mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dauer von Befehlen (für Timeout)


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe eine Funktion, die abfragt ob Daten über UART zu mir gesendet 
wurden. Diese Funktion sieht so aus:
uint8_t USART_get(void)
{
  //Warte bis Daten erhalten
  while ( !(UCSRA & ( 1<<RXC)) );

  //Hole Daten vom Puffer und gib sie zurück
  return UDR;
}

So da ich jetzt aber in einer Endlosschleife lande, wenn ich diese 
Funktion aufrufe, möchte ich ein Timeout einbauen:
uint8_t USART_get(void)
{
  uint8_t i = 0;

  //Warte bis Daten erhalten
  while ( !(UCSRA & ( 1<<RXC)) )
  {
    if(i == 255)
    return 255;    // Error Code
    i++;
  }

  //Hole Daten vom Puffer und gib sie zurück
  return UDR;
}

Also im Prinzip, dass ich in der While Schleife eine Zahl immer 
inkrementiere und abfrage ob sie einen gewissen Wert erreicht hat. Und 
ich habe aber keine Ahnung wie ich mir ausrechnen kann, welchen Wert ich 
für z.b. 2 Sekunden brauche. (Das Beispiel hier ist nur zu 
veranschaulichung, ich weiß das ich nicht 255 zurückgeben kann als Error 
Code, weil es ja bei UDR auch auftretten kann und ich weiß auch, dass 
ich wahrscheinlich i als 16 bit Variable deklarieren muss)

Kann mir jemand erklären, wie ich das Ausrechnen kann? Falls jemand eine 
bessere Lösungsidee hätte, nur her damit!

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer starten und auf 2sek. einstellen, wenn erreicht Funktion 
abbrechen.
Fertig.

Gruß

Autor: Michael L. (-mic-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du mehrere timeouts parallel brauchen solltest, stellst du den 
timer auf den kleinsten benötigten wert ein und baust dir einen 
interrupt-zähler.

gruß

michael

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu warten?
Sieh im Statusregister nach, ob was da ist und wenn nicht,
dann spring mit dem Fehlercode sofort zurück.
uint8_t USART_get(uint8_t* p)
{
  // sind Daten da?
  if ( !(UCSRA & ( 1<<RXC)) )  
     *p = UDR;   // ja: Gib die Daten über zeiger zurück
     return 1;   //     Empfang ok
  else
     return 0;   // nein: Error Code
}

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:
> Wozu warten?
> Sieh im Statusregister nach, ob was da ist und wenn nicht,
> dann spring mit dem Fehlercode sofort zurück.

Das ist aber keine Lösung des Problems, sondern nur die Verlagerung des 
Problems an eine andere Stelle.

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.