ATmega + TL16C554 Divisor Latch Problem (DLM)

Gast #440548
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
Persönliche Seite #440603
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.




Gast #440628
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.