Arduino como programador AVR con Avrdude

Mi objetivo es programar un solo ATmega328P sentado en una placa de pruebas. Debido a mi ubicación y al dinero disponible, no puedo adquirir un programador AVR ICSP, así que (a través de la investigación) descubrí que puedo usar un arduino como programador AVR y decidí usarlo.

El boceto de ArduinoISP se cargó en mi Arduino Uno R3 con éxito y los pines apropiados se conectaron a mi tablero.

Escribí un programa C simple en Atmel Studio y lo compilé en un archivo hexadecimal de Intel y luego procedí a usar avrdude para cargar el archivo en la μCU. Avrdude informó un flasheo exitoso (verificación exitosa también) pero la μCU no parece estar respondiendo.

El programa C simple de la siguiente manera:

//Define CPU speed to 1 MHz (8 MHz internal with CKDIV8)
#define F_CPU 1000000

#include <avr/io.h>
#include <util/delay.h>

int main(void){
    DDRC = 0xFF; //Set all of port C to outputs

    while(1){
        PORTC = PORTC ^ 0xFF; //Toggle all of port C
        _delay_ms(500); //Delay 500ms
    }

    return 0;
}

Comando utilizado para enviar el flash al Atmega328P:

$ avrdude -c arduino -p m328p -P COM9 -U flash:w:"compiled_file.hex":i

Un solo LED (con una resistencia de 220 ohmios) se enganchó desde tierra al pin PC5. Si mi lógica es correcta, esta luz debería encenderse/apagarse cada 500 ms, pero la luz permanece apagada. Se probó el LED y se confirmó la polaridad de la conexión (positivo a pin, negativo a tierra).

Como nota al margen, también descubrí que cuando le pedí a avrdude que leyera la configuración de los fusibles en la μCU, todos se registraron como 0x00, lo cual es bastante extraño.

Cualquier ayuda sería muy apreciada.

Actualizar:

A través de algunos experimentos, descubrí que el comando mencionado anteriormente de alguna manera le decía a avrdude que programara el ATmega328P en el arduino uno en lugar del ATmega328P en la placa de pruebas. Volví a actualizar con éxito el ArduinoISP al Arduino, así que volví al paso uno. ¿Alguien sabe cómo obtener avrdude para escribir en el ATmega328P en el protoboard?

¿Alguna vez has usado ese chip ATmega en particular? Solo me preguntaba si tal vez tiene una configuración de fusibles extraña en lugar de la predeterminada, supongo que podría valer la pena intentar configurarlos de cualquier manera para ver si hace la diferencia.
@PeterJ Nuevo mega328P. Intenté configurar los fusibles, "funcionó" (¿creo?) Pero la etapa de verificación me dijo que los fusibles aún estaban 0x00. Supongo que, por alguna extraña razón, la detección de fusibles no funciona.
Sería útil tener el esquema (o incluso el diagrama de cableado) de sus conexiones. ¿O implementaste exactamente este ?

Respuestas (2)

Al leer la pregunta, parece que olvidó uno de los componentes necesarios.

Ejecutar AVRDUDE hará que la MCU del host se reinicie. Para evitar esto, debe colocar un condensador en la línea nRESET del host para mantener el voltaje por encima de cierto umbral. Agregue el capacitor como se describe en el artículo de ArduinoISP e intente nuevamente.

Este paso ya fue realizado. También intenté quitar este condensador para probar los efectos, lo que resultó en ninguna diferencia. El problema es que avrdude está escribiendo en el ATmega328P de arduino (puedo eliminar mi AVR de destino y el comando avrdude aún se ejecuta sin problemas).
Si nRESET se suprimió correctamente, no habría forma de escribir en la MCU integrada, ya que su cargador de arranque nunca se ejecutaría. Pruebe con un condensador más grande.
El capacitor que usé era de 100 μF (no tenía ningún límite de 10 μF en ese momento), a menos que todavía sea "demasiado pequeño"... No creo que el problema sea el capacitor.

He encontrado exactamente el mismo problema la semana pasada.

Avrdude reporta la firma m328p(uno), mientras estoy programando ATmega8A.

El programador ArduinoISP debe ser:

avrdude -c stk500v1 -b 19200 
¿Puedes elaborar un poco tu respuesta? Traté de editar pero ni siquiera puedo entender lo que estás tratando de decir