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:
- A korábbi fejlesztésű PIC-ekhez hasonlóan CCPx modul felhasználásával.
- 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:
- Tiltsa le a PWMx kimeneti illesztőprogram (ok) beállítását
a kapcsolódó TRIS bit (ek) et.
- Törölje a PWMxCON regisztert.
- Töltse be a T2PR regisztert a PWM időtartammal
érték.
- Töltse be a PWMxDCH regisztert és <7: 6> biteket a PWMxDCL regiszter a PWM munkakörnyezetével érték.
- 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.
- 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.
- 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.
- 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:
- Disable the PWMx pin output driver(s) by setting the associated TRIS bit(s).
- Clear the PWMxCON register.
- Load the T2PR register with the PWM period value.
- Load the PWMxDCH register and bits <7:6> of the PWMxDCL register with the PWM duty cycle value.
- 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.
- Enable PWM output pin and wait until Timer2 overflows, TMR2IF bit of the respective PIR register is set. See note below.
- Enable the PWMx pin output driver(s) by clearing the associated TRIS bit(s) and setting the desired pin PPS control bits.
- Configure the PWM module by loading the PWMxCON register with the appropriate values.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|