Bug in WinAVR 20060125

Gast #363538
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:
1
                      // faulty on WinAVR 20060125
2
                      // faulty on WinAVR 20040720
3
                      // faulty on WinAVR 20050214
4

5
                      // correct on WinAVR 20040404
6

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

10

11
                      // work around for WinAVR 20060125:
12

13
                      // positive float -> unsigned -> negative ->
14
unsigned
15

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

20

21
                      // another work around for WinAVR 20060125:
22

23
                      // negative float -> signed -> unsigned
24

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

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


Peter
Angehängte Dateien:
Gast #363540
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.

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.