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