Programmierung mehrerer ICs mit einem einzigen USBasp/SPI-Bus und Arduino IDE

Hallo und danke fürs suchen!

Hintergrund

Nachdem ich ein Projekt mit der Arduino-Hardware und der IDE codiert und entworfen hatte, habe ich meine eigene Leiterplatte mit einem einzigen ATMega328 und zugehörigen Komponenten für das jeweilige Projekt geätzt. Ich füge auf meinen Platinen einen sechspoligen Header hinzu, an den ich einen generischen USBasp-Programmierer angeschlossen habe, und flashe dann den IC mit neuem Code, der in der Arduino IDE geschrieben wurde.

Das funktioniert alles super.

Problem

Ich baue jetzt eine fortgeschrittenere Schaltung, die fünf ATMega328-ICs erfordert - jeder mit seinem eigenen Code, der sich von dem Code auf den anderen ICs unterscheidet . Ich muss in der Lage sein, alle fünf ICs über die einzelne sechspolige USBasp/SPI-Verbindung zu flashen, aber ich habe keine Ahnung, wie.

Mir ist klar, dass es einfacher wäre, nur einen einzigen IC mit mehr Pins zu verwenden, aber das ist derzeit keine Option.

Frage

Wie kann ich mit meiner einzelnen sechspoligen USBasp/SPI-Verbindung mehrere ATMega328-ICs mit ihrem jeweiligen Code flashen, den ich in der Arduino IDE geschrieben habe?

Antworten (3)

Ich würde die USBAsp-Firmware nehmen und sie so modifizieren, dass sie auf einem weiteren AVR-Chip auf Ihrem Board läuft, der die Reset-Leitungen jedes Ihrer fünf Ziel-Atmegas einzeln manipulieren würde. Sie müssten einen Weg finden, um auszuwählen, welches Ziel programmiert werden soll. Wenn Sie AVRDUDE als Programmierer verwenden, können Sie dafür "-x extended_param" verwenden.

Das ist nicht einfach. Sie müssten einen zusätzlichen On-Board-Programmierer sowie Code vorbereiten, um damit zu kommunizieren. es ist möglich, dass dies schon einmal gemacht wurde, aber ich habe es nicht gesehen.

Die Lösung von Nick Alexeev wäre korrekt, wenn sich die Auswahlebene am Reset-Pin von der Programmierebene unterscheiden würde, aber sie sind bei der seriellen Niederspannungsprogrammierung identisch, was die Standardmethode ist. Dies bedeutet, dass die AVRs am Ende parallel reagieren würden, möglicherweise ihre MISO-Ausgangspuffer beschädigen und es unmöglich machen würden, sie einzeln anzusprechen. Beim allerersten Mal, während alle AVRs gelöscht sind, können Sie damit davonkommen, die Reset-Pins hoch statt niedrig zu lassen (da der Standardzustand der I/Os schwebend ist). Aber das scheitert im Grunde an der Programmierung weiterer Chips, es sei denn, die frühen wissen, wie man die SPI-Pins meidet.

Die Lösung von Pault ist näher, aber es reicht nicht aus, die Reset-Leitungen einzeln zu manipulieren (obwohl der Master-AVR offensichtlich seine eigenen benötigt); Es sind die MISO- und SCK-Leitungen, die getrennt werden müssen. Erstens, damit sich die Slave-AVRs nicht gegenseitig beschädigen können, zweitens, damit sie einzeln angesprochen werden können.

Da Sie viele SCK-Leitungen benötigen, bedeutet dies, dass Sie den SPI-Port wahrscheinlich nicht für die Kommunikation mit den Slave-Geräten verwenden können. Außerdem benötigen Sie den ersten SPI, um den Master-AVR überhaupt zu programmieren. Das wiederum bedeutet Bitbanging (Steuerung per Software) der Programmierpins, zusätzlich zur Neuprogrammierung der seriellen Schnittstelle, so dass die Änderungen der Programmierfirmware bemerkenswert sind.

Eine Option besteht darin, anstelle des Master-AVR eine Art E / A-Extender-Chip zu verwenden und den Host das Bitbanging durchführen zu lassen. Dies ist wahrscheinlich langsamer, aber Geschwindigkeit ist bei Chips dieser Größe selten ein Problem.

Kurz gesagt, es ist normalerweise einfacher, stattdessen einfach einen ICSP-Anschluss pro AVR zu verwenden. Atmel hat das ICSP-Protokoll einfach nicht für mehrere Chips entwickelt, obwohl viele andere SPI-Chips es unterstützen (über Chipauswahl oder Daisy-Chaining). JTAG TAP ist ähnlich für Daisy-Chaining ausgelegt.

Haftungsausschluss: Ich habe dies nicht mit Arduino oder Atmega gemacht. Aber ich habe dies mit PICs getan.

Synopsis: SPI-Leitungen parallel schalten, RESET_n-Leitungen separat behandeln. Wie Sie geschrieben haben, wird Ihr neuer Schaltplan 5x Atmegas haben. Fügen Sie Ihrem Schaltplan 5x Kurzschlussblöcke (Jumper-Selektoren) hinzu. Jeder Selektor hat 3 Pins.

  • Pin1 wird vom Programmierer mit der Leitung RESET_n verbunden. ( _n am Ende bedeutet, dass die Leitung aktiv niedrig ist. Es gibt einige gebräuchliche Notationen für „aktiv niedrig“, dies ist nur eine davon.)
  • Pin2 geht an RESET_X_n, wobei X ein einzelner Controller ist. Die RESET_X_n-Leitung hätte einen Pullup-Widerstand wie eine normale Reset-Leitung.
  • Pin3 geht auf GND.

Angenommen, Sie möchten Controller_1 programmieren. Verbinden Sie RESET_1_n über seinen Selektor mit dem Programmiergerät. Verbinden Sie alle anderen Reset-Leitungen mit GND. Dadurch werden alle anderen Atmegas zurückgesetzt, sie werden die Pins schweben lassen, die zu SPI-Leitungen gelangt sind, und die Programmierung von controller_1 nicht beeinträchtigen [ Bearbeiten: Lesen Sie unbedingt den Kommentar von Yann Vernier unten und seine Antwort in diesem Thread ]. Entfernen Sie alle Kurzschlussblöcke, um Ihr System zu betreiben.

UPDATE als Antwort auf Matthews Kommentar

"Einfach den USB-Programmierer einstecken und dann den Code [an mehrere Controller] senden"

Wenn Sie einen Controller mit JTAG-Schnittstelle bekommen können, wäre das, wonach Sie fragen, einfach. JTAG ist das einzige "Wundermittel" für Ihr Problem, das ich kenne. (Die anderen Ansätze sind komplizierter, obwohl dies ein lustiges systemtechnisches Problem ist, das man im Kopf herumwerfen kann.)

Gleichzeitig vertrauen Sie dem Benutzer zunächst die Neuprogrammierung an. Erwägen Sie, ihr auch Selektoren anzuvertrauen.

Danke Nick, das klingt großartig. Ich hatte jedoch gehofft, dass dies ohne die Verwendung von Jumpern erfolgen könnte, sodass der Endbenutzer einfach den USB-Programmierer anschließen und dann den Code senden könnte. Ist dies nicht möglich? Danke noch einmal.
Wenn Sie die anderen AVRs im Reset belassen, werden ihre Programmierports aktiviert, sodass sie die Pins nicht schweben lassen . Sie müssen sie laufen lassen und die Programmierstifte in diesem Fall nicht für die Ausgabe aktivieren. Alternativ können Sie jeden so konfigurieren, dass die Niederspannungsprogrammierung deaktiviert wird, sodass es einen Unterschied zwischen Reset- und Programmierspannungen gibt.
@YannVernier Das Schema mit Niederspannungsprogrammierung, das Sie beschreiben, hatte ich im Sinn. (Das habe ich mit PICs gemacht, siehe Haftungsausschluss oben.)