S
Stefan Bröring
Guest
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
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