Forum: Mikrocontroller und Digitale Elektronik UART Library von P. Fleury


von Ingo (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Ingo (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Ingo (Gast)


Lesenswert?

Mhm Ok mit dem 0x31 funktioniert. Danke schonmal.

:-)

von Georg G. (df2au)


Lesenswert?

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".

von Ingo (Gast)


Lesenswert?

Okay das müsste ich dann vermutlich irgendwie abfangen.

von Adam P. (adamap)


Lesenswert?

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
Noch kein Account? Hier anmelden.