Flash-Tools

Im Folgenden werde ich einige Werkzeuge vorstellen, die ich zur Programmierung diverser Mikrocontroller im Alltag verwende. Sie haben sich im Gebrauch als sehr nützlich erwiesen.  Ich habe sie speziell für meine Anwendungszwecke gebaut und dabei auch bereits vorhandenen Lösungen adaptiert. 

ESP-Flashtool

Es handelt sich hier um einen Programmer, der sowohl die ESP8266- als auch die ESP32-Famile unterstützt. Zum Programmieren dieser MCUs benötigt man die serielle Schnittstelle und ein paar Steuersignale.  Auf den Entwicklungsboards (z.B. NodeMCU, …) ist eine komplette Programmierhardware, mittels USB-UART-Interface, bereits integriert. Für ein Devboard ist das auch OK. Für die Integration in einer Zielschaltung ist das aber viel zu groß. Ich bevorzuge die Verwendung der MCU-Module in meinen finalen Schaltungen (ESP32-WROOMx, ESP8266-12x). Diese sind klein und preiswert und müssen nur um eine winzige 2x3pol. Microtatch-Buchse, als Programmierschnittstelle, ergänzt werden.
Hier kommt dann dieses Flash-Tool zum Einsatz. Es wird über ein entsprechendes Programmierkabel mit dieser Schnittstelle verbunden. Für ESP01 ist ein direkter Steckplatz neben der Micromatch-Buchse vorhanden.
Bei Bedarf kann die Zielschaltung auch aus dem Programmer mit Spannung versorgt werden (PWext). Diese wird über einen separaten LDO aus VBUS erzeugt. Ansonsten funktioniert die Schaltung wie auf den Devboards. Als USB-UART Interface habe ich allerdings einen FT232RL und verbesserte Störschutzdioden verbaut. Der Eingang ist eine USB-C-Buchse. Der Programmiervorgang erfolgt über die RESET- und FLASH-Taste. Intelligente Programmiersoftware kann den Programmiervorgang auch über die /DTR- und /DTS-Leitungen automatisch steuern.

AVR-Flashtool

Dieser Programmer ist eine Version des allseits beliebten USBasp, mit dem sich nahezu jede AVR-MCU über ISP programmieren lässt. Es ist deshalb zweckmäßig, sich einen USBasp zu besorgen, die Bauelemente mit einem Heißluftföhn abzulöten und hier beim Aufbau zu verwenden. Das gilt im Besonderen für den ATmega8.
Abweichend vom Original, ist als Eingangsbuchse eine USB-C-Buchse vorgesehen. Als Schutzschaltung wurden spezielle USB-Protektor-Dioden eingesetzt. Die Jumper zur externen Stromversorgung und für den slow-/fast-Mode sind Schiebeschaltern gewichen. Als Progheader habe ich eine 2x3polige Micromatch-Buchse vorgesehen. Ich benutze diese Anschlussvariante in allen meinen Schaltungen. Das ist sozusagen mein privater „Quasistandard“, der sich seit Jahren absolut bewährt hat. Diese Buchse ist deutlich kleiner als die AVR-Standardstecker. Dafür findet sich auf jedem PCB ein Plätzchen.
Der Programmer arbeitet durchgängig mit 5V Betriebsspannung/Pegel.

AVR-Progadapter

Hierbei handelt es sich um einen universellen Adapter, der es ermöglicht, mit unterschiedlichen ISP-Anschlussbedingungen für AVR-Controller klar zu kommen. ATMEL hat zwei Standard-Header definiert. Da gibt es die Wannenstecker 2x5poligen und den 2x3poligen. Diese sind aus meiner Sicht viel zu groß, um sie in kleinen PCBs einzudesignen. Deshalb verwende ich eine 2x3polige Micromatch-Buchse. Diese hat SMD-Anschlüsse im 1,28mm Raster. Nähere Angaben dazu habe ich schon in der Beschreibung von AVR-Flashtool gemacht.
Damit können jetzt die unterschiedlichsten Anschlussszenarien realisiert werden. Zum Beispiel kann man einen gängigen USBasp am 2×5-Wannenstecker anstecken und mit einer 2x3poligen Micromatch-Verbindung die Zielschaltung kontaktieren. Eine weiter Option ist das direkte Anstecken des Adapters auf den ISP-Header eines ARDUINO Nano.
Wenn man auf dem Ziel-PCB nur ganz wenig Platz hat, besteht sogar die Möglichkeit dort ein 5poliges Programmierpad, ohne jegliche Buchsen oder Stecker, vorzusehen. Dass wird dann mit dem Nadeladapter, bestehend aus fünf Pogo-Pins, kontaktiert. Die Zuordnung der Signale und das Footprint ist der Grafik links unten zu entnehmen. Pogo-Pins gibt es mit unterschiedlichsten Nadelformen. Im Prinzip sind alle geeignet, die beim Aufsetzen nicht verrutschen. Ideal sind ganz normale Spitzen. In dem Fall sollte man beim PCB-Design Durchkontaktierungen mit 0,8mm Bohrungen vorsehen, sodass die Nadeln dort einrasten können. Beim Aufbau des Adapters sind die Pogos direkt auf den dafür vorgesehenen Lötpads mittig aufzulöten. Die Die GND-Nadel sollte ca. 1 bis 2mm vorstehen, sodass sie den anderen Nadeln beim Aufsetzen vorauseilt. Um die Anordnung mechanisch zu schützen, habe ich ein kleines 3D-Druckteil entworfen, was über die Pogo-Pins gestülpt und mit der Leiterplatte verklebt wird.

SaveAVR

Ich hatte immer wieder Probleme mit AVR-Controllern, beim Setzen der Fuses. Insbesondere beim Entfernen des Vorteilers oder bei der Festlegung der Taktquelle, gab es mitunter Probleme beim Schreiben. Das Resultat war ein Controller, den man über den gängigen ISP-Modus nicht mehr programmieren kann. Laut Datenblatt gibt es dafür einen Ausweg – die Hochspannungsprogrammierung. Hochspannung bedeutet hier 12V. Legt man die an RESET an, ermöglicht das eine spezielle Programmierweise, unabhängig von der aktuellen Fuses- und Lockbitkonfiguration. Je nach Controllertyp kann das parallel (HVPP) oder seriell (HVSP) erfolgen.
Bei meinen Recherchen bin ich auf bereits vorhandene Lösungen gestoßen. Insbesonder die Variante, die im GitHub-Artikel RescueAVR beschrieben wurde, fand ich sehr gut. Hier wird ein passendes HV-Programmer-Board vorgestellt, das auf einen Arduino Uno aufgesetzt wird. Dieser enthält eine entsprechende Steuersoftware, die von Bernhard Nebel und Jeff Keyzer geschrieben wurde. Damit kann man über ein Terminalprogramm, die betroffenen MCUs wieder in deren Ursprungszustand zurückversetzen. Das Board funktioniert prima und ich möchte an dieser Stelle „felias-fogg“ meinen Dank aussprechen.
Ausgehend von diesem Board, wurde eine eigene Variante für einen HV-Programmer entwickelt. MCUs im DIL-Gehäuse werden von mir kaum genutzt. Mir war es wichtig, dass auch Controller mit TQFP32-Gehäuse unterstützt werden. Deshalb habe ich die 20pol. Buchsenleiste durch einen Wannenstecker ersetzt. TQFP-Adapter gibt es preiswert über Aliexpress. Dafür habe ich einen separaten Programmieradapter designed. Dieser ist ebenfalls mit dem gleichen Stecker ausgestattet. Die Verbindung erfolgt mit einem Flachbandkabel über passende Pfostenbuchsen. Zusätzlich hat der Adapter noch eine 2x3polige Micromatch-SMD-Buchse. Darüber ist zusätzlich auch noch die ISP-Programmierung, z.B mit dem AVR-Flashtool möglich.
Des Weiteren habe ich als 12V-Quelle das allseits verfügbare Booster-Modul mit dem MT3608 verwendet. Letztendlich wurde das Routing noch optimiert und alles konsequent auf SMD-Bauelemente umgestellt.
Zur besseren Handhabbarkeit wurden alle Komponenten in ein Gehäuse aus 3D-Druckteilen eingebaut. Hierbei wurde auch an eine RESET-Knopf-Verlängerung für den Arduino Uno gedacht, um das Terminalprogramm gegebenenfalls neu zu starten. Der Zusammenbau ist recht einfach und kann den Fotos und CAD-Ansichten entnommen werden. Unter der TQFP-Platine werden lediglich noch 4 selbstklebende Füße angebracht.
Ist alles zusammengebaut wird die RescueAVR.ino, von RescueAVR, auf den Arduino Uno geflasht. Diese Prozedur muss nur einmal durchgeführt werden. Damit ist das Gerät schon betriebsbereit. Um eine MCU zurückzusetzen, wird diese bei gezogenem USB-Stecker, in den entsprechenden Sockel gesteckt. Dann wird der USB-Verbindung wieder hergestellt. Über ein Terminalprogramm (z.B. Hterm) erfolgt die Verbindung zum Arduino Uno über den virtuellen COM-Anschluss (siehe Gerätemanager). Als Baudrate wird 19200 eingestellt. Wir die Verbindung aktiviert, muss das links dargestellte Menü erscheinen. Die gewünschten Befehle werden im Fenster Input Control eingegeben.
Es ist darauf zu achten, dass die Controller nur bei abgeschalteter Betriebsspannung (USB-Stecker gezogen) eingesteckt bzw. eingelegt werden dürfen 👀️ !
Dieses Projekt ist auch noch mal auf meiner GitHub-Seite verfügbar.