Hi! Ich unternehme gerade meine ersten Gehversuche mit einem ATmega162
und C. Dabei habe ich ein für mich nicht nachvollziehbares Verhalten bei
folgendem Code:
1 | while(1)
|
2 | {
|
3 | for (unsigned char i=7; i!=255; i--)
|
4 | {
|
5 | PORTE=i;
|
6 | for (unsigned char j=1; j<=5; j++) _delay_ms(100);
|
7 | }
|
8 |
|
9 | for (unsigned char j=1; j<=25; j++) _delay_ms(100);
|
10 | }
|
Im Simulator von AVR Studio wird wie erwartet PORTE nacheinander auf 7,
6, 5, 4, 3, 2, 1, 0 gesetzt; im nächsten Durchlauf der while-Schleife
wiederholt sich dies.
Der AVR dagegen macht folgendes: PORTE läuft von 7 bis 1, dann kommt das
lange Delay (an dem man erkennt, dass die for-Schleife verlassen wurde),
und erst im nächsten Durchlauf der while-Schleife kommt die 0, und dann
wieder 7 bis 1 usw. Also
7 - 6 - 5 - 4 - 3 - 2 - 1 _ 0 - 7 - 6 - ...
statt
7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 _ 7 - 6 - ...
(wobei "-" für das kurze und "_" für das lange Delay steht).
Konsequenterweise gibt der AVR genau die richtige Sequenz aus, wenn ich
die 255 im Kopf der for-Schleife durch 254 ersetze. Im Simulator dagegen
wird in diesem Fall natürlich auch noch der Wert 255 an PORTE
zugewiesen, was diesen auf 111, also 7 setzt. Man kann also sagen, dass
der AVR den letzten for-Durchlauf einfach weglässt. Weiß jemand warum?