PIC16F88 a PWM

Ahoj.
Řeším jednu aplikaci s 16F88 a PWM a narazil jsem na problém, kde zadám pin pro PWM (RB0 nebo RB3). Podařilo se mi to jen v nastavení sw UP od Asix pro programátor Presto. Funguje mi to, jen se chci ujistit, zda bych nemohl v tom konfiguračním slově zadat přímo ten pin. V datasheetu píší, citace: Vstup nebo výstup modulu CCP1 může být konfigurován na vývodu RB0 nebo RB3. Volba se provádí pomocí bitu CCPMX, což je 12. bit konfiguračního slova mikropočítače. Nechci to jako 3FFF nebo tak, zajímá mě, jak to zapsat do __CONFIG. Moje převzatá nastavení konfigurace pro testování je zde:

;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
__CONFIG _CONFIG2,_IESO_OFF & _FCMEN_OFF

NASTAVENI_PWM ; vlastni nastaveni PWM

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		; preddelic 1:16, po delic 1:16, TMR2 = ON
MOVWFPR2
BCF	STATUS,RP0
MOVLW	0x00	        ; nacti 0 do registru CCPR1L
MOVWF	CCPR1L
MOVLW	0XFF
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

    MOVLW	0x3F		
MOVWF	CCP1CON		; zapnuti pwm

TEST_2

CALL	CEK15m

INCFSZ	CCPR1L,F          ; postupny nabeh pWM

GOTO	TEST_2

    atd ......                            ; PWM 100% a nejake dalsi zpracovani bla, bla, bla ,....

CFG Presto 16F88.PNG

Připadá mi,že se to nastavuje tím CCP1_RB0 ,nebo CCP1_RB3(_CCP1_RB3 ,nebo CCPB3).Při otevření hex souboru v programu Presta by se mohla nastavit položka CPPMux automaticky.
(bez záruky)

Tak to překladačem neprojde

Jak to vypadá v souboru hlavičkovým 16F88.asm ? jaký je používán překladač (MPLab,X8 …) ?

V hlavičkovým souboru je to definováno takto:
_CCPMX_RB3 EQU H’2FFF’ ; CCP1 function on RB3
_CCP1_RB3 EQU H’2FFF’ ; CCP1 function on RB3
_CCPMX_RB0 EQU H’3FFF’ ; CCP1 function on RB0
_CCP1_RB0 EQU H’3FFF’ ; CCP1 function on RB0

Zkusil bych dát do __CONFIG _CONFIG1, něco z výše uvedeného (přepsáním _CCP1_RB0)

Ano, v hlavičkovém souboru je to definováno, jak píšeš. Ale překladač MPASM verze 5.02, mi to nebere. Zadat do toho __CONFIG _CONFIG1 jsem to samozřejmě zkoušel.

PS. Tak si sypu popel na hlavu a mažu okolo máslem!!! :blush:
Blbě jsem zadal mezeru, tak proto mi to nezkousnul ten překladač.
Díky

Zrovna řeším taky PWM u totožného procesoru.Narazil jsem na malý zádrhel -jak se řeší rozlišení 10bit ? Je potřeba řešit oba registry CCPR1L a CCPR1H ? Případně kousek kódu.
Děkuji za tipy

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