Forum: Compiler & IDEs Problem mit Modulo


von Tilo (Gast)


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,

von johnny.m (Gast)


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

von Roland Schmidt (Gast)


Lesenswert?

0 % 250 ==> 0

von Tilo (Gast)


Lesenswert?

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.

von unsichtbarer WM-Rahul (Gast)


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




von Dirk (Gast)


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
}

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.