AVR-Programmer mit NE556
von Michael Gaus
Beim Projekt "LED-Weihnachtsbäumchen mit Jingle Bells"
wurde ein AVR des Typs ATtiny13 verwendet. Um diesen mit der Firmware
zu programmieren wird ein AVR-Programmer benötigt, der z.B.
über die serielle RS232-Schnittstelle eines PCs gesteuert wird.
Solch einen Programmer kann man auch mit dem NE556 und den Bauteilen
aus dem Adventskalender bauen. Es wurde ein Zusatzbauteil verwendet:
eine 9-polige D-Sub Buchse zum Anschluss der Schaltung an die RS232
Schnittstelle eines PCs. Auf dem Aufbaufoto ist zusätzlich noch
ein ATtiny13 zu sehen, der als Testkandidat direkt über
Drahtverbindungen mit den Programmierpins verbunden und dann
programmiert wurde. Die Firmware für "Jingle Bells" (Datei
ton.hex) wurde damit erfolgreich in den AVR geflasht.
Der
zu programmierende AVR darf mit maximal 5,5V versorgt werden, somit
muss zunächst aus der 9V Batteriespannung eine entsprechende
Anpassung vorgenommen werden. Über die 1k Widerstände R1 bis
R3 wird ein Spannungsabfall von ca. 2/3 der Batteriespannung, also ca.
6V, an der Basis des Transistors eingestellt. Der Transistor arbeitet
als Emitterfolger, sodass sich am Emitter eine Spannung von ca. (6 V -
0,7 V) = 5,3 V ergibt. Hierüber werden der NE556 sowie der zu
programmierende AVR versorgt.
RS232-Spannungspegel zwischen +3 V
und +15 V entsprechen einer logischen 0 und müssen Richtung AVR auf
Low-Pegel (GND) umgewandelt werden. RS232-Spannungspegel zwischen -3 V
und -15 V entsprechen einer logischen 1 und müssen Richtung AVR auf
High-Pegel (ca. +5 V) umgewandelt werden. Es werden 2
RS232-Ausgänge benötigt zur Steuerung der AVR-Programmierpins
SCK (Takt) und MOSI (AVR-Eingangsdaten). Außerdem wird ein
RS232-Eingangbenötigt, um die AVR-Ausgangsdaten des Pins MISO
verarbeiten zu können. MISO ist hier direkt mit dem DCD-Eingang
der PC RS232-Schnittstelle verbunden. Dies funktioniert, da die meisten
PCs einen GND-Pegel am RS232-Eingang als logische 1 interpretieren und
es nicht unbedingt erforderlich ist, eine negative Spannung zu erzeugen.
Der
NE556 arbeitet hier als eine Art "invertierender Verstärker", um
die RS232-Ausgangspegel zu konvertieren. Die Umsetzungen für MOSI
und SCK sind gleich aufgebaut, deshalb wird hier exemplarisch die
Umsetzung des RS232-Signals TXD (Pin 3 von X1) auf SCK (Pin 3 von X2)
beschrieben. Der am Control-Pin 3 angeschlossene Transistor T2 bewirkt
eine Spannung von ca. 0,7 V am negativen Komparatoreingang des
Threshold-Pins. Durch den an Control angeschlossenen internen
Widerstand fließt ein Strom über die Basis des Transistors
nach GND und bewirkt somit einen Spannungsabfall in Höhe der
Basis-Emitter-Spannung von ca. 0,7 V. Der Kollektor von T2 bleibt
unbeschaltet. Wenn die Spannung an Threshold größer ist als
0,7 V (z.B. wenn eine positive Spannung an Pin 3 der
RS232-Schnittstelle anliegt und die grüne LED1 leuchtet), dann
wird der Reset-Pin des im NE556 integrierten Flipflops getriggert und
der Ausgang (Pin 5) geht auf GND-Pegel. Durch die grüne LED wird
die Spannung am Threshold-Pin auf ca. +2 V begrenzt.
Die
Triggerschwelle für den positiven Komparatoreingang des
Trigger-Pins des NE556 liegt aufgrund der Innenbeschaltung bei
ungefähr der halben Threshold-Triggerschwelle, also bei ca. 0,35 V.
Wenn die Spannung an Trigger kleiner ist als 0,35V (z.B. wenn eine
negative Spannung an Pin 3 der RS232-Schnittstelle anliegt und die rote
LED2 leuchtet), dann wird der Set-Pin des im NE556 integrierten
Flipflops getriggert und der Ausgang (Pin 5) geht auf VCC-Pegel. Somit
wird praktisch ein invertierender Verstärker gebildet. Durch die
rote LED wird die Spannung am Trigger-Pin auf ca. -1,8 V begrenzt. Der
Widerstand R5 sorgt dafür, dass die negative Spannung keinen
Schaden im NE556 anrichten kann.
Während der Programmierung
flackern die roten und grünen LEDs je nach den auftretenden Bits
im Datenstrom. Der Resetpin des zu programmierenden AVRs ist hier fest
auf GND gelegt. Das Programmiertool hat somit keine Möglichkeit,
den Reset zu aktivieren. Um einen Reset auszulösen, muss manuell
kurz die Versorgungsspannung aus- und wieder eingeschaltet werden. Dies
ist z.B. vor jedem erneuten Aufruf des Programmiertools erforderlich.
AVR Programmierung
Ein
ziemlich universelles Programmiertool, das sehr einfach für diese
Programmierung angepasst werden kann, steht mit der bekannten
Open-Source Software AVRDUDE (siehe [1] bis [3]) bereit.
Die Signalzuordnung zwischen den AVR-Programmierpins und den RS232-Signalen sieht in der Schaltung folgendermaßen aus:
AVR <-> RS232
=================
Reset <-> GND (5)
SCK <-> TXD (3)
MOSI <-> DTR (4)
MISO <-> DCD (1)
In die Konfigurationsdatei avrdude.conf fügt man hierzu den folgenden Abschnitt ein:
# --------------------------------------------------------------------------------
# NE556 AVR Programmer
# reset=!rts sck=!txd mosi=!dtr miso=dcd
programmer
id = "ne556";
desc = "Serial AVR Programmer with NE556, reset=!rts sck=!txd mosi=!dtr miso=dcd";
type = serbb;
reset = ~7;
sck = ~3;
mosi = ~4;
miso = 1;
;
# --------------------------------------------------------------------------------
Die
Tilde ~ bei den Pinnummern der RS232-Signale (X1) bedeutet, dass die
Signale invertiert sind. Dadurch wird ein Programmer namens "ne556"
hinzugefügt, der über den Kommandozeilenparameter "-c ne556"
ausgewählt werden kann.
Beispiel-Aufrufe für AVRDUDE,
um mit dem an COM1 angeschlossenen AVR-Programmer auf einen ATtiny13
zuzugreifen (mit Kommandozeilenparameter -p ATtiny13):
Hexdatei
ton.hex ins Flash programmieren und die Fusebits auf 0xFD (HFuse) und
0x2A (LFuse) setzen: avrdude -P com1 -p ATtiny13 -c ne556 -i 250 -u -e
-U flash:w:ton.hex:i -U hfuse:w:0xFD:m -U lfuse:w:0x2A:m (siehe
Batchdatei avr_write_flash.bat)
Flash auslesen und in Datei testread.hex speichern:
avrdude -P com1 -p ATtiny13 -c ne556 -i 250 -U flash:r:testread.hex:i (siehe Batchdatei avr_read_flash.bat)
Fusebits lesen und in hfuse.txt und lfuse.txt speichern:
avrdude -P com1 -p ATtiny13 -c ne556 -i 250 -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h (siehe Batchdatei avr_read_fuses.bat)
Wenn
ein COM-Port größer als COM9 verwendet werden soll, z.B.
COM13, dann muss der Aufruf folgendermaßen aussehen:
-P \\.\com13
Der
Delay für den Takt auf SCK wurde hier über den
Kommandozeilenparameter "-i 250" auf 250 µs gesetzt. Dadurch
dauert die Programmierung relativ lang, jedoch ist gewährleistet,
dass es keine Probleme mit zu schnellen Signalflanken gibt.
Der
Resetpin des zu programmierenden AVRs ist hier fest auf GND gelegt. Der
im Konfigurationsfile angegebene Pin RTS ist nur als Dummy angegeben,
somit hat AVRDUDE keine Möglichkeit, den Reset zu aktivieren. Um
einen Reset auszulösen, muss manuell kurz die Versorgungsspannung
aus- und wieder eingeschaltet werden. Dies ist z.B. vor jedem erneuten
Aufruf von AVRDUDE erforderlich.
Download: avrprogrammer.zip
Quellen/Links:
[1] AVRDUDE: http://www.nongnu.org/avrdude/
[2] AVRDUDE Version für Windows: http://www.mikrocontroller.net/attachment/123832/avrdude-5.11svn-20111019.zip
[3] http://www.mikrocontroller.net/articles/AVRDUDE