Forum: Mikrocontroller und Digitale Elektronik LCD Routine Peter Fleury


von Benulba (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Community,

ich habe die im Anhang aufgeführten Routinen in mein Programm 
eingebunden, bekomme sie aber einfach nicht zum Laufen. (lcd.c und 
lcd.h)


Das Display (2x16) hängt an PortA eines Atmega 162.

Ich habe bisher lediglich die Routinen eingebunden. Hier ein Ausschnitt 
aus meinem Programm:

lcd_init(LCD_DISP_ON_CURSOR);

lcd_clrscr();

lcd_data( 'T' );
lcd_data( 'E' );
lcd_data( 'S' );
lcd_data( 'T' );

Im Moment passiert folgendes:

Zeile 1 zeigt schwarze Balken, in Zeile 2 ist nichts zu sehen. 
Kontrastveränderungen bringen auch keine Besserung.

Ich habe es auch mit den Routinen lcd-routines.h und lcd-routines.c 
versucht. Hier mit folgendem Code:

lcd_init();

lcd_data( 'T' );
lcd_data( 'E' );
lcd_data( 'S' );
lcd_data( 'T' );

Hier bleiben aber bei beiden Zeilen die schwarzen Balken. Auch hier ist 
das Display an PortA im 4-bit-Modus.

Verkabelung habe ich bereits mehrfach überprüft.

Weiß einer Rat?

Danke

von Krapao (Gast)


Lesenswert?

> Zeile 1 zeigt schwarze Balken, in Zeile 2 ist nichts zu sehen.

d.h. die lcd_init(); arbeitet in deinem Projekt nicht richtig. Das kann 
viele Ursachen haben.

Eine häufige Ursache ist, dass der Hardware-Reset des LCD beim Power-Up 
durch ein voreiliges µC Programm gestört wird.

Eine andere häufige Ursache ist, dass die Kommandos in der LCD-Library 
nicht zu dem LCD-Controller in dem konkret verbauten LCD passen.

Gelegentlich kommt es auch vor, dass die Verdrahtung zwischen µC und LCD 
nicht zur LCD-Library passt oder der praktische Aufbau nicht dem 
theoretischen Aufbau entspricht, z.B. bei gelockerten Steckdrähten.

von Krapao (Gast)


Lesenswert?

Du hast ZWEI LCD-Libraries im Anhang und kein eigenes main() :-(

1/ lcd.c und lcd.h (Fleury)
2/ lcd-routines.c und lcd-routines.h (µC.net?)

In einem eigenen Programm kann man nur entweder 1/ oder 2/ verwenden.

Bei der Library 1/ wird die BUSY-Leitung des LCD benötigt! Die Wartezeit 
nach Power-Up des µC ist in lcd_init() nur 16 ms (bei korrekt 
eingestelltem delay).

von Benulba (Gast)


Lesenswert?

Ich habe es zuerst mit der Routine von uC-net versucht und dann mit der 
von Peter Fleury.

Ich verwende folgendes LCD:

http://de.farnell.com/everbouquet/mc1602f7-syl/lcd-modul-a-n-stn-b-l-2x16/dp/1220435?Ntt=1220435

mit der Anschlussbelegung:

1 Ground
2 VCC
3 Poti
4 RS --> PA4
5 RW --> PA5
6 E  --> PA6

7-10 Ground
11-14 --> PA0 - PA3

Wenn ich die lib für die LCD-Ansteuerung aus dem "Absolute Beginner" 
Bereich nehme und an PortD anhänge und den darin enthaltenen Code auf 
den Controller lade, funktioniert es. Dieser Port ist allerdings belegt 
(OC-Match).

@ Krapao: Was meinst du mit voreiligem uC-Programm?

von Krapao (Gast)


Lesenswert?

Mit voreilig meine ich, dass das Programm nicht die erforderliche 
Power-Up Zeit des LCDs aus dem LCD-Controller Datenblatt beachtet, bevor 
es Kommandos zum LCD schickt bzw. an den Leitungen zum LCD Pegelwechsel 
verursacht. Worst-case 16 ms kommt mir sportlich schnell vor. Die Zeit 
hängt auch davon ab, wie der µC in Relation zum LCD nach dem Anschalten 
aus dem Reset kommt (Clock-Einstellungen) und wie lang vor der 
lcd_init() sonstiger Code ausgeführt wird.

von Benulba (Gast)


Lesenswert?

Ich habe das Display mit deinem Tip zum Laufen bekommen. Ich habe den 
LCD_init...Aufruf an den Anfang von main gesetzt und zwischen Aufruf und 
Kommunikation einen "delay" eingeführt.

int main(void)
{

  lcd_init(LCD_DISP_ON);


  _delay_ms(2000);

  lcd_data( 'T' );
  lcd_data( 'E' );
  lcd_data( 'S' );
  lcd_data( 'T' );


  port_init();

     ...


Es funktionert allerdings nicht, wenn ich die gleiche Programmstruktur 
weiter unter in main einfüge. Nach der Initialisierung der Ports werden 
einige Eingangspins abgefragt, an denen Taster hängen.

Wieso läuft es nicht, wenn die gleiche Programmstruktur nach den 
while-Schleifen (zur Tasterabfrage) eingefügt wird?

von Karl H. (kbuchegg)


Lesenswert?

Benulba schrieb:
> Ich habe das Display mit deinem Tip zum Laufen bekommen. Ich habe den
> LCD_init...Aufruf an den Anfang von main gesetzt und zwischen Aufruf und
> Kommunikation einen "delay" eingeführt.

Gemeint war allerdings etwas anderes:
Vor dem lcd_init dem LCD etwas mehr Zeit zu geben um erst mal in die 
Gänge zu kommen, ehe man es dann mit den Konfigurationsbytes 
bombardiert.
Auf dem LCD ist ja auch ein µC verbaut, der erst mal in einen sauberen 
Zustand booten muss.

> int main(void)
> {
>

    _delay_ms( 20 );

>   lcd_init(LCD_DISP_ON);
>
>
>   _delay_ms(2000);

2 Sekunden ist schon ein wenig heftig. Zum Probieren ok, aber für 
richtigen Einsatz darfs dann auch ein wenig weniger sein.

Wenn du das ganze Dauerhaft haben willst, ohne dich ständig daran 
erinnern zu müssen, sollte man mal überlegen ob man da nicht in der 
Funktion selber die Zeiten etwas länger macht.

> Es funktionert allerdings nicht, wenn ich die gleiche Programmstruktur
> weiter unter in main einfüge. Nach der Initialisierung der Ports werden
> einige Eingangspins abgefragt, an denen Taster hängen.
>
> Wieso läuft es nicht, wenn die gleiche Programmstruktur nach den
> while-Schleifen (zur Tasterabfrage) eingefügt wird?

Könnte ein Hinweis darauf sein, dass noch etwas anderes falsch ist.

PORTA bringt mich auf eine mögliche Fehleridee. VAcc hast du am µC 
angeschlossen? Das ist die Spannungsversorgung für den Port A. Und auch 
wenn du den ADC nicht nutzt, muss die Versorgungsspannung an VAcc 
angeschlossen werden, sonst funktioniert Port A nicht richtig.

von Benulba (Gast)


Lesenswert?

Hallo Karl-Heinz,

danke für deine Antwort.

Der Atmega162 hat keinen VAcc-Pin, ich werde die Routine aber noch 
einmal
auf PortC umschreiben und testen.

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.