www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT89S52 UART geht nur mit Hterm


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und die ISR (die empfangenen Daten werden aufs LCD gegeben):

Schmeiss das raus. Möglicherweise stören die Delays vom LCD.

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: friend of interrupt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Ingo W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beziehungsweise "CTS" und "DSR" auf +5V legen, dann müsste es auch mit 
aktiver Flusskontrolle gehen.
mfG ingo

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!!!

Autor: friend of interrupt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber wie das mit Interrupts funktioniert, solltest Du noch mal nachlesen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.