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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.