Pony-Prog Tutorial

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

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


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

Einstellung der Programmierhardware (STK200 ISP-DONGLE) in PonyProg unter Setup/Interface-Setup
Einstellung für einen AVR ATmega16

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

Pfostenwanne, Wannenstecker

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.

Isp conn.jpg

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

Sercon2m.png

(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

Schaltplan eines Adapters für die Druckerschnittstelle (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

Sertwi.png

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.