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
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.
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
Wie hast du denn die gesetzen Baudraten wieder ausgelesen? Arbeite auch gerade mit dem Chip... thx
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.