Do CCPR1H nelze zapisovat při použití PWM. Takto je to v datasheetu:
Střídu opakovací frekvence lze nastavit v rozsahu 1024 hodnot nastavením registru CCPR1L a dvou bitů v registru CCP1CON. V registru
CCPR1L je obsaženo osm významnějších bitů rozlišení střídy. Pro stanovení střídy PWM lze použít následující vzorec:
Střída PWM = (CCPR1L:CCP1CON<5:4>) • TOSC • (dělicí poměr předěličky Timer2)
Registry pro nastavení střídy CCPR1L a CCP1CON mohou být modifikovány kdykoli, ale nastavená změna střídy se projeví až po ukončení periody opakovací frekvence, kdy dojde k zápisu do registru CCPR1H. V režimu PWM je registr CCPR1H určen jen ke čtení.
Registr CCPR1H a dvou bitový vnitřní záchytný obvod pracují jako dvojitý buffer. Toto řešení umožňuje plynulé generování signálu PWM.
Poznámka: Pokud je nastavená doba pro určení střídy delší než celková perioda opakovací frekvence,
nebude výstup PWM nulován.
Osobně používám jen registr CCPR1L, protože jsem tak jemné rozlišení PWM nepotřeboval.
Kus kódu:
; Pro interni oscilator 4MHz
;--------------------------------------------------------------------;
list p=16F88, r=DEC
#include P16F88.INC
;--------------------------------------------------------------------;
;Nastaveni konfigurace procesoru:
__CONFIG _CONFIG1,_CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO & _CCP1_RB3
__CONFIG _CONFIG2,_IESO_OFF & _FCMEN_OFF
#define PWM PORTA,3 ; vystup, PWM pro buzeni motoru
#define RELE PORTA,2 ; vystup, RELE pro pripojeni motoru
NASTAVENI_PWM ; v INIT
CLRF T2CON ; vynuluj registr T2CON
CLRF TMR2 ; vynuluj registr TMR2
CLRF INTCON ; vynuluj registr INTCON
BSF STATUS,RP0
CLRF PIE1 ; vynuluj registr PIE
BCF STATUS,RP0
CLRF PIR1 ; vynuluj registr PIR1
BSF STATUS,RP0
MOVLW 0xFF
MOVWF PR2 ; nacti 255 do registru PR2
BCF STATUS,RP0
MOVLW 0x00 ; nacti 0 do registru CCPR1L
MOVWF CCPR1L
MOVLW 0xFF ; nacti 255 do registru T2CON
MOVWF T2CON ; prescaler 1:16 and postscaler 1:1
MOVLW 0x00 ; nacti 0 do registru CCP1CON
MOVWF CCP1CON ; vypnuti pwm
BSF T2CON,TMR2ON ; log. 1do registru T2CON,TMR2ON
SPUST_PWM
BSF RELE ; sepni RELE a pripoj motor
MOVLW 0x3C ; aktivuj PWM
MOVWF CCP1CON
MOVLW 0x00 ; nula do registru PWM
MOVWF CCPR1L
ROZBEH_PWM
CALL CEK4m
INCF CCPR1L,F ; inkrementuj CCPR1L po 4 ms
MOVF AD_PWM,W ; porovnej s hodnotou AD prevodu
XORWF CCPR1L,W ; pokud je hodnota shodná, pokracuj dale
BTFSS STATUS,Z
GOTO ROZBEH_PWM
; neco dal delej