Forum: Mikrocontroller und Digitale Elektronik Synchronitätsprobleme mit PCINT


von Andreas K. (totem)


Lesenswert?

Guten Abend verehrtes Forum,

nachdem ich Euch gestern mit einem vermeintlichen Genauigkeitsproblem 
der internen Timer des ATmega2560 auf STK600 verrückt gemacht habe 
(danke an der Stelle nochmal für die Tipps), dann der Verdacht von EMV 
aufgekommen ist, hat sich jetzt herausgestellt, dass das Problem mit der 
Abarbeitung der ISR zusammenhängt.
1
//Danke hier noch mal an Karl Heinz...
2
ISR(PCINT0_vect)
3
{
4
  uint8_t pinNowB = PINB;
5
  uint8_t diffB = pinNowB ^ pinOldB;
6
  
7
  if (diffB & (1<<PB0))  //Pin B0 hat ausgelöst
8
    intZaehler++;    //Die LS wurde durchschnitten
9
    //PORTA = PCIFR;       //DEBUGGING
10
    PCIFR &= ~(1<<PCIF0);  //DEBUGGING
11
  
12
  if (diffB & (1<<PB1))  //oder / UND(!) Pin B1 hat ausgelöst
13
  {  
14
      flDruck++;      //Der Drucksensor hat zu einer Flanke geführt
15
  }
16
  pinOldB = pinNowB;    //Merken der aktuallen Pinlevel, um die nächste Unterscheidung durchzuführen
17
}

Beide Interrupts haben eine Frequenz von ca. 100 Hz und zählen jeweils 
einen Counter hoch, der an anderer Stelle verarbeitet wird.
Teste ich jeweils eines der beiden Interrupts, ist es hinreichend genau. 
sobald aber beide abgearbeitet werden sollen, sind beide Counter zu 
hoch! Kann mir jemand sagen, wieso das passiert?
ich habe auch versucht, einen zweiten Interruptvektor auf einem anderen 
Port zu nutzen, also in jedem Vektor auf separaten Ports nur je einen 
Counter zählen zu lassen, der Effekt ist der gleiche. Wenn ich das Pin 
Change Flag Register manuell zurücksetze, dann detektiere ich zu wenig 
Flanken.
Ein interessanter Punkt noch: Das eine Signal kommt ja von einer 
Drehzahl messenden Lichtschranke. Je schneller das Objekt dreht, je mehr 
Flanken also kommen, desto größer wird der Fehler, der auf dem anderen 
Counter gemacht wird. Die Flanken sind jedoch immer im ms-Bereich von 
einander getrennt.

Weis jemand Rat? Habe leider keine ähnlichen Probleme (zumindest was 
ATmega2560 betrifft) auf Anhieb im Forum gefunden...

Beste Grüße in den frühen Abend

Andreas
von Oliver J. (skriptkiddy)


Lesenswert?

Hast du eventuell Übersprechen zwischen den Leitungen? Vielleicht hilf 
es beide Signal direkt vor dem Microcontroller zu filtern.

Gruß Oliver
von Andreas K. (totem)


Lesenswert?

Hallo Oliver,

das war auch mein erster Gedanke. Die Signale kommen aber von zwei 
(räumlich getrennten) Quellen und treffen sich erst am Controller. Kommt 
ein Übersprechen bei 5 V@100 Hz öfters vor?
von Andreas K. (totem)


Lesenswert?

Das Problem konnte ich provisorisch lösen, indem ich eine manuelle 
Abfrage in der Hauptschleife alle 1 ms mache, ob sich die Flanke 
geändert hat. Das schränkt die detektierbaren Signale zwar immens ein, 
reicht aber für den konkreten Anwendungsfall als Notlösung aus. Warum 
die Interrupts so stark daneben liegen muss ich bei Gelegenheit 
rausfinden.
Hat ansonsten keiner diese Erfahrung gemacht?

Beste Grüße

Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.