Hallo zusammen, ich habe ein ungewöhnliches Problem mit der seriellen Schnittstelle meines 8051. Ich habe sie so programmiert, dass ich mein Board mit ASCII-Zeichen über HyperTerminal steuern kann und ich mache es auf diese Weise schon seit längerer Zeit, bin also kein blutiger Anfänger. Die Hauptschleife sieht ungefähr wie folgt aus: while(1) { putchar('s'); (1. Kontroll-putchar) c = _getkey(); putchar(c); (2. Kontroll-putchar) if(c == 't') { längerer Anweisungsblock... } putchar(c); (3. Kontroll-putchar) } Seit einiger Zeit habe ich jetzt das Problem, dass er mir nur jedes zweite mal die if-Abfrage abarbeitet, wenn ich ein 't' eingebe, denn jedes zweite mal springt er direkt zum 3. putchar. Ich arbeite ohne Debugger, deswegen diese putchar's, (aber auch ohne diese sieht das Signal genau so aus, wenn ich es mit dem Oszi anschaue). Beim 3. putchar messe ich nähmich ein 0x0B an der seriellen Schnittstelle und ich habe keinen blassen Schimmer wo dieses Zeichen herkommen soll. Das "beste" ist, bei "Fehlfunktion" überspringt er auch das zweite putchar, was vollkommen unsinnig ist! Ich arbeite mit eigenen Funktionen und ohne Interrupts. Ich habe auch ein Reserver-Board mit dem gleichen Prozessor, und es passiert das gleiche. Hat da einer ähnliche Erfahrung gemacht?? Woran könnte es liegen? Wäre für jede Hilfe dankbar. Markus
Ist c eine lokale Variable oder eine globale Variable? Ich vermute, dass c lokal ist d.h. auf dem Stack oder einem Register liegt und beim putchar() gelegentlich zerschossen wird. Ansonsten wäre es hilfreich den Sourcecode komplett bzw. wenigstens den Sourcecode von _getkey() zu sehen.
Stimmt, c ist lokal. Das klingt als vielversprechender Ansatz... ich werde es gleich testen... wie gesagt, kommisch ist, das der MC den zweiten putchar nicht abarbeitet, den dritten aber schon. char _getkey(void) { char c; while(!RI0); c = SBUF0; RI0 = 0; } Danke Stefan
Das war's doch nicht! ich muss feststellen, dass mein MC zwei "t" braucht um die sequent abzuarbeiten... komisch. Aber ich vermute auch ein Speicher-Problem...
pardon... er braucht ein beliebiges zeichen um die if-abfrage zu starten..
1 | char _getkey(void) |
2 | {
|
3 | char c; |
4 | while(!RI0); |
5 | c = SBUF0; |
6 | RI0 = 0; |
7 | }
|
Wo ist der Rückgabewert der Funktion? Es passt wenn zufällig ein 't' auf dem Stack liegt. Das kann noch von einem nicht-erfolgreichen if Fall bzw. dessen Vergleich von vorher dort liegen und nur dann...
return c; ist natürlich da, hab' vergessen es reinzutippen... ich habe es mit globaler variable ausprobiert, hilft nix, das gleich problem. Der putchar sieht wie folgt aus... char putchar(char c) { SBUF = c; while(!TI); TI = 0; return c; } Dus siehst, es steckt nicht viel dahinter -:). Bis jetzt war es aber immer ausreichend.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.