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


von Sebastian (Gast)


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?

von Fritz G. (fritzg)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

BootupTimeout ist ein unsigned int

von Rolf Magnus (Gast)


Lesenswert?

Von wo liest denn dein getchar()? Schickst du da auch Daten rein?

von Tobias (Gast)


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.

von Sebastian (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Sebastian (Gast)


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?

von Tobias (Gast)


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 )

von Sebastian (Gast)


Lesenswert?

das hört sich gut an, ich werde das mal probieren

vielen Dank für die Hilfe

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.