4TAP - ein AVR "bitbanging"
Programmer für die serielle Schnittstelle, bestehend aus 3 Widerständen
und einem Transistor.
Ich wollte endlich auch mal Mikrocontroller programmieren, aber mit
möglichst geringem Anfangswiderstand. Ohne Bootloader, ohne
Entwicklungsplatine, sondern etwa so wie im "Lernpaket Mikrocontroller"
von Franzis. Das Programmieren und Flashen sollte aber komfortabler
sein, am liebsten in Basic. Der Mega8-ISP-Programmer vom selben Autor
wie das Lernpaket (Burkhard Kainka), kam der Sache schon ziemlich nahe.
Allerdings musste für den Einsatz von AVRdude dessen
Konfigurationsdatei editiert werden. Außerdem muss immer die serielle
Schnittstelle geöffnet sein, weil ohne einen HIGH-Pegel an RTS der
Controller in den Reset-Zustand geht. Herausgekommen ist der
"4-Teile-AVR-Programmer", kurz 4TAP.
Die schlechte Nachricht gleich vorweg: Das gute Stück ist (wie sein
Vorbild) NICHT mit USB-seriell-Adaptern benutzbar. Falls eine
Verbindung überhaupt glückt, ist die Transferrate im
"bitbanging"-Betrieb inakzeptabel gering.
Besitzer von aktuellen Desktop-PCs ohne serielle Schnittstelle sollten
mal nachsehen, ob diese nicht doch auf dem Motherboard vorhanden ist,
nur nicht nach außen geführt ist. Haben wir kein Glück, sollte auch
eine PCI-Einsteckkarte funktionieren (habe ich allerdings nicht
getestet).
Haben wir aber einen Windows PC mit einem "echten" COM-Port, können wir
mit minimalem Aufwand in die Welt der AVR-Mikrocontroller einsteigen.
Das linke Bild zeigt den Hardwareaufwand um einen ATtiny45 zu
programmieren und Temperaturwerte über die serielle Schnittstelle an
den PC zu senden.
Softwareseitig war das Ziel eine problemlose Zusammenarbeit mit AVRdude
als Brennsoftware und der BASCOM-AVR Demo als Programmiersprache. Die
Pinbelegung des 4TAB ist so gewählt, dass er mit AVRdude als
DASA3-Programmer angesprochen werden kann.
4TAP dient aber nicht nur dazu, Programme und EEPROM in den AVR zu
flashen. Er kann über dieselben Verbindungen auch Daten mit dem PC
austauschen. Wir brauchen erstmal keine andere Hardware, wie z.B.
LCD-Displays wenn der AVR uns etwas mitteilen möchte. Stattdessen
werden dieselben Leitungen, die eben noch per "bitbanging" zum Brennen
(flashen) benutzt wurden, anschließend als UART benutzt (also dafür,
wofür de serielle Schnittstelle konzipiert wurde). AVR-seitig ist das
allerdings nur mittels Software-UART möglich, weil so eine invertierte
Ausgabe möglich ist und die Sende-und Empfangspins frei zugeordet
werden können. Auf dem PC werden die Daten in einem Terminal-Programm
angezeigt.
|
Schaltplan
Die gesamte Pegelwandlung der seriellen Schnittstelle geschieht wie bei
den Vorbild-Programmern über möglichst hochohmige Widerstände in
Verbindung mit des internen Schutzdioden des AVR. Lediglich RESET wird
über einen "Wald und Wiesen Transistor" angesteuert. Der invertiert den
Pegel (RESET wird auf Masse gezogen, wenn ein HIGH-Pegel an DTR
anliegt). Das ginge auch nicht invertiert. Dann mit einem Widestand
plus Zenerdiode wie beim Mega8-ISP. Allerdings müssen wir dann zum
Betrieb immer für einen HIGH-Pegel an RESET sorgen. Dazu müssen wir
PC-seitig die serielle Schnittstelle öffnen und den mit RESET
verbundenen Ausgang setzen, z.B. mit einem Terminalprogramm. Sobald wir
das vergessen oder die Schnittstelle schließen, geht der AVR auf
RESET und nix funktioniert. Nicht schlimm, aber verwirrend, wie meine
"Selbstversuche" mit zwei Vorgänger-Prototypen gezeigt haben.
Ganz wichtig ist auch die Verbindung von CTS und RxD. Über CTS empfängt
der PC die Daten vom AVR beim Brennen, über RxD die vom (Software-)UART
im Betrieb. Wenn wir die Verbindung schon im PC-Stecker herstellen,
brauchen wir also lediglich 5 Adern für das Verbindungskabel.
|
Aufbau für's
Steckbrett
Der
gezeigte Aufbauvorschlag ist für den Anschluss an ein Steckbrett
vorgesehen (Bild ganz oben) und ganz einfach auf Streifen-Lochraster
aufgebaut. 7 Bahnen mit je 14 Löchern stehen lassen und wie
gezeigt zusammenlöten. Es sind nur 2 Leiterbahn - Unterbrechungen
nötig.
Die Anordnung von MOSI - MISO - SCK ist so gewählt, dass sie direkt an
ATtinys und ATmegas im DIL Gehäuse passen. Der separate Steckkontakt
für GND hat den Abstand, dass er in die innen liegende Reihe der
Spannungsversorgung am Steckbrett greift. Damit haben wir schon vier
Verbindungen hergestellt, ohne dass ein Draht gesteckt ist. RESET ist
bei jedem AVR anders angeordnet. Hier habe ich einen einzelnen
Kontakt einer IC-Fassung aufgelötet. Ein Draht stellt die Verbindung zu
RESET am Controller her.
Als Verbindungskabel habe ich ein altes USB-Kabel verwendet. Masse geht
dabei über die Schirmung (das Drahtgeflecht außen rum). Dann bleiben
noch vier Leitungen für die restlichen Verbindungen. Bitte nicht
vergessen, im Stecker Pin2 (RxD) mit Pin8 (CTS) zu verbinden!
Das "Gehäuse" besteht aus einem Papier-Deckblatt aus dem Drucker und
klarem Paketband, in das wir die Platine einwickeln. |
|
Klassischer Aufbau
mit 10-Pol Wannenstecker
Wenn
wir es lieber kompatibel zu anderen Programmern bauen möchten, hier ein
Exemplar, das zwischen einer 9-poligen Sub-D Buchse und einem
10-poligen Wannenstecker aufgebaut ist.
So passt das Ganze direkt an den Ausgang der Schnittstelle unseres PC
oder (sinnvollerweise) an ein Standard-Verlängerungskabel. Der
Wannenstecker hat selbstverständlich ebenfalls Standardbelegung.
Die Verbindung RxD/CTS ist hier auf der Platine realisiert.
Verbindungen innerhalb des Sub-D Steckers brauchen wir nicht herstellen.
Update April 2012: Das Verbinden von unbenutzten
Leitungen der 10pol Flachbandleitung mit Masse (Pin 4,6,8 mit 10
an der Platinenoberseite) verhindert ein "übersprechen" der
parallelen Leitungen. Das hat bei mir Fehler bei höheren
Controllerfrequenzen verhindert. Die Bilder sind entsprechend angepasst.
|
|
AVRdude
Nehmen wir an, wir sind stolzer Besitzer eines ATtiny45.
Wir haben uns darüber hinaus den hier beschriebenen 4TAP nachgebaut und
an COM1 angeschlossen. Wir haben uns gemerkt, dass der
4TAP kompatibel zum DASA3-Programmer ist. In diversen
durchprogrammierten Nächten haben wir mit der Programmierumgebung
unseres Vertrauens ein Superprogramm erstellt, welches nun als superprog.hex
auf unserer Festplatte im Ordner C:\Users\Frank\Tolle Progs
auf seinen Einsatz wartet. Dann könnten wir das von AVRdude erledigen
lassen. Zu diesem Zweck haben wir AVRdude im Ordner C:\Program
Files\AVRdude installiert. Die Kommandozeile zum flashen lautet
dann:
"C:\Program Files\AVRdude\avrdude.exe" -p atTiny45 -c
DASA3 -P COM1 -U flash:w:"C:\Users\Frank\Tolle Progs\superprog.hex":i
|
Bascom-AVR
und stk2dude
Das geben wir natürlich nicht
immer per Hand ein. Ich kann nur Basic und benutze deshalb Bascom-AVR.
Dort können wir externe Programmer einbinden. Leider kann Bascom nur
den Dateinamen der zu flashenden Datei übergeben, nicht die AVR-Type.
Das können wir mit meinem kleinen Hilfsprogramm namens stk2dude.exe
beheben. Dieses dient als "pseudo-stk500.exe". Es gibt die Parameter
für den AVR-Typ und unser Compilat (hex-Datei) automatisch an AVRdude
weiter. Weitere Parameter für AVRdude geben wir einfach in das Feld USB
ein. Unbedingt erforderlich sind Angaben zum Programmer (für den 4TAP
muss hier -cDASA3 stehen) und zum Port, an dem der Programmer
hängt (hier -Pcom1).
Folgende Dateien müssen sich in demselben Ordner befinden:
- stk2dude.exe
- avrdude.exe
- avrdude.conf
- libusb0.dll (falls nicht schon im
Windows-Systemordner)
|
Das Terminalprogramm
Irgendwie wollen wir ja mal mit unserem genial
programmierten Mikrocontroller kommunizieren. Im einfachsten Fall soll
er uns etwas anzeigen. Vielleicht wollen wir aber auch Eingaben machen.
Beides geht mit einem Terminalprogramm. Es zeigt Zeichen an, die der PC
über eine serielle Schnittstelle empfängt und kann Zeichen über
dieselbe senden. Als Schnittstelle zwischen PC und Controller kann 4TAP
dienen.
Das Bild zeigt das Terminalprogramm Termite (siehe Downloads), wie es
Werte des internen ATtiny45-Thermometers anzeigt. Den Quelltext für das
Thermometer können wir unter Downloads runterladen. Im Button von
Termite können wir erkennen, dass die Schnittstelle für 2400 Baud. 8
Datenbits, No Parität und 1 Stoppbit eingestellt ist. Das haben wir im
Quelltext für den Controller genauso eingestellt.
Eine Hürde müssen wir noch beachten: Es kann immer nur ein Programm auf
eine serielle Schnittstelle zugreifen. Das Terminalprogramm ODER das
Programm, das den Controller flasht, in unserem Fall AVRdude. Da kommt
uns eine Eigenschaft zu Gute, die wir in Termite (und HTerm) einstellen
können: Sobald das Programm den Fokus verliert, gibt es die
Schnittstelle frei. Wenn wir das Fenster wieder in den Vordergrund
holen, wird wieder geöffnet. Konflikte mit AVRdude werden so elegant
umgangen.
|
Downloads
- Terminalprogramme, als Ersatz für das Bascom-interne
(weil ich mit dessen Scrollfunktion auf Kriegsfuß stehe):
Termite, HTerm,
Terminal by Br@y
|
Links
Die Vorbilder:
Infos für Anfänger:
|
|