Forum: Mikrocontroller und Digitale Elektronik 16550 zum Laufen bringen


von keinLichtAufging (Gast)


Lesenswert?

Hallo zusammen,

ich mache gerade meine ersten Gehversuche mit einem 16550 und weiss 
nicht, was ich falschmache :-(.
Ich habe das Teil nach National Datenblatt, "Basic Configuration" 
angeschlossen mit ein paar kleinen Vereinfachungenn (MP ist ein 80188er 
@11,0592Mhz):

- INTRPT floating (erst mal nur Polling, übersichtlicher)
- RS232-Stecker an SOUT, SIN über MAX232 wie üblich, GND direkt
- Am 16550 DCD+DSR+DTR/CTS+RTS zusammengezogen, am RS232 floating
- /CS2 geht über einen 573er direkt an MP.s2, restliche
  Pheripherie abgeklemmt (lt. Manual darf ich mit s2 Memory/IO trennen)

Ich habe dann folgende Testprogramme direkt nach Reset gestartet:

a)
1
    TESTLOOP:
2
      INC AL
3
      OUT 6, AL
4
      JMP SHORT TESTLOOP

  Sinnfrei, sollte aber bewirken, dass einige Modemausgänge am 16550 
ständig toggeln. Ergebnis:
  - Alle RS232-Leitungen konstante Pegel (mit Oszi gemessen)
  - /BAUDOUT konstant 1

b)
1
    UART_DLH    EQU     1   ; Basisport 0
2
    UART_DLL    EQU     0   
3
    UART_FCR    EQU     2
4
    UART_IER    EQU     1
5
    UART_LCR    EQU     3
6
    UART_LSR    EQU     5
7
    UART_RBR    EQU     0
8
    UART_THR    EQU     0
9
10
    MOV         AL, 80H
11
    OUT         UART_LCR, AL
12
13
    MOV         AX, 20          ; 9600baud, UART an 3,072Mhz
14
    OUT         UART_DLL, AL
15
    XCHG        AL, AH
16
    OUT         UART_DLH, AL
17
18
    MOV         AL, 3           ; 8B,1S,NP,NBr
19
    OUT         UART_LCR, AL
20
21
    MOV         AL, 0           ; Keine Interrupts
22
    OUT         UART_IER, AL
23
    OUT         UART_FCR, AL    ; 16450 mode, kein DMA
24
25
    MOV         AL, '?'         ; Prompt ausgeben
26
    OUT         UART_THR, AL
27
28
ECHO_CHAR:
29
    IN          AL, UART_LSR
30
    TEST        AL, 1           ; Daten im Puffer?
31
    JZ          ECHO_CHAR
32
33
    IN          AL, UART_RBR    ; Puffer lesen
34
    INC         AL              ; Taetigkeitsnachweis
35
    OUT         UART_THR, AL    ; Zurueck zum Absender
36
    JMP         ECHO_CHAR       ; Endlos

Ergebnis:
    - PC am anderen RS232-Ende empfängt nichts
    - /BAUDOUT 1 mit regelmäßigen L-Spikes
    - /RD1 meist 0 (Programm läuft weiter)
    - /CS2 1 mit 0-Spikes (IN AL,...)
    - /BAUDOUT 1 mit 0-Spikes, höherer Takt als /CS2 (UART aktiv?)
    - /RXRDX 1 mit 0-Spikes, viel langsamer als /CS2 (???)

Wegen dem Verhalten von /BAUDOUT glaube ich, dass die MP-seitige 
Ansteuerung grundsätzlich funktioniert. Vermutungen:

1) Programm b initialisiert falsch (auf dem DOS-PC gehts, aber könnte ja 
sein, dass das BIOS den Chip schon "freigeschaltet" hat?)
2) Der 16550 tuts nicht ohne die anderen RS232-Signale in "echt"
3) Kabelbruch?
4) 16550 defekt?

Hat jemand einen Tipp für mich, wie ich das Teil zum Laufen bringen oder
austesten kann, warum es nicht tut?

Danke und Grüssli

von Ben _. (burning_silicon)


Lesenswert?

Erstmal Beinchen beweglich machen!

SCNR ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

keinLichtAufging schrieb:
> 2) Der 16550 tuts nicht ohne die anderen RS232-Signale in "echt"

Nö, den interessieren die Pegel auf den anderen Leitungen nicht.

Eine Musterbeschaltung des pinkompatiblen 8250 findest Du im IBM AT 
Technical Reference Manual, das erfreulicherweise Christoph vor ein paar 
Tagen hier verlinkt hat:
Beitrag "Re: IBM PC-AT technical reference manual gesucht"

Darin findest Du übrigens auch ein Assemblerlisting des PC-BIOS-Codes, 
der die seriellen Schnittstellen an den üblichen Adressen initialisiert. 
Dieser Code ist zwar für den 8250 geschrieben, funktioniert aber ebenso 
mit dem 16550. Die Funktionserweiterungen (Sende- und Empfangs-FIFOs) 
sind mit der Standardinitialisierung zwar inaktiv, aber für Deine 
grundlegende Funktionskontrolle sollte das wohl genügen.

Einziger deutlicher Unterschied ist der verwendete Takt; im PC werden 
1.8432 MHz genutzt, so maximal 115200 Baud möglich sind.

von keinLichtAufging (Gast)


Lesenswert?

Hallo,

@Ben:
Genau dafür war Testprogramm a gedacht, aber die Modem-Beinchen sind 
eben nicht "beweglich", sondern halten ihre Pegel stur fest. Ich dachte, 
wenn MR den 16550er freigegeben hat, kann ich mit Register 6 auf die 
Pins durchschreiben wie bei einem Latch (Funktionstest für "Register 
schreiben").

@Rufus:
Danke für den Link, werde da mal reingucken (DL dauert allerdings eine 
ganze Weile ohne Breitbandzugang ;-).

Die Beschränkung auf drei Leitungen kommt übrigens daher, dass ich vom 
8051er einen "Bootstecker" auf P3 verwende, und den hier gerne 
unverändert weiternutzen möchte - von dem weiss ich wenigstens sicher, 
dass er in Ordnung ist.

Danke und Grüssli

von G. O. (aminox86)


Lesenswert?

Bei korrekt initialisiertem Baudratenregister steht an !BAUDOUT der 
16-fache Takt(Rechteck,50%-Tastverhältnis)der gewählten Baudrate an. 
Konstanter "0"- oder "1"-Pegel mit Spikes darf nicht sein.
Hardware:
Das Bus-Zustandssignal "S.0" als Auswahlsignal zu verwenden ist 
ungewöhnlich, da es aber offensichtlich gespeichert(Signal nur in T1 und 
T2 des Buszykus gültig) und nicht gleichzeitig für andere Zwecke 
ausgewertet wird (Schaltplan?) ist es wohl in Ordnung.
Sind CS0, CS1, mit "1", RD, WR, !ADS mit "0" belegt?
Software:
Die Initialisation des 16550 sollte funktionieren. Allerdings werden 
üblicherweise zuerst die Statusregister und zuletzt die 
Baudratenregister beschrieben.
Das Testprogramm sollte das "MCR"-Register verwenden, da hier die an den 
Pins zugänglichen Modemsteuersignale generiert werden.

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
Noch kein Account? Hier anmelden.