Hi,
ich hab das Problem, dass ich mit meiner AT89S52 UART nur über HTERM,
aber nicht mit Hyperterminal, Putty, Docklight kommunizieren kann.
Infos:
Baudrate: 9600, 1 Stopbit, No Parity, No Float Control
Oszillator 11.0592 MHz, SMOD nicht gesetzt.
Hier meine C-UART-Init:
void initUARTTimer(void) {
TL1= 0xFD;
TH1= 0xFD;
SCON = 82; // 8-bit UART, REN, TI set, Timer 1;
TMOD = TMOD | 32; // Timer 1 8bit Auto Reload
TR1 = 1; // Timer starten
ES = 1; // Interrupts freischalten
EA = 1;
return;
}
Und die ISR (die empfangenen Daten werden aufs LCD gegeben):
void SerialISR(void) interrupt 4 {
if(RI==1) {
lcd_data(SBUF);
RI=0;
}
return;
}
Könnt ihr mir n Tip geben?
Danke,
Jan
>Und die ISR (die empfangenen Daten werden aufs LCD gegeben):
Schmeiss das raus. Möglicherweise stören die Delays vom LCD.
Jan schrieb: > Hier meine C-UART-Init: > void initUARTTimer(void) { > TL1= 0xFD; > TH1= 0xFD; > SCON = 82; // 8-bit UART, REN, TI set, Timer 1; > TMOD = TMOD | 32; // Timer 1 8bit Auto Reload > TR1 = 1; // Timer starten > ES = 1; // Interrupts freischalten > EA = 1; > return; > } > > Und die ISR (die empfangenen Daten werden aufs LCD gegeben): > void SerialISR(void) interrupt 4 { > if(RI==1) { > lcd_data(SBUF); > RI=0; > } > return; > } Wieso setzt du TI=1 beim Initialisieren? Deine ISR behandelt das TI Flag nicht, weshalb es auch nicht gelöscht wird. Sobald die ISR also verlasen wird, wird im Hauptprogramm nur ein Befehl ausgeführt und dann sofort wieder in die ISR gesprungen. Und das passiert solange dein Programm läuft. Das macht überhaupt keinen Sinn. Ciao, Rainer
Ich hab mein Anliegen jetzt mal auf Assembler reduziert. Mein komplettes
Programm, das nur 1 Zeichen senden soll (ohne LCD-Routinen o.ä.),
und auch ohne Interrupts:
main: CALL UARTinit
MOV A,#'A'
CALL UARTsend
JMP $
uartInit: MOV TL1, #0FDh ; 9600 Baud
MOV TH1, #0FDh
MOV SCON, #0101 0000b ; 8bit-UART on Timer 1, Rec. En.
MOV TMOD, #0010 0000b ; Timer 1 8bit Auto-Reload
SETB TR1 ; Start Timer
SETB TI ; TI fürs erste Zeichen setzen
RET
uartSend: JNB TI,$ ; Warten bis vorheriges Zeichen
; übertragen
CLR TI ; TI rücksetzen
MOV SBUF,A ; Zeichen senden
RET
Wieder kann ich das Zeichen nur mit Hterm empfangen :verzweifel:
Danke schonmal, Jan
Das Gleiche wie oben: Warum setzt du TI während der Initialisierung? Lösch das Flag und überlasse das Setzen der HW. Und dann bau die Inrerrupt-Behandlung wieder richtig ein.
Ohne TI zu setzen würd das Programm am Anfang in keine ISR springen (ich
empfange ja nichts am µC).
Ich habs nochmal in Assembler vereinfacht aber ohne Interrupts, und ohne
TI/RI-Behandlung. Ich will einfach nur 1 Zeichen senden:
main: CALL UARTinit
MOV SBUF, #'T'
JMP $
uartInit: MOV TL1, #0FDh ; 9600 Baud
MOV TH1, #0FDh
MOV SCON, #0101 0000b ; 8bit-UART on Timer 1, Rec. En.
MOV TMOD, #0010 0000b ; Timer 1 8bit Auto-Reload
SETB TR1 ; Start Timer
RET
Mit hterm gehts, mit den übrigen Verdächtigen nicht.
Und ich denke an Interrupts liegts jetzt auch nicht mehr.
Jan
Hast du eventuell die Flusskontrolle in den anderen Programmen aktiviert? Wenn es mit HTerm geht und mit den anderen nicht, dann kann es ja nicht an deinem Controller Programm liegen, sondern muß an den Terminal Programmen liegen. Hast du mal "Tera Term" oder "Realterm" ausprobiert? Die sind beide sehr gut und man kann bei Realterm genau sehen, was auf den Pins der Flusskontrolle passiert.
Beziehungsweise "CTS" und "DSR" auf +5V legen, dann müsste es auch mit aktiver Flusskontrolle gehen. mfG ingo
Jungs, danke für euer Bemühen. Das Problem war ein gesteckter Jumper, der wohl gesteckt wird wenn der µC per ISP programmiert werden soll. Jetzt gehts. Danke Danke Danke!!!
aber wie das mit Interrupts funktioniert, solltest Du noch mal nachlesen
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.