Forum: Compiler & IDEs Problem mit ATmega164A und LCD FDCC1601E


von Arne P. (ob3lix)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

kurz gesagt, ich habe folgendes Problem:

das LCD Display zeigt nur die letzten 8 Stellen an "block" an, egal was 
ich mache... und bei der Fehlersuche im Quellcode steh ich aufm 
Schlauch. Ich habe die Codes des Tutorials genommen und angepasst, aber 
es klappt net so richtig...

im Anhang mal der Schaltplan (D0 - D3 ist NICHT angeschlossen) und der 
Quellcode...

Vielleicht kann mir einer von euch einen kleinen Denkanstoß geben?!

Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

Der Code funktioniert so nicht.
Der COde ist nicht dafür ausgelegt, dass die Steuerleitungen auf einem 
anderen Port liegen ans die Datenleitung. Das muss dir doch selber 
auffallen, dass du in der Konfiguration nirgends PORTC bzw. DDRC 
reinschreiben musstest.

Man könnte den Code natürlich umschreiben und für die Steuerleitungen 
einen anderen PORT (samt Makro) einführen.
Aber für dich dürfte es wohl am einfachsten sein, wenn du dir die LCD 
Routinen vom P.Fleury holst. DOrt kannst du für jede einzelne Leitung 
Port und Portpin einstellen.

: Bearbeitet durch User
von Arne Pf (Gast)


Lesenswert?

Hallo Karl Heinz,

Das habe ich auch schon probiert, ich vergass zu erwähnen das es ein 
splc780d treiber ist... ich habe das mit der fleury lib probiert das 
klappt leider auch nicht...

von Karl H. (kbuchegg)


Lesenswert?

Arne Pf schrieb:
> Hallo Karl Heinz,
>
> Das habe ich auch schon probiert, ich vergass zu erwähnen das es ein
> splc780d treiber ist...
Soweit ich das bei einem kurzen Durchscrollen des Datenblattes gesehen 
habe, ist das ein HD44780 kompatibler IC. Sollte also keine Probleme 
machen

> ich habe das mit der fleury lib probiert das
> klappt leider auch nicht...

Hast du die auch RICHTIG konfiguriert?
Du hast deine Datenleitungen an einem anderen Port als die 
Control-Leitungen! Das muss in der Kondifguration auch berücksichtigt 
werden!.

Wenn in deiner lcd.h nirgends das Wort 'PORTC' auftaucht, dann ist auch 
die Fleury Lib nicht richtig konfiguriert. Es reicht eben nicht, nur 
hier
1
#define LCD_PORT         PORTA        /**< port for the LCD lines   */

den PORTD einzutragen. Denn damit würden die Steuerleitungen
1
....
2
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
3
#define LCD_RS_PIN       4            /**< pin  for RS line         */
4
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
5
#define LCD_RW_PIN       5            /**< pin  for RW line         */
6
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
7
#define LCD_E_PIN        6            /**< pin  for Enable line     */
8
....
bei unveränderter Einstellung ja auch auf den PORTD gelegt werden. Die 
sind aber am PORTC. Also musst du das auch eintragen
1
....
2
#define LCD_RS_PORT      PORTC        /**< port for RS line         */
3
#define LCD_RS_PIN       0            /**< pin  for RS line         */
4
#define LCD_RW_PORT      PORTC        /**< port for RW line         */
5
#define LCD_RW_PIN       1            /**< pin  for RW line         */
6
#define LCD_E_PORT       PORTC        /**< port for Enable line     */
7
#define LCD_E_PIN        2            /**< pin  for Enable line     */
8
....
dass diese Leitungen am PORTC sind.
Hast du das gemacht?
(Und ja, die Fleury Lib kann das korrekt behandeln)

Ein anderes mögliches Problem ist natürlich, dass all diese Libs auf den 
4 Bit Modus ausgelegt sind. Daher gehen sie ja auch davon aus, dass alle 
Leitungen an einem Port liegen. IN deinem AUfbau liegen aber alle 8 
Datenleitungen an einem µC Port. Je nachdem, welchen Zustand diese 
Leitungen bei der Initialisierung haben, könnte ich mir vorstellen, dass 
sie die Initialisierung beeinflussen. Ist das LCD erst mal in den 4 Bit 
Modus geschaltet, gibt es kein Problem mehr. Aber erst mal muss man in 
den 4 Bit Modus kommen.

: Bearbeitet durch User
von Arne P. (ob3lix)


Lesenswert?

ok, es klappt jetzt, nach kleiner Änderung:
1
 /* now configure for 4bit mode */
2
    //LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);   // LCD_FUNCTION_4BIT_1LINE>>4
3
    lcd_e_toggle();
4
    delay(64);           /* some displays need this additional delay */

//LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); <-- Ohne diesen Befehl klappt 
das mit dem Initialisieren.

Danke!!! Anleitung lesen hilft...

aber jetzt zeigt es mit nur ??? und komische Zeichen auf allen stellen 
an, anstatt nem 'a'
1
lcd_gotoxy(0,0);
2
lcd_home();
3
lcd_putc('a');

von Arne P. (ob3lix)


Lesenswert?

So,

die Initialisierung geht, das Display zeigt auch Zeichen an, aber nur 
die ersten 8! Der Rest fehlt...

Hat einer ne Idee woran das noch liegen kann?!

Fehlerbehebung wegen der Zeichen ist folgende:

in der lcd.c bei LCD_INIT ganz unten folgende Schritte einfügen:
1
lcd_command(0b00100000);
2
lcd_command(0b00001000);
3
lcd_command(0b00000001);
Damit wird das display laut treiber anleitung initialisiert.

von Karl H. (kbuchegg)


Lesenswert?

Arne Pfäffle schrieb:
> So,
>
> die Initialisierung geht, das Display zeigt auch Zeichen an, aber nur
> die ersten 8! Der Rest fehlt...
>
> Hat einer ne Idee woran das noch liegen kann?!

Du kannst doch nicht einfach die Umschaltung in den 4 Bit Modus aus der 
Initialisierung rausnehmen und denken das wär schon alles gewesen.

Wenn du nicht in den 4 Bit Modus schaltest, dann musst du logischerweise 
auch die Ausgabefunktionen auf unterster Ebene umschreiben. Denn die 
gehen noch immer davon aus, dass das LCD im 4 Bit Modus ist und daher 
pro auszugebendem Byte 2 Übertragungen notwendig sind.
Dein LCD ist aber nicht im 4 Bit Modus, ergo gestaltet sich die Ausgabe 
anders.

von Arne Pf (Gast)


Lesenswert?

Das display ist im 4-bit modus, die ausgabe einzelner chars geht ohne 
Probleme nur werden strings bis max 8 zeichen ausgegeben, der rest wird 
beschnitten... das ist mein Problem...

von Uwe S. (de0508)


Lesenswert?

Hallo Arne,

das ist auch richtig so, da das LCD die 1x16 Zeichen in 2x 8 Zeichen 
verwaltet.

Siehe: 
http://docs-europe.electrocomponents.com/webdocs/0f25/0900766b80f25dfc.pdf
rechts unten DISPLAY CHARACTER ADDRESS CODE.

Dann musst du halt die Ausgaberoutine umschreiben, so dass ein 
Zeichenzähler mit läuft und bei erreichen von Zeichen 8 die DDRAM 
Adresse 0x40 vorher schreibt.

: Bearbeitet durch User
von Arne Pf (Gast)


Lesenswert?

Ahhh alles klar! Des probier ich dann morgen mal aus, vielen Dank für 
den Tipp!!

Gruß
Arne

von Arne P. (ob3lix)


Lesenswert?

Hallo Uwe,

daas mit dem 2 x 8 Zeichen war das Problem! Display geht jetzt danke!

Gruß
Arne

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.