mikrocontroller.net

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


Autor: Jürgen (Gast)
Datum:

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

Autor: Jürgen (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

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.





Autor: Jürgen (Gast)
Datum:

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

Autor: Newbie (Gast)
Datum:

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

Autor: Newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Antwort???

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.