Flashen der ATmega328P-Firmware unterbrochen - kann es behoben werden?

Ich arbeite an einer Platine mit einem ATmega328P darauf. Ich verwende einen Pogo-Stecker, weil wir die Platine draußen programmieren und testen müssen.

Ich programmiere mit usbTiny, ( mosi/miso/rest/clk/power)

Wie auch immer, oft bewege ich mich während des Programmierens ein wenig, was die Pogo-Pin-Kontakte stört und einen Verifizierungsfehler erhalte. Dann starte ich neu und flashe es erfolgreich.

Aber manchmal kann ich es nach einer Bewegung und einer Nichtübereinstimmung bei der Überprüfung nicht mehr flashen, wie jetzt.

Ich bekomme :

avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

An error occurred while uploading the sketch

Ich wurde immer wieder extrem müde von der Herstellung :( und ich bin mir sicher, dass der Chip noch in Ordnung ist. Das wird wahrscheinlich wieder vorkommen.

Ich habe gelesen, dass es Möglichkeiten gibt, es zu speichern, wie serielle Programmierung oder Oszillator.

Wie genau kann ich das mit Serial machen?

VERBOTE:

       Using Port                    : usb
         Using Programmer              : usbtiny
avrdude: usbdev_open(): Found USBtinyISP, bus:device: 020:013
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : USBtiny
         Description     : USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/
avrdude: programmer operation not supported

avrdude: Using SCK period of 10 usec
avrdude: initialization failed, rc=-1

Antworten (1)

Es ist wahrscheinlich, dass Sie versehentlich die Sicherungen gegen eine der folgenden ausgetauscht haben:

  • /ZURÜCKSETZEN deaktivieren
  • Unterschiedliche Taktfrequenz oder Taktquelle
  • Deaktivieren Sie die SPI-Programmierung

Um dies wiederherzustellen, müssen Sie einen "Hochspannungs" -Programmierer verwenden, bei dem /RESET auf +12 V gehalten wird, während bestimmte Befehlssequenzen durch die meisten anderen Pins gesendet werden. Dies kann mit Ihrer "Pogo-Pin" -Anordnung schwierig sein.

Es kann sogar unmöglich sein, wenn 12 V an /RESET angelegt werden und andere Schaltkreise beschädigt werden (z. B. wenn Sie einen Pull-up-Widerstand haben, der 12 V in die 5-V-Leitung leiten würde).

Ich habe hier einen Beitrag über die Verwendung eines anderen Arduino für die Hochspannungsprogrammierung .

Hochspannungs-Programmierer

Sie können sehen, dass es viele Drähte gibt, und es ist möglicherweise nicht praktikabel, mit Pogo-Pins etwas zu tun.

Sie können auch ein AVR Dragon-Board verwenden, um die erforderlichen Signale und Pinbelegungen bereitzustellen.

AVR-Drache

Dies würde jedoch erfordern, dass Sie entweder den Chip entfernen und in den Programmierer einsetzen oder etwa 18 Drähte zur Platine führen, ähnlich wie bei der früheren Lösung.


Ich schlage vor, dass Sie während des Tests einen 6-poligen Header anlöten, der für Ihre SPI-Programmierung geeignet ist. Dadurch werden die Pogo-Pins eliminiert und Sie erhalten einen zuverlässigen Kontakt für die Programmierung. Sobald Sie es debuggt haben, brauchen die Produktionsmodelle das nicht.


Was ist mit externen Oszillator?

Sie könnten meine Chip-Detektor-Skizze verwenden , die zeigen würde, ob der Chip nicht reagiert oder nur einige Sicherungen geändert wurden (z. B. Taktquelle).

Beispielausgabe aus der Skizze:

Atmega chip detector.
Entered programming mode OK.
Signature = 1E 95 0F 
Processor = ATmega328P
Flash memory size = 32768
LFuse = FF 
HFuse = DE 
EFuse = FD 
Lock byte = CF 
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00

Bootloader:

7E00: 11 24 84 B7 14 BE 81 FF E6 D0 85 E0 80 93 81 00 
7E10: 82 E0 80 93 C0 00 88 E1 80 93 C1 00 86 E0 80 93 
...
7FE0: E7 DF 80 32 09 F0 F7 DF 84 E1 DA CF 1F 93 18 2F 
7FF0: DF DF 11 50 E9 F7 F4 DF 1F 91 08 95 FF FF FF FF 

MD5 sum of bootloader = 0F 02 31 72 95 C8 F7 FD 1B B7 07 17 85 A5 66 87 

First 256 bytes of program memory:

0: 0C 94 35 00 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 
10: 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 
20: 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 
30: 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 
40: 0C 94 80 03 0C 94 5D 00 0C 94 C9 00 0C 94 5D 00 
50: 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 0C 94 5D 00 
60: 0C 94 5D 00 0C 94 5D 00 E5 01 11 24 1F BE CF EF 
70: D8 E0 DE BF CD BF 11 E0 A0 E0 B1 E0 E0 E9 F8 E0 
80: 02 C0 05 90 0D 92 A2 32 B1 07 D9 F7 11 E0 A2 E2 
90: B1 E0 01 C0 1D 92 A2 3C B1 07 E1 F7 10 E0 CA E6 
A0: D0 E0 04 C0 22 97 FE 01 0E 94 42 04 C8 36 D1 07 
B0: C9 F7 0E 94 1F 02 0C 94 46 04 0C 94 00 00 08 95 
C0: FF 92 0F 93 1F 93 06 EA 11 E0 C8 01 40 E0 52 EC 
D0: 61 E0 70 E0 0E 94 FA 00 C8 01 0E 94 44 03 C8 01 
E0: 60 E0 71 E0 0E 94 75 03 91 E2 F9 2E E0 E0 F0 E0 
F0: F0 92 57 00 E4 91 C8 01 6E 2F 40 E1 50 E0 0E 94 

Quelle für Skizze auf GitHub - im Ordner "Atmega_Board_Detector".

Danke Nick, mir scheint, dass ich dazu nicht in der Lage sein werde, weil ich sehr empfindliche Teile auf dieser Platine habe. Was ist mit dem externen Oszillator? Ich muss einen Weg finden, den Chip zu entfernen, geht das ohne Spezialwerkzeug?
Dies hängt vom Gehäusetyp (SMD oder DIP) ab. Beide wären jedoch sehr schwer zu entfernen, wenn sie einmal angelötet sind. Bei einer Oberflächenmontage haben Sie möglicherweise eine Chance, benötigen jedoch wahrscheinlich Spezialwerkzeuge. Ich glaube, es gibt ein Produkt, mit dem SMD-Chips entfernt werden können (es vermischt sich mit dem Lötmittel und senkt seinen Schmelzpunkt). Wäre es Ihnen möglich, während des Tests einen Chipsockel zu verwenden? Das dürfte die praktischste Lösung sein.
Was ist mit externen Oszillator? - Sie könnten meine Chip-Detektor -Skizze verwenden , die zeigen würde, ob der Chip nicht reagiert oder nur einige Sicherungen geändert wurden (z. B. Taktquelle).
Es wäre schön, wenn Sie Ihrer Antwort die relevanten Teile Ihres Forumsbeitrags hinzufügen würden.
Der Beitrag ist ein bisschen lang (und die Quelle ist ein bisschen lang), aber ich habe der Antwort mehr Details hinzugefügt, anstatt sie in einem Kommentar zu hinterlassen.
Warum nicht einen seriellen Bootloader verwenden? Viel weniger Risiko, Sicherungen usw. durcheinander zu bringen, und Sie benötigen nur drei Drähte (GND, TX, RX).
Ich habe aus der Frage den Eindruck gewonnen, dass eine SPI-Programmierung erforderlich ist. Ein Bootloader wäre natürlich einfacher. Vielleicht den OP fragen?