Problem mit Modulo

Gast #438733
Lesenswert?

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,
Gast #438738
Lesenswert?

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...
Gast #438762
Lesenswert?

>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
.
.
.
.
.



Gast #439414
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren