Protokollerweiterung für AVR910-Programmer mit AT90S2313

In der Application Note AN910 von Atmel wird ein serieller AVR-Programmer samt Hardware, Software und verwendetes Protokoll beschrieben. Die Schnittstelle zwischen PC und dem zu programmierenden Mikrocontroller bildet dabei ein AT90S1200. Um für neue Controller und neue Optionen mehr Flashspeicher zur Verfügung zu haben, wurde inoffiziell ein AVR910-kompatibler Programmer mit AT90S2313 entwickelt. Dieser bietet neben einem (schnelleren) Hardware-UART auch einen Datenspeicher von 128 Bytes. Im folgenden wird eine Softwareerweiterung beschrieben, die unter anderem den SRAM benutzt, um höhere Programmiergeschwindikeiten zu erreichen.

1. Einleitung - Warum das AN910-Protokoll ändern?

Der originale Programmer ist nicht der schnellste. Ein Grund dafür ist das eingesetzte Protokoll, welches ein ständiges Umschalten zwischen Senden und Empfangen erforderlich macht. Jedes Byte, welches in einen Controller programmiert werden soll, wird dem Programmiergerät einzeln übergeben und der PC wartet auf eine Bestätigung. Beim Auslesen ist es ähnlich: jedes Byte muss extra angefordert werden. Die Zeit, die für das Umschalten zwischen Senden und Empfangen benötigt wird, ist vom System und dessen Einstellungen abhängig. Unter Linux kann das Flashen eines Controlles mit der Einstellung
setserial /dev/ttyS1 ^low_latency
und dem ursprünglichen Protokoll schon einige Minuten dauern.
Aus diesem Grund habe ich mich zusammen mit Klaus Leidinger mit der Steigerung der Programmier- und Lesegeschwindigkeit beschäftigt.

2. Benötigte Hardware

Programmer Um die Erweiterungen nutzen zu können, wird ein Programmer nach der AN910 benötigt, mit dem Unterschied, dass statt dem ursprünglich vorgesehenen AT90S1200 ein AT90S2313 eingesetzt wird. Klaus Leidinger stellt auf seiner Homepage eine sehr ausführliche Beschreibung eines solchen Programmiergerätes bereit: de http://www.mikrocontroller-projekte.de. Der rechts abgebildete Programmer wurde von ihm gebaut.

2. Erweiterungen

2.1. Flash auslesen

Statt alle Bytes einzeln anzufordern wird hier nach dem Lese-Kommando die Anzahl der zu lesenden Words übergeben. Danach schickt der Programmer alle Bytes in einem Rutsch zum PC. Die Bestätigung erfolgt vom Programmer erst nach Erhalt des ganzen Blockes.
Für diese Operation wird das SRAM noch nicht benötigt; das kommt erst bei dem Schreibbefehl zum Einsatz.

2.2. Flash schreiben

Der AT90S2313 besitzt einen Datenspeicher (SRAM) von 128 Bytes. Dieser kann dafür eingesetzt werden, um mehrere Bytes (maximal 120; der Rest ist für den Stack reserviert) zwischenzuspeichern und erst dann zu brennen.
Dem Schreibbefehl folgt die Anzahl der zu übertragenden Bytes. Nach dieser Blockgröße werden die eigentlichen Datenbytes gesendet. Der Programmer nimmt die Daten entgegen und sichert sie ins SRAM. Nachdem der komplette Block empfangen wurde, nimmt das Programmiergerät das Flashen der einzelnen Bytes aus dem SRAM vor. Wurden alle erfolgreich in den Zielcontroller geschrieben, sendet der Programmer eine Bestätigung an den PC.
Zu beachten ist, dass bei Controllern, die im Paged-Mode-Verfahren programmiert werden, wie bisher der Befehl zum Einprogrammieren der Pages ('m') vom PC kommen muss.

2.3. Autoincrement

Das automatische Hochzählen der Adresse war zwar schon früher in die Firmware integriert worden, jedoch war es speziell im Paged-Mode-Verfahren nötig, mehrmals die Adresse zum Programmer zu senden. Dies wurde dadurch behoben, dass die Adresse im Zielcontroller, an der zuletzt ein Byte geschrieben wurde, gespeichert wird. So ist bei einem Flush-Page-Befehl ('m') die korrekte Speicherstelle bekannt und muss nicht extra übergeben werden.

3. Umsetzung

Die Erweiterung umfasst drei neue Befehle:
+-----------------------------------+-----------+-------+------+-----+------+
| Report enhanced Mode              | 'M'(0x45) |       |      | 'Y' |  14  |
| eNhanced Block Write              | 'N'(0x4E) |   nn  |   dd |     |  14  |
| eNhanced Block Read               | 'n'(0x6E) |   nn  |   dd |     |  14  |
+-----------------------------------+-----------+-------+------+-----+------+
Über 'M' kann erfragt werden, ob ein Programmer die Erweiterungen ("enhanced mode" genannt) unterstützt. 'N' ist der Schreibbefehl und 'n' der Lesebefehl.
Die Erweiterungen wurden in die Firmware des Programmiergerätes aufgenommen und in AVRDUDE umgesetzt.

Firmware 3.3      avr910_2313_v33.asm      Assemblerfile
avr910_2313_v33.hex Intel-Hex
AVRDUDE avrdude430_mod_w32.zip Windowsversion
avr910.c.diff Linux-Patch für AVRDUDE 4.3.0

4. Ergebnis

Die folgenden Diagramme zeigen die Zeiten für Schreib- und Leseoperationen für 6394 Bytes mit einem ATMega8 bei einer Baudrate von 115200 Baud. Getestet wurde mit AVRDUDE unter Windows und Linux. Wenn unter Linux low_latency gesetzt wird, entsprechen die Zeiten ziemlich genau denen unter Windows.
Windows

Die Zeiten für die Lese- und Schreibaktionen konnten also um über die Hälfte verringert werden (6,97s -> 2,71s, 4,00s -> 1,78s).
Der Geschwindikgeitszuwachs unter Linux mit der Standardeinstellung (^low_latency) ist um vieles höher:

Linux

Das Flashen dauerte hier ohne die Modifikation über eine Minute und das Auslesen gut eine halbe Minute. Beide Zeiten konnten auf unter drei Sekunden reduziert werden (66,94s -> 2,73s, 31,98s -> 1,78s).
Fazit: Die Änderungen verkürzen die Lese- und Schreibzeiten grundsätzlich um mindestens die Hälfte. In Systemen, in denen man die Umschaltzeiten zwischen Senden und Empfangen nicht beeinflussen kann, bringt die Erweiterung eine sehr hohe Geschwindigkeitssteigerung. Es muss noch untersucht werden, wie stark sich die Modifikationen bei Verwendung eines USB-RS232-Konverters auswirkten - zu erwarten wäre eine starke Verringerung der Programmier- und Lesezeiten.

Thomas Fischl
(06/2004)


Externe Links zum Thema

de http://www.mikrocontroller-projekte.de Beschreibung zu einem AVR910-Programmer von Klaus Leidinger
de http://www.mikrocontroller.net AVR-Tutorial, Forum