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