Светодиод не горит на ATmega16

Я написал эту простую программу:

#include <avr/io.h>

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

Когда я программирую его на свой новый ATmega16A-PU, avrdude говорит мне, что все в порядке. Но когда я подключаю светодиод к порту А, он никогда не включается.

Для компиляции программы и прошивки на ATmega я использую следующие команды:

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

Подключены следующие выводы микроконтроллера:

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

Когда я подключаю левый конец резистора 220 Ом напрямую к VCC, светодиод светится, значит, со светодиодом все в порядке. Микроконтроллер совершенно новый, и я уже пробовал другой (тоже совершенно новый), так что я думаю, что они тоже в порядке.

РЕДАКТИРОВАТЬ: предохранители установлены на 0b10011001 (высокий уровень) и 0b11100001 (низкий уровень).

Любая идея, почему микроконтроллер не устанавливает порт PA0 на VCC?

1. Предохранители установлены по умолчанию? Вы меняли их? 2. Можете ли вы включить вывод для avr-objdump -C -d test.elf? 3. Вы используете Windows/Linux/... 4. Также включите полный вывод для вашей avrdudeкомандной строки. 5. Включите ссылку на техническое описание контроллера. 6. Если возможно, добавьте изображение вашей установки.
Я использую линукс. Вывод avr-objdump: pastebin.com/htm68TPy
Не знаю почему, но ваша программа вообще не пишет в регистры портов, судя по дизассемблированию.
Вы уверены, что хотите прошить .elfфайл?
@jippie разве две инструкции не st Z,r18записывают в регистры порта через косвенную адресацию (что, по общему признанию, выглядит неуклюжим способом)?
@microtherion Я как-то упустил это из виду. Это объяснило бы код, правильно. Использование файла .elf вместо файла .hex объясняет, почему светодиод отказывается загораться.
Сводка реестра с двойным $адресом ($address) продолжает меня смущать.

Ответы (1)

Слишком много деталей для комментария, поэтому я решил написать это как ответ.

Попробуйте эти команды:

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

Проверьте http://git.linformatronics.nl/gitweb/?p=makefile;a=summary для общего файла Makefile. Это потребует некоторой настройки, так как я использую другой программатор и контроллер, но это должно быть довольно просто.

Спасибо! Ты был прав. Мне не очень хотелось прошивать файл elf. Я хотел шестнадцатеричный файл...