Lass uns das ganze mit kleineren Zahlen probieren.
Wir wollen 5 Interrupt Aufrufe abzählen. Bei jedem 5. soll etwas
passieren.
Variante 1 (deine und unsere)
count++;
if( count > 4 ) {
count = 0;
... // Aktion
count sei 3 (ich steige mitten drinnen ein um die Unsicherheit zu
umgehen, was genau mit der allerersten 0 passiert
count am Anfang nach Erhöhen nach if Aktion
------------------------------------------------------
3 4 4 Nein
4 5 0 Ja
0 1 1 Nein
1 2 2 Nein
2 3 3 Nein
3 4 4 Nein
4 5 0 Ja
0 1 1 Nein
....
Zähl die Anzahl der Zählvorgänge von einem Ja zum nächsten.
Es sind genau 5. So wie gefordert
(Man kanns acuh so sagen: In jeder 5. Zeile steht ein 'ja'
Variante 2 (die deines Professors)
count++;
if( count > 3 ) {
count = 0;
...
count am Anfang nach Erhöhen nach if Aktion
------------------------------------------------------
3 4 0 Ja
0 1 1 Nein
1 2 2 Nein
2 3 3 Nein
3 4 0 Ja
0 1 1 Nein
...
Wie man sieht vergehen von einem Ja zum nächsten nur 4 Zählvorgänge.
D.h. Hier wird die Aktion bei jedem 4. ISR Aufruf ausgelöst.
Fazit:
Will ich n Interrupt Aufrufe abzählen und bei jedem n-ten etwas
auslösen, dann muss es heißen
1 | count++;
|
2 | if( count == n ) {
|
3 | count = 0;
|
4 | .... // Aktion
|
5 | }
|
oder eben mit >
1 | count++;
|
2 | if( count > (n-1) ) {
|
3 | count = 0;
|
4 | ... // Aktion
|
Dein Professor hat Unrecht. Ihr liegt richtig. Da hat er was
verwechselt.
Die Rechnung ergibt, dass für 1 Sekunde 125 ISR Aufrufe abgezählt werden
müssen. Sein Code zählt aber nur 124 ab.
Fazit 2:
Man kann sich viele Dinge klarer machen, wenn man mit kleinen Zahlen
einfach eine Probe macht.