mikrocontroller.net

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


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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






Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pardon...

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char _getkey(void)
{
  char c;
  while(!RI0);
  c = SBUF0;
  RI0 = 0;
}

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

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.