Guten Morgen zusammen, Ich bin seit heute morgen dadran ein bisschen mit der UART zu spielen und benutze dafür die Library von P. Fleury. http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__uart.html Schematisch sieht mein Aufbau so aus: USB PC -> FT232RL -> UART vom Atmega 16 Die Kommunikation funktioniert auch so weit habe ich mit HTerm getesten. Nun würde ich zum weiteren testen gerne vom PC eine "1" Senden und damit eine LED am Controller einschalten und mit einer "2" wieder abschalten. Dafür verwende ich aus der Library die Funktion c = uart_getc(); if ( c == '1') {LED_ON;} if ( c == '2') {LED_OFF;} Ich vermute aber das ich von der Funktion " uart_getc() " nicht den wert zurück bekomme den ich von HTerm gesendet habe. Hat da vielleicht jemand einen lösungsansatz? Viele Grüße
Ingo schrieb: > Hat da vielleicht jemand einen lösungsansatz? Sende doch zur Kontrolle das von uart_getc() empfangene Zeichen an HTerm zurück. Dann siehst du schon mal, ob die Library und dein Drumherum wunschgemäss spielt. Verwirrung herrscht öfter mal durch die ASCII Darstellung. Du könntest also mal auf 0x31 statt auf '1' testen, oder auf 0x32 für die '2'. HTerm muss auch richtig eingestellt sein, du kannst hier auch HEX senden. Das siehst du aber auch, wenn du wie o.a. mal echoest. Check auch mal deine LED_ON und LED_OFF Makros. Da geht gerne mal was schief.
:
Bearbeitet durch User
Die LED_ON Makros hab ich einzeln getestet die funktionieren. -> #define LED_ON { DDRA |= (1<<PA4); PORTA |= (1<<PA4); } #define LED_OFF { PORTA &= ~(1<<PA4); } Das gesendete Zeichen sehe ich auch in HTerm, das sieht dann so aus wie in dem angehangenen Bild: Das mit den HEX Code 0x31 versuche ich gleich mal.
Denk bitte daran, dass Fleury einen 16 Bit Wert liefert. Im oberen Byte steht der Status. Und es kommt immer und sofort ein Wert zurück, notfalls der Wert "nichts empfangen, die Welt dreht sich".
Ingo schrieb: > Okay das müsste ich dann vermutlich irgendwie abfangen. Schau dir mal in der uart.c Datei die Funktion uart_getc() an (ebenfalls die uart.h defines), da siehst du genau was die Fkt. wann liefert. Mögliche Lösung: (Kannst es auch mit if(...) anstatt switch(...) machen, find das jedoch schöner, falls du noch mehr Werte prüfen möchtest) - Geschmackssache :-)
1 | unsigned int c; |
2 | |
3 | c = uart_getc(); |
4 | |
5 | if(c != UART_NO_DATA) |
6 | {
|
7 | switch(c & 0x00FF) |
8 | {
|
9 | case '1': |
10 | {
|
11 | LED_ON; |
12 | } break; |
13 | |
14 | case '2': |
15 | {
|
16 | LED_OFF; |
17 | } break; |
18 | }
|
19 | }
|
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.