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