Forum: Mikrocontroller und Digitale Elektronik LCD HD44780 u 74HC164 4bit init-Problem


von Willi P. (anlen)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein LCD HD44780 mit einem Schieberegister 74HC164 verbunden.
Nun habe ich ein Problem.

Ich kann keinen Text in die 2. und 4. zeile schreiben.
Anhand der Suchfunktion habe ich schon herausgefunden, das es an der 
Init-Funktion liegt.
Da ja alles andere funktioniert, schließe ich einen Hardwarefehler aus.
Auch hat das LCD im 8-Bit Modus, die Zeile 2 und 4 richtig beschrieben.

Es ist ein:
electronic assembly 1604A  (4 Zeilen, 16 Spalten).

Ich habe aber irgendwo einen Denkfehler und finde ihn nicht.

Dies is so ziemlich mein erster Code den ich mir selber zusammengebaut 
habe.
Es wäre nett wenn jemand mal drüberschauen würde und mir helfen könnte.

Hier die Init-Funktion, der komplette Code ist im Anhang. Sowie der 
Schaltplan als PDF.
1
void lcd_init(void)
2
{
3
  DDR = (1<<ENABLE) | (1<<DATA) | (1<<CLK);
4
    _delay_ms(20);     
5
  
6
  loadnibble(0x30);
7
  _delay_ms(5);
8
  loadnibble(0x30);
9
  _delay_us(120);
10
    loadnibble(0x30);
11
  _delay_us(120);
12
  
13
  loadnibble(0x20);  // hier ist wahrscheinlich der Fehler 
14
                     // 0x30 oder 0x38 bringt auch nichts 
15
  _delay_ms(2);
16
  
17
  loadnibble(0x10);
18
  _delay_ms(2);
19
  
20
  loadnibble(0x02);
21
  _delay_us(140);
22
    
23
  loadnibble(0x01);    
24
  _delay_ms(2);
25
     
26
  loadnibble(0x0c);  
27
  _delay_ms(2);
28
};

von Georg G. (df2au)


Lesenswert?

Was soll das verodern mit 0x0f hier bewirken?

t1 = (out >>4) | 0xf0;

  if  (RSPin ==0)
    {
    t2 = 0b00000000 | 0x0f;
    }
    else
    {
    t2 = 0b00010000 | 0x0f;
    }

Falls du die relevanten Bits maskieren wolltest, ginge das mit
t1 = (out >> 4) & 0x0f besser...

von Willi P. (anlen)


Lesenswert?

Hi Georg,

das veroden soll bewirken, das am Pin5 des 74hc164, bei einem 
Commandbyte der Pin low ist und bei einen Zeichenbyte der Pin auf High 
gesetzt wird.
Aber ich werde mir deinen Vorschlag anschauen. Ich habe das nur deshalb 
so gemacht, weil ich es besser nicht wusste, bin halt Anfänger.

Nur leider hilft mir das bei meinem Prob mit der Init-Funktion nicht 
weiter.
Trotzdem danke für den Hinweis.

Gruß
WilliP

von Georg G. (df2au)


Lesenswert?

Willi P. schrieb:
> das veroden soll bewirken, das am Pin5 des 74hc164, bei einem
> Commandbyte der Pin low ist und bei einen Zeichenbyte der Pin auf High
> gesetzt wird.

Das ist schon klar. Das macht der linke Binär Wert. Ich fragte, was das 
Verodern mit 0x0f bewirken soll,das du mehrfach machst.

von willip (Gast)


Lesenswert?

Hi,


ich muss gestehen, das ich diesen Teil auch nicht richtig verstanden 
habe.
Das mit dem verroden, ist mir im Tutorial auch nicht ganz klar geworden.

Ich hatte das ganze am Schieberegister mit LEDs getestet um mir die bits 
beim übertragen direkt anzuschauen. Und weil es funktioniert hat, habe 
ich mir keine weitere Gedanken gemacht.
ich habe das ganze auch mit einem Schieberegister 74hct595 aufgebaut und 
dort funktioniert das alles wunderbar. Auch das beschreiben der 2. und 
4.Zeile. Du siehe ich stehe am Anfang von Programmieren.

Wie löse ich das besser? Ich werde dein Vorschlag versuchen umzusetzen, 
bin ja froh wenn ich was lernen kann.

oder hast du direkt eine Idee, was geändert werden muss.

Gruss
Willi

von Michael H. (mha1)


Lesenswert?

Deine loadnibble Funktion sendet immer high und low Nibble an das LCD. 
Bevor das LCD in den 4-Bit Modus geschaltet wurde, kann das Display mit 
dem low Nibble aber noch gar nichts anfangen. Das gesendete low Nibble 
wird als eigener Befehl interpretiert. 0x00 gibt es als Befehl aber 
nicht. Bis der4 Bit Modus aktiviert wurde, darf nur das high Nibble 
gesendet werden. Andernfalls funktioniert die Initialisierung nicht 
immer zuverlässig. Dies fällt meistens nicht weiter auf.

Die Initialisierung (0x20) für den 4-Bit Modus an sich ist soweit 
korrekt. Allerdings fehlt die Initialisierung für die zweite Zeile. 
Anstelle 0x20 wäre dafür 0x28 notwendig. Zu dem Zeitpunkt ist das 
Display aber noch im 8-Bit Modus (nur high Nibble senden) und würde das 
low Nibble ignorieren. Also anschließend noch ein 0x28 für die 
Initialisierung der zwei Zeilen senden (diesmal als high und low 
Nibble), dann sollte es funktionieren.

von Willi P. (anlen)


Lesenswert?

Hi Michael,

danke für die ausführliche Antwort.

Wenn ich das jetzt richtig verstanden habe, muss ich noch eine Fuktion 
schreiben, wo nur das High Bit gesendet wird, während das LCD sich noch 
im 8Bit Modus befindet?

Ich habe mal die Initsequenz so geändert, das anstatt des 0x20, zweimal 
hintereinander 0x28 gesendet wird.
Das Ergebnis ist, es wird nicht mehr angezeigt, auch nicht mehr die 1. 
oder 3. Zeile.
Ich habe auch schon den Kontrast verändert, da sich bei dem Display nach 
dem einschalten des zweizeiligen Modus, dieser aufteilt und somit 
schwächer wird.

Gruß
Willi

von Chris (Gast)


Lesenswert?

Vielleicht kannst du ja mal beim Ulrich Radig spickeln wie er das gelöst 
hat.
Auf http://www.ulrichradig.de/home/index.php/avr/lc-display gibt es ganz 
unten eine Zip-Datei 
http://www.ulrichradig.de/home/uploads/File/AVR_LCD/SerLCD.zip - in 
dieser ist sein Code in Verbindung mit dem 74HC164.

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.