mikrocontroller.net

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


Autor: Peter Rockel (Firma: Vispiron) (rocket_peter)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Rockel (Firma: Vispiron) (rocket_peter)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.