Forum: Compiler & IDEs LCD-Ansteuerung


von Jens (Gast)


Lesenswert?

Hallo,
ich bin noch Anfänger auf dem gebiet, bin gerade beim hineinschnuppern. 
Habe ein Problem mit der LCD-Ansteuerung unter GCC.

Habe mir die LCD-Lib von Peter Fleury 
(http://www.mysunrise.ch/users/pfleury/) runtergeladen.
Mein Display habe ich an PORTC vom 4433 gehängt (im 4-Bit-Modus).
Allerdings, wie beim AVR-Tutorial habe ich den RW-Pin des LCDs auf GND 
und nicht an einen PortPin.
In der Lib habe ich den Port geändert, brauche ich ich den RW vom LCD??
denn das Display macht keinen Mux, nur zwei schw. Balken. In dem 
Beispiel vom Tutorial in ASM gehts ohne Probleme....

Kann mir jemand weiterhelfen,
vielen Dank im Voraus...

Gruß Jens

P.S.: Habe den Versuchsaufbau vom Tutorial deshalb geändert (LCD von 
PortD auf PortC, weil ich RS232-Daten auf meinem LCD ausgeben möchte.

von FaB (Gast)


Angehängte Dateien:

Lesenswert?

hallo,

ich bin zwar auch immer noch ein blutiger anfänger in diesem gebiet 
jedoch habe ich es hingekriegt mein 2x16-lcddisplay anzusteuern.
es ist wie folgt angeschlossen:

PB0 --> D4
PB1 --> D3
PB2 --> D2
PB3 --> D1
PB4 --> RS
PB5 --> RW
PB6 --> EN

es funktioniert zwar noch nicht alles z.b. mit dem positionieren auf der 
ten zeile gibt es noch probleme abr zum initialisieren und zum text 
ausgeben geht's

gruss fab

von Frank Linde (Gast)


Lesenswert?

Hallo Jens,

den RW brauchst Du nicht unbedingt. Es ist dann nur wichtig, lange genug 
zwischen zwei Kommandos zu warten, damit der LCD-Controller sich an den 
Anweisungen nicht verschluckt.

Da es in Assembler geht, wird der Kontrast wohl noch richtig eingestellt 
sein, oder?

Wenn nur zwei schwarze Balken zu sehen sind, liegt der Fehler vermutlich 
in der Routine zur Initialisierung des LCD. Vergleiche doch mal die 
beiden Init-Folgen in ASM und GCC.
Wenn's nicht klappt, bitte nochmal melden, dann such ich meinen 
GCC-Quellcode heraus.

Gruß
Frank

von Axel Schindler (Gast)


Lesenswert?

Hallo Jens!

Ich denke auch, dass es an der Initfolge liegt. Hatte am Anfang das 
selbe Problem. Bei mir war die erste Zeile komplett an und die zweite 
aus.
Habe dann einen Zahlenverdreher in der Initfolge festgestellt.

Axel

von Dude (Gast)


Lesenswert?

Ich habe seit langen auch das gleiche problem.

Zuerst mit meinem HMPEG, dann über PC und jetzt auch direkt über
den ATMEL. Bis jetzt habe ich 3 verschiedene LCD probiert und keines hat
gefunzt.

Bitte melden wenn ihr das Problem gelöt habt.

PS: ich hätte gerne eure Version die SICHER funktioniert hat.

Danke

DUDE

von Ronald (Gast)


Lesenswert?

habe für solche Sachen mir mal ein Datenblatt von Conrad gekauft, das 
beinhaltet u.a. folgenden Ablauf:

1. power on
2. warten >15ms
3. Funktionset (der wert hierfür ist bei 4 Bit 0x30)
4. warten > 4.1ms
5. Funktionset (der wert hierfür ist bei 4 Bit 0x30)
6. warten > 100 µs
7. Funktionset (der wert hierfür ist bei 4 Bit 0x30
8. warten > 4.1ms

die befehlsfolge muß !!! 3 mal erfolgen, eineigen LCD reicht eimal auch 
schon aus.

9. Funktionset (der Wert: 0x38 für 2 zeilen und 0x37 für eine Zeile )
10. Display an (der Wert: 0x3C ; 0x3D für blinkenden Cursor)
11. Display löschen (der Wert:0x01)
12. Entry mode set (der Wert:0x05)

Das enable Signal sollte mind. 1ms lang sein, und die Pausen sollten 
eigehalten werden...

von Ronald (Gast)


Lesenswert?

Habe das gestern nochmal verifiziert, folgende Ansteuerung sollte 
funktionieren:

LCD               ATMEL
1                   --                 GND
2                   --                 VCC
3                   --                 POTI (1:gnd 2:zum LCD 3:VCC)
4                   PD1              RS    Daten/Befehl
5                   PD2              RW   Lesen/Schrieben
6                   PD3              E      Enable
7                   NC
8                   NC
9                   NC
10                 NC
11                 PB0
12                 PB1
13                 PB2
14                 PB3


Initroutine:

outp(0xff,DDRD);outp(0x00,PORTD);
outp(0xff,DDRB);outp(0x00,PORTB);

cbi(PORTD,PD2); cbi(PORTD,PD2);
outp(0x03,PORTB);enLCD();delay(15);
outp(0x03,PORTB);enLCD();delay(4);
outp(0x03,PORTB);enLCD();delay(1);
outp(0x02,PORTB);enLCD();
outp(0x02,PORTB);enLCD();outp(0x08,PORTB);enLCD();
outp(0x00,PORTB);enLCD();outp(0x0d,PORTB);enLCD();
outp(0x00,PORTB);enLCD();outp(0x01,PORTB);enLCD();


die Enable Routine:
------------------------

void enlcd(void)
{delay(1);sbi(PORTD, PD3);delay(2);cbi(PORTD, PD3);delay(2);}


die Delayroutine:
---------------------

void delay (unsigned short count)
{for(; count !=0 ; 
count--){timer0_stop();timer0_source(CK1024);timer0_start();while( 
inp(TCNT0) < 9 ){}}timer0_stop();}


für das Delay muß "timer.h" eingebunden werden.
Atmel: AT90S8515
LCD:   Displaytech 204 A von Reichelt Elektronik (4*20)

von Ronald (Gast)


Lesenswert?

kleine Korrektur

void enLCD (void)

Gross / Kleinschreibung!!!!!!!!

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.