Hallo Ich verwende WinARM mit gcc 4.1.1 und will einen ARM-Prozessor programmieren. Timer1 löst alle 1ms einen Interrupt aus. Alle 250ms soll ein Messwert gespeichert werden. Die Messwerte sollen in einem Ringpuffer zwischengespeichert und dann ausgegeben werden. // Interruptroutine if (timer1count % 250==0 ) { [...] timer1count=0; } else timer1count++; Meine Idee war, timer1count so lange hochzuzählen, bis die Division durch 250 restlos auf geht. if (timer1count == 250) ... funktioniert. Mit Modulo wird die if-Bedingung immer ausgeführt. Weiß jemand warum? Vielen Dank,
Statt
1 | if (timercount % 250 == 0) |
kann man auch schreiben
1 | if (!(timercount % 250)) |
Allerdings sollte das nicht zu einem Problem führen. Die sicherste und einfachste Methode ist sicher
1 | if (timercount >= 250) |
Dabei muss der Prozessor nämlich nicht jedes mal die Modulo-Operation durchführen (weiß nicht, wie die implementiert ist), sondern nur einen einfachen Vergleich. Und sollte mal aus irgendwelchen Gründen ein Wert größer als 250 in der Variable stehen, dann wird auch in dem Fall der Zähler zurückgesetzt. Der einfache Vergleich ist wahrscheinlich die beste Wahl. Ich kenne Deinen genauen Anwendungszweck nicht, aber ich würde nie auf die Idee kommen, so etwas mit Modulo zu machen, wenn eh nur Werte kleiner gleich 250 auftreten können. Dass das mit Modulo nicht funktioniert, wundert mich allerdings schon ein bisschen. Logisch korrekt ist es ja an sich...
Danke Roland, die 0 hab ich natürlich nicht bedacht :) Ein einfacher Vergleich ist natürlich besser. Warum ich auf die Idee mit Modulo gekommen bin weiß ich nicht mehr.
>Warum ich auf die Idee mit Modulo gekommen bin weiß ich nicht mehr. Ich aber! >Die Messwerte sollen in einem Ringpuffer zwischengespeichert >und dann ausgegeben werden. Quatsch:
1 | >if (timer1count % 250==0 ) { |
2 | > [...] |
3 | > timer1count=0; |
4 | >} |
5 | >else timer1count++; |
Sinnvoll:
1 | timer1count++; |
2 | timer1count = timer1count % 250; // so kann timer1count nie grösser als 249 werden. |
249 % 250 = 249 250 % 250 = 0 1 % 250 = 1 . . . . .
Hi, machen wir es ein bischen anders geht es auch Peusdo C Code:
1 | volatile u8 timer=0; |
2 | |
3 | |
4 | ISR(TIMER){ |
5 | timer++; |
6 | if(!(timer%8)){ |
7 | PORTD ^= (1<<0); |
8 | }
|
9 | |
10 | if(!(timer%64)){ |
11 | PORTD ^= (1<<1); |
12 | }
|
13 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.