Hallo zusammen,
wenn ich das folgende Programm kompiliere und auf meinen ATmega16 lade,
würde ich erwarten, dass an keinem der C-Pins eine Spannung anliegt.
Allerdings kann ich mit dem Messgerät 5V an allen Pins messen.
1 | #include <avr/io.h>
|
2 |
|
3 | int main() {
|
4 | DDRC = 0xff;
|
5 | PORTC = 0x00;
|
6 | while(1) {}
|
7 | }
|
Der Code ist folgendermaßen gebaut worden:
1 | avr-gcc -D__AVR_ATmega16__ -o test.obj -Os test.c
|
2 | avr-objcopy -j .text -j .data -O ihex test.obj test.hex
|
Das weglassen der -Os Option produziert längeren Assemblercode, aber
dasselbe Ergebnis.
Ich habe die produzierte Binary dann mal disassembliert, mit folgendem
Ergebnis:
1 | .text
|
2 | main:
|
3 | ser r24
|
4 | out 0x14, r24 ; 20
|
5 | out 0x15, r1 ; 21
|
6 |
|
7 | ; Referenced from offset 0x06 by rjmp
|
8 | Label0:
|
9 | rjmp Label0
|
Wenn ich diese Assemblercode zu
1 | .text
|
2 | main:
|
3 | ser r24
|
4 | out 0x14, r24 ; 20
|
5 | ldi r24, 0x00
|
6 | out 0x15, r24 ; 21
|
7 |
|
8 | ; Referenced from offset 0x06 by rjmp
|
9 | Label0:
|
10 | rjmp Label0
|
ändere und neu assembliere, funktioniert alles wie erwartet.
Der gcc geht also davon aus, dass r1 mit 0 initialisiert ist, aber das
ist scheinbar nicht der Fall.
Liegt der Fehler im gcc, bei der Hardware oder in meinem Kopf?
Viele Grüße
Johannes