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
> 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.
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).
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?
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.