Tengo un chip ATmega328-PU que está configurado para usar el oscilador interno sin dividir la velocidad del reloj entre 8. Lo primero que hice fue usar un programa realmente simple que cargué; un programa que activaba y desactivaba todos los pines en PORTB. Al igual que:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
int main(void) {
DDRB = 0xFF;
PORTB = 0xFF;
while(1) {
PORTB = 0x00;
_delay_ms(50);
PORTB = 0xFF;
_delay_ms(50);
}
return 0;
}
- Actualización: He intentado lo que Jon L sugirió. Sigue con el mismo resultado.
- Actualización 2: he intentado lo que sugirió Kevin Vermeer. El chip parece congelarse cuando entra en el primer bucle. Usando el temporizador con un valor < 65000 hace que el LED se encienda directamente, usando un valor > 65000 resultados en el LED nunca se encienden.
- Actualización 3: he intentado seguir con un nuevo chip idéntico con los mismos resultados
-
Actualización 4: enchufé simulavr y avr-gdb para ver si encontré algo, esta fue la salida:
memory.c: 267: ADVERTENCIA: * * Intente escribir io reg inválido: ADCL en 0x0024 memory.c: 267: ADVERTENCIA: * * Intente escribir io reg inválido: ADCH en 0x0025 memory.c: 267: ADVERTENCIA: * * Intente escribir io reg inválido: ADCH en 0x0025 decoder.h: 59: ADVERTENCIA: Opcode desconocido: 0xffff
Entonces el código de operación desconocido se repite para siempre
Sin embargo, cuando subí el programa, llega a la segunda instrucción en main y luego se congela. Dejando todos los pines de PORTB en ALTO. Hasta ahora lo he intentado:
- Diferentes ms entre 10 y 1000 para ver si hay algunos valores que no se pueden usar
- Se cambió F_CPU a 1000000UL en caso de que usara CKDIV8.
- Looping _delay_ms (1) en una función separada hasta que se itere a la cantidad dada
- Recompilado y subido varias veces
- Se intentó restablecer varias veces
- Utiliza diferentes pines PORTB
- F_CPU definido a partir de los argumentos del compilador
-DF_CPU=8000000
Por qué pregunto aquí y no por stackoverflow.com es porque creo que debería comenzar a eliminar los errores en el nivel más bajo de abstracción, es decir; hardware.
Entonces, ¿cuál podría ser el problema?
Aquí hay información sobre mi configuración:
- Sistema operativo: OS X 10.7.3
- Programador: AVRisp MKII
- Uploader: avrdude
- Compilador: avr-gcc
- hex de Bin 2: avr-objcopy
Configuración de fusibles:
avrdude: safemode: lfuse reads as E2
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as 7
Entrada en la calculadora de fusibles AVR :
makefile:
main:
avr-gcc -g -Os -Wall -mmcu=atmega328 -c ../src/example.c
hex:
avr-objcopy -j .text -j .data -O ihex example.o example.hex
dump:
avr-objdump -h -S example.o > example.lst
upload:
avrdude -p m328 -c avrispmkII -P usb -U flash:w:example.hex
clean:
rm -f *.o
rm -f *.hex
rm -f *.lst
Pines utilizados en el chip:
- Pin 7 (VCC): suministro de 5 voltios
- Pin 8 (GND): suelo
- Pin 14 (PB0): resistencia y LED