Forum: Mikrocontroller und Digitale Elektronik ATmega + TL16C554 Divisor Latch Problem (DLM)


von Jürgen (Gast)


Lesenswert?

Hallo,

ich möchte einen TL16C554 vorerst mit einen ATmega16 initialisieren.
Das scheint auch zu funktionieren, nur das Divisor Latch übernimmt nicht 
die Änderung für das DLM (MSB).
Der Divisor ist für 4800 Baud 24(0x18h), d.h. LSB=0x18h und MSB=0x00h
Leider wird nur die Änderung für das LSB übernommen.
Weiß jemand rat? :)


Hyperterminalauszug:

Vor dem Reset und der Initialisierung:

Receiver buffer: 11111011 IER: 00000000 IIR: 00000001 LCR: 00000000 MCR: 
00000000 LSR: 01100000 MSR: 11110000
LSB: 00011000 MSB: 11111111

Nach dem Reset und der Initialisierung:

Receiver buffer: 00000000 IER: 00000000 IIR: 11000001 LCR: 00000011 MCR: 
00000000 LSR: 01100000 MSR: 11110000
LSB: 00011000 MSB: 11111111

(MSB läßt sich nicht ändern, die anderen Register sind ok)

Codeauszug:

  schreiben_ini();

  PORTB = 0x03; // 0000 0011 A2A1A0=011 LCR
  PORTA = 0x80; // 1000 0000 DLAB setzen

  PORTB = 0x00; // 0000 0000 A2A1A0=000 divisor latch LSB
         PORTA = 0x18; // 0001 1000 4800 baud

  PORTB = 0x01; // 0000 0001 A2A1A0=001 divisor latch MSB
         PORTA = 0x00; // 0000 0000


Jürgen

von Jürgen (Gast)


Lesenswert?

Übrigens, das sratchpad läßt sich auch nicht verändern.
Evtl.Hardwareproblem beim TL16C554?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vielleicht ein Problem bei der Erzeugung/Verdrahtung der Adressleitungen 
für den 16c554?

Wenn Dein Code allerdings so aussieht, wie gepostet, dann fehlt da noch 
einiges
1
  PORTB = 0x03; // 0000 0011 A2A1A0=011 LCR
2
  PORTA = 0x80; // 1000 0000 DLAB setzen
3
4
  PORTB = 0x00; // 0000 0000 A2A1A0=000 divisor latch LSB
5
  PORTA = 0x18; // 0001 1000 4800 baud
6
7
  PORTB = 0x01; // 0000 0001 A2A1A0=001 divisor latch MSB
8
  PORTA = 0x00; // 0000 0000

Du legst zwar Adressen und Daten an, aber was soll den 16554 dazu 
veranlassen, diese Daten auch zu übernehmen?
Ich sehe nicht, daß Du irgendwas mit den Leitungen /CS, /IORD bzw. /IOWR 
machst, und die sind nicht ganz unwichtig ...
Sieh Dir mal in dessen Datenblatt an, wie so ein Schreib- oder 
Lesezyklus abläuft.

Du musst zwischen den Schreibzugriffen auf unterschiedliche Register 
auch den Schreibzyklus abschließen, indem Du /IOWR deaktivierst, und im 
Schreibzyklus solltest Du zuerst Adressen und Daten anlegen, dann /IOWR 
aktivieren und wieder deaktivieren.





von Jürgen (Gast)


Lesenswert?

Danke für die Hilfe :), es funktioniert nun.

Ich hatte mit der funktion schreiben_ini();

void schreiben_ini(void) {

DDRA  = 0xff;            // 1111 1111 -> D7D6D5D4D3D2D1D0 ausgänge
PORTC |= (1 << PC4);     // xxx1 xxxx -> IOR = 1, kein lesen
PORTC &= ~( 1 << PC1 );  // xxxx xx0x -> IOW = 0  ->> schreiben in den 
tl16c554


}

nur 1x IOW aktiviert und dann mehrmals geschrieben.
Nun mit Adressen+Daten anlegen,IOW aktivieren, dann deaktivieren klappt 
es.

PORTB = 0x03; // 0000 0011 A2A1A0=011 LCR
PORTA = 0x80; // 1000 0000 DLAB setzen
PORTC &= ~( 1 << PC1 );        // xxxx xx0x -> IOW = 0  ->> schreiben in 
den tl16c554
PORTC |= (1 << PC1);           // xxxx xx1x -> IOW = 1, kein schreiben

PORTB = 0x00; // 0000 0000 A2A1A0=000 divisor latch LSB
PORTA = 0x18; // 0001 1000 4800 baud
PORTC &= ~( 1 << PC1 );        // xxxx xx0x -> IOW = 0  ->> schreiben in 
den tl16c554
PORTC |= (1 << PC1);           // xxxx xx1x -> IOW = 1, kein schreiben

PORTB = 0x01; // 0000 0001 A2A1A0=001 divisor latch MSB
PORTA = 0x00; // 0000 0000
PORTC &= ~( 1 << PC1 );        // xxxx xx0x -> IOW = 0  ->> schreiben in 
den tl16c554
PORTC |= (1 << PC1);           // xxxx xx1x -> IOW = 1, kein schreiben

von Newbie (Gast)


Lesenswert?

Wie hast du denn die gesetzen Baudraten wieder ausgelesen? Arbeite auch 
gerade mit dem Chip... thx

von Newbie (Gast)


Lesenswert?

Keiner eine Antwort???

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.