Hallo,
ich beschäftige mich schon seit mehr als 15 Jahren mit der Programmierung von 8031, 87C51 etc., habe aber momentan ein Problem auf dem Tisch liegen, zu dem mir nichts mehr einfällt:
Ein Programm, in dem per Polling ständig die serielle Schnittstelle abgefragt wird reagiert zwar korrekt auf die empfangenen Kommandos, sendet aber keine Antwort mehr auf TXD.
Das Programm durchläuft eine Hauptschleife und wartet auf Daten auf RXD und soll dann ein Echo machen. Das Programm läuft manchmal tagelang durch, bis plötzlich kein Echo mehr kommt. Die Kommandos (Relais Ein- und Ausschalten) werden nach wie vor korrekt ausgeführt. Wenn ich ein Kommando sende, dass einen "LJMP 0" auslöst, funktioniert alles wieder.
Hat jemand eine Idee, was dazu führen kann, dass sich beim UART nur der Sender aufhängt?
Hier einige Codefragmente:
Gruß
Stefan
;************************************************* ;* Initialisierung der seriellen Schnittstelle * ;* Mode 1, 9600 Baud, 7 Datenbits, even Parity * ;* 1 Stopbit * ;************************************************* INITS: CLR TR1 MOV P3,#%11101111 ;ausser SE-Leitung alles setzen ;8031 Timer 1 als Baudratengenerator und Timer 0 fr Timeout ANL PCON,#$7F ;einfache Baudrate ;init SCON mov SCON,#%01011100 ;8-bit uart, enable reception, init PCON MOV TMOD,#%00100010 ;Timer 1 Mode 2, Timer 0 Mode 2 mov TH1,#0fdh ;auto-reload value fuer timer1
MOV TH0,#00 ;timer 0 macht nach 65ms einen MOV TL0,#00 ;Timeout-INT ;*************************************************************************************** ANL IP,#%11000000 ORL IP,#%00000011 ;TIMER 0 UND INT0 HIGH PRIO SETB TI0 ;SIO Flags l"schen CLR RI0 CLR ES0 ;SIO-INT sperren SETB TR1 ;Timer 1 aktivieren, fr serielle Schn. CLR EAL SETB TR0 ; Timer 0 einschalten SETB ET0 ; Timer 0 int aktivieren SETB EAL ; INT's freigeben MOV P1,#$0FF ; Port 1 auf High schalten
;**********************************************************************
..... EINGANG: _WTLOP: LCALL RECA ;Zeichen einlesen LCALL SENDV24 ;Zeichen weitergeben CJNE A,#'#',_WTLOP ; # ist das Blockanfangzeichen LCALL RECA ;Komando einlesen LCALL SENDV24 ;Echo .....
;************************************************* ;* Routine zum Senden eines Bytes ber Ser. IO * ;* Einsprung : SENDA * ;************************************************* SENDV24: SENDA: CPL watchdog JNB TI0,SENDA ;Test ob Sender bereit CLR TI0 MOV S0BUF,A ;Senden RET ;************************************************* ;* Routine zum Empf. eines Bytes ber Ser. IO * ;* Einsprung : RECA * ;************************************************* GETV24: RECA: CPL watchdog JNB RI0,RECA ;TEST ob Zeichen bereit CLR RI0 ;Flag l"schen MOV A,S0BUF CJNE A,#10,RECAR ;LF ignorieren SJMP RECA RECAR: RET