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
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; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.