Forum: Mikrocontroller und Digitale Elektronik 4x40 LCD Library


von Frank I. (icelase)


Lesenswert?

Hallo zusammen,

ich bin relativ neu in der Szene (hab mir vor kurzem ein STK500 
gekauft).

Mein Problem ist das ich ein 4x40 LCD ansteuern möchte.

Beide Enable PINs sind angeschlossen und funktionieren auch "fast".
Benutz dazu die Library von P.Fleurys.
Da die aber keine zwei Controller ansteuern kann, hab ich ein bisschen 
im Code herumgepfuscht... das will aber nicht so richtig (und ist auch 
ziemlich Quick&Dirty ;-) ) kann zwar beide Controller ansteuern... 
bekomme aber hin und wieder nach einem Reset/Power off/on  komischen 
Datenmüll auf dem 2. Controller ;-)

Gibt es vielleicht schon vorgefertigte LCD librarys die 4x40 LCDs 
beherschen? oder vielleicht eine angepasst lcdlibrary version?

Benutz Avr-Studio sowie den avr-gcc Compiler

Danke.

Grüße,
Frank

von Dennis (Gast)


Lesenswert?

>Da die aber keine zwei Controller ansteuern kann, hab ich ein bisschen
>im Code herumgepfuscht... das will aber nicht so richtig (und ist auch
>ziemlich Quick&Dirty ;-)

Na dann würde ich doch mal alles sauber aufsetzen, und dann klappt es 
auch...

von Franke M. (appletree)


Lesenswert?

Hallo Frank.
Ich muss Dennis recht geben.
Nimms erstmal auseinander und schreib es neu.
Hat den vorteil das mehr oder weniger genau weißt was du machst.
Tipp.
Falls du das nicht eh schon gemacht hast dann kontrolliere nochmal alle 
Steuerbefehle.Da gibt es gerne mal Unterschiede.Also muss das richtige 
Datenblatt her.
Wegen dem Verhalten beim Reset, es könnte an der Initialisierung liegen
Viel Erfolg.

von Frank I. (icelase)


Lesenswert?

Hi,

also im Code selbst "switch" ich einfach zwischen den beiden 
Controllern.

Da ja alles Parallel angeschlossen ist ( außer die beiden Enable Pins E1 
und E2 ) sollte das doch eigentlich möglich sein?


Habe jeweils die funktionen die die Enable pins high/low setzen 
angepasst:
1
void setController(uint8_t controller) {
2
3
use_controller = controller;
4
5
}
6
7
8
void lcd_e_high() {
9
10
   if (use_controller == 1) {
11
      LCD_E1_PORT  |=  _BV(LCD_E1_PIN);
12
   } else if (use_controller == 2) {
13
      LCD_E2_PORT  |=  _BV(LCD_E2_PIN);
14
   }
15
16
}
17
18
19
void lcd_e_low() {
20
21
   if (use_controller == 1) {
22
      LCD_E1_PORT  &= ~_BV(LCD_E1_PIN);
23
   } else if (use_controller == 2) {
24
      LCD_E2_PORT  &= ~_BV(LCD_E2_PIN);
25
   }
26
27
}


Und logischerweise Initialisiere ich dann beide Controller, und schreib 
auf beiden das gleiche:

1
  setController(1);
2
        lcd_init(LCD_DISP_ON);
3
  lcd_clrscr();
4
5
6
7
  setController(2);
8
        lcd_init(LCD_DISP_ON);
9
  lcd_clrscr();
10
11
setController(1);
12
lcd_gotoxy(0,1);
13
lcd_puts("blabla");
14
15
16
setController(2);
17
lcd_gotoxy(0,1);
18
lcd_puts("blabla");


Manchmal kommt Datenmüll ( eher wenn ich dem Strom ganz weg nimm und 
wieder gib ) manchmal nicht.
Hat wohl irgendwas mit den Timings zu tun. Ein Delay zwischen dem 
Controller wechseln bringt irgendwie auch nix :-(

Bin mit meinem unprofessionellen C Kentnissen eigentlich am Ende.
Einer vielleicht noch ne Idee wo ich ansetzen könnt?


Grüsse,
Frank

von Peter D. (peda)


Lesenswert?


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.