Guten Morgen,
seit einigen Stunden versuche ich bereits die LCD Library von Peter
Fleury in mein AVR Programm einzubinden. Ich habe die Anpassung
entsprechend dem Datenblatt vorgenommen und das Übersetzen und Laden in
den Mega ist auch kein Problem.
Leider funktionert das Display überhaupt nicht. Ein hardwareseitiger
Fehler kann ausgeschlossen werden, da mit Bascom keine Probleme
auftreten.
Nach dem Laden des hex-Files wird nur die erste Zeile initialisiert,
also die erste und dritte Zeile im Display sind völlig schwarz...
Vielleicht habt ihr eine Idee, wo der Fehler liegen könnte. Mein
Programm sieht folgendermaßen aus:
aus der "lcd.h":
1
#define LCD_CONTROLLER_KS0073 0 //Use 0 for HD44780 controller, 1 for KS0073 controller */
2
3
/**
4
* @name Definitions for Display Size
5
* Change these definitions to adapt setting to your display
6
*/
7
#define LCD_LINES 4 /**< number of visible lines of the display */
8
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
9
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
10
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
11
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
12
#define LCD_START_LINE3 0x10 /**< DDRAM address of first char of line 3 */
13
#define LCD_START_LINE4 0x50 /**< DDRAM address of first char of line 4 */
14
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
Stephan wrote:
> aus der "lcd.h":> #define LCD_LINE_LENGTH 0x40 /**< internal line length of the> display */
Wirklich 64 Zeichen pro Zeile im LCD Buffer?
> #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of> line 1 */> #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of> line 2 */> #define LCD_START_LINE3 0x10 /**< DDRAM address of first char of> line 3 */> #define LCD_START_LINE4 0x50 /**< DDRAM address of first char of> line 4 */
Passt das zu Deinem LCD Controller ?
> #define LCD_DATA0_PIN 3 /**< pin for 4bit data bit 0 */> #define LCD_DATA1_PIN 2 /**< pin for 4bit data bit 1 */> #define LCD_DATA2_PIN 1 /**< pin for 4bit data bit 2 */> #define LCD_DATA3_PIN 0 /**< pin for 4bit data bit 3 */
Wirklich "verkehrt herum" ?
Ich frag so, weil ich genau dort auch Probleme hatte ... Wenn Dir eine
einfachere Version lieber ist zum Debuggen, schau mal im Dateianhang ...
Gruß,
Frank
Hallo Frank,
mit den 64 Zeichen ergibt sich doch aus 16x4 oder sehe ich das falsch?
Adressen des ersten Zeichen der jeweiligen Zeile habe ich aus dem
Datenblatt und sollten stimmen.
Das Display ist wie folgt an den Controller angeschlossen:
DB4 A03
DB5 A02
DB6 A01
DB7 A00
RS A05
R/W A06
E A04
bin mit der Reihenfolge in der Headerdatei nicht ganz sicher... Ich habe
die Reihenfolge auch schon geändert und es hat sich nichts geändert.
Ich habe den Fehler nun gefunden, bloß noch nicht die richtige Idee
diesen zu beheben.
Wird der Befehl " lcd_init(LCD_DISP_ON); " aufgerufen, so bleibt der
Controller an dieser Stelle hängen und nichts passiert mehr...
Hatte dieses Phänomen auch schon mal jemand beobachten können?
Ist bei dem 16x4 denn nur ein Controller verbaut ? Ansonsten tippe ich
mal, dass zwei Enable Leitungen benötigt werden (wie z.B. bei dem Wintek
Display von Pollin).
Man muss dann abhängig von der Line den richtigen Controller einschalten
(E1 bei 1+2, E2 bei 3+4).
Angabe der Beschreibung des LCDs wäre hilfreich.
Laut Datenblatt ist nur ein Controller vorhanden und auch nur eine
Enable - Leitung!
Das Display hat folgende Bezeichnung:
" NLC - 16x4x05 " und ist mit dem Controller KS0066, welcher dem HD44780
entspricht, bestückt.
delay(64);/* some displays need this additional delay */
Ich habe noch ein wenig im Netz weiter rumgeschaut und habe entdeckt,
dass der KS0066 scheinbar nicht mit der Library funktioniert. Deshalb
werde ich wohl selber eine Library schreiben müssen :-(
>Wird der Befehl " lcd_init(LCD_DISP_ON); " aufgerufen, so bleibt der>Controller an dieser Stelle hängen und nichts passiert mehr...
Dann bleibt er vermutlich beim Busycheck hängen.
Programm passt möglicherweise nicht mit der
realen Verdrahtung zusammen.
Ich habe die Library aktuell mit einem 4 x 20 Zeichen LCD von Reichelt
am Laufen. Das Teil hat laut Datenblatt den KS0066U. Das funktioniert
einwandfrei.
Gruß
Benedikt
Hallo Benedikt,
schicke mir doch mal bitte die Header-Datei, welche du konfiguriert
hast. Vielleicht kann ich den entscheiden Unterschied finden. Es muss
mit der Adressierung der verschieden Kommandos zusammenhängen, eine
andere Idee habe ich langsam nicht mehr...
* Change LCD_PORT if you want to use a different port for the LCD pins.
32
*
33
* The four LCD data lines and the three control lines RS, RW, E can be on the
34
* same port or on different ports.
35
* Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
36
* different ports.
37
*
38
* Normally the four data lines should be mapped to bit 0..3 on one port, but it
39
* is possible to connect these data lines in different order or even on different
40
* ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
41
*
42
*/
43
#define LCD_PORT PORTC /**< port for the LCD lines */
44
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
45
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
46
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
47
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
48
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
49
#define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */
50
#define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */
51
#define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
52
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
53
#define LCD_RS_PIN 4 /**< pin for RS line */
54
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
55
#define LCD_RW_PIN 5 /**< pin for RW line */
56
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
57
#define LCD_E_PIN 6 /**< pin for Enable line */
Abgesehen von den Adressen und der Pin-Belegung sieht das deiner Header
Datei ja recht ähnlich.
Ich habe die restlichen Data-Pins (0-3) vom Display auf Masse gelegt.
Gruß
Benedikt
Die Konfiguration deines Displays stimmt auch mit dem in meinem
Datenblattheft überein. Der einzige Unterschied besteht darin, dass ich
die anderen Pins nicht auf Masse gelegt habe, denkst du, dass das die
Ursache sein könnte?
Bei anderen Displays habe ich mal die Erfahrung gemacht das es nur geht
wenn die nicht benötigten Pins auf Masse liegen. Daher mache ich das
jetzt einfach immer.
Wenn's aber anders im Datenblatt steht wird das wohl stimmen :)
In der Init Routine werden nicht die delay.h Routinen benutzt. Das würde
ich ändern, da die delay.h Routinen Frequenz unabhängig sind (z.B.
_delay_ms(x)).
Passt in der Init auch das Setzen auf Output (DDR(LCD_DATA0_PORT) |=
0x7F;) mit der Konfiguration zusammen ? Durch die vielen If's steige ich
jetzt nicht so schnell durch :-)
hmmm... weiß nicht obs hilft, aber ich hatte vor n paar Tagen mit der
obigen I2Clib nen Display angesteuert und dabei externe Pullups für SCL
und SDA verwendet... völlig unerklärliche Abstürze trieben mich zur
Verzweiflung :-)
Als ich dann die externen Widerstände weggeputzt und statt dessen die
internen Pullups aktiviert hatte liefs wie am Schnürchen