Forum: Mikrocontroller und Digitale Elektronik PRINT oder ähnliches für XMEGA


von Peter R. (Firma: Vispiron) (rocket_peter)


Lesenswert?

Hallo!
Ich würde gerne ein PRINT für den XMEGA zusammenstöpseln und benötige 
dafür DEINE Hilfe. Ich lege die formidable Application-Note AVR1307 als 
Treiber zugrunde, die innerhalb von usart_driver.c /.h schon eine 
zeichenweise Funktion in form von USART_PutChar(&USARTD0, 'c'); 
bereitstellt.

Ich portiere Code vom ATMEGA, wo ich das folgende Makro irgendwo aus 
einem open-source Projekt übernommen habe.

#define  PRINT(string, ...)    printf_P(PSTR(string), ##__VA_ARGS__)

static int putchar__(char c, FILE *stream) {
  uart_putc(c);
  return 0;
}

static FILE mystdout = FDEV_SETUP_STREAM(putchar__, 0, 
_FDEV_SETUP_WRITE);

Soweit zum Define, der Funktion putchar__ und der globalen Variable vom 
Typ FILE. Im Programmcode wird dann noch einmal mittels stdout = 
&mystdout; die Ausgabeeinheit verbogen und gut ist. PRINT("Hello 
World"); spuckt damit auf dem ATMEGA den bekannten Text raus. 
Selbstverständlich muss #include<stdio.h> gegeben sein, da dort printf_P 
herstammt.

Nun dachte ich, ich lasse alles beim alten und ersetze einfach in der 
Funktionsimplementierung uart_putc(c); durch USART_PutChar(&USARTD0, c); 
Das kompiliert zwar, aber ich bekomme auf dem Port keine Zeichen raus.
Ich bin sicher der Port funktioniert mit korrekter Baudrate, da ich 
beliebige Zeichenketten über for-schleifen, die ihrerseits die
einzelzeichenfunktion nutzen, senden kann.

Könnte mir jemand helfen oder einen Tip geben, wo ich das gruselige 
Thema mit meheren Unterstrichen nachlesen kann. Ich meine mich zu 
erinnern, dass es sich dabei um Assemblermakros o.ä. gehandelt hat.

Vielen Dank und gruß, Peter

von Peter R. (Firma: Vispiron) (rocket_peter)


Lesenswert?

Tach!
Problem ist behoben. Die oben diskutierte Funktion sieht jetzt so aus 
und wartet immer darauf, dass die USART-Schnittstelle die Zeichen auch 
entgegennehmen kann.



static int putchar__(char c, FILE *stream) {

     uint16_t timeout = 100000;

  // warte bis es möglich ist data in TX data register zu schieben.
  // oder timeout zuschlägt
  while(!USART_IsTXDataRegisterEmpty(&USARTD0) && timeout!=0)
  {
    timeout-=1;
  }

  USART_PutChar(&USARTD0, c);
  return 0;
}

von Simon K. (simon) Benutzerseite


Lesenswert?

Was hat es mit dem timeout auf sich? Sowas braucht man eigentlich nicht. 
Und mit viel Glück wird das wahrscheinlich eh herausoptimiert vom 
Compiler.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.