|
|
Launchprogvon minifloat
[Bearbeiten] Was ist das denn?Ein AVR-ISP-Programmer nach der Atmel AVR910-Appnote, der auf einem TI Launchpad 1.4 mit dem beiliegenden MSP430G2211 oder dem MSP430G2231 und dem beiliegenden Uhrenquarz läuft. Für wenig Geld hat man einen Steckbrettkompatiblen USB-in-System-Programmer für einige Atmel AVR Prozessoren in der Hand. [Bearbeiten] EinleitungDas "Henne und Ei"-Problem oder das Basteln eines AVR-ISP-Programmers "aus dem Nichts" wird dem einen oder anderen sicher einmal widerfahren sein. Dieses Projekt wurde zwar "nur so zum Spaß" und nicht aus der Not heraus durchgeführt, trotzdem möchte ich es euch nicht vorenthalten, da es dem einen oder anderen einmal nützlich sein könnte. Zugegebenermaßen ist es schon ein bisschen dreist gegenüber TI. Aber warum nicht? Vorteil der Sache ist, man bekommt von TI recht günstig eine funktionsfähige Hardware, die sich direkt an den USB-Port anstecken lässt. Zudem ist auf dem "Emulation" benannten Teil der roten Platine neben der Programmerhardware auch ein USB-Seriell-Adapter integriert. Nachteil ist, dass der hier verwendete MSP430G2211 keinen UART in Hardware besitzt. Zahlreiche Implementierungen für eine Software-UART existieren in den Foren von TI. Die meistfavorisierten Lösungen benutzen das erste Zeichen, was über RX vom Rechner kommt, um sich auf die Baudrate der eintrudelnden Daten aufzusynchronisieren. Die meisten Software-UARTs benutzen also den internen RC-Oszillator. Das erste Zeichen sollte meist ein 'U' sein(0b01010101 oder 0x55). Der Nachteil an dieser Sache ist, dass das erste gesendete Zeichen nicht bei jeder steuernden Software gleich ist. Der Programmer sollte "sofort nach dem Anstecken" betriebsbereit sein. Zudem liegt den Launchpads kein "amtlicher Quarz" bei. Und wenn gerade ein Quarz rumliegt, dann ist es für einen MSP430-Neuling relativ undurchschaubar, wie man jetzt da dran einen Quarz benutzt. Ich war zunächst generell auf der Suche nach einem Software-UART für die beiden dem Launchpad beiliegenden Prozessoren. Ich hab mich dann riesig gefreut, eine Lösung von Rick Kimball gefunden zu haben, die den beiliegenden 32,768kHz Uhrenquarz benutzt. Mit diesem wird über eine Art Software-PLL der RC-Oszillator des MSP430G2211 getrimmt. Nach dem Start hat man dann hinreichend stabile 16MHz Haupttakt. Wer wissen will, wie das genau geht, kann sich den Sourcecode zur Software-UART von Rick Kimball ansehen. Die eigentliche Soft-UART wird dann über Timer-ISRs abgewickelt. Um diesen Teil musste ich mich also nicht mehr groß kümmern. Der Software-UART von Rick Kimball braucht für sich allein und mit der "Echo"-Demo schon 1kB Flash im MSP430G2211(er hat 2kB). Aus der Frage, was noch in die restlichen 1kB Speicher passt, wurde dann die Idee zu diesem Projekt geboren. [Bearbeiten] Hardware[Bearbeiten] Grundüberlegungen zur HW
[Bearbeiten] PinbelegungHerausgekommen ist folgende Pinbelegung für die AVR ISP Schnittstelle:
Dass auf dem Launchpad der Taster S2 an P1.3 ist, kommt einem insofern entgegen, da man damit das Targetsystem auch mal resetten kann. Es gibt also jetzt zwei Reset-Taster: einen für den AVR, einen für den MSP430. Wenn man eine Targetspannung von +5V benutzt, muss ein Widerstand von 1kΩ in die MISO-Leitung eingefügt werden. [Bearbeiten] UhrenquarzDer dem Launchpad beiliegende 32,768kHz Uhrenquarz muss bestückt werden, wenn man dies noch nicht getan hat. [Bearbeiten] LEDsWas die LEDs auf dem Launchpad aktuell anzeigen:
Die LEDs werden nicht durch die im AVR910-Protokoll vorgesehenen Softwarekommandos gesteuert. Die LED-Softwarekommandos werden ignoriert und quittiert, da sonst die Brennsoftware am PC meckern würde. Das wurde bei Serasidis' AVR910 schon so gehandhabt. [Bearbeiten] Jumper J3Die Jumper, die den "Emulation"-Teil mit dem unteren "MSP-EXP430G2"-Teil verbinden, müssen zum Programmieren des MSP430G2211 alle gesteckt sein. [Bearbeiten] Software[Bearbeiten] Grundüberlegungen zur SW
[Bearbeiten] Soft-UARTDamit meine Vorgabe bezüglich der Namensgebung auch für die Soft-UART von Rick konsistent ist, habe ich ein paar kleine Wrapper-Funktionen geschrieben, die sich stark an den hier im Forum bekannten Implementierungen für einen Zugriff auf die Hardware-UART eines Atmel AVR anlehnen und die gleiche Funktionalität bieten. Damit konnte ich schon mal wie gewohnt auf AVR-Umgebung arbeiten. Bei Serasidis Vasilis' ASM-Code haben die UART-Routinen kein Präfix "uart_". Die von mir verwendete Version vom msp430-gcc hat sich -warum auch immer- über "getc()" beschwert, also musste da etwas "manuelles Name-Mangling" Korrektur schaffen. [Bearbeiten] Soft-SPIZugegebenermaßen bin ich zuerst nicht wirklich durch die ASM-Routine "wrser" für Schreiben auf die SPI durchgestiegen. Aufgrund dessen habe ich eine eigene Routine dafür genommen, die sich bei meinen bescheidenen Basteleien bewährt hat. Anstatt hier und da zu schieben und eine Zählvariable zu benutzen, nehme ich eine Bitmaske und statt zu zählen wird eben geschoben/durch 2 geteilt. Mittlerweile habe ich die Funktion der Originalroutine verstanden. Meine Implementierung sollte sich gleich verhalten. Die Funktionalität der SPI-Leseroutine "rdser" wurde durch ein Makro erreicht. [Bearbeiten] DevicecodesDie Liste der von Launchprog unterstützten Devices(Target-Prozessoren) ist gleich der Liste der von Serasidis Vasilis' AVR910. Mit ein bisschen "Find & Replace" war die Liste auch recht schnell nach C umgesetzt. Ich hab sie einfach in ein Headerfile geworfen. Beim Test, ob der von der Brennsoftware am PC gewählte Devicecode überhaupt in der Liste der unterstützten Devices ist, wurde im Assemblercode eine ziemlich zeitraubende Methode gewählt:
Die Gültigkeit des gewählten Devicecodes wird in meinem C-Code sofort nach der Auswahl geprüft.
Wer genau wissen will, was da vor sich geht, sei auf den C-Quelltext und zum Vergleich die Assemblersource von Serasidis Vasilis verwiesen. Bei Version 1.2 wurde ein Bug in der Deviceauswahl beseitigt. Dieser rief das "Kaltstartproblem" hervor(siehe Known Bugs). Der Zugriff auf die Programmierroutinen ist nun grundsätzlich erlaubt, es sei denn, es wird ein "falscher" Devicecode eingestellt. [Bearbeiten] BlockmodusAVRDUDE führt vor jedem Start eines Programmier- oder Lesevorgang auf dem Target eine Art Service-Discovery des Programmers durch. Bei den ersten Tests meldete sich avrdude mit "Programmer not responding". Um dieser Sache auf den Grund zu gehen, habe ich einen zweiten USB-Seriell-Adapter an die RX-Leitung gehängt. Mit diesem Lauschangriff konnte ich sehen, ob es nun an AVRDUDE oder an meinem Code liegt. Nun - es lag an beidem. AVRDUDE schreibt ein 'b', um festzustellen, ob der angeschlossene AVR910 den gepufferten Blockmodus unterstützt. Da dieses Kommando in Serasidis Vasilis' Code nicht existiert, meldet der Programmer '?'. So war es also auch bei mir. Aus den Sourcen von Klaus Leidinger habe ich die Info entnommen, was es mit dem 'b' überhaupt auf sich hat. Launchprog meldet auf das Kommando 'b' nun ein 'N' wie "Nein, ich unterstütze keinen Blockmode". Soweit scheint dieses Problem gelöst zu sein. [Bearbeiten] VersionDie Service-Discovery-Funktionen, die Soft- und Hardwareversion zurückgeben, geben aktuell die Versionsnummern von Serasidis Vasilis' AVR910 zurück. Dies habe ich aus Kompatibilitätsgründen so gewählt. Die Versionsnummern stimmen natürlich nicht mit der Launchprog-Version überein. [Bearbeiten] Build der FirmwareZum Bau der Firmware wurde msp430-gcc v4.5.3 verwendet. In Rick Kimballs Code fanden sich noch einige nach diesem Stand veraltete Headerdateien. Ich hab das ein wenig aufgeräumt und der Bau sollte ohne Fehler und ohne Warnungen durchgehen. Wer die Software nicht selbst zusammenbauen kann oder möchte, kann auch das fertige Binary direkt auf den MSP430G2211 aufspielen. Quellcode und Binary gibt es in der Download-Sektion unten. [Bearbeiten] Known Bugs[Bearbeiten] Tracking
[Bearbeiten] Beschreibung der BugsBug1 "Kaltstartproblem" (Beseitigt!) Bug2 "Target-Reset" (Muss noch geprüft werden) [Bearbeiten] Tests[Bearbeiten] TestkonditionenUm die grundsätzliche Funktionalität von meinem Launchprog zu ergründen,
[Bearbeiten] Funktionierende KonfigurationenFolgende Prozessoren sind mit Launchprog v1.2 + AVRDUDE getestet worden:
"√" = geht/OK Anmerkungen: ... stk500_devcode = 0x14; # this is the devicecode for Tiny19, works though avr910_devcode = 0x58; signature = 0x1e 0x90 0x07; ... Es empfiehlt sich, für "neue" Prozessoren einen Devicecode ohne 'P' zu benutzen. Das zusätzliche Delay beim Beschreiben des Flash schadet in keinem Fall. Mehr Prozessoren: [Bearbeiten] Aufruf von AVRDUDEDer Launchprog verhält sich in der jetzigen Version 1.2 nahezu wie ein generischer AVR910-Programmer. Er läuft jedoch mit 9600Bd statt wie im Original mit 19200Bd. Der Aufruf von AVRDUDE sollte also wie folgt stattfinden: avrdude -c avr910 -b 9600 -P <PORT> -p <PART> -U <KOMMANDO> Wer eine GUI für AVRDUDE benutzt, sollte nach einer "Speed" oder "Baudrate" genannten Konfigurationsmöglichkeit Ausschau halten. Hierbei ist lediglich die Geschwindigkeit der seriellen Schnittstelle gemeint, nicht die Frequenz des ISP-Taktes an SCK! [Bearbeiten] Weitere EntwicklungIch(minifloat) werde den Kram hier nicht mehr weiter Entwickeln oder Pflegen. Wer sich dran freut das zu tun den lass ich gerne vor. [Bearbeiten] DownloadsNeueste Version: Alte Versionen: [Bearbeiten] Troubleshooting[Bearbeiten] error: 'TA0IV_TACCR1' undeclaredFalls beim kompilieren der Version 1.2 folgender Fehler auftritt: $ make msp430-gcc -Os -Wall -g -mmcu=msp430g2231 -c main.c msp430-gcc -Os -Wall -g -mmcu=msp430g2231 -c softserial.c softserial.c: In function 'SoftSerial_RX_ISR': softserial.c:281:19: error: 'TA0IV_TACCR1' undeclared (first use in this function) softserial.c:281:19: note: each undeclared identifier is reported only once for each function it appears in make: *** [softserial.o] Error 1 Hilft folgender Patch für softserial.c
--- softserial.c 2012-12-26 14:54:00.974029300 +0100
+++ softserial.c.new 2012-12-26 14:54:22.943562900 +0100
@@ -273,6 +273,10 @@
static unsigned char rxBitCnt = 8;
static unsigned char rxData = 0;
+#ifndef TA0IV_TACCR1
+#define TA0IV_TACCR1 TAIV_TACCR1
+#endif /* TA0IV_TACCR1 */
+
#ifdef TIMER0_A1_VECTOR
if ( TA0IV == TA0IV_TACCR1 ) { // this mcu has multiple TIMERA peripherals
#else
[Bearbeiten] Links und Referenzen |