mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART macht Probleme


Autor: Tabaluga (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe das erste mal ein UART auf einem 89S8252 in Betrieb genommen
und habe nun folgendes Problem:

Vorab: Ich verwende den Wickenhäuser µC Compiler

Wenn ich mehrere Zeichen in einer Schleife sende, kommen nicht alle
Zeichen richtig an. Zuerst dachte ich, dass es an der Übertragung
liegt, aber offensichtlich liegt das irgendwie an der Geschwindigkeit,
mit der die Schleife durchläuft.

Der Code sieht wie folgt aus:

Interrupt für UART:
    if (TI){    // fertig gesendet
        TI = 0;
        uart_send_ok = 1;
    }

Die Sende-Funktion:
void uart_send_byte(unsigned char byte){

    for (;;) if (uart_send_ok) break;   // warte, bis vorheriges Byte
gesendet wurde
    // berechne Parity-Bit
//   if (calc_parity(byte)) TB8 = 0;   // wenn ungerade
//    else TB8 = 1;                    // wenn gerade
    // sende Byte
//    _wait_ms(100);         // Nur zum Testen eingebaut
    uart_send_ok = 0;
    SBUF = byte;
}

Die Schleife, die die Daten senden soll:
void uart_send_codes(void){

    unsigned char i;

    for (i=0; i<200; i++){uart_send_byte(load(i));}          // eine
verschachtelte Schleife funktioniert hier aus unerklärlichen Gründen
nicht!
    for (i=0; i<200; i++){uart_send_byte(load(i + 200));}    //
Vermutung: Stackpointer
    for (i=0; i<200; i++){uart_send_byte(load(i + 400));}
}

Wenn ich nur ein Byte sende will, funktioniert das alles wunderbar!
Wenn ich in der uart_send_byte Funktion die Paritätsprüfung ausblende
(auskommentiert, wie auch gepostet) und die _wati_ms(100) nicht
ausgeführt werden, klappt das Senden fehlerfrei. Es werden 600 Bytes
gesendet. Zur Überprüfung sind alle Bytes FF.
Wenn ich nun die Paritätsprüfung einbaue, sind einige zufällige Bytes
00. Alle Anderen sind FF. Dann hab ich mir gedacht, dass die
Paritätsberechnung irgendwo ein Fehler hat und diese ausgeblendet und
stattdessen die Warteschleife eingebaut. Dann werden nur Nullen
gesendet! Das kann doch nicht sein!?!
Das Senden von einzelnen Bytes mit der selben Funktion funktioniert
doch auch!

Hat da jemand ne Idee?

Thx Tabi

Autor: Tabaluga (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin dem Problem etwas auf den Grund gegangen:

void uart_send_byte(unsigned char byte){

    for (;;) if (uart_send_ok) break;   // warte, bis vorheriges Byte
gesendet wurde
    // sende Byte
    lcd_printf("%3u",byte);
    _wait_ms(100);
    uart_send_ok = 0;
    lcd_printf("%3u",byte);
    SBUF = byte;
}

Wenn ich das so ausführe, sollte man meinen, dass in den beiden printf
Funtionen beides mal der gleiche Wert ausgegeben werden wird.
Tatsächlich wird zuerst der richtige (FF), danach aber (00) ausgegeben.
Also verändert die _wait_ms(xx)-Funktion den Wert von byte. Das darf
aber nicht sein! In anderen Programmteilen passiert das auch nicht. Ich
habe die Vermutung, das der Stackpointer irgendwie überläuft oder es da
irgendwelche internen Probleme mit dem Compiler gibt!
Kennt sich jemand mit dem Wichenkäuser Compiler aus und weiß jemand, ob
der Compiler den Stack überprüft?

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.