mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik P.Fleury USART-Lib/getc() liefert immer 256


Autor: Alexander W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verzweifle langsam daran, ein paar Bytes mit dem USART zu Empfangen.

Ein Atmega32 ist an ein eDIP240-7 angeschlossen, auf dem Display ist ein 
Bargraph, der nach jedem Bewegen seinen neuen Wert in 5 Bytes sendet.
Das erste soll auf 0x1B geprüft werden, dann werden drei verworfen und 
das fünfte ist ein Wert von 0-100. Eine völlig unelegante Lösung, aber 
zurzeit gibt es auf dem Display nur den Bargraph.

Dazu habe ich folgende Sourcecode(auch völlig ineffizient):
     
for(;;)
{
        
    c = uart_getc();
    if ( c & UART_NO_DATA )
    {
        
    }
    else
    {
       if (c==0x1B)
       {
       c=uart_getc();
       c=uart_getc();
       c=uart_getc();
       c=uart_getc();        
            
       uart_puts("#YH");
       itoa(c,buffer,10);
       uart_puts(buffer);            
       uart_putc(',');        
      }
  }
}

Das Problem ist, das immer "#YH256," gesendet wird. Eigentlich soll 
statt 256 aber der Wert c vom letzen getc() gesendet werden.
Im übrigen sind alle getc() bis auf das allererste 256, das erste 
funktioniert hingegen und erkennt ggf. das 0x1B.

Danke im Vorraus,
Alex

Autor: Ohforf Sake (ohforf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gucken wir mal in die uart.h...
#define   UART_NO_DATA   0x0100
... in dezimal ist das 256.

Ich glaube, die Bytes nach dem 0x1B sind zu dem Zeitpunkt noch nicht 
angekommen.

Autor: Alexander W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das war tatsächlich das Problem. Ich glaube ich hätte ewig 
gesucht, obwohl ich eigentlich weiss das das eDIP ziemlich langsam ist.
Mit einer ms delay läuft es. :-)

Gruß,
Alex

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander W. schrieb:
> Danke, das war tatsächlich das Problem. Ich glaube ich hätte ewig
> gesucht, obwohl ich eigentlich weiss das das eDIP ziemlich langsam ist.
> Mit einer ms delay läuft es. :-)

AUTSCH!

Die Library ist so ausgelegt, dass uart_getc nicht auf ein Zeichen 
wartet, sondern sofort zurück kommt, wenn kein Zeichen vorhanden ist.
Das macht man doch nicht mit delays!

Wenn du auf ein Zeichen warten willst, dann schreib dir eine Routine, 
basierend auf uart_getc, die genau das macht: Auf ein Zeichen warten
char uart_getc_wait()
{
  unsigned int c;

  do {
    c = uart_getc();
  } while( c & UART_NO_DATA );

  return c;
}

und diese Funktion verwendest du jetzt anstelle von uart_getc().

Autor: Alexander W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

deshalb hab ich ja geschrieben, das der Code "auch völlig ineffizient" 
ist. ;-)

Es ging mir nur darum die Kommunikation mit dem Display hinzukriegen, 
wenn ich das richtige Programm schreibe mach ich das schon noch 
ordentlich.

Gruß,
Alex

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.