Forum: Mikrocontroller und Digitale Elektronik 8051-UART empfängt nur jedes zweite zeichen


von markus (Gast)


Lesenswert?

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






von Stefan (Gast)


Lesenswert?

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.

von markus (Gast)


Lesenswert?

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


von markus (Gast)


Lesenswert?

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...

von markus (Gast)


Lesenswert?

pardon...

er braucht ein beliebiges zeichen um die if-abfrage zu starten..

von Stefan (Gast)


Lesenswert?

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...

von markus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.