LED bleibt auf ATmega16 aus

Ich habe dieses einfache Programm geschrieben:

#include <avr/io.h>

int main(void) {
  DDRA = 0xff;
  PORTA = 0xff;
  while(1) {
  }
}

Wenn ich es auf meinen brandneuen ATmega16A-PU programmiere, sagt mir avrdude, dass alles in Ordnung ist. Aber wenn ich eine LED an Port A anschließe, wird sie nie aktiviert.

Um das Programm zu kompilieren und auf den ATmega zu flashen, verwende ich die folgenden Befehle:

avr-gcc -mmcu=atmega16 -c -o test.o test.c
avr-gcc -mmcu=atmega16 -o test.elf test.o
avrdude -p m16 -c avrispv2 -P usb -U flash:w:test.elf

Folgende Pins des Mikrocontrollers sind verbunden:

40 PA0 ---------> 220 Ω --> green LED --> GND
06 PB5 (MOSI) --> MOSI of the programmer
07 PB6 (MISO) --> MISO of the programmer
08 PB7 (SCK) ---> SCK of the programmer
09 RESET -------> RESET of the programmer
10 VCC ---------> VCC of the programmer
11 GND ---------> GND of the programmer

Wenn ich das linke Ende des 220 Ω-Widerstands direkt an VCC anschließe, leuchtet die LED, also ist die LED in Ordnung. Der Mikrocontroller ist nagelneu und ich habe schon einen anderen ausprobiert (ebenfalls nagelneu), also denke ich, dass sie auch ok sind.

EDIT: Die Fuses sind auf 0b10011001 (high) und 0b11100001 (low) gesetzt.

Irgendeine Idee, warum der Mikrocontroller Port PA0 nicht auf VCC setzt?

1. Sind die Sicherungen defekt? Hast du sie geändert? 2. Können Sie die Ausgabe für einbeziehen avr-objdump -C -d test.elf? 3. Verwenden Sie Windows/Linux/... 4. Fügen Sie auch die vollständige Ausgabe für Ihre avrdude-Befehlszeile hinzu. 5. Fügen Sie einen Link zum Datenblatt des Controllers hinzu. 6. Fügen Sie nach Möglichkeit ein Bild Ihres Aufbaus hinzu.
Ich benutze Linux. Die Ausgabe von avr-objdump: pastebin.com/htm68TPy
Nicht sicher warum, aber laut Disassemblierung schreibt Ihr Programm überhaupt nicht in die Portregister.
Sind Sie sicher, dass Sie die Datei flashen möchten .elf?
@jippie schreiben die beiden Anweisungen nicht st Z,r18durch indirekte Adressierung in die Portregister (was zugegebenermaßen nach einer umständlichen Methode aussieht)?
@microtherion das habe ich irgendwie übersehen. Das würde den Code erklären, richtig. Die Verwendung der .elf-Datei anstelle der .hex-Datei erklärt, warum die LED nicht leuchtet.
Die Registerzusammenfassung mit doppelter $address ($address) verwirrt mich immer wieder.

Antworten (1)

Zu viele Details für einen Kommentar, also habe ich mich entschieden, es als Antwort zu schreiben.

Versuchen Sie diese Befehle:

cflags="-g -DF_CPU=1000000 -Wall -Os -Werror -Wextra"
avrType=m16

avr-gcc ${cflags} -mmcu=${avrType} -Wa,-ahlmns=test.lst -c -o test.o test.cpp
avr-gcc ${cflags} -mmcu=${avrType} -o test.elf test.o
avr-objcopy -j .text -j .data -O ihex test.elf test.hex
avrdude -p ${avrType} -c avrispv2 -P usb -v -U flash:w:test.hex

Suchen Sie unter http://git.linformatronics.nl/gitweb/?p=makefile;a=summary nach einem generischen Makefile. Es muss etwas angepasst werden, da ich einen anderen Programmierer und Controller verwende, aber es sollte ziemlich einfach sein.

Danke! Du hattest Recht. Ich wollte die elf-Datei nicht wirklich flashen. Ich wollte eine Hex-Datei ...