Pony-Prog Tutorial
Diese Anleitung beschreibt, wie vom Assembler (z. B. AVR-Studio) oder C-Compiler (z. B. avr-gcc/winavr) erzeugte HEX-Dateien auf einen Atmel AVR-Mikrocontroller übertragen werden. Die vorgestellte Lösung basiert auf freier oder kostenloser Software und low-cost-Hardware. Anfänger sollten sich bevor sie loslegen zuerst einmal das AVR-Tutorial zu Gemüte führen.
Die Ponyprog - Homepage ist http://www.lancos.com/prog.html
Das Ponyprog - Diskussionsforum ist http://ponyprog.sourceforge.net/phorum/list.php?2
Hinweis auf den Quellcode
Ponyprog jetzt opensource
Benötigte Ausstattung
- Programmier-Software PonyProg 2000 von www.lancos.com. Für diese Anleitung wurde PonyProg 2000 Version 2.06 beta genutzt.
- STK200-kompatible Programmier-Hardware (Programmieradapter).
- Fertig zu kaufen bei:
- Platine zum Selbstbestücken bei:
- oder selbst bauen nach:
- AVR-Controller-Board mit ISP-Anschluss (siehe weiter unten)
Um schon in der Anfangsphase Probleme zu vermeiden, sollte der Controller beim Einsatz eines STK200-Programmierers mit 5 Volt betrieben werden. Geringere Spannungen werden nicht von allen Programmieradaptern unterstützt. Höhere Spannungen zerstören möglicherweise den Controller oder den Parallelport des PCs.
PonyProg installieren und einrichten
PonyProg kommt mit einem Installationsprogramm, einfach starten.
Im Anschluss PonyProg die Zeitschleifen kalibrieren lassen (Menüpunkt Setup/Calibration).
PonyProg unterstützt die automatische Erkennung von AVR-Controllern. Um Probleme zu vermeiden, sollte man den Controllertyp jedoch manuell einstellen. Achtung, die P-Typen Mega644P, 48P... werden derzeit (V.2.07c vom 6.1.08) noch nicht unterstützt.
Parallel oder seriell?
PonyProg unterstützt das Programmieren über ein serielles oder ein Druckerport. Das macht den Einstieg für Gelegenheitsbastler besonders attraktiv. Sofern man diese Ports hat. Etwaige USB-Programmiergeräte werden nicht nativ unterstützt. Hier eine Tabelle zur Gegenüberstellung:
Vergleichskriterium | Serielles Port | Parallelport (Druckerport) |
---|---|---|
Anschluss zum Controller | kompliziert (Pegelumsetzung nach TTL) | einfach (bereits TTL-kompatibel) |
Programmiergeschwindigkeit am echten Port | mittel | schnell |
Programmiergeschwindigkeit am USB-Adapter | langsam | Schreiben: flott Lesen, Verify: langsam ‡ |
Nutzung des Ports zur Kommunikation mit dem programmierten Controller | günstig, typisch via MAX232 u.ä. | ungünstig, archaisch |
Funktioniert unter 64-Bit-Versionen von Windows | ja | ja ※ |
‡ Entweder mit jenem USB2LPT oder einem USB-Drucker-Konverter und einer speziellen Version der InpOut32.dll.
Nur USB2LPT: Der Einsatz von USB Low-Speed dehnt alle Zeiten (mindestens) um Faktor 8. Hi-Speed-USB verkürzt um Faktor 8.
※ Genügend neues InpOut32.dll vorausgesetzt, signierten 64-Bit-Treiber enthaltend
Hardwareverbindung herstellen
Via standardisiertem ISP-Stecker
Auf der Controller-Platine (Controllerboard) ist ein Anschluss für den Programmieradapter erforderlich. Überlicherweise wird dazu eine 10-polige "Pfostenwanne" (andere Bezeichnung: Wannenstecker, Wannen-Stiftleisten) (5 Pole in 2 Reihen, "WSL 10G" bei Reichelt) genutzt (siehe Abbildung). Dieser Anschluss ist auch kompatibel zum ATMEL AVRISP Programmiergerät.
Die Anschlussbelegung (entnommen aus der AVRISP Online-Benutzeranleitung) siehe folgende Abbildung. Pin 1 ist an Wannensteckern üblicherweise mit einem Pfeil markiert.
Signal | Pins | E/A aus "Sicht" des Programmier- adapters) |
Beschreibung |
---|---|---|---|
VTG | 2 | (Eingang) | Stromversorgung des Programmiergeräts, mit +5V Versorgung des Controllerboards verbinden |
GND | 4,6,8,10 | (Eingang) | Masse, Ground, mit Ground des Controllerboards verbinden |
MOSI | 1 | Ausgang | Datenleitung vom Programmieradapter zum Controller, mit MOSI des AVR verbinden |
MISO | 9 | Eingang | Datenleitung vom Controller zum Programmieradapter, mit MISO des AVR verbinden |
SS | 3 | nicht benutzt | Reserviert für Auswahl und Synchronisierung eines Slave, wenn über diesen Stecker Master-Slave mit SPI Daten austauschen sollen. - Wird beim Programmieren nicht benutzt. Wenn dieser Pin verbunden ist, dann kann die Programmierhardware auch zur Kommunikation mit dem Prozessor verwendet werden. |
SCK | 7 | Ausgang | Programmier-Takt-Leitung (PA->AVR), mit SCK des AVR verbinden |
RESET | 5 | Ausgang | Resetleitung, wird durch das Programmiergerät bei der Programmierung auf "LOW gezogen", mit RESET des AVR verbinden |
Sogenannte "value-added" Programmieradapter unterstützen an PIN 3 den Anschluss einer LED, mit der ein Zugriff auf den Controller durch den Programmieradapter angezeigt werden kann. Weiters dazu in den Beschreibungen der Programmierhardware auf den o.g. Seiten.
Wenn die Anschlüsse MOSI, MISO und SCK des Controllers als allgemeine Ausgabeanschlüsse verwendet werden, muss beachtet werden, dass die Peripherie beim Programmieren mitgeschaltet wird.
Zur Programmierung mittels ISP muss der Controller mit einer "Taktquelle" ausgestattet sein, modernere AVRs sind mit einem internen Oszillator (1 MHz Takt) ausgestattet, der ab Werk aktiviert ist. Bei diesen sind keine zusätzliche externen Bauteile erforderlich. An AVRs ohne internen Oszillator (z. B. die veraltete "AT90S"-Serie) muss zur ISP-Programmierung ein externer Taktgeber (z. B. Quarz mit Kondensatoren) angeschlossen werden.
Der ISP-Anschluss wird zur Programmierung mit dem Programmieradapter verbunden, der PC-seitige Anschluss erfolgt an die Druckerschnittstelle (Parallelport, LPT), über die serielle Schnittstelle (COM1). Es empfiehlt sich, die Stromversorgung des Controllerboards beim An- und Abstecken abzuschalten.
Via sonstigem Anschluss
Dem Bastler ist es natürlich völlig freigestellt, wie die Verbindung vom PC-Port zum Mikrocontroller erfolgt. Auf einem Steckbrett genügen 5 simple Drähte zu einem 25-poligen SubD-Stecker zum Anschluss an's Parallelport, 5 V dazu und fertig ist das Programmiergerät für DIL-Schaltkreise.
Ist kein Platz auf einer Platine mit einem SMD-Controller bleibt nichts anderes übrig als temporäre Drähte anzulöten und solange den Entwicklungszyklus Programmieren-Testen-Debuggen auszuführen, bis alles wie gewünscht funktioniert. SMD-Programmierfassungen sind für Bastler eher eine kostspielige Rarität.
Programmierung des Controllers
Schritt 1: Hex-Datei in Ponyprog laden
In PonyProg Menü: File/Open-Device-File... wählen, im Dialog die HEX-Datei auswählen und mit [OK] in PonyProg laden.
Schritt 2: Daten zum Controller übertragen
In PonyProg Menü: Command/Write All wählen. PonyProg überträgt die Daten aus der HEX-Datei dann auf den Controller ("flashen") und verfiziert im Anschluss, ob dieser Schreibvorgang fehlerfrei durchgeführt wurde, indem der Inhalt des Controller-Flash-Speichers gelesen und mit dem Inhalt der HEX-Datei verglichen wird. Der Inhalt des EEPROM wird bei der Programmierung gelöscht, d.h. alle Speicherstellen des EEPROM-Speichers im AVR werden auf $FF gesetzt.
Um den Zyklus Programmieren-Testen-Debuggen zu verkürzen gibt es mit ^P (Strg+P) die Möglichkeit, die Schritte "Hex-Datei neu einlesen", "Controller löschen", "Controller brennen" automatisiert ablaufen zu lassen. Die machbare Option, diesen Automatismus bei Änderung der Hex-Datei ablaufen zu lassen (also ohne Tastendruck, und ohne das letzte OK bei Erfolg) ist in PonyProg leider nicht eingebaut.
Fuses
Mit Ponyprog kann man auch die Fuses bei den AVRs setzen, muss dabei aber sehr aufpassen: Die Fuses sind im AVR invertiert, d.h. 0 = ein und 1 = aus. Das steht auch so im Datenblatt. Ponyprog invertiert das wieder (steht auch da, allerdings in dunkelgrau auf hellgrauem Grund), d.h. 0 = aus und 1 = ein. Jetzt scheint wieder alles normal zu sein.
Allerdings steht im Datenblatt nicht immer ein und aus, sondern manchmal (z. B. bei den Clock sources) steht da auch einfach 0 und 1. Da Ponyprog dieses Fuses ebenfalls invertiert, muss man diese selbst nochmals invertieren. Wo im Datenblatt eine 0 steht muss man in Ponyprog ein Häkchen setzen, bei einer 1 im Datenblatt das Häkchen löschen.
Verwirrt? Tja, hier hilft nur sorgfältiges arbeiten. Ganz wichtig ([1]): Erstmal die bisherigen Einstellungen auslesen. Und dann nur das ändern, was unbedingt nötig ist. Finger weg von RSTDISBL. Wenn man diese ändert, dann kann man den AVR nicht mehr über das STK200 programmieren. Ohne alternativen Bootloader oder einem AVR HV-Programmer (z. B. STK500) ist der Chip dann wertlos.
Siehe auch: Vergleich der Fuses bei verschiedenen Programmen
Programmierung über den seriellen Port
Modische Laptops haben nicht immer ein Parallelport. Dann können die 3 Ausgangsleitungen des seriellen Ports COM1 von Ponyprog angesteuert werden. Es werden dabei keine Daten seriell herausgeschickt, sondern die 3 Leitungen werden durch entsprechende Befehle High und Low geschaltet.
- Eine Warnung
- Es gibt im Handel diverse USB-Seriell Wandler. Ihre Aufgabe ist es am USB-Port eine serielle Schnittstelle zur Verfügung zu stellen. Da PonyProg den seriellen Port aber nicht wie einen standardmäßigen seriellen Port benutzt, funktioniert die Programmierung über so einen USB Wandler in den seltesten Fällen.
Pardon, falsche Warnung! USB-Seriell-Wandler werden korrekt (mit Win32-API) angesteuert. Vorausgesetzt, man wählt „…API“, nicht „…I/O“ als Programmiergerät. Sie sind allerdings um Faktor 100 langsamer als eingebaute Ports. Zusätzlich kann es sein, dass die Treiberfähigkeit ihrer Ausgänge vermindert ist, was dafür sorgen kann, dass es mit bestimmten einfachen Adaptern tatsächlich gar nicht funktioniert. Aber schon der Faktor 100 dürfte abschreckend genug sein.
Neuere Windows-Versionen (ab Vista) haben offenbar einen verbesserten USB-Hostcontroller-Treiber, der in der Lage ist, USB-Transfers außerhalb des 1-ms-Planungsrasters einzuschieben. Damit beschleunigt sich der USB-Zugriff für derartige Anordnungen etwa um den Faktor 2 oder 3, und die Programmierzeiten werden in der Tat erträglicher.
Schaltbild
(Auch als Tinycad-Quelle verfügbar: Datei:Sercon2m.zip - Tinycad gibt es bei http://tinycad.sourceforge.net )
Die Spannungsversorgung für den MAX238 erfolgt von der Schaltung. Deswegen ist der Programmieradapter nur für Schaltungen brauchbar, die mit 5 V +-5% versorgt werden.
Ähnliche Adapter, die mit Dioden, Z-Dioden und Widerständen aufgebaut sind, sind unter dem Namen "sercon programming adapter" im Internet zu finden. Diese benötigen dann andere Einstellung der Invertierungs-bits! Siehe hierzu [[2]]
Vorgehensweise
- Im Ponyprog-Menü : [Setup] [Interface Setup...]
(o) Serial [ SI Prog I/O ] (o) COM1 [ ] Invert Reset [v] Invert D-in [v] Invert SCKL [v] Invert D-Out
- Zeitkalibrierung durchführen: Im Ponyprog-Menü : [Setup] [Calibration]
- Anwahl des Mikroporzessortyps AVR und ATmega8535
- Laden der HEX-Datei C:\home\cc\qq\avr\qqtslcd.hex
- Verbinde Programmieradapter mit Mikroprozessor
- Spannung an Mikroprozessor ein (5V, versorgt MAX238 )
- Wähle an AVR und ATmega8535
Damit lassen sich die Konfigurationsbits auslesen.
Und damit lässt sich ATmega8535, ATmega32 programmieren.
Hinweis: Der MAX238 invertiert die RS232-Signale (das wird für RS232-Verbindungen so gebraucht.) Deswegen die Invertierungsbits im Ponyprog entsprechend setzen. Das muss bei jedem Start von Ponyprog (2.07a Beta) neu eingestellt werden. Ab Version 2.07c Beta merkt sich Ponyprog diese Voreinstellung
avrdude unter Linux
Vor diesen sercon2m muss 'root' in /etc/avrdude.conf noch einfügen:
programmer id = "sercon2m"; desc = "An serial port, mikrocontroller.net Pony-Prog_Tutorial"; type = serbb; reset = ~3; sck = ~7; mosi = ~4; miso = ~8; ;
Dann kann ein atmega32 programmiert werden mit
avrdude -p atmega32 -P /dev/ttyS0 -c sercon2m -U flash:w:dateiname.hex
Siehe auch: AVRDUDE
I2C - EEPROM programmieren am Parallelport
Diese Schaltung ist nachgebaut nach der Schaltung, die Claudio Lanconelli in http://www.lancos.com/prog.html#easyi2c veröffentlicht hat.
Die Transistoren invertieren das Signal: Ausgabe von 1 führt dazu, dass die entsprechende Leitung (SDA SCL) nach LOW gezogen wird.
Die Transistoren schützen den Parallelport vor Überlastung oder Kurzschluß (Ich tausche nach einem Unfall lieber zwei Transistoren als das Mainboard meines Laptop ;-) .
Diese Schaltung verwende ich auch, um aus Turbo-C heraus EEPROM auszulesen und andere TWI (I²C, I2C) - Experimente zu machen.
Anwendung:
- Starte Ponyprog
- Einsetzen eines 24C128
- [Setup] [Interface Setup] [EASYI2C I/O] an (o) LPT1
- Anwahl des EEPROM-Typs, z. B. [I2C Bus 16bit eeprom] [24128]
- Versorgung durch 5V
- Read Device
Der WP-Pin muss Low sein, um Schreiben zu können.
I2C - EEPROM programmieren am COM1-Port
R5,R6 = 10 kOhm geht nicht. Muss 3.3 kOhm sein.
Wenn die Steckbrücken 1-2 und 3-4 fehlen (kein Pull-Up), dann zeigt Ponyprog die Fehlermeldung an: I2CBus Stop condition error (bad timing ?) (-20)
Der Aufbau eines dritten Inverters mit einem Transistor (würde das Invertieren von D-IN sparen) erwies sich als zu problematisch. Vermutlich war der verwendete Transistor zu langsam.
Die Einstellungen in Ponyprog:
(o) Serial SI Prog I/O (o) COM1 [ ] Invert Reset [v] Invert D-IN [ ] Invert SCKL [ ] Invert D-OUT
Nach jedem Start von Ponyprog muss das [v] Invert D-IN neu gesetzt werden.
Die Zeitkalibrierung nicht vergessen!
- 1: Uli Huber hat im Forum einen Weg beschrieben, wie man mit PonyProg direkt aus AVR-Studio heraus programmieren kann, ohne einen SDK-kompatiblen Programmer zu haben.