mikrocontroller.net

Forum: Compiler & IDEs Problem mit Modulo


Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt
if (timercount % 250 == 0)
kann man auch schreiben
if (!(timercount % 250))
Allerdings sollte das nicht zu einem Problem führen. Die sicherste und 
einfachste Methode ist sicher
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...

Autor: Roland Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0 % 250 ==> 0

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
>if (timer1count % 250==0 ) {
> [...]
> timer1count=0;
>}
>else timer1count++;

Sinnvoll:
 timer1count++;
 timer1count = timer1count % 250; // so kann timer1count nie grösser als  249 werden.
249 % 250 = 249
250 % 250 = 0
1   % 250 = 1
.
.
.
.
.




Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, machen wir es ein bischen anders geht es auch

Peusdo C Code:
volatile u8 timer=0;


ISR(TIMER){
timer++;
if(!(timer%8)){
 PORTD ^= (1<<0);
}

if(!(timer%64)){
 PORTD ^= (1<<1);
}
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.