Några Comparator och Interrupt-frågor för 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

Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Vet inte riktigt hur jag ska göra för att få med all nödvändig information men utan att det blir överflödigt. Gör ett försök.

Controller: PIC12F1840
IDE och kompilator: MikroC Pro for PIC
Programmerare: PicKit2

Mål:
Att släcka den röda LED:n när en 5V insignal ges på ingången genom en knapptryckning. Detta ska ske med användning av intern komparator och interrupt-rutin.

Setup:
Genom att komparatorn använder den interna spänningsreferensen (här 4,096V) som "-" och 5V insignal via knappen som "+" så ger den en interruptflagga vid knapptryckning och programmet sätter då LED-utgången låg.

Problem och frågor:
LED och knapp är verifierat att dom inte är defekta.

1.) Förvisso ska komparatorn ha analoga signaler in men som jag förstår databladet så behöver man inte använda ADC:n till detta utan enbart behöver sätta knapp-ingången till analog ingång. Är det rätt förstått?

2.) Ser min interruptrutin korrekt ut? Det jag försökt med är alltså att när jag får PIE2.C1IF (komparators interruptflagga) så sätter den LED:ens utgång låg. Kan man skriva som jag gjort? Har testat lite olika varianter utan framgång.

3.) Har ni fler förslag på hur jag kan felsöka? Tycker det blir lite svårt när jag nyttjar interna funktioner. Känns som att jag inte kan förenkla det mer än så här.

Uppkoppling och kod:
Interruptkoppling.jpg

Kod: Markera allt

void main() {

  OSCCON = 0b01110010;                            // 0....... Software PLL disabled
                                                  // .1110... 8 Mhz
                                                  // .....0.. Unused
                                                  // ......10 Use internal oscillator

  ANSELA = 0b00010000;                           // Enable Analog function on RA4, all other Digital

  CM1CON0 = 0b10010100;                           // 1....... Enable the Comparator module
                                                  // .0...... Ignore polarity of output pin due to internal use only
                                                  // ..0..... C1OUT is internal only
                                                  // ...1.... Output is inverted
                                                  // ....0... Unused
                                                  // .....1.. Operate in normal (high) power mode
                                                  // ......0. Disable comparator hysteresis
                                                  // .......0 Comparator output to Timer1 and I/O is asynch.

  PIE2 = 0b00010000;                              // ...1.... Enable Comparator C1 interrupt bit, all other disabled

  CM1CON1 = 0b10100001;                           // 1....... Give C1IF flag on rising edge
                                                  // ..10.... C1VP connects to FVR Reference
                                                  // .......1 C1VN connects to C1IN1- pin

  INTCON = 0b01000000;                            // 0....... Disable global interrupts
                                                  // .1...... Enable all active peripheral interrupts

  FVRCON = 0b11001100;                            // 1....... Fixed Voltage Reference Enable
                                                  // .1...... FVR output ready (default)
                                                  // ....11.. Comparator FVR output is 4x (4,096V)

  TRISA = 0b00010000;                             // Define PORT RA4 as input
  
  PORTA.B5 = 1;                                   // Set RA5 as 1



  while(1) {}
  
}
void interrupt(void) {

     if(PIR2.C1IF) {
     PORTA.B5 = 0;
       }
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Klas-Kenny »

Med GIE (INTCON bit 7) satt till 0 lär du ju inte precis generera mycket till interrupts.. :)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Har tidigare testat med även globala interrupts aktiverade men utan framgång.
Sen har jag för mig att jag läst någonstans att så länge jag bara ska använda mig av komparator-interruptet (eller vilken "peripheral" interrupt som helst) så är det endast bit 6 som behöver sättas 1.

I vilket fall som helst så testade jag igen och LED:en lyser stadigt oberoende av knapptryck.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Icecap »

Utan GIE kommer det ingen interrupt alls!

Sedan är den bristande interrupt sannolikt för att någon inställning är fel.

Har du gjort en testversion som kan visa status på comparatorns utgång? På det vis kan du se om den "rör på sig" vilket ju kan påstås vara ganska viktigt.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Klas-Kenny »

Kollar man på sidan 67 i databladet syns det tydligt att GIE måste vara satt till 1.
Interrupt.PNG
Men ett tips, börja med att köra utan interrupt, skriv CMOUT direkt till lysdioden eller något i den stilen för att se om du får igång komparatorn. När du vet att komparatorn fungerar, kan du gå på interrupten. Blir alltid mycket svårare när man försöker med två nya saker samtidigt. :)

Inte en aning om vad som är korrekt (hittar det inte i databladet?), men när jag använt komparatorn har jag satt ingången till digital, och det har fungerat. Vet inte alls om det slutar fungera med den analog eller ej, men som sagt, det har fungerat för mig med den digital. :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Ja där hade jag fel. GIE ska vara satt!

Ska testa ikväll att låta komparatorn ge utsignalen direkt till LED:en, precis som ni säger.

Klas-Kenny skrev:Inte en aning om vad som är korrekt (hittar det inte i databladet?), men när jag använt komparatorn har jag satt ingången till digital, och det har fungerat. Vet inte alls om det slutar fungera med den analog eller ej, men som sagt, det har fungerat för mig med den digital.
Ska kika mer på det här. Från början hade jag "glömt" att sätta den analog så de första försöken skedde med ingången konfigurerad som digital.

Återkommer!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av sodjan »

> Inte en aning om vad som är korrekt (hittar det inte i databladet?)...

Korrekt är att sätta pinnen efter användningen analog/digital.
Komparator är så klart analog.

> men när jag använt komparatorn har jag satt ingången till digital, och det har fungerat.

Det "fungerar". Den analoga funktionen är alltid aktiv, men den digitala
ingången kan/bör stängas av för att inte dra ström i onödan. Digitala
ingångar tycker inte om spänningsnivåer som ligger och flyter.

> Vet inte alls om det slutar fungera med den analog eller ej, men som sagt, det
> har fungerat för mig med den digital.

Det fungerar bättre som analog pinne.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Klas-Kenny »

Sodjan: Sedär, då har man lärt sig något! :tumupp:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av sodjan »

Som andra sa så istället för interruptet så kan du loopa och kopiera
komparatorns utgång till pinnen med lysdioden. Något i stil med:

Kod: Markera allt

...
  while(1) {
  PORTA.B5 = CM1CON0.C1OUT
  }
}
och plocka/kommentera bort ISR'en tillsvidare.

Men å andra sidan så kanske det bara var GIE som var fel. :-)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Ja! Nu jäklar!
Kopplade in en annan LED på RA2 (C1OUT utgång) precis som ni föreslog. Lade till den lilla kodsnutten du skrev sodjan.
Resultatet blev enligt önskemål att den "nya" LED:en som indikerar komparatorutgång aktiv lyser när jag håller ner knappen.

Skrev in ISR:en igen och nu skulle alltså båda LED:arna lysa när jag trycker på knappen, vilket dom inte gjorde, enbart den "nya" lyste vilket borde innebära att jag inte får någon flagga.

Jag började skriva detta svaret och stapla upp alla villkor som skulle vara sanna för att få flaggan. Du fann jag felet! Om ni ser i min första post så har jag skrivit:

Kod: Markera allt

PIE2 = 0b00010000;                // ...1.... Enable Comparator C1 interrupt bit, all other disabled
Jo visst, kommentaren kanske var önskad inställning men i själva verket hade jag aktiverat EEPROM write completion interruptet...

Rättade till detta och det fungerar! Båda LED:arna lyser. Nu ska jag bara återgå till min interna funktion och labba vidare men jag har en avslutande fråga; nu när knappen blivit tryckt så vill jag i detta fallet "cleara" flaggan när knappen släpps, hur "clearar" man flaggan lämpligast?
Provade med:

Kod: Markera allt

void interrupt(void) {

       if(PIR2.C1IF) {
       PORTA.B5 = 1;
       PIR2.C1IF = 0;
       }
}

och

void interrupt(void) {

       if(PIR2.C1IF) {
       PORTA.B5 = 1;
       }
       PIR2.C1IF = 0;
}
men den clearades aldrig. Har ni lust att leda en blind?
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Klas-Kenny »

Det finns en bit i något av registerna för att generera interrupt både då komparatorutgången går "hög" och "låg". Sen får du bara ha någon variabel för att hålla reda på om lysdioden är i tänt eller släckt läge. Så vid interrupt kollar du den variabeln, ändrar lysdiodens status, samt ändrar variabelns status.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Ja just det, bit 6 och 7 i CM1CON1 väljer om flaggan ska triggas på rising/falling edge. Jag valde rising tidigare och det får vara kvar.

Ser ju nu också att som det är skrivet nu så sätter man ju utgången till 1 men sen nollas den aldrig.
Provade att skriva "PORTA.B5 = ~PORTA.B5;" och då fungerar det men märker att jag får problem med avstudsning. Nåja, det var inte problemet.

Kanooooon, tack ska du/ni ha!
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Klas-Kenny »

Just att skriva PORTA.B5 = ~PORTA.B5; är aldrig en riktigt god idé. Det kanske fungerar i just ditt fall, men som "best practice" ska det alltid undvikas.

Problemet är att när du läser ifrån utgången så kan du inte vara helt säker på att du det logiska tillståndet µC'n läser in är just det du satt det till. Allmänt känt som "Read-Modify-Write Problem", du kan läsa mer om det exempelvis här:
http://www.mikroe.com/download/eng/docu ... lp/rmw.htm

Det är därför jag skrev om att du ska använda en variabel för att hålla koll på vilket tillstånd du är i. :)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av Magnus_K »

Ah, bra! Tack för den, nu hänger jag med :wink:
Läste också ett inlägg i någon annan tråd att man i de senare PIC:arna tillgång till "LATCH"-registren. Om man har möjligheten så bör man alltid ska läsa PORTx men skriva till LATx.

Eftersom jag har det i denna modell så tänkte jag använda mig av det i den slutgiltiga koden.

Ska ta och läsa igenom din länkade sida i dagarna!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Några Comparator och Interrupt-frågor för PIC12F1840

Inlägg av sodjan »

> PIE2 = 0b00010000; // ...1.... Enable Comparator C1 interrupt bit, all other disabled

Gör istället:

Kod: Markera allt

  PIE2 = 0;
  PIE2.C1IE = 1;
Det behöver inga kommentarer eftersom det är helt solklart vad som görs.
Undvik generellt kod där man måste räkna bitar, det finns ju symboler för allt.
Skriv svar