Forum: Compiler & IDEs Bug in WinAVR 20060125


von peter dannegger (Gast)


Angehängte Dateien:

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

von karl-heinz (Gast)


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.

von A.K. (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

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.