Forum: Mikrocontroller und Digitale Elektronik UART macht Probleme


von Tabaluga (Gast)


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

von Tabaluga (Gast)


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?

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.