Schnittstelleninterpreter

Zusammenfassung

Mit dieser Software ist es relativ einfach möglich Befehle über die Serielle Schnittstelle an den msp430 zu senden. In diesem Artikel soll ein kleines Minimalbeispiel vorgestellt werden. Die vom Schnittstelleninterpreter empfangenen Befehle haben folgendes Format:

Startzeichen Adresse Befehl Parameter(optional) Endezeichen
$ A3 led 1 '\n'
$A3 led 1 \n

Start-, Endezeichen, die Geräteadresse (hier A3) und eine Broadcastadresse (z.B. '00') werden in der der Datei rs232.h Definiert, die auswertbaren Befehle in einer Struktur in der Datei rs232_func.c (dazu später mehr).

Voraussetzungen

Um den Interpreter zu nutzen müssen die rs232.h, rs232.c, rs232_func.h und rs232_func.c in das aktuelle Projektverzeichnis kopiert werden. Dann muss die rs232.h in der Hauptdatei per #include eingebunden werden.

Per uart_init(); wird die serielle Schnittstelle initialisiert, momentan sind die Parameter fest auf 9600 Baud bei 16MHz eingestellt. Für andere Kombinationen muss die Initialisierungsroutine entsprechend angepasst werden. Das wird aber irgendwann mal automatisiert wenn ich Zeit dazu habe.

Nach der Initialisierung müssen Interrupts global aktiviert werden, da das Empfangen von Befehlen Interruptbasiert von statten geht. Das Hauptprogramm wird in eine Endlosschleife geschickt, in welcher ein Flag überwacht wird welches durch eben diese Interruptroutine gesetzt wird wenn ein kompletter Befehl empfangen wurde. Ist dieses Flag gesetzt, muss aus der Schleife heraus die Auswertung gestartet werden: die Funktion uart_receive(rxbuffer); übernimmt die Befehlsdekodierung. Anschließend muss das Flag wieder gelöscht werden.

int main()						// main-Function
{
	clk_init();					// Clock initialisieren
	uart_init();
 
	__bis_SR_register(GIE);       			// Global interrupts enabled
 
	while(1)					// Endlosschleife
	{
		if(flags&(1<<RX_FLAG))			// Befehl empfangen?
		{
			uart_receive(rxbuffer);		// -> Befehl auswerten
			flags &= ~(1<<RX_FLAG);		// Flag löschen
		}
	}
}

Befehle Hinzufügen

Die Vorhandenen Befehle und die jeweils auszuführenden Funktionen werden innerhalb einer Struktur in der Datei rs232_func.c gespeichert.

command list[]={{" led",LED},				// Liste mit den Befehlen
		{" who",WHO}};				// und den dazugehörigen Funktionen

Im ersten Feld steht immer der 4 Zeichen lange Befehl (inklusive leerzeichen), der empfangen werden muss, im zweiten ein Pointer auf die auszuführende Funktion. Der Befehl selbst kann frei gewählt werden, die Funktion muss immer einen Pointer auf Character als Übergabewert und einen Rückgabewert vom Typ unsigned char haben. Damit der Interpreter neu hinzugefügte Funktionen auswerten kann muss außerdem die Anzahl der Hinterlegten Befehle in der Datei rs232_func.h angepasst werden.

#define COM_NR	2					// Anzahl der hinterlegten Befehle

An eine so angelegte Funktion wird immer der über die Serielle Schnittstelle empfangene String ab dem 7. Zeichen übergeben. Die ersten beiden sind die Adrsse, dann folgen 4 Zeichen Befehl und ab diesem 7. Zeichen folgen eventuelle Parameter, die jede Funktion entsprechend selbst auswerten muss. Die Funktion WHO aus dem Minimalbeispiel verlangt keine Parameter, die Funktion LED dagegen wertet einen Parameter „1“ oder „0“ aus, um die Hintergrundbeleuchtung entsprechend „an“ oder „aus“ zu schalten. Jede Funktion sollte eine Art von Fehlerkontrolle beinhalten und bei einem Fehler 0 zurückgeben, bei Ordnungsgemäßer Funktion (Parameter erkannt) entsprechend einen Wert verschieden von 0.

uint8_t WHO(char* buffer)				//Wer bist du?
{
	append(buffer," MSP430F2618-Dev.Board");	//Antwort drannhängen
	return 1;					//Erfolgreich zurück
}
 
uint8_t LED(char* buffer)				//Einfacher Test LED an/aus
{
	if (buffer) buffer++;				//Falls Parameter vorhanden
							//Leerzeichen überspringen
	if (*buffer==48)				//Parameter = "0"?
	{
		P7OUT &= ~(1<<2);			//LED aus
		return 1;				//ausgeführt, zurück
	}
	else if (*buffer==49)				//Parameter = "1"?
	{
		P7OUT |= (1<<2);			//LED an
		return 2;				//ausgeführt, zurück
	}
	return 0;					//nicht erfolgreich
}

Test des Interpreters

Zum Testen des Programmes bietet sich ein Terminalprogramm (Hilfreiche Links) an. Um zum Beispiel hterm zu nutzen muss einfach die im Projektverzeichnis gespeichert Konfiguration geladen, der verwendete com-Port angepasst und per Connect die Verbindung hergestellt werden. Jetzt können im Textfeld unten die Befehle eingegeben werden und (hoffentlich) im Received Data Bereich die jeweiligen Antworten erkannt werden.

Quellcode

Viel Spass damit! schnittstelleninterpreter.zip


Diskussion

Geben Sie Ihren Kommentar ein
Wenn Sie die Buchstaben auf dem Bild nicht lesen können, laden Sie diese .wav Datei herunter, um sie vorgelesen zu bekommen.
 
projekte/schnittstelleninterpreter.txt · Zuletzt geändert: 12.03.2009 18:31 von michael
Nach oben
Creative Commons License Recent changes RSS feed
Dieses Werk oder dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.