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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren