Sparka igång CCP modulen i PWM-mode

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
slatte
Inlägg: 420
Blev medlem: 1 april 2008, 16:05:17
Ort: Jönköping

Sparka igång CCP modulen i PWM-mode

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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 ?
Användarvisningsbild
slatte
Inlägg: 420
Blev medlem: 1 april 2008, 16:05:17
Ort: Jönköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg av slatte »

Om jag kollar på utgången med voltmeter så får jag bara 0V!
Men har provat duty på 50% med.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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...).
Användarvisningsbild
slatte
Inlägg: 420
Blev medlem: 1 april 2008, 16:05:17
Ort: Jönköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Sparka igång CCP modulen i PWM-mode

Inlägg av dangraf »

har du satt porten som utgång i TRIS registret?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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...
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Re: Sparka igång CCP modulen i PWM-mode

Inlägg 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;
}

}

}
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Sparka igång CCP modulen i PWM-mode

Inlägg av vfr »

Snälla, använd CODE-taggarna för guds skull. Det blir helt oläsbart annars.
Skriv svar