Konfigurera PWM-modulen i en PIC12F1840

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Hej hej,

Har aldrig labbat med en µC på en kopplingsbräda tidigare och tänkte nu slå två flugor i en smäll; delvis göra det jag precis nämnde och delvis konfigurera PWM-modulen i en PIC jag tidigare inte kikat på.
Jag använder MicroC, PICkit2 och µC är en PIC12F1840 (datablad).

Efter att ha uppdaterat device_lib till min PICkit2 så kände den igen µC:n vilket jag tog som ett gott tecken.

Jag tänkte använda P1A som PWM-utgång vilket är pinne RA2 (5 på IC:n) och provade först så jag ens fått till uppkopplingen rätt. Ett litet program laddades ner för att toggla RA2 av/på vilket verifierades med skopet.

Sen försökte jag med PWM:en och ett märkligt fenomen uppstod; När jag spänningssatte µC:n så gav RA2 ifrån sig ett knepigt brus som jag inte hann tolka med mitt gamla skop. Efter ca 2 sekunder försvann signalen helt.
För att verifiera att jag inte eldat µC:n så laddade jag toggle-programmet igen och det fungerade utmärkt.

I och med detta så är jag alldeles säker på att det är min konfigurering av PWM-modulen som är fel, och här behöver jag hjälp.
Givetvis kommer jag grotta vidare men lägger upp koden och bild på uppkopplingen ifall det är någon PIC-erfaren som direkt ser ett fel.

Koden kompilerar utan errors eller varningar och den externa kristallen kommer in i nästa steg när jag ska börja leka med PWM:en. Så nu ska µC:n vara konfigurerad till intern oscillator och kan inte vara helt tokigt då den kan toggla en output med ca 1/2 sek-intervall.
Kopplingsbräda.jpg

Kod: Markera allt

void main() {

  OSCCON = 0b00000010;      // 0....... PLL Inactivated
                            // .0000... Internal osc 31 kHz
                            // .....0.. Unused
                            // ......10 Internal osc block (Vad är detta?)
  
  TRISA.B2 = 0;             // Define PORT RA2 as output
  ANSELA = 0;               // Turn off Analog SELect register for port A
  
  PIR1 = 0b00000000;        // No interrupt flags are pending
  
  T2CON = 0b00000111;       // 0....... Unused
                            // .0000... Postscaler 1:1
                            // .....1.. Enable Timer2
                            // ......11 Prescaler 64
  
  CCP1CON = 0b00111100 ;    // ..11.... Use 10 bit res
                            // ....1100 P1A Active High, P1B Active High
                            
  PR2 = 241;                // PWM period
  
  while(1){
  }
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

Du vill alltså använda 31 KHz oscillatorn?

> Internal osc block (Vad är detta?)

Ja, det är vad det står.

Hela CONFIG saknas från koden.

> Efter ca 2 sekunder försvann signalen helt.

Whatchdog har 2 sek intervall som default.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

> Du vill alltså använda 31 KHz oscillatorn?
Ja just det.

>> Internal osc block (Vad är detta?)
>Ja, det är vad det står.

Skrev till den frågan till mig själv som en påminnelse att läsa på lite.

>Hela CONFIG saknas från koden.
Hmm, har du/ni någon erfarenhet hur jag exporterar den från MicroC? Det enda jag hittar är alla rullgardiner i "Project Settings" som jag för övrigt inte kan ta ett "screenshot" från då fönstret inte kan förstoras men scrollbart..
Har lagt med det jag ser här nedan så kanske det är lättare att förstå vad jag menar.

>Whatchdog har 2 sek intervall som default.
En mycket bra slutsats som jag måste gräva mer i. Enligt konfigurationen ska Watchdog:en vad deaktiverad men det vet vi ju sen innan att jag inte riktigt haft koll på.

EDIT: Hmm, jag måste väl sätta/ställa in CCPR1L också?
Konfiguration.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av vfr »

Magnus, konfig är mycket bättre att sätta i koden. Det finns direktiv för det i MPAsm.

Typ så här:

Kod: Markera allt

        __CONFIG        _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _ER_OSC_NOCLKOUT
Fördelen är att konfiginsällningen ligger med i källkoden till projektet istället för att ligga i MPLab.

Och visar du upp källkoden här t.ex så ser man direkt att du verkligen tänkt på inställningarna och vilka inställningar du använder.

Edit: Exemplet för assembler, om det nu var någon tvekan om det. :-)
Senast redigerad av vfr 1 juni 2014, 12:51:25, redigerad totalt 1 gång.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Jag måste nog läsa på lite mer vfr.
I MicroC trodde jag dom gjort detta lite mer visuellt i och med rullgardinerna, men jag har stört mig lite på att konfigurationen inte blir synlig i kod-fönstret, precis som du visar.

Dock på min nivå så blir det lite enklare med rullgardiner men skulle man direkt kunna "konvertera" den till en liknande rad som du skrev så tror jag att jag skulle ha lättare att förstå. Om det här var möjligt så skulle jag själv se till att kopiera in den övanför koden för att kunna kommentera och förtydliga.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

> istället för att ligga i MPLab.

Magnus kör inte MPLAB/MPASM. Rör inte till det...

Jag hittar inte direkt om/hur/att MikroC stöder CONFIG
settings direkt i källkoden. Jag hade för mig att det var
så. Synd om det inte är så. Det är ju *mycket* enklare
att posta en komplett bild i t.ex ett forum...

Hur som helst, hur var det med WDT ??
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Har aldrig använt WDT och mig veteligen har jag haft den inaktiverad i mina små projekt.

I konfigurationsbilden ovan ser man att jag satt den som "disabled" samt att "3FE4" i första konfigurationsordet ger 00 på bit 3 och 4 vilket är WDT inaktiverad.
(vilken svengelska...)

Jag ska sätta mig i lugn och ro ikväll och gå igenom registren igen, är ganska säker att det är något jag missat i databladet.
Återkommer!

Ps. Visst kan jag förutsätta att jag kopplat rätt då jag utan problem kan programera µC:n samt toggla en utgång va? Ds
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

> Har aldrig använt WDT...

Mycket möjligt. Men det vet ju inte *vi*... :-)

> Visst kan jag förutsätta att jag kopplat rätt då jag utan problem kan programera µC:n samt toggla en utgång va?

Du har i alla fall kopplat så mycket rätt så att det går att programmera... :-)
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av vfr »

sodjan skrev:> istället för att ligga i MPLab.

Magnus kör inte MPLAB/MPASM. Rör inte till det...
Nää. Jag skulle naturligtvis skrivit "i utvecklingsmiljön" istället. I den mån det är möjligt naturligtvis. Det var för att jag var inne på just ett exempel med MPAsm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Kikar vidare på det här nu och återkommer under kvällen med resultat men det dök upp en undring:
Är alla registerbitar 0 från början och sedan utgår man från det? Om inte, hur vet man hur registren står "default"?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

Det står i databladet (surprice! :-) ).
Sidan "3.3.5 CORE FUNCTION REGISTERS SUMMARY" och några sidor efter.
Titta under "Value on POR, BOR" och "Value on all other Resets".

Men, ta gärna för vana att alltid ställa alla register som är rellevanta
för just det du håller på med så som du vill ha dom, *även* om det
råkar vara detsamma som efter reset. Om inte annat så visar du
både för dig själv och för andra att du faktiskt har tänkt på just
det registret. Och du får även en färdig punkt i programmet att
ändra på, om du senare vill ha ett annat läge.

> Är alla registerbitar 0 från början

Det är alltså minst fem olika "lägen":
- 1
- 0
- x = unknown (oftast efter power on)
- u = unchanged (t.ex efter end reset med spänningen kvar)
- q = value depends on condition (beror på *varför* processorn startade om)



Är alla registerbitar 0 från början
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Hehe, ja vilken överraskning!
Nej men det där tyckte jag om. Tyvärr var det inga defualt-settings i registren som var problemet denna gång.
Det jag speciellt hade i åtanke var ett register som heter APFCON där man verkar kunna skifta utgångarna mjukvarumässigt. Å andra sidan en väldigt långsökt idé då det hade varit konstigt om det var så default.
Ja ja, nog om det.

Efter att ha grottat med register och datablad i en timme så slog det mig att prova med samma PWM-konfiguration som jag gjorde till min 16F690 och den fungerade kanon även på denna µC.
Ok, vad var då skillnaderna mot min kod, inte mycket mer än lite andra frekvenser. Nähä, vad är det då jag missar?

Här kommer "lösningen" men den avslutas med en fråga jag skulle uppskatta MYCKET om jag kan få ett bra svar på:

I min tidigare PWM-konfiguration så sattes T2CON, CCP1CON och PR2. Inom en while-loop laddades CCPR1L med ett värde som varierade för varje loop.
Om man kollar i min kod som jag postade tidigare i denna tråd så laddas aldrig CCPR1L med något värde.
Med hjälp av den här PIC PWM generatorn (som jag tror du tipsat om tidigare också sodjan) fick jag fram vilket värde jag skulle sätta CCPR1L med.
När jag hade gjort det så hoppade PWM-en igång så fint och allt är frid och fröjd.
Fråga: Vad är det för värde jag egentligen gav CCPR1L registret?
Hmmmmmm, nu när jag skriver det.. Värdet jag matade in var binärt 11110000 vilket blir 240 decimalt. Det är ju oroväckande nära vad jag satt PR2 till. Nu måste jag läsa lite till men svara hemskt gärna om det går att förklara enkelt!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

Om man sätter registren "rätt" så kan man få 0% eller 100% "duty cycle",
d.v.s att utgången kommer att ligga fast antingen hög eller låg.

> så laddas aldrig CCPR1L med något värde.

Och sannolikt så var den 0 efter reset. Skulle inte förvåna om det ger
0 eller 100 % duty cycle...

> Nu måste jag läsa lite till men svara hemskt gärna om det går att förklara enkelt!

Förklara vad? Du hade en fråga som du svarade på själv. :-)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av Magnus_K »

Jag var otydlig. Gör ett nytt försök nedan.

Fråga 1: I mitt första försök hade jag som sagt inte satt något värde i CCPR1L-registret och fick bara "brus" ut från PWM-porten. Enligt databladet ska registret innehålla "unknown" data vid POR. Är "unknown data" samma sorts data som hamnar i en oanvänd variabel, dvs slask-bitar?

Fråga 2: CCPR1L innehåller 8 bitar (MSB) och CCP1CON<5:4> innehåller de två LSB. I min konfiguration satte jag dessa två LSB-platser till 1 för att använda mig av 10-bitars upplösning.
Det jag inte förstår är om controllern själv sedan adderar dessa 8 MSB's med de 2 LSB's bara genom att jag satt registret att även använda de 2 LSB's eller om jag måste göra det själv på något sätt?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konfigurera PWM-modulen i en PIC12F1840

Inlägg av sodjan »

1. OK, ja det är visst "unknown". Kan väl vara lite vad som helst,
men ett visst exemplar tenderar till att ha samma värde varje gång.

2. PWM modulen har 10 bitars upplösning. 8 av dessa bitar ligger
i ett register (CCPR1L) och de två lägsta bitarna i CCP1CON<5:4>.

> I min konfiguration satte jag dessa två LSB-platser till 1 för att
> använda mig av 10-bitars upplösning.

Om du sedan ändå bara ändrar i CCPR1L, så använder du ju bara
8 bitar i alla fall. Om inte CCP1CON<5:4> ändras hela tiden som en
del av PWM värdet, så spelar det inte så stor roll vilket värde de har.
Det är ju ändå bara de två lägsta bitarna av ett 10-bitars värde...

PWM modulen i sig jobbar dock alltid med 10 bitar. Sen kan man välja
att hoppa över var fjärde värde (genom att inte ändra CCP1CON<5:4>)
men det spelar ingen roll för PWM modulen.
Skriv svar