UAC Mikrocontroller ASCII Console

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

Einleitung

Die uAC (Mikrocontroller ASCII Console) ist dafür gedacht, dass ein Benutzer mit seinem Controller kommunizieren kann. Es können Kommandos abgesetzt werden oder die Firmware kann Ausgaben tätigen. Die Datenübertragung ist nicht auf RS232 beschränkt, sondern kann vom Programmierer über beliebige Schnittstellen geschehen. Eine Implementierung einer solchen Datenübertragung ist somit allerdings unabdingbar.

  • Kann auf beliebigen Controllern eingesetzt werden.
  • definierbarer New-Line-String und Prompt
  • Kommandozeilen Befehle können in die uAC "eingehangen" werden.
  • Beliebig viele Kommandos können eingetragen werden.
  • Befehle können beliebige Parameter empfangen (argc,args).
  • Implementierung einer mini-printf-variante (%i,%s,%c,%u,%f)
  • Strings können auch aus dem Flash gelesen werden ohne RAM zu verbrauchen
  • Variable Anpassung um einen Kompromiss zwischen Speicherplatz und Komfort zu finden

Software

Allgemein

Vor der Benutzung der uAC-Funktionen muss die uac_init() aufgerufen werden. Damit die uAC Zeichen verarbeitet muss die Funktion uac_task() periodisch aufgerufen werden.

Beispiel:

int main (void) {
  uac_init();
  
  //Hauptschleife
  for (;;) {
    //do something interesting..
    uac_task();
    //poll for outputchars:
    if (uac_txavaiable()) send_char(uac_tx());
  }

Ausgabe von Daten

Dies geschieht über die uac_printf()-Funktion. Prinzipiell ist sie ansprechbar wie die gemein bekannte printf(). Allerdings stehen (in der Version 0.3) nur

  1. %i - int
  2. %u - unsigned int
  3. %s - char*
  4. %c - char
  5. %<x>f - float bzw. double

Beispiel

uac_printf("%s World%c\n","Hello",'!');

Wichtig zu wissen ist, dass alle '\n' in der uac_printf() durch das define '_uAC_NewLineString' ersetzt werden. Man braucht sich also nicht darum kümmern, ob das benutzte Terminal "\n" oder "\r\n" benötigt.

die Unterstützung für float und double kann über das define uAC_Print_f_Type aktiviert / deaktiviert werden.

Um Strings auszugeben die im Flash liegen wird die Funktion uac_printf_P() benutzt. Sie verhält sich an sonsten genau wie die uac_printf() Funktion.

Kommandobefehle

Sehr hilfreich ist es, wenn nicht nur die Firmware Ausgaben an den Benutzer weitergibt, sondern wenn auch der Benutzer Anfragen an die Firmware stellen kann. In uAC funktioniert das so, dass eine Kommandofunktion, mittels uac_attach() bekannt gemacht wird. Als Parameter übergibt man einen String (den Kommandobefehl) und einen Zeiger auf die Funktion, die bei Eingabe dieses Befehls aufgerufen wird. Die Kommandofunktion muss als Parameter einmal ein Integer besitzen, welcher beim Aufruf die Anzahl der übergebenen Parameter enthält (ArgC) und Zweitens einen Array von Zeigern auf Chars. Letzteres enthält einen Char* Vektor auf die Parameter (ArgV).

Beispiel einer Kommandofunktion:

void TestCMD (int argc, char *argv[])
{
	uac_printf("Hello World: \n");
	int i;
	for (i=0;i<argc;i++) uac_printf("%i: %s\n",i,argv[i]);
}

Beispiel wie die obige Kommandofunktion bekannt gemacht wird:

uac_attach("test",TestCMD);

Nach dem uac_attach() wird die Funktion TestCMD() aufgerufen, wenn der Benutzer "test\n" eingibt.

Implementierung der Datenübertragung

Die uAC Software kümmert sich in keinster Weise um die Übertragung der Daten (chars). Dies obligt dem Programmierer. Grundsätzlich gibt es drei uAC-Funktionen die eine Schnittstelle bereit stellen:

  • uac_rx - Stellt ein eingehendes Zeichen in den uAC Eingangpuffer.
  • uac_txavailable - Gibt eine '1' zurück wenn Ausgehende Zeichen versendet werden müssen.
  • uac_tx - Gibt ein zu sendendes Zeichen zurück.

Um eingehende Zeichen zu verarbeiten, kann z.B. in eimen USART-Interrupt, dass bei einem eingehenden Zeichen ausgelöst wird, dass ankommende Zeichen per uac_rx() versendet werden. Um ausgehende Zeichung zu verarbeiten, kann z.B. in der Hauptschleife die Funktion uac_txavailable() gepollt werden und gegebenfalls ein Zeichen mit uac_tx() an den USART gesendet werden.

Version Log

Version 0.2

Rename the main functions:

  • uAC_Init() -> uac_init()
  • uAC_Task() -> uac_task()
  • uAC_RxInput() -> uac_rx()
  • uAC_TxAvailable -> uac_txavailable()
  • uAC_GetTxChar() -> uac_tx()
  • uAC_Print() -> uac_print()
  • uAC_StringCompare() -> uac_strcmp()
  • uAC_Attach() -> uac_attach()

Bugfixes:

  • _putuint() printing integers had a failure (backcounting had to start at i--)

Features:

  • uac_print() supports %f type

Version 0.3

  • _putnumber() - function (printf should run faster at %f)
  • internal _printf() defined
  • uac_printf() and uac_printf_P() replaying old uac_print() function

released 03/22/2011

Version 0.4

  • uAC_CmdLibLength define can be left to use a dynamic cmd-list, or set to save som space

released 06/12/2011

Version 0.5

  • volatile for _inbuff and _outbuff
  • support for %x and %X type (can be disabled by undefining uAC_Print_x_Type)

released 09/01/2011

Version 1.0

  • fixing buf with floats between -1.0 and 0.0 (found by kletter_g)
  • writing break command into default cases to avoid warnings of some IDEs
  • rising to first major version (uAC seems to work)

released 10/25/2012

Downloads

[Version 1.0 von Mikrocontroller.net downloaden]

[Version 0.5 von Mikrocontroller.net downloaden]

[Version 0.4 von Mikrocontroller.net downloaden]

[Version 0.3 von Mikrocontroller.net downloaden]

[Version 0.2 von Mikrocontroller.net downloaden]

[Version 0.1 von Mikrocontroller.net downloaden]

Sonstiges

Fragen und Antworten an lodentoni