PIC16F88 a PWM

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