www.mikrocontroller.net

Forum: Compiler & IDEs Bug in WinAVR 20060125


Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nun hats mich auch erwischt.

Ich hab mich dumm und dämlich gesucht, warum ich mit T0 keinen 10ms
Interrupt hinkriege.
Bis ich dann gemerkt habe, daß TCNT0 immer mit 0 vorgeladen wurde,
statt mit dem berechneten Wert.
Den Reloadwert kann man ja als negative Zahl betrachten, von der aus
bis 0 hochgezählt wird.
Macht man nun diese Rechnung mit float Zahlen, macht der WinAVR aber 0
daraus.
Hier mal das Listing:
                      // faulty on WinAVR 20060125
                      // faulty on WinAVR 20040720
                      // faulty on WinAVR 20050214

                      // correct on WinAVR 20040404

TCNT0 = (unsigned char)-(1e6 / 1024 * 10e-3);
58:   12 be           out     0x32, r1        ; 50


                      // work around for WinAVR 20060125:

                      // positive float -> unsigned -> negative ->
unsigned

TCNT0 = (unsigned char)-(unsigned char)(1e6 / 1024 * 10e-3);
5a:   87 ef           ldi     r24, 0xF7       ; 247
5c:   82 bf           out     0x32, r24       ; 50


                      // another work around for WinAVR 20060125:

                      // negative float -> signed -> unsigned

TCNT0 = (unsigned char)(signed short)-(1e6 / 1024 * 10e-3);
5e:   82 bf           out     0x32, r24       ; 50

Anbei das C-Programm.
Der alte WinAVR20040404 konnte es aber noch richtig.


Peter

Autor: karl-heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist es ein bug wenn man mit negativzahlen einen schnelleren weg zum
zählen eingeschlagen hat?
ich glaube nicht.
der korrekte weg vom timer ist null.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Verhalten ist korrekt, denn wenn in einer float => integral type
conversion der Wert nicht ins Ziel passt, ist das Verhalten
ausdrücklich undefiniert.

Und weil -9 nicht in einen unsigned char passt, ist der Compiler bei
Beispiel 1 frei, zu tun was immer ihm beliebt.

In den übrigen Beispielen ist die float=>integral conversion durchaus
möglich und für die int=>unsigned conversion gelten andere Regeln.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch
Seit wann, bitte, passt -9 nicht in einen unsigned char?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry. Denkfehler
Warum merkt man immer erst im Moment des Sendens, dass
man Bloedsinn geschrieben hat?

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.