UART Library von P. Fleury

Gast #5097916
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
(Firma: matzetronics) #5097929
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.
Gast #5097945
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.
Angehängte Dateien:
#5098094
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren