LED permanece apagado en ATmega16

Escribí este programa simple:

#include <avr/io.h>

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

Cuando lo programo en mi nuevo ATmega16A-PU, avrdude me dice que todo está bien. Pero cuando conecto un LED al puerto A, nunca se habilita.

Para compilar el programa y actualizarlo en el ATmega, utilizo los siguientes comandos:

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

Los siguientes pines del microcontrolador están conectados:

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

Cuando conecto el extremo izquierdo de la resistencia de 220 Ω directamente a VCC, el LED se ilumina, por lo que está bien. El microcontrolador es nuevo y ya probé otro (también nuevo), así que creo que también están bien.

EDITAR: los fusibles están configurados en 0b10011001 (alto) y 0b11100001 (bajo).

¿Alguna idea, por qué el microcontrolador no configura el puerto PA0 en VCC?

1. ¿Los fusibles son los predeterminados? ¿Los cambiaste? 2. ¿Puedes incluir la salida para avr-objdump -C -d test.elf? 3. ¿Está en Windows/Linux/...? 4. También incluya la salida completa para su avrdudelínea de comando. 5. Incluya un enlace a la hoja de datos del controlador. 6. Si es posible, agregue una imagen de su configuración.
Yo uso Linux. La salida de avr-objdump: pastebin.com/htm68TPy
No estoy seguro de por qué, pero su programa no está escribiendo en los registros del puerto, según el desensamblado.
¿Seguro que quieres flashear el .elfarchivo?
@jippie, ¿las dos instrucciones no st Z,r18escriben en los registros del puerto a través del direccionamiento indirecto (que, ciertamente, parece una forma incómoda de hacerlo)?
@microtherion Lo pasé por alto de alguna manera. Eso explicaría el código, ¿verdad? El uso del archivo .elf en lugar del archivo .hex explica por qué el LED se niega a encenderse.
El resumen del registro con doble $dirección ($dirección) me sigue confundiendo.

Respuestas (1)

Demasiados detalles para un comentario, así que elegí escribirlo como respuesta.

Prueba estos comandos:

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

Consulte http://git.linformatronics.nl/gitweb/?p=makefile;a=summary para obtener un Makefile genérico. Necesitará algunos ajustes ya que estoy usando un programador y un controlador diferentes, pero debería ser bastante sencillo.

¡Gracias! Usted tenía razón. Realmente no quería mostrar el archivo elf. Quería un archivo hexadecimal...