www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Routine Peter Fleury


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Benulba (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: Benulba (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

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?

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Benulba (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Benulba (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net