Hallo, im Anhang ist die Software für die serielle Schnittstelle eines AT89S8253 (ATMEL). Die Empfangsroutine hat einen Fehler. Der Reihe nach: 1. Ein Modem erhält den die 3 Zeichen 41 54 0D (A, T, <CR>) Es wird immer dann ein Zeichen gesendet, wenn das Echo des vorhergehenden eingegangen ist. Das die Zeichen korrekt am Modem ankommen habe ich mit einem Sniffer überprüft. 2. Die Antwort vom Modem ist 0D A1 6A 35 0A fehlerhaft. Die richtige Antwort ist 0D 0A 4F 4B 0D 0A (<CR>, <LF>, O, K, <CR>, <LF>) Die Zeichen kommen am des Controllers auch so an, Dies habe ich wiederum mit dem Sniffer geprüft. 3. Was ist an der Empfangsroutine fehlerhaft? Viele Grüße Karlheinz
Wo ist die main Fkt.? Ganz verstanden habe ich allerdings nicht, was Du da beschreibst?
> Wo ist die main Fkt.? > Ganz verstanden habe ich allerdings nicht, was Du da beschreibst? Hier ein 'komplettes' Programm. Mit Keil (aktuelle Software) erstellt und compiliert. Es werden 2 serielle Schnittstellen verwendet: 1. der Hardware UART des Controllers 19200 Bit/s 2. ein Softwareschnittstelle zur Controller 9600 Bit/s Das Problem ist ganz einfach, zu einem GSM-Modem wird ein AT-Befehl gesendet.Der AT-Befehl kommt 'ordentlich' (mit einem Sniffer überprüft) am Modem an. Die Antwort - ein einfaches OK - vom Modem ist am Pin des Controller auch in Ordnung (wieder mit einem Sniffer geprüft). Was fehlerhaft ist, ist das was im interen Buffer steht! Im Puffer steht: 0D A1 6A 35 0A. Vom Modem kommt und liegt auch am Pin an: 0D 0A 4F 4B 0D 0A Den Bufferinhalt gebe ich die Softwareschnittstelle aus und schaue sie mir mit einem Terminalprogramm an. Ich nehme an das SBUF zum falschen Zeitpunkt gelesen wird.
Eine Lösung habe ich gefunden. Wenn das GSM-Modem mit 2 Stopbits sendet funktioniert es, mit einem Stopbit nicht. Es sieht so, dass der AT89S8253 (Quarz? etc.) ein Problem mit dem Timing hat.
Aus deiner Beschreibung werde ich nicht ganz schlau. Nochmal bitte: Der Hardware-UART ist mit dem Modem verbunden, und der Software-UART dient nur zur Ausgabe für Debugging o.ä.? > Wenn das GSM-Modem mit 2 Stopbits sendet funktioniert es, mit einem > Stopbit nicht.Es sieht so, dass der AT89S8253 (Quarz? etc.) ein Problem > mit dem Timing hat. Ich glaube eher deine Software hat ein Problem. Überleg mal, dein Modem pustet mit 19200 Bd, dein Software-UART "nur" mit 9600 Bd. Allein das ist schon etwas kontraproduktiv, weil mehrere Bytes vom Modem schneller einträufeln können als du ausgeben kannst. Aber lassen wir das mal aussen vor, und schauen wir uns deine Software-UART-Sendefunktion an. Du hast da ne Warte-Schleife für 100µs drin. Sind es jetzt wirklich mehr oder weniger genau 100µs oder 104,2µs für 9600 Bd? Wenn es eher 100µs sind, dann bist du über den 3% Fehlertoleranz einer UART-Schnittstelle. Jetzt kommt aber noch hinzu, dass deine Bitknubbelei für den Soft-UART, also das Ermitteln welcher Pegel gesendet werden soll auch noch Zeit verbrät. Vielleicht gleicht das den "Zeitverlust" wieder aus. Was noch zu beachten ist, während dein Soft-UART sendet, kann ja ein weiterer Interrupt des Hardware-UART kommen, und der bringt dein Timing für den Soft-UART durcheinander. Kannst du einfach mal einen Text senden und schauen ob der richtig ankommt? Für den Soft-UART solltest du probeweise mal während dem Senden den Interrupt des Hardware-UART sperren. > Was fehlerhaft ist, ist das was im interen Buffer steht! Glaube ich nicht, deine Baudrateneinstellung für 19200 sieht soweit richtig aus. Hast du die Möglichkeit, eine LED o.ä. einzuschalten wenn der Buffer den richtigen Inhalt hat? Damit könntest du relativ schnell drauf kommen, welcher der UARTs ein Problem hat. Ralf
>> Wenn das GSM-Modem mit 2 Stopbits sendet funktioniert es, mit einem >> Stopbit nicht.Es sieht so, dass der AT89S8253 (Quarz? etc.) ein Problem >> mit dem Timing hat. > Ich glaube eher deine Software hat ein Problem. Überleg mal, dein Modem > pustet mit 19200 Bd, dein Software-UART "nur" mit 9600 Bd. Allein das > ist schon etwas kontraproduktiv, weil mehrere Bytes vom Modem schneller > einträufeln können als du ausgeben kannst. Es ist so, wei ich es beschrieben habe. Der Software-UART dient nur der Kontrolle. Die Bytes können mit 19200 Bit/s ankommen und trotzdem mit 9600 Bit/s über den Softwareuart weitergeleitet werden, da der Buffer, der im Interrupt gefüllt wird, groß genug ist. Und nicht vergessen, mit 2 Stopbits im GSM-Modem geht es, mit einem nicht.
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.