PWM CCPx modullal

 

Leírás: http://www.t-es-t.hu/elokep/pic/felhkk/kk/sz1604.htm

http://www.t-es-t.hu/elokep/pic/f_pwm.htm

http://www.magyar-elektronika.hu/10005-tartalom/1856-a-pwm-felbontas-novelese-processzorperiferiak-kombinalasaval

http://www.microchip.com/design-centers/8-bit/peripherals/core-independent/16-bit-pulse-width-modulation-16-bitpwm

FONTOS: http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf

----------------------------------------------------------------------------------------------------------------------------------------------------------

 A PIC18FxxK42 típusnál két megoldással lehet egyszerűen PWM szabályozást megoldani:

  1. A korábbi fejlesztésű PIC-ekhez hasonlóan CCPx modul felhasználásával.
  2. Külön erre a cálra kifejlesztett PWM, illetve PWMx modullal.

Ez az oldal kimondottan a CCPx modul felhasználásával megvalósított PWM szabályozásával foglalkozink. 
A PWM modullal megvalósított leírásra a következő link mutat: itt!
 

PWM szabályozás megvalósítása CCPx modul felhasználásával PIC18 F45K42 mikrokontrollernél


 


 


Példaprogram CCP1 modullal:

Pő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   
; PWM kat:317-337. old. (Timer2) és 343-351 . old (CCPx).   
    
start:
    nop
foprogram:   
    goto konfig ;
    nop
konfig_:    
 
    ; Körülbelül 50%-os kitültéssel 30 Hz PWM jel
   movlw b'0' ; 
   banksel CCPR1L
   movwf CCPR1L ;
 
   movlw b'00000010' ; A 2 lacsony helyiértékű bit számít FMT = 0 esetén
   movwf CCPR1H ;     
    
    goto  $ ; 
    
    END     
        
;--------------------------------------------------------------

 


Alprogram (beállítás):

  LIST   P=PIC18F45K42 ;  ISO 8859-2   
  #include p18f45k42.inc ;  

  
; Ide kerülnek a konfigurációs utasítások
 

    
    CODE ; 
    extern konfig_      
    global konfig
 
konfig:     
;---PWM1_CCP1-------- K:352. old-------------------------------------   
        
; A labalat ( RA7 - 13.lab) digitalissnak konfiguraljuk
    banksel ANSELC ; 
    bcf ANSELC,ANSELC0 ; { Katalógus 11.old. es     262. oldal }
    
;    .....CCPx (PWM jel) hozzarendelése a 15-ös 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          
  
; 15.láb = RC0 láb    
    movlw b'001001' ; CCP kimenet (PWM jel) lábhoz rendelése   
    banksel RC0PPS ; 
    movwf RC0PPS ;  Kat.: 280-281. 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         
;    .............................................................    
    
;          Óral forrás választási lehetőségek:      
;    movlw b'0000' ; T2INPPS-el beállított lábról kapja az órajelet
;  movlw b'0001' ; Fosc/4 (CPU órajel/4, vagyis műveletvégzési frekvencia)
;  movlw b'0010' ; Fosc (CPU órajel) legyen  a TIMER2 órajele 
;  movlw b'0011' ; HFINTOSC-ról (OSCFRQ<3:0>-val beállított) kapja az órajelet 
;    movlw b'0100' ; LFINTOSC-ról (alacsony frekvenviájó belső oszcillátor)
;  movlw b'0101' ; MFINTOSC (500 KHz)-ról kapja az órajelet
;  movlw b'0110' ; MFINTOSC (32 KHz)-ről kapja az órajelet
;    movlw b'0111' ; SOSC (másodlagos /külső/ oszcillátor)
;    movlw b'1000' ; CLKREF_OUT-ról kapja az órajelet
;    movlw b'1001' ; NCO1OUT
;    movlw b'1010' ; ZCD_OUT
;    movlw b'1011' ; CLC1_out
;    movlw b'1100' ; CLC2_out
;    movlw b'1101' ; CLC3_out
;    movlw b'1110' ; CLC4_out    
         
    movlw b'0001' ; Fosc/4 (CPU órajel/4, vagyis műveletvégzési frekvencia)
    banksel T2CLK ;
    movwf T2CLK ; A TMR2 órajel forrásának megadása      
      
; TMR2 modul beállítása    
    ; TxCON<6:4> (CKPS<2:0>) előosztó (Megj.: utóoasztó nincs befolyással)
;           111 =  1:128 Prescaler
;           110 =  1:64 Prescaler
;           101 =  1:32 Prescaler
;           100 =  1:16 Prescaler
;           011 =  1:8 Prescaler
;           010 =  1:4 Prescaler
;           001 =  1:2 Prescaler
;           000 =  1:1 Prescaler

    movlw b'01110000' ; <3:0>=utóosztó, <6:4>=előosztó, <7>=1 start, 0 stop    
    banksel T2CON ; előosztást 1:128-ra állítom (111) értékkel
    movwf T2CON ; Megj.: Az utóosztó nincs hatássat a PWM működésre
      
; TMR2 modul (Timer2) bekapcsolása         
    bsf T2CON,7 ; fentebb egy menetben is elvégezhető szerintem   

; CCPx beállítása: PWM üzemmód, mód:16-ról 10 bit, CCPx engedélyezés /K:348. old/   
; CCPxCON<3:0> üzemmód: 11xx=PWM, <4>(<FMT>)=0 jobbra eltolásos 16-ról 10 bit
;   CCPRH és CCPRxL -> 10 bit, <7>=1 CCPx engedélyezése
    movlw b'10001100' ; K:348
    banksel CCP1CON
    movwf CCP1CON    
      
 ; A kimenet (IC láb) engedélyezése kimentnek (PWM kimenet)       
    banksel TRISC
    bcf TRISC,0 ; PWM kimenetet bekapcsolom      
    goto konfig_          
        
;........PWM1_CCP1..............................................................
    
  END 

   
   

Konfigurációs utasítások:

  
    ;   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
 
  



 

Példaprogram 3 PWM szabályozásra CCP1, CCP2 és CCP3  modullal:

Főprogram kódok:

  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   
; PWM kat:317-337. old. (Timer2) és 343-351 . old (CCPx).   
    
start:
    nop
foprogram:   
    goto konfig ;
    nop
konfig_:    
 
    ; Körülbelül 50%-os kitültéssel 30 Hz PWM jel
   movlw b'0' ; 
   banksel CCPR1L
   movwf CCPR1L ;
 
   movlw b'00000010' ; A 2 lacsony helyiértékű bit számít FMT = 0 esetén
   movwf CCPR1H ;     
       
   ; Körülbelül nagy%-os kitültéssel 30 Hz PWM jel
   movlw b'0' ; 
   banksel CCPR2L
   movwf CCPR2L ;
 
   movlw b'00000011' ; A 2 lacsony helyiértékű bit számít FMT = 0 esetén
   movwf CCPR2H ;        
      
   ; Körülbelül kicsi%-os kitültéssel 30 Hz PWM jel
   movlw b'0' ; 
   banksel CCPR3L
   movwf CCPR3L ;
 
   movlw b'00000001' ; A 2 lacsony helyiértékű bit számít FMT = 0 esetén
   movwf CCPR3H ;        
      
   ; Körülbelül 50%-os kitültéssel 30 Hz PWM jel
   movlw b'0' ; 
   banksel CCPR4L
   movwf CCPR4L ;
 
   movlw b'00000010' ; A 2 lacsony helyiértékű bit számít FMT = 0 esetén
   movwf CCPR4H ;        
      
    goto  $ ; 
    
    END     
    

 

Teljes konfigurációs programkódok:

  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:     
;---PWM1_CCP1-------- K:352. old-------------------------------------   
        
; A labalat ( RC0-15, RC1-16, RD0-19, RD1-20.lab) digitalissnak konfiguraljuk HIBA!
    banksel ANSELC ; 
    bcf ANSELC,ANSELC0 ; 15.lab { Katalógus 6, 11.old. es 264. oldal } HIBA
    bcf ANSELC,ANSELC1 ; 16.lab { Katalógus 6, 11.old. es 264. oldal }     
    bcf ANSELD,ANSELD0 ; 19.lab { Katalógus 6, 11.old. es 264. oldal } 
    bcf ANSELD,ANSELD1 ; 20.lab { Katalógus 6, 11.old. es 264. oldal }     
    
;.........CCPx (PWM jelek) hozzarendelése a 15, 16, 19, 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          
  
; 15.láb = RC0 láb  CCP1 ->  PWM1
    movlw b'001001' ; CCP1 kimenet (PWM1 jel) lábhoz rendelése   
    banksel RC0PPS ; 
    movwf RC0PPS ;  Kat.: 280-281. old
    
; 16.láb = RC1 láb  CCP2 ->  PWM2
    movlw b'001010' ; CCP2 kimenet (PWM2 jel) lábhoz rendelése   
  ;  banksel RC1PPS ; 
    movwf RC1PPS ;  Kat.: 280-281. old
    
    
; 17.láb = RC2 láb  CCP3 ->  PWM3
    movlw b'001011' ; CCP3 kimenet (PWM3 jel) lábhoz rendelése   
    banksel RD0PPS ; 
    movwf RD0PPS ;  Kat.: 280-281. old
    
; 18.láb = RC3 láb  CCP4 ->  PWM4
    movlw b'001100' ; CCP4 kimenet (PWM4 jel) lábhoz rendelése   
  ;  banksel RD1PPS ; 
    movwf RD1PPS ;  Kat.: 280-281. 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         
;    .............................................................    
; CCPTMRS0<7:6> (C4TSEL<1:0>) CCP4 Timer választás
; 11 =  CCP4 hozzárendelése Timer6 PWM üzemmodban
; 10 =  CCP4 hozzárendelése Timer4 PWM üzemmodban
; 01 =  CCP4 hozzárendelése Timer2 PWM üzemmodban
; 00 =  Reserved

; CCPTMRS0<5:4> (C3TSEL<1:0>) CCP3 Timer választás
; 11 =  CCP3 hozzárendelése Timer6 PWM üzemmodban
; 10 =  CCP3 hozzárendelése Timer4 PWM üzemmodban
; 01 =  CCP3 hozzárendelése Timer2 PWM üzemmodban
; 00 =  Reserved

; CCPTMRS0<3:2> (C2TSEL<1:0>) CCP2 Timer választás 
; 11 = CCP2 hozzárendelése Timer6 PWM üzemmodban
; 10 = CCP2 hozzárendelése Timer4 PWM üzemmodban
; 01 = CCP2 hozzárendelése Timer2 PWM üzemmodban
; 00 = Reserved

; CCPTMRS0<1:0> (C1TSEL<1:0>) CCP1 Timer választás 
; 11 = CCP1 hozzárendelése Timer6 PWM üzemmodban
; 10 = CCP1 hozzárendelése Timer4 PWM üzemmodban
; 01 = CCP1 hozzárendelése Timer2 PWM üzemmodban
; 00 = Reserved    
    
    movlw b'11100101' ; { CCP1 és CCP2 <-> Timer2  
    banksel CCPTMRS0  ;   CCP3 <-> Timer4
    movwf CCPTMRS0    ;   CCP4 <-> Timer6 }
    
;.........................................    
;          Óral forrás választási lehetőségek:      
;    movlw b'0000' ; T2INPPS-el beállított lábról kapja az órajelet
;  movlw b'0001' ; Fosc/4 (CPU órajel/4, vagyis műveletvégzési frekvencia)
;  movlw b'0010' ; Fosc (CPU órajel) legyen  a TIMER2 órajele 
;  movlw b'0011' ; HFINTOSC-ról (OSCFRQ<3:0>-val beállított) kapja az órajelet 
;    movlw b'0100' ; LFINTOSC-ról (alacsony frekvenviájó belső oszcillátor)
;  movlw b'0101' ; MFINTOSC (500 KHz)-ról kapja az órajelet
;  movlw b'0110' ; MFINTOSC (32 KHz)-ről kapja az órajelet
;    movlw b'0111' ; SOSC (másodlagos /külső/ oszcillátor)
;    movlw b'1000' ; CLKREF_OUT-ról kapja az órajelet
;    movlw b'1001' ; NCO1OUT
;    movlw b'1010' ; ZCD_OUT
;    movlw b'1011' ; CLC1_out
;    movlw b'1100' ; CLC2_out
;    movlw b'1101' ; CLC3_out
;    movlw b'1110' ; CLC4_out    
         
    movlw b'0001' ; Fosc/4 (CPU órajel/4, vagyis műveletvégzési frekvencia)
    banksel T2CLK ;
    movwf T2CLK ; A TMR2 órajel forrásának megadása    
    
    movlw b'0010' ; Fosc (CPU órajele)
    banksel T4CLK ;
    movwf T4CLK ; A TMR4 órajel forrásának megadása      
    
    movlw b'0101' ; MFINTOSC (500 KHz)-ról kapja az órajelet    
    banksel T6CLK ;
    movwf T6CLK ; A TMR6 órajel forrásának megadása      
    
      
; TMR2 modul beállítása    
    ; TxCON<6:4> (CKPS<2:0>) előosztó (Megj.: utóoasztó nincs befolyással)
;           111 =  1:128 Prescaler
;           110 =  1:64 Prescaler
;           101 =  1:32 Prescaler
;           100 =  1:16 Prescaler
;           011 =  1:8 Prescaler
;           010 =  1:4 Prescaler
;           001 =  1:2 Prescaler
;           000 =  1:1 Prescaler
    ; ..TMR2..............
    movlw b'01110000' ; <3:0>=utóosztó, <6:4>=előosztó, <7>=1 start, 0 stop    
    banksel T2CON ; előosztást 1:128-ra állítom (111) értékkel
    movwf T2CON ; Megj.: Az utóosztó nincs hatássat a PWM működésre
      
; TMR2 modul (Timer2) bekapcsolása         
    bsf T2CON,7 ; fentebb egy menetben is elvégezhető szerintem   
    
    ; ..TMR4.......
    movlw b'01110000' ; <3:0>=utóosztó, <6:4>=előosztó, <7>=1 start, 0 stop    
    banksel T4CON ; előosztást 1:128-ra állítom (111) értékkel
    movwf T4CON ; Megj.: Az utóosztó nincs hatássat a PWM működésre
      
; TMR4 modul (Timer4) bekapcsolása         
    bsf T4CON,7 ; fentebb egy menetben is elvégezhető szerintem   
    
   ; ..TMR6................ 
    movlw b'01110000' ; <3:0>=utóosztó, <6:4>=előosztó, <7>=1 start, 0 stop    
    banksel T6CON ; előosztást 1:128-ra állítom (111) értékkel
    movwf T6CON ; Megj.: Az utóosztó nincs hatássat a PWM működésre
      
; TMR6 modul (Timer6) bekapcsolása         
    bsf T6CON,7 ; fentebb egy menetben is elvégezhető szerintem   
       
; PWM üzemmód beállítása a CCPx moduloknál
; CCPx beállítása: PWM üzemmód, mód:16-ról 10 bit, CCPx engedélyezés /K:348. old/   
; CCPxCON<3:0> üzemmód: 11xx=PWM, <4>(<FMT>)=0 jobbra eltolásos 16-ról 10 bit
;   CCPRH és CCPRxL -> 10 bit, <7>=1 CCPx engedélyezése
    ;...CCP1..........
    movlw b'10001100' ; K:348
    banksel CCP1CON
    movwf CCP1CON    
    
    ;...CCP2..........
    movlw b'10001100' ; K:348
    banksel CCP2CON
    movwf CCP2CON        
    
     ;...CCP3..........
    movlw b'10001100' ; K:348
    banksel CCP3CON
    movwf CCP3CON       
    
    ;...CCP4..........
    movlw b'10001100' ; K:348
    banksel CCP4CON
    movwf CCP4CON        
        
 ; A kimenet (IC láb) engedélyezése kimentnek (PWM kimenet)       
    banksel TRISC
    bcf TRISC,0 ; PWM1 kimenetet bekapcsolom     
    bcf TRISC,1 ; PWM2 kimenetet bekapcsolom    
    bcf TRISD,0 ; PWM2 kimenetet bekapcsolom 
    bcf TRISD,1 ; PWM2 kimenetet bekapcsolom 
    
    goto konfig_          
        
;........PWM1_CCP1..............................................................
    
  END 
 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

SETUP FOR PWM OPERATION USING PWMx PINS SETUP FOR PWM OPERATION USING PWMx PINS
A konfigurálás során a következő lépéseket kell megtenni
a modul a PWM működéshez a PWMx csapokkal:
  1. Tiltsa le a PWMx kimeneti illesztőprogram (ok) beállítását
    a kapcsolódó TRIS bit (ek) et.
     
  2. Törölje a PWMxCON regisztert.
     
  3. Töltse be a T2PR regisztert a PWM időtartammal
    érték.
     
  4. Töltse be a PWMxDCH regisztert és <7: 6> biteket a PWMxDCL regiszter a PWM munkakörnyezetével érték.
     
  5. Az Időzítő2 konfigurálása és indítása:
    • Törölje a TMR2IF megszakítási zászló bitjét megfelelő PIR-nyilvántartást. Lásd az 1. megjegyzést.
    • Válassza ki a beállítani kívánt időzítő órát FOSC/4 a TxCLK regiszter használatával. Eza PWM helyes működéséhez modult.
    • Állítsa be a T2CON CKPS bitjeit regisztráljon a Timer2 prescale értékkel.
    • Engedélyezze az Időzítő2 értéket a T2CON nyilvántartás.
       
  6. Engedélyezze a PWM kimenetét és várjon, amíg a Timer2 túlcsordul, a megfelelő PIR regiszter TMR2IF bitje 1-re vált. Lásd az alábbi megjegyzést.
     
  7. Engedélyezze a PWMx pin kimeneti illesztőprogram (ok) a kapcsolódó TRIS bit (ek) et és a beállításokat kívánt PPS vezérlő bitek.
     
  8. A PWM modul beállítása a A PWMxCON regisztrálja a megfelelő értékeket.





 
The following steps should be taken when configuring the module for PWM operation using the PWMx pins:
  1. Disable the PWMx pin output driver(s) by setting the associated TRIS bit(s).
     
  2. Clear the PWMxCON register.
     
  3. Load the T2PR register with the PWM period value.
     
  4. Load the PWMxDCH register and bits <7:6> of the PWMxDCL register with the PWM duty cycle value.
     
  5. Configure and start Timer2:
    • Clear the TMR2IF interrupt flag bit of the respective PIR register. See Note 1 below.
    • Select the timer clock source to be as FOSC/4 using the TxCLK register. This is required for correct operation of the PWM module.
    • Configure the CKPS bits of the T2CON register with the Timer2 prescale value.
    • Enable Timer2 by setting the ON bit of the T2CON register.
       
  6. Enable PWM output pin and wait until Timer2 overflows, TMR2IF bit of the respective PIR register is set. See note below.
     
  7. Enable the PWMx pin output driver(s) by clearing the associated TRIS bit(s) and setting the desired pin PPS control bits.
     
  8. Configure the PWM module by loading the PWMxCON register with the appropriate values.