NCO

Számvezérelt oszcillátor modul
NUMERICALLY CONTROLLED OSCILLATOR (NCO) MODULE

 

NCO doksi (EN) : NCO doksi (PDF)  

K:446. old

 

Működése: 

  • NCOxINCU-ba beírjuk a ferkvenciameghatározó értéket, majd NCOxINCH-ba és végül az  NCOxINCL-be. Tehát itt adjuk meg, hogy mennyi legyen a kimeneten a frekvencia. A kimeneti frekvenciájára természetesen más értékek is hatással vannak, ezekről lentebb lehet olvasni. Ha a mudul nincs engedélyezve, akkor ez az adat a beírást követően átvándorol az INCBUFx regiszterekbe, ha engedélyezve van, akkor csak akkor, amikor a beírást követően a bemeneti órajel második felfutó éle történik.
  • Az NCOxINCL regiszterbe történő írást követően az NCOx_clk jel második felfutó élekor azonnal átkerül az INCBUFx regiszterekbe az adat. Ez a kettős pufferezés teszi lehetővé, hogy az NCO modul működése közben is zökkenőmentesen tudjuk állítani ezt az értéket, vagyis a kimenet frekvenciájának értéket. Ha az NCO1 modul nincs engedélyezve, akkor ez az adatátvánsorlás azonnal bekövetkezik.  

 

Az increment regiszterek dupla pufferrel vannak ellátva, hogy lehetővé tegyék az értékváltoztatásokat az NCO modul letiltása nélkül. A teljes inkrement érték az NCOx_clk jel második emelkedési élén lévő puffer regiszterbe kerül, amely az NCOxINCL regiszterbe történő írást követően azonnal megtörténik. A pufferek nem hozzáférhetőek a felhasználók számára, és itt hivatkozásként jelennek meg.

 

 

 

0. bit PFM: NCO1 Pulse Frequency Mode bit
A kimeneti impulzusok milyenségét beáálító bit
  1. Az NCO1 kimenete minden őt vezérlő (beállított frekvenciájú) jelre az ellentkezőjére vált, így a tényleges kimeneti ferkvencia megfeleződik. A kitöltést nem lehet szabályozni, értelemszerűen automatikusan 50% lesz.
  2. Az NCO1 impulzus frekvencia üzemmódban működik
4. bit POL: NCO1 Polarity
A kimenet polaritását beállító bit
  1. NCO1 kimenete nem fordított polaritású
  2. NCO1 kimenete  fordított jelű polaritású
5. bit OUT: NCO1 Output bit
A kimenet ártékét felvevő (jelző) bit. Csak olvasható.
 
7. bit EN: NCO1 Enable bit
NCO1 modult engedélyező (be/ki kapcsoló) bit
  1. NCO1 modul nincs engedélyezve
  2. NCO1 modul engedélyezve van, be van kapcsolva

 

 

 

PÉLDAPROGRAM:

Főprogram:

  LIST   P=PIC18F45K42 ;  ISO 8859-2   
  #include p18f45k42.inc ;  
  
; Fosc = 8 MHz 
          
adat:    UDATA_ACS   ; H'10' ; nincs kezdo memoriacim megadva az ACCESS ramban
W_TEMP         RES   1      ; w register for context saving (ACCESS)
STATUS_TEMP    RES   1      ; status used for context saving
BSR_TEMP       RES   1      ; bank select used for ISR context saving       

    ORG 0X0000
    nop
    CODE
    global konfig_
    extern konfig
    nop ;
    goto start ;     
    
;----------------------------------PIC18's--------------------------------------
; FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF   
; NCO (számvezérelt oszcillátor) megvalósítása 500 KHz-es INTOSC órajellel
; hangfrekvenciás jelkeltés céljából. Alkalmazható például hangriasztásra.    
    
start:
    nop
foprogram:   
    goto konfig ;
    nop
konfig_:        
  
    banksel NCO1ACCL  
    movlw b'0000' ; 
    movwf NCO1ACCU ;         
    
    movlw b'00000000' ; 
    movwf NCO1ACCH ;    
    
   
    movlw b'00000000' ; 
    movwf NCO1ACCL ;
    
    
   
    banksel NCO1INCL ;   
                      ; 500KHz-es órajel frekvenciafelező üzemmódban k.b.:  
    movlw h'F' ; b'1100' ;  NCO1INC=00-0Hz, 0001-0,4Hz, 010-0,5Hz, 011-1Hz
    movwf NCO1INCU ; 100-1,5Hz, 1000-2,5Hz, 10000-4Hz, 100000-8Hz, 1000000-15Hz 
                   ; 10000000-30Hz, 01'00000000-61Hz, 10'0...0-122Hz,  
    movlw h'FF' ;b'00000000' ; 0100'0...0-245Hz, 01000'0-490Hz, 10000'0-977Hz,  
    movwf NCO1INCH ; 100000'0-1,96KHz, 1000000'0-3,91KHz, 10000000'0-7,82KHz,           
           ; 01'0'0-15,6KHz,  010'0'0-31,3KHz,  0100'0'0-62,6KHz,
    movlw h'FF' ;b'00000000' ; 1000'0'0-125,2KHz,  1000'0'00000001-125,3KHz, 
    movwf NCO1INCL ;  1100'0'0-187,9KHz, F'FF'FF-250,7KHz       
            
    goto  $ ; 
    
    END   

 

Konfiguráció:

  LIST   P=PIC18F45K42 ;  ISO 8859-2   
  #include p18f45k42.inc ;    
  
    ;   External Oscillator Selection:
;     FEXTOSC = LP         LP (crystal oscillator) optimized for 32.768 kHz; PFM set to low power
;     FEXTOSC = XT         XT (crystal oscillator) above 100 kHz, below 8 MHz; PFM set to medium power
;     FEXTOSC = HS         HS (crystal oscillator) above 8 MHz; PFM set to high power
;     FEXTOSC = RESERVED   Reserved (DO NOT USE)
    ;  CONFIG FEXTOSC = OFF   ;     Oscillator not enabled
;     FEXTOSC = ECL        EC (external clock) below 100 kHz; PFM set to low power
   CONFIG   FEXTOSC = ECM ;       EC (external clock) for 500 kHz to 8 MHz; PFM set to medium power
;     FEXTOSC = ECH        EC (external clock) above 8 MHz; PFM set to high power
;
;   Reset Oscillator Selection:
;     RSTOSC = HFINTOSC_64MHZHFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1
;     RSTOSC = RESERVED_1  Reserved
;     RSTOSC = EXTOSC_4PLL EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits
;     RSTOSC = RESERVED_2  Reserved
;     RSTOSC = SOSC        Secondary Oscillator
;     RSTOSC = LFINTOSC    Low-Frequency Oscillator
 ;  CONFIG  RSTOSC = HFINTOSC_1MHZHFINTOSC ; with HFFRQ = 4 MHz and CDIV = 4:1
 
;     RSTOSC = EXTOSC      EXTOSC operating per FEXTOSC bits (device manufacturing default)
;
;   Clock out Enable bit:
;     CLKOUTEN = ON        CLKOUT function is enabled
;     CLKOUTEN = OFF       CLKOUT function is disabled
;
;   PRLOCKED One-Way Set Enable bit:
;     PR1WAY = OFF         PRLOCK bit can be set and cleared repeatedly
 ; CONFIG   PR1WAY = ON ;         PRLOCK bit can be cleared and set only once
;
;   Clock Switch Enable bit:
;     CSWEN = OFF          The NOSC and NDIV bits cannot be changed by user software
;     CSWEN = ON           Writing to NOSC and NDIV is allowed
;
;   Fail-Safe Clock Monitor Enable bit:
;     FCMEN = OFF          Fail-Safe Clock Monitor disabled
;     FCMEN = ON           Fail-Safe Clock Monitor enabled
;
;   MCLR Enable bit:
 ;  CONFIG   MCLRE = INTMCLR  ;    If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR
;     MCLRE = EXTMCLR      If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR 
;
;   Power-up timer selection bits:
;     PWRTS = PWRT_1       PWRT set at 1ms
;     PWRTS = PWRT_16      PWRT set at 16ms
;     PWRTS = PWRT_64      PWRT set at 64ms
;     PWRTS = PWRT_OFF     PWRT is disabled
;
;   Multi-vector enable bit:
 ;  CONFIG  MVECEN = OFF ;        Interrupt contoller does not use vector table to prioritze interrupts
;     MVECEN = ON          Multi-vector enabled, Vector table used for interrupts
;
;   IVTLOCK bit One-way set enable bit:
;     IVT1WAY = OFF        IVTLOCK bit can be cleared and set repeatedly
 ;  CONFIG  IVT1WAY = ON ;        IVTLOCK bit can be cleared and set only once
;
;   Low Power BOR Enable bit:
;     LPBOREN = ON         ULPBOR enabled
  CONFIG   LPBOREN = OFF ;       ULPBOR disabled
;
;   Brown-out Reset Enable bits:
;     BOREN = OFF          Brown-out Reset disabled
;     BOREN = ON           Brown-out Reset enabled according to SBOREN
;     BOREN = NOSLP        Brown-out Reset enabled while running, disabled in Sleep; SBOREN is ignored
;     BOREN = SBORDIS      Brown-out Reset enabled , SBOREN bit is ignored
;
;   Brown-out Reset Voltage Selection bits:
;     BORV = VBOR_2P85     Brown-out Reset Voltage (VBOR) set to 2.8V
;     BORV = VBOR_2P7      Brown-out Reset Voltage (VBOR) set to 2.7V
;     BORV = VBOR_245      Brown-out Reset Voltage (VBOR) set to 2.45V
;     BORV = VBOR_190      Brown-out Reset Voltage (VBOR) set to 1.90V
;
;   ZCD Disable bit:
;     ZCD = ON             ZCD always enabled
;     ZCD = OFF            ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON
;
;   PPSLOCK bit One-Way Set Enable bit:
  CONFIG   PPS1WAY = OFF   ;     PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence)
  ; CONFIG  PPS1WAY = ON ;        PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle
;
;   Stack Full/Underflow Reset Enable bit:
;     STVREN = OFF         Stack full/underflow will not cause Reset
  CONFIG   STVREN = ON ;         Stack full/underflow will cause Reset
;
;   Debugger Enable bit:
;     DEBUG = ON           Background debugger enabled
;     DEBUG = OFF          Background debugger disabled
;
;   Extended Instruction Set Enable bit:
;     XINST = ON           Extended Instruction Set and Indexed Addressing Mode enabled
  CONFIG   XINST = OFF      ;    Extended Instruction Set and Indexed Addressing Mode disabled
;
;   WDT Period selection bits:
;     WDTCPS = WDTCPS_0    Divider ratio 1:32
;     WDTCPS = WDTCPS_1    Divider ratio 1:64
;     WDTCPS = WDTCPS_2    Divider ratio 1:128
;     WDTCPS = WDTCPS_3    Divider ratio 1:256
;     WDTCPS = WDTCPS_4    Divider ratio 1:512
;     WDTCPS = WDTCPS_5    Divider ratio 1:1024
;     WDTCPS = WDTCPS_6    Divider ratio 1:2048
;     WDTCPS = WDTCPS_7    Divider ratio 1:4096
;     WDTCPS = WDTCPS_8    Divider ratio 1:8192
;     WDTCPS = WDTCPS_9    Divider ratio 1:16384
;     WDTCPS = WDTCPS_10   Divider ratio 1:32768
;     WDTCPS = WDTCPS_11   Divider ratio 1:65536
;     WDTCPS = WDTCPS_12   Divider ratio 1:131072
;     WDTCPS = WDTCPS_13   Divider ratio 1:262144
;     WDTCPS = WDTCPS_14   Divider ratio 1:524299
;     WDTCPS = WDTCPS_15   Divider ratio 1:1048576
;     WDTCPS = WDTCPS_16   Divider ratio 1:2097152
;     WDTCPS = WDTCPS_17   Divider ratio 1:4194304
;     WDTCPS = WDTCPS_18   Divider ratio 1:8388608
;     WDTCPS = WDTCPS_19   Divider ratio 1:32
;     WDTCPS = WDTCPS_20   Divider ratio 1:32
;     WDTCPS = WDTCPS_21   Divider ratio 1:32
;     WDTCPS = WDTCPS_22   Divider ratio 1:32
;     WDTCPS = WDTCPS_23   Divider ratio 1:32
;     WDTCPS = WDTCPS_24   Divider ratio 1:32
;     WDTCPS = WDTCPS_25   Divider ratio 1:32
;     WDTCPS = WDTCPS_26   Divider ratio 1:32
;     WDTCPS = WDTCPS_27   Divider ratio 1:32
;     WDTCPS = WDTCPS_28   Divider ratio 1:32
;     WDTCPS = WDTCPS_29   Divider ratio 1:32
;     WDTCPS = WDTCPS_30   Divider ratio 1:32
;     WDTCPS = WDTCPS_31   Divider ratio 1:65536; software control of WDTPS
;
;   WDT operating mode:
  CONFIG    WDTE = OFF  ;         WDT Disabled; SWDTEN is ignored
;     WDTE = SWDTEN        WDT enabled/disabled by SWDTEN bit
;     WDTE = NSLEEP        WDT enabled while sleep=0, suspended when sleep=1; SWDTEN ignored
;     WDTE = ON            WDT enabled regardless of sleep
;
;   WDT Window Select bits:
;     WDTCWS = WDTCWS_0    window delay = 87.5; no software control; keyed access required
;     WDTCWS = WDTCWS_1    window delay = 75 percent of time; no software control; keyed access required
;     WDTCWS = WDTCWS_2    window delay = 62.5 percent of time; no software control; keyed access required
;     WDTCWS = WDTCWS_3    window delay = 50 percent of time; no software control; keyed access required
;     WDTCWS = WDTCWS_4    window delay = 37.5 percent of time; no software control; keyed access required
;     WDTCWS = WDTCWS_5    window delay = 25 percent of time; no software control; keyed access required
;     WDTCWS = WDTCWS_6    window always open (100%); no software control; keyed access required
;     WDTCWS = WDTCWS_7    window always open (100%); software control; keyed access not required
;
;   WDT input clock selector:
;     WDTCCS = LFINTOSC    WDT reference clock is the 31.0 kHz LFINTOSC
;     WDTCCS = MFINTOSC    WDT reference clock is the 32kHz MFINTOSC output
;     WDTCCS = SOSC        WDT reference clock is SOSC
;     WDTCCS = SC          Software Control
;
;   Boot Block Size selection bits:
;     BBSIZE = BBSIZE_8192 Boot Block size is 8192 words
;     BBSIZE = BBSIZE_4096 Boot Block size is 4096 words
;     BBSIZE = BBSIZE_2048 Boot Block size is 2048 words
;     BBSIZE = BBSIZE_1024 Boot Block size is 1024 words
;     BBSIZE = BBSIZE_512  Boot Block size is 512 words
;
;   Boot Block enable bit:
;     BBEN = ON            Boot block enabled
;     BBEN = OFF           Boot block disabled
;
;   Storage Area Flash enable bit:
;     SAFEN = ON           SAF enabled
;     SAFEN = OFF          SAF disabled
;
;   Application Block write protection bit:
;     WRTAPP = ON          Application Block write protected
;     WRTAPP = OFF         Application Block not write protected
;
;   Configuration Register Write Protection bit:
;     WRTB = ON            Configuration registers (300000-30000Bh) write-protected
;     WRTB = OFF           Configuration registers (300000-30000Bh) not write-protected
;
;   Boot Block Write Protection bit:
;     WRTC = ON            Boot Block (000000-0007FFh) write-protected
;     WRTC = OFF           Boot Block (000000-0007FFh) not write-protected
;
;   Data EEPROM Write Protection bit:
;     WRTD = ON            Data EEPROM write-protected
;     WRTD = OFF           Data EEPROM not write-protected
;
;   SAF Write protection bit:
;     WRTSAF = ON          SAF Write Protected
;     WRTSAF = OFF         SAF not Write Protected
;
;   Low Voltage Programming Enable bit:
  CONFIG     LVP = OFF ;           HV on MCLR/VPP must be used for programming
;     LVP = ON             Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored
;
;   PFM and Data EEPROM Code Protection bit:
;     CP = ON              PFM and Data EEPROM code protection enabled
;     CP = OFF             PFM and Data EEPROM code protection disabled
 
  
;---Konfigurálás---------------------------------------------    
    
    CODE ; 
    extern konfig_      
    global konfig
 
konfig:     
;---NCO------- K:446. old-------------------------------------   
; Kimenetre a Pic18F45K42-nél az A vagy D port használható fel ( RD1-20.láb )       
; Az RD1-20. lábat digitalissnak konfiguraljuk 
    banksel ANSELD ; 
    bcf ANSELD,ANSELD1 ; 20.lab { Katalógus 6, 11.old. es 264. oldal 
            
;.........PWMx (NCO jelek) hozzarendelése a 20-as IC lábhoz.........    
; Letiltjuk globalisan a megszakitasokat    
    banksel INTCON0
    bcf     INTCON0,GIE ; letiltjuk globálisan a megszakításokat      
    
; PPS UNLOCK szekvencia
    banksel PPSLOCK ;
    movlw 0x55 ; 
    movwf PPSLOCK ;
    movlw 0xAA ; 
    movwf PPSLOCK ;
  ;  bcf PPSLOCK,PPSLOCKED ;
     bcf PPSLOCK,0 ;
    
; Engedélyezzuk globalisan a megszakitasokat    
    banksel INTCON0
    bsf     INTCON0,GIE ; engedélyezzük globálisan a megszakításokat          
  
; 20.láb = RD1 láb  NCO modul kimenet
    movlw b'100110' ; RD1 láb  NCO modul kimenetéhez rendelése   
    banksel RD1PPS ; 
    movwf RD1PPS ;  Kat.: 279. old
        
; Letiltjuk globálisan a megszakításokat   
    banksel INTCON0
    bcf     INTCON0,GIE ; letiltjuk globálisan a megszakításokat     
    
; PPS LOCK szekvencia
    banksel PPSLOCK ;
    movlw 0x55 ; 
    movwf PPSLOCK ;
    movlw 0xAA ; 
    movwf PPSLOCK ;
   ; bsf PPSLOCK,PPSLOCKED ;    
     bsf PPSLOCK,0 ;
    
; Engedélyezzuk globálisan a megszakításokat     
    banksel INTCON0
    bsf     INTCON0,GIE ; engedélyezzuk globálisan a megszakításokat        
    
; NCO1CLK<3:0> (CKS<3:0>)
; NCO1 órajel forrást beállító bitek
;  1111 = Reserved
;   ?
;  1011 = Reserved
;  1010 = CLC4_out
;  1001 = CLC3_out
;  1000 = CLC2_out
;  0111 = CLC1_out
;  0110 = CLKREF_out
;  0101 = SOSC
;  0100 = MFINTOSC/4 (32 kHz)
;  0011 = MFINTOSC (500 kHz)
;  0010 = LFINTOSC
;  0001 = HFINTOSC
;  0000 = FOSC    
    
; NCO1CLK<4>  nem használt  
    
; NCO1CLK<7:5> (PWS<2:0>)
; NCO1 Output Pulse Width Select bits
;  111 =   NCO1 output is active for 128 input clock periods
;  110 =   NCO1 output is active for 64 input clock periods
;  101 =   NCO1 output is active for 32 input clock periods
;  100 =   NCO1 output is active for 16 input clock periods
;  011 =   NCO1 output is active for 8 input clock periods
;  010 =   NCO1 output is active for 4 input clock periods
;  001 =   NCO1 output is active for 2 input clock periods
;  000 =   NCO1 output is active for 1 input clock period    
    
    movlw b'00000011' ; 500 KHz INTOSC használata  
    banksel NCO1CLK    ; 16 periódus
    movwf NCO1CLK
     
; NCO1CON<7:0> beállítása
; <7> - EN: 
;  1 = NCO1 module is enabled
;  0 = NCO1 module is disabled
    
; <6> - nem használt

; <5> - OUT:
; NCO1 Output bit
; Displays the current output value of the NCO1 module.
    
; <4> - POL: 
; NCO1 Polarity
;  1 = NCO1 output signal is inverted
;  0 = NCO1 output signal is not inverted
    
; <3:1> Unimplemented

; <0> - PFM:
; NCO1 Pulse Frequency Mode bit
;  1 = NCO1 operates in Pulse Frequency mode
;  0 = NCO1operates in Fixed Duty Cycle mode, divide by 2    
    
    movlw b'10000000' ;
    banksel NCO1CON ;
    movwf NCO1CON ;
    
    banksel TRISD
    bcf TRISD,1
        
    goto konfig_
        
    END