Arduino als AVR-Programmierer mit Avrdude

Mein Ziel ist es, einen einzelnen ATmega328P zu programmieren, der auf einem Steckbrett sitzt. Aufgrund meines Standorts und meines verfügbaren Geldes kann ich keinen AVR-ICSP-Programmierer erwerben. Stattdessen habe ich (durch Recherche) festgestellt, dass ich ein Arduino als AVR-Programmierer verwenden kann, und mich dafür entschieden.

Die ArduinoISP-Skizze wurde erfolgreich auf meinen Arduino Uno R3 hochgeladen und die entsprechenden Pins wurden an mein Steckbrett angeschlossen.

Ich habe ein einfaches C-Programm in Atmel Studio geschrieben und es in eine Intel-Hex-Datei kompiliert, dann habe ich mit avrdude fortgefahren, um die Datei auf die μCU hochzuladen. Avrdude hat einen erfolgreichen Flash gemeldet (Verifizierung ebenfalls erfolgreich), aber die μCU scheint nicht zu reagieren.

Das einfache C-Programm wie folgt:

//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;
}

Befehl zum Senden des Blitzes an den Atmega328P:

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

Eine einzelne LED (mit 220 Ohm Widerstand) wurde von Masse an Pin PC5 angeschlossen. Wenn meine Logik richtig ist, sollte dieses Licht alle 500 ms ein- und ausschalten, aber das Licht bleibt aus. Die LED wurde getestet und die Anschlusspolarität bestätigt (positiv an Pin, negativ an Masse).

Als Randbemerkung habe ich auch festgestellt, dass, als ich avrdude sagte, die Sicherungseinstellungen auf der μCU zu lesen, sie alle als 0x00 registriert wurden, was ziemlich seltsam ist.

Jede Hilfe wäre sehr willkommen.

Aktualisieren:

Durch einige Experimente fand ich heraus, dass der oben aufgeführte Befehl avrdude irgendwie sagte, den ATmega328P auf dem Arduino Uno selbst zu programmieren, anstatt den ATmega328P auf dem Steckbrett. Ich habe den ArduinoISP erfolgreich auf den Arduino geflasht, also bin ich wieder bei Schritt eins. Weiß jemand, wie man avrdude dazu bringt, auf dem Steckbrett auf den ATmega328P zu schreiben?

Haben Sie diesen speziellen ATmega-Chip schon einmal verwendet? Ich frage mich nur, ob es vielleicht eher seltsame Sicherungseinstellungen als die Standardeinstellung hat. Ich denke, es könnte sich lohnen, sie so oder so einzustellen, um zu sehen, ob es einen Unterschied macht.
@PeterJ Brandneuer mega328P. Ich habe versucht, Sicherungen zu setzen, es "funktionierte" (glaube ich?), Aber die Überprüfungsphase sagte mir, dass die Sicherungen immer noch 0x00. Ich gehe davon aus, dass die Sicherungserkennung aus irgendeinem Grund nicht funktioniert.
Es wäre hilfreich, den Schaltplan (oder sogar den Schaltplan) Ihrer Verbindungen zu haben. Oder hast du genau diesen implementiert ?

Antworten (2)

Wenn Sie die Frage durchlesen, klingt es so, als hätten Sie eine der erforderlichen Komponenten vergessen.

Das Ausführen von AVRDUDE bewirkt, dass die Host-MCU zurückgesetzt wird. Um dies zu verhindern, müssen Sie einen Kondensator an die nRESET-Leitung des Hosts anschließen, um die Spannung über einem bestimmten Schwellenwert zu halten. Fügen Sie den Kondensator wie im ArduinoISP-Artikel beschrieben hinzu und versuchen Sie es erneut.

Dieser Schritt wurde bereits durchgeführt. Ich habe auch versucht, diesen Kondensator zu entfernen, um die Effekte zu testen, was zu keinem Unterschied führte. Das Problem ist, dass avrdude in den ATmega328P des Arduino schreibt (ich kann meinen Ziel-AVR entfernen und der Befehl avrdude wird weiterhin ohne Probleme ausgeführt).
Wenn nRESET ordnungsgemäß unterdrückt würde, gäbe es keine Möglichkeit, auf die integrierte MCU zu schreiben, da der Bootloader niemals ausgeführt würde. Versuchen Sie es mit einem größeren Kondensator.
Der Kondensator, den ich verwendete, war 100 μF (zu diesem Zeitpunkt gab es keine 10 μF-Kappen), es sei denn, das ist immer noch "zu klein" ... Ich glaube nicht, dass der Kondensator das Problem ist.

Ich bin letzte Woche auf genau das gleiche Problem gestoßen.

Avrdude meldet m328p (uno) Signatur, während ich ATmega8A programmiere.

Der ArduinoISP-Programmierer sollte sein:

avrdude -c stk500v1 -b 19200 
Kannst du deine Antwort etwas präzisieren? Ich habe versucht zu bearbeiten, aber ich kann nicht einmal verstehen, was Sie sagen wollen