mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Codeproblem mit while-Schleife und getchar()


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein kleines Codeproblem bei meinem AVR-Progarmm.

Mein Programm bricht folgende while-Schleife nicht ab, wenn der
BootupTimeout größer als 199 ist:

while((BootupTimeout<199)&&(getchar()!=0x24))
{
  #asm(nop)

}

Hab ich mich bei der logischen Verknüpfung vertan?

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Typ hat BootupTimeout? Sollte mindestens uint8_t sein, signed
char geht nicht.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BootupTimeout ist ein unsigned int

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von wo liest denn dein getchar()? Schickst du da auch Daten rein?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scheint mir, das er auf das getchar wartet und nichts bekommt. Probier
doch mal aus ob deine getchar routine überhaupt funktioniert.
Ansonsten kannst du ja auch das umschreiben in eine do-while schleife.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das getchar() soll Daten von dem UART des ATmega16 einlesen. Wenn aber
keine ankommen, soll BootupTimeout dafür sorgen, dass die
while-Schleife abgebrochen werden soll.
BootupTimeout wird in einer ISR hochgezählt, was auch funktioniert.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
getchar() aber wartet, bis ein Zeichen ankommt. Daher wird Dein
Bootuptimeout nur ein einziges Mal ausgewertet und die Chose hängt im
getchar().

Statt getchar() solltest Du eine Funktion verwenden, die Dir mitteilt,
ob überhaupt ein Zeichen anliegt, und nur dann solltest Du getchar()
benutzen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und so eine Funktion müsste ich dann wohl selber basteln, weils der
Codevision nicht hat. welche register müsste ich mir da näher anschaun?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstatt zu suchen, welches register du auslesen musst, kannst du einfach
eine interrupt routine benutzen, die einfach nur eine variable setzt
beim erfolgreichen empfang eines zeichens.
 usart_rx interrupt ( natürlich rücksetzen nicht vergessen )

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hört sich gut an, ich werde das mal probieren

vielen Dank für die Hilfe

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.