Problem mit ATmega164A und LCD FDCC1601E

#3704418
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!
Angehängte Dateien:
#3704613
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.
#3705313
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.
#3705772
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');
#3708451
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.
#3708636
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren