Sida 1 av 1
Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 13:18:10
av slatte
Ja jag håller på att försöka sparka igång CCP modulen i PWM mode på en PIC16f648A.
Men lyckas inte få något utslag på RB3 (CCP1).
Detta är första gången som jag försöker mig på att använda denna!
Var inte helt 100% säker på hur jag skulle göra med PEIE och TMR2IE men har provat både av och på så?
4Mhz kristall
kompilator: Hi-techC
Ser ni något fel i min initiering av modulen?
(beklagar min blandning av svenska och engelska

)
Kod: Markera allt
//PWM mode
PEIE = 0; //interrupt disable (peripheral)
TMR2IE = 0; //timer2 interrupt disable
TMR2IF = 0; //timer2 interrupt flag nollad
TOUTPS3 = 0; //timer2 postscaler (0000 = 1:1)
TOUTPS2 = 0;
TOUTPS1 = 0;
TOUTPS0 = 0;
TRISB3 = 0; //CCP1 som utgång
CCP1CON = 0; //reset CCP1 module
CCP1M3 = 1; //väljer PWM-mode(11xx)
CCP1M2 = 1;
CCP1M1 = 0;
CCP1M0 = 0;
TMR2 = 0; //nollar Timer2
PR2 = 0b11111111; //PWM periodtid
CCPR1L = 0b11111111; //Duty cycle (100%)
CCP1X = 1;
CCP1Y = 1;
T2CKPS1 = 0; //timer2 Prescaler (00 = 1:1)
T2CKPS0 = 0;
TMR2ON = 1; //timer2 ON
Efter att jag har fått modulen att fungera, så har jag en del andra funderingar:
- Ska det bara vara att skriva till "CCPR1L" "CCP1X" "CCP1X"
föra att ändra dutycycle inget mer ska jag väl behöva styra i mjukvaran?
- För att kunna stänga av PWM signalen, räcker det med att sätta TMR2ON = 0?
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 13:28:32
av sodjan
> CCPR1L = 0b11111111; //Duty cycle (100%)
Varför 100% ?? Är det inte lättare att felsöka med t.ex 50% ?
Är du helt säker på att du får någon pwm signal alls med 100% duty cycle ?
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 13:31:52
av slatte
Om jag kollar på utgången med voltmeter så får jag bara 0V!
Men har provat duty på 50% med.
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 13:37:32
av sodjan
> Om jag kollar på utgången med voltmeter så får jag bara 0V!
Ja, det kanske är förväntat med 100% duty cycle, jag har inte kollat. Har du ?
> Men har provat duty på 50% med.
Mycket möjligt, men det stämmer inte med din kod...
En annan sak, för att göra det lite mer lättläst, sätt gärna kontrollregistren med
en helt 8-bitars värde (på samma sätt som du gör med t.ex PR2). Då blir det bara
4-5 rader istället för 20-25 för att göra samma sak. Och har man alla 8 bitarna i rätt
ordning så blir det ganska enkelt att "mappa" över det till register beskrivningen i databladet.
Ett annat sätt att göra det mer lättläst är att sätta upp saker och ting i samma ordning
som databladet föreslår (det är möjligt att du gör det, det var för mycket för att kolla...).
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 13:56:26
av slatte
Nu har jag komprimerat koden lite hoppas den blir mer lättläst nu
Kod: Markera allt
//PWM mode
PEIE = 0; //interrupt disable (peripheral)
TMR2IE = 0; //timer2 interrupt disable
TMR2IF = 0; //timer2 interrupt flag nollad
T2CON = 0b00000100;
TRISB3 = 0; //CCP1 som utgång
CCP1CON = 0; //reset CCP1 module
CCP1CON = 0b00111100;
TMR2 = 0; //nollar Timer2
PR2 = 0b11111111; //PWM periodtid
CCPR1L = 0b11111111; //Duty cycle (100%)
TMR2ON = 1; //timer2 ON
Har även kollat genom att sätta CCPR1L = 0b00000000; vilket jag får till dutycycle (0%) .
Men jag tycker att som koden är nu borde den ge 5V ut på utgången.
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 14:17:04
av sodjan
Kör med (ca) 50%. Mycket lättare att felsöka. Jag är lite osäker
på vad som händer vid max och min värde på duty cycle...
> CCPR1L = 0b00000000; vilket jag får till dutycycle (0%)
Ja, om du sätter det två extra bitarna till "0" (minns inte var de finns eller vad de heter) också.
Annars vet jag inte. Du skulle kunna göra ett enkelt ASM program som gör samma
sak och prova med. T.ex genom att köra det i MPSIM.
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 15:16:08
av Walle
Varför hålla på och prova med 100% och 0% duty cycle???
Som sodjan skriver, det måste ju vara betydligt lättare att felsöka med ~50% duty cycle.
Vet du hur den
ska bete sig om du konfigurerar den för 100% duty cycle? För 100% duty cycle är ju annars "på" (eller av) 100% av tiden, altså
inte någon PWM-signal!!
Men hur de nu har löst det i den µCUn har jag ingen aning om.
Edit: De två extra bitarna som sodjan nämner, är bit 5 och 4 i CCP1CON.
Edit 2: sodjan nämnde att du kanske ska initiera i den ordningen de föreslår i databladet. Det kanske inte är en dum idé, när du ändå har städat upp din kod.
The following steps configure the CCP module for PWM operation:
1. Establish the PWM period by writing to the PR2 register.
2. Establish the PWM duty cycle by writing to the DCxB9:DCxB0 bits.
3. Make the CCPx pin an output by clearing the appropriate TRIS bit.
4. Establish the TMR2 prescale value and enable Timer2 by writing to T2CON.
5. Configure the CCP module for PWM operation.
Kod: Markera allt
CLRF CCP1CON ; CCP Module is off
CLRF TMR2 ; Clear Timer2
MOVLW 0x7F ;
MOVWF PR2 ;
MOVLW 0x1F ;
MOVWF CCPR1L ; Duty Cycle is 25% of PWM Period
CLRF INTCON ; Disable interrupts and clear T0IF
BSF STATUS, RP0 ; Bank1
BCF TRISC, PWM1 ; Make pin output
CLRF PIE1 ; Disable peripheral interrupts
BCF STATUS, RP0 ; Bank0
CLRF PIR1 ; Clear peripheral interrupts Flags
MOVLW 0x2C ; PWM mode, 2 LSbs of Duty cycle = 10
MOVWF CCP1CON ;
BSF T2CON, TMR2ON ; Timer2 starts to increment
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 15:39:11
av dangraf
har du satt porten som utgång i TRIS registret?
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 15:43:05
av sodjan
> har du satt porten som utgång i TRIS registret?
Just *det* är ju ganska tydligt i koden :
> TRISB3 = 0; //CCP1 som utgång
Om det (i C) gör det jag gissar, vill säga...
Som sagt, jag skulle göra ett litet ASM exempel för att verifiera att
man har förstått det hela, sedan porta över det till C. Om man inte
är bombsäker på att C-koden faktiskt gör exakt det man tror...
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 15:56:26
av ChristianS
Jag skrev ett litet testprogram när jag lekte en gång. Lite klipp och klistrat så jag kan inte försvara allt som står men den fungerade för mig.
I evighetsloopen skiftas duty cyklen för att testa lite olika värden.
Använder CC5X c-kompilator från bknd.com.
// Testar PWM ut
//#include "16f876.h"
//#pragma config |= 0x3ff2
uns8 x;
void delay10( char n)
/*
Delays a multiple of 10 milliseconds using the TMR0 timer
Clock : 4 MHz => period T = 0.25 microseconds
1 IS = 1 Instruction Cycle = 1 microsecond
error: 0.16 percent
*/
{
char i;
OPTION = 7;
do {
i = TMR0 + 39; /* 256 microsec * 39 = 10 ms */
while ( i != TMR0)
;
} while ( --n > 0);
}
void main(void)
{
/* Settings CCP1 PWM-mode */
PR2 = 249;
/* 10 bit Duty 0b01111101.0.0 = 500 */
CCPR1L = 0b01111101; /* testar bara med 8 bitar */
TRISC.2 = 0; /* CCP1 is output at RC2 ( pin 17 ) */
T2CON = 0b0.0000.1.01; /* 0, 0000 (1:1 postscale), 1 (TMR2 on), 01 (1:4 prescale) */
CCP1CON = 0b00.0.0.1111; /* --, 0 (CCP1X), 0 (CCP1Y), 1111 (PWMmode 11xx) */
while(1)
{
for(x=0;x < 16;x++)
{
delay10(100);
CCPR1L = x*16;
}
}
}
Re: Sparka igång CCP modulen i PWM-mode
Postat: 8 mars 2009, 17:00:55
av vfr
Snälla, använd CODE-taggarna för guds skull. Det blir helt oläsbart annars.