Hallo Leute,
bin seit geraumer Zeit mit dem AVR GCC Tutorial beschäftigt und dabei
eine Library für mein LCD zu schreiben.
Ich möchte keine fertige nehmen, der Lerneffekt ist beim selber machen
größer :)
Problem ist nun das ich keine Buchstaben in die zweite Zeile bekomme ...
sobald ich die Adresse auf 0x40 setze kommt nichts. Ich muss aber dazu
sagen, dass es ohne Probleme Funktioniert, einen String an eine
bestimmten Stelle in der 1.Zeile zu schreiben.
Ja habe die Forensuche benutzt und bin auf keine passende Antwort
gestoßen :(
Ich benutze das myAVR Board LPT mit dem Display Add-on.
http://www.myavr.info/download/produkte/lcd/techb_lcd_de_en.pdf
Hier ist mal ein Ausschnitt aus dem Code:
Hauptprogramm:
immer_das_gleiche... schrieb:> lcd_command(lcd_funktion);>> // Eingabemodus einstellen> lcd_command(lcd_entry);
Versuch mal zwischen diesen beiden zeilen eine Pause zumachen zb 5ms.
also sollange etwas in der ersten zeile dargestellt wird und ich dann am
kontrast regler spiele. wird nur die erste zeile dunkel.
sieht wohl so aus als ob da was falsch initialisiert wird... oder irre
ich mich?
wenn Du im 4-bit-Modus bist, musst Du immer 2x4 Bit (HI-LO) übertragen,
damit der Befehl komplett ist. Du übeträgst nur 1x 4 Bit.
Steht alles bei sprut unter "Beispiel für eine Initialisierung mit 4-Bit
Interface:"
Wenn das LCD richtig Initialisiert ist werden beide Zeilen dunkel wenn
man mehr Kontrast reingibt. So wie das bei dir ausieht kann es durchaus
an der Initialisierung liegen zB das die delays zu kurz sind.
Danke schonmal soweit, habe die Zeiten mal geändert und es hat sich
soweit auch nichts geändert.
Das einzigste was ich noch vermuten könnte ist das meine lcd_command();
funktion nicht ganz richtig ist.
1
// Befehl zum LCD senden
2
voidlcd_command(uint8_tcommand){
3
// Obere Bits schicken
4
lcd_port=(command&0xF0);
5
lcd_enable();
6
7
// Untere Bits schicken
8
lcd_port=(command<<4)&0xF0;
9
lcd_enable();
10
11
// Kurze Pause
12
_delay_ms(lcd_cmd_time);
13
}
Wobei ich mich frage, wenn das LCD doch nicht richtig initialisiert ist,
dann sollte es doch gar nichts darstellen oder?
usuru schrieb:> #define lcd_modus 0b01000000 // 4Bit Modus --- Deine Einstellung>> ---------------------------^>>>> #define lcd_modus 0b00100000 // 4Bit Modus --- gefällt mit eher>> ----------------------------^
danke, habe es geändert. leider funzt das auch nicht :(
habe aber nochmal den kompletten code angehangen. die reset zeiten habe
ich mal an die aus dem LCD Tutorial angepasst.
mit den 10ms klappt es auch nicht :(
also laut der myavr anleitung sind die pausenzeiten
1. 5ms
2. 100us
3. 5ms
habe die anleitung auch schon 1 zu 1 gemacht aber es ist immer nur die
1. zeile aktiv.
kaputt ist das display auch nicht, das test programm läuft.
deine reihenfolge ändert auch nichts an dem sachverhalt.
langsam verzweifel ich
immer_das_gleiche... schrieb:> Problem ist nun das ich keine Buchstaben in die zweite Zeile bekomme ...>> sobald ich die Adresse auf 0x40 setze kommt nichts.
ich verwende die Adresse für zweite Zeile 0x20, und erste Zeile 0x00.
lg
>> Problem ist nun das ich keine Buchstaben in die zweite Zeile bekomme ...>>>> sobald ich die Adresse auf 0x40 setze kommt nichts.> ich verwende die Adresse für zweite Zeile 0x20, und erste Zeile 0x00.
richtige Spur aber flasche Zahl: Die 2. Zeile wird mit 0x28 erreicht was
dez der pos 40 entspricht
Thomas
> Aber nicht bei dem o.g. Display (S.10):> http://www.myavr.info/download/produkte/lcd/techb_...
das scheint mir ein Fehler in diesem Datenblatt zu sein. So einen
Controller habe ich noch nie gesehen.
Die mir bekannten Controller können alle 80 Zeichen verwalten, weshalb
die 2. Zeile bei 40 anfängt. Die 0x40 halte schlicht für falsch.
Thomas
> Nicht 0x40 sondern 0x28 was int 40 entspricht ;)
ich bin ja deiner Meinung und hatte das auch so geschrieben nur im
zitierten Datenblatt steht eben 40h.
Thomas
so da bin ich wieder :D
also bei dem display ist die adresse 0x40.
das problem mit der zweiten zeile habe ich gelöst, in der
initialisierung musste einfach hinter dem befehl lcd_command(lcd_modus);
noch eine kurze wartezeit von 5ms ergänzt werden.
nun habe ich aber noch ein anderes problem, um den code übersichtlicher
zu machen habe ich eine unterfunktion ergänzt
sollange die funktion lcd_display_reset(); eingebaut ist, ist der code
bei knapp 50% speichergröße des mega8.
die größe steigt erst von 5% auf 50%, sobald man in das _delay_ms(); die
variable "time" einfügt.
gibt es dafür einen bestimmen grund?