AVR-Programmer mit NE556           

von Michael Gaus                     
      
Elektronik-Labor  Literatur  Projekte  Lernpakete  Kalender  Schaltungswettbewerb




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