Hallo alle zusammen
Zunächst mal möchte ich mich dafür entschuldigen, einen weiteren LCD
Thread zu eröffnen, aber ich habe für mein Problem keine Lösung
gefunden.
Mein Problem lässt sich recht einfach darstellen:
bei Conrad ein Anag Vision 2x16 LCD bestellt (KS0066 Controller) und das
Display lässt sich nicht initialisieren. Die Kontakte sind alle in
Ordnung, es gibt keine gebrochenen Lötstellen und die Ports reagieren
auch alle (mit LEDS getestet).
Ich arbeite mit dem STK500 von Atmel und AVR Studio 4.13, als Sprache
hab ich 'C' gewählt.
Auf dem STK ist ein 8MHz Quartz, der Jumper XTAL1 ist gesetzt, der
OSCSEL ist auf den rechten beiden Pins und ich habe die Fuses so
eingestellt:
CKOPT -> gesetzt
SUT_CKSEL -> ext. RC Osc 8Mhz-12Mhz; Start-up time: 18CK + 4 ms
Das LCD häng an Port D mit:
D4 bi D7 an DB4 bis DB7 des LCD und
RS=D0 sowie E=3. Die restlichen, nicht benutzten Pins am LCD sind auf
GND, Versorgungsspannung mit Netzgerät auf 5V, Kontrast Einstellbar mit
Poti 10k.
Sollte also alles bereit sein.
Im Anhang findet sich die Initialisierung in C. Da ich die
Initialisierung so gewählt habe, dass man den Cursor blinken sieht,
sollte ja auch direkt nach der initialisierung was zu sehen sein.
Ich habe die Zeiten variiert, andere ports genommen, mit und ohne enable
Impuls...einfach so ziemlich alle Kombinationen...aber es tut sich
einfach NIX! hin und wieder (nach willemlosen nutzen des Reset-Taster
auf dem STK kommt mal der Cursor kurz, verschwindet dann aber wieder,
woraus ich schließe, dass das Display auch nicht am A... ist)
Ebenso wurde das Tutorial auch schon kompiliert und gebrannt, was
ungefähr zum gleichen erfolg geführt hat (oh wunder, andere
initialisierung!).
Die Initialisierung jetzt ist nach dem Datenblatt:
http://www.lcd-module.de/eng/pdf/zubehoer/ks0066.pdf
Hat hier jemand vielleicht eine ähnliche Konfiguration (gleiches
Display, in C geschrieben, wenn möglich sogar ein ATMEGA16?) und möchte
sein Wissen weitergeben? =)
So far, ich hoffe auf Hilfe =)
PS: folgende Zeile fehlt im Code:
Ich weiss nicht warum du einen RC-Oszillator einstellst wenn du einen
Quarz hast.
Ausserdem würde ich zuerst mal den Code von Fleury probieren, wenn es
dann läuft weisst du das HW-mässig alles OK ist und kannst dich mit dem
eigenen Code herumspielen.
Gut, dass mit dem externen Oszi und dem Quartz seh ich noch ein =) Aber
welche Fuse bits muss ich dann setzen? Ext. Crystal/Resonator High
Freq.?
Keine Angst, Fleury habe ich auch schon hinter mir, bringt mich ungefähr
genau so weit. Habe jetzt vermutlich den Fehler gefunden, bin mir aber
noch nicht so ganz sicher (Stichwort: Pull Ups, hoffe aber nicht, dass
es daran liegt, das wäre ja schon fast peinlich! g)
>Gut, dass mit dem externen Oszi und dem Quartz seh ich noch ein
Ob mit internem Oszi oder externen Quarz, das LCD muss so oder so
funktionieren.
>Stichwort: Pull Ups,
Wenn du das Display "nur" initialisierst sind ja zu jeder Zeit alle Pins
zum LCD auf Ausgang, dabei spielen die "Pull Ups" keine Rolle. Ich
vermute einen Fehler in der Verdrahtung; was gerne gemacht wird:
- Im 4-bit Modus DB0-3 anstatt DB4-7 anschließen.
- RS/RW richtig gesetzt und nicht vertauscht ?
- Alle Portpins zum LCD auf Ausgang geschaltet ?
- Timing korrekt ? Achtung, einige Kommandos brauchen länger (z.B.
CLRSCR) bis der nächste Befehl entgegengenommen werden kann
>int main (void){>>> _delay_ms(45); //eigentlich 30ms>> PORT=0b00111000;> _delay_us(48);> PORT=0;
Für PORT wurde DDR nicht auf Ausgänge gesetzt.
Ich seh kein bitwackeln am Enable Pin und keine
Auswahl von RS.
Die Verdrahtung stimmt, LCDB4 ist mit PD4 verbunden, 5 mit 5 usw. RW ist
nicht angeschlossen und RS ist zwar angeschlossen, da aber nur
initialisiert wird, eh die ganze zeit auf 0. ja, das Timing ist auch
sehr konservativ gehalten (Faktor 4 zum datenblatt).
Mit PullUp meine ich, dass wenn ich
1
DDRD=0xff;
2
PORTD=0b11000001;
laufen lasse nicht die LEDS 0 und 7,8 leuchten, sondern eben aus sind.
Also musste dementsprechend auch der "Befehl": 0010 auf ~0010 geändert
werden usw.
also werd ich damit erstmal weiter rum probieren, der link zu dem Fuse
calculator ist aber gut gewesen, danke!
Ja mann wrote:
>>Gut, dass mit dem externen Oszi und dem Quartz seh ich noch ein> Ob mit internem Oszi oder externen Quarz, das LCD muss so oder so> funktionieren.>
Ob da was taktet wenn RC-Oszillator eingestellt ist, aber ein Quarz dran
hängt?
holger wrote:
>>int main (void){>>>>>> _delay_ms(45); //eigentlich 30ms>>>> PORT=0b00111000;>> _delay_us(48);>> PORT=0;>>> Für PORT wurde DDR nicht auf Ausgänge gesetzt.> Ich seh kein bitwackeln am Enable Pin und keine> Auswahl von RS.
Das ist mittlerweile geschehen, habe die "anfangsversion" mitgepostet,
sorry, mein Fehler.
1
#include<avr/io.h>
2
#include<util/delay.h>
3
#include<inttypes.h>
4
5
#define F_CPU 8000000UL
6
7
8
9
voidlcd_enable(uint8_twert){
10
_delay_us(5);
11
PORTD=~0b00001000;//enable anlegen
12
_delay_us(2);
13
PORTD=PORTD|~wert;//wert maskieren
14
_delay_us(5);
15
PORTD=~0;//PORT wieder auf 0
16
DDRD=0xff;//PORT D ist output
17
}
18
19
intmain(void){
20
DDRD=0xff;
21
_delay_ms(150);//eigentlich 30ms
22
23
lcd_enable(0b00100000);
24
_delay_us(120);
25
lcd_enable(0b00100000);
26
_delay_us(120);
27
28
29
lcd_enable(0b00110000);//LCD 2 line und LCD on
30
_delay_us(120);
31
32
33
34
lcd_enable(0b00110000);//erste 1 für 2 zeilen zweite 1 für display on
35
_delay_us(45);//eigentlich 39us
36
37
38
lcd_enable(0b00000000);
39
lcd_enable(0b11110000);//display ON, cursor ON, blink ON
Nochmal ne ganz dumme Frage, ich seh in den Datenblättern bei der
Initialisierung immer sternchen, was bedeuten diese? Doch wohl
hoffentlich "low" oder?
BSP:
RS R/W DB7 DB6 DB5 DB4
0 0 N F *** ***
Hi,
schau dir doch mal das Diagramm im Datenblatt auf Seite 32 an.
Demnach mußt du E erst auf High setzen, dann die Daten anlegen, und zum
übernehmen der Daten E wieder auf Low. Du setzt den Port aber komplett
auf 0.
Die Sternchen bei der Initialisierung bedeuten, das hier der Wert nicht
relevant ist.
_delay_us(120); geht nicht, schaue in die Headerdatei. Die maximal
einstellbare delay Zeit hängt von der CPU Taktung ab. Vielleicht liegt
es auch daran. Wenn du längere delays brauchst, schreib dir eine
do-while schleife wo ein ms delay z.B. 100 mal aufgerufen wird.
Danke, bei jedem tip hier bin ich der Meinung es würde jetzt
funktionieren aber irgendwie tut sich danach genau so wenig.
Tips wie delay nicht über 120 und Enable vor den Daten runter nehmen
sind wirklich gut gewesen (Ja, ich weiß, Datenblatt wirklich noch
genauer lesen =) ) aber es tut sich nichts. Es ist wirklich zum
erbrechen!!!
Bin mittlerweile soweit, dass ich 8 Bits spendiere und einen neuen Port
für RS und E eröffnet habe um NOCH sicherer zu sein, dass es ganz genau
so läuft, wie es soll. Das tut es scheinbar auch aber funktionieren tut
es deswegen noch lange nicht.
War vorhin sogar soweit den "Hersteller" in Berlin anzurufen und zu
fragen welche Initialisierung denn nun stimmt, die, die auf seiner Seite
angegeben ist oder die von Samsung...leider hat er bis jetzt nicht
zurück gerufen. Die Verzweiflung hat mich auch erneut ein neues Display
anschließen lassen mit dem Erfolg, dass sich nicht
änder....AHHHHHHHH!!!!
hier der Code, falls jemand des Rätelslösung kennt, so möge er sich
bitte melden, ich bin fast schon dazu geneigt mich in seine lebenslange
Schuld zu stellen!!! =)
1
#include<avr/io.h>
2
#include<util/delay.h>
3
#include<inttypes.h>
4
5
//#define F_CPU 8000000UL
6
7
voidlcd_command(uint8_tbefehl){
8
_delay_ms(30);
9
PORTA=PORTA|0b00000010;//ENABLE setzen
10
_delay_ms(30);
11
12
PORTD=befehl;//befehl auf D setzen
13
_delay_ms(30);
14
15
PORTA=0;//enable löschen
16
_delay_ms(30);
17
18
PORTD=0;//D löschen
19
}
20
21
voidlcd_init(void){
22
DDRD=0xff;//D ist Datenport
23
DDRA=0xff;//A0=RS ; A1=E;
24
25
_delay_ms(30);
26
PORTD=0;
27
PORTA=0;
28
_delay_ms(30);
29
30
//INIT NACH SAMSUNG KS0066
31
lcd_command(0b00110100);//FUNCTION SET: 1| 2 lines (angebl.0)| disp. on
32
_delay_ms(30);
33
PORTB=0b01111111;
34
35
lcd_command(0b00001111);//DISPLAY CONTROL 1|displ ON|Cursor ON|blink ON
36
_delay_ms(30);
37
PORTB=0b00111111;
38
39
40
lcd_command(0b00000001);//DISPLAY CLEAR
41
_delay_ms(30);
42
PORTB=0b00011111;
43
44
lcd_command(0b00000110);//ENTRY MODE SET 1|DECREMENT | ENTIRE SHIFT
45
_delay_ms(30);
46
PORTB=0b00001111;
47
//ENDE SAMSUNG
48
}
49
50
51
intmain(void){
52
53
DDRB=0xff;
54
55
lcd_init();
56
PORTB=0b00000111;
57
58
while(1);
59
return0;
60
}
PORTB steuert nur LEDS an, damit ich sehen kann/konnte, dass der Delay
auch wirklich ein Delay ist und wie weit die Init. ist.
Alles ab //INIT NACH SAMSUNG KS0066 bis //ENDE SAMSUNG
wurde auch schon gegen:
1
//INIT NACH www.DST-gmbh.de
2
lcd_command(0b00110000);
3
_delay_ms(30);
4
PORTB=0b01111111;
5
6
lcd_command(0b00110000);
7
_delay_ms(30);
8
PORTB=0b00111111;
9
10
lcd_command(0b00110000);
11
_delay_ms(30);
12
PORTB=0b00011111;
13
14
lcd_command(0b00111000);
15
_delay_ms(30);
16
PORTB=0b00001111;
17
18
lcd_command(0b0000100);
19
_delay_ms(30);
20
PORTB=0b00000111;
21
22
lcd_command(0b00000001);
23
_delay_ms(30);
24
PORTB=0b00000011;
25
26
lcd_command(0b00000110);
27
_delay_ms(30);
28
PORTB=0b00000001;
29
}
getauscht, "natürlich" erfolglos.
Der schwarze Balken macht einfach keine Anstalten zu verschwinden!
Auch in Teilen der Initialisierung bringen so Dinge wie "Display off"
nicht den geringsten Unterschied, einfach GAR KEINEN!!! ARGH!
Also, folgendes, dass mit den pull ups war auch total humbug meiner
seits...nicht mitgedacht.
dann hab ich gemerkt, dass an dem netzteil, dass ich benutze die 12V für
das stk und die 5v für das display wohl potentialfrei sind, also konnten
die PORTS gar keine signale "anlegen".
somit hab ich mich dazu entschlossen ein altes computernetzteil zu
verwenden, und dem display mit einer extra schaltung mit einem 7805er
die spannung so zukommen zu lassen.
jetzt passiert nach wie vor nix. das einzige, dass ich feststellen kann
ist, dass wenn der atmega arbeitet, ein ganz leichtes flackern auf dem
display zu sehen ist, was ich jedoch also kurze schwankungen in der
versorgung interpretiere. daran dürfte es ja aber nicht liegen, oder
täusche ich mich da so sehr?
LCDs machen definitiv keinen spaß... =(
YEAH, es geht.
Anbei die "Grundinitialisierung" im 8BIT Modus, R/W MUSS auf Grund
liegen.
PORTD ist für die Daten
PORTA ist: A0 = RS, A1=E und A6=POWER LCD
Scheinbar ist doch kein KS0066 verbaut, entgegen den Angaben von Conrad
und DST. Hätte enorm viel arbeit erspart...
Also ich hab mir auch ein 16x2 Anag Vision Display (AV1624YRB-SJW) von
Conrad gekauft, und mich an die Initialisierung vom KS0066 aus dem
Samsung Datenblatt gehalten, und es funktioniert. Zugegeben, es hat Tage
gedauert, aber als ich dann von assembler auf c umgestiegen bin, hat es
funktioniert.
Ich vermute, dass ich in dem assemblercode Fehler bei den delayroutinen
gemacht hab, aber...
welcher controller genau verbaut ist, kann ich leider nicht sagen, da
die initialisierung nach anag-vision zwar angeblich ks0066 ist, die von
samsung jedoch definitiv anders aussieht! anag vision hat bis dato auch
nicht mehr zurück gerufen, so dass man es vielleicht erfahren könnte.
@mr_t:
jaja, kontrast einstellen ist durchaus sinnvoll, ebenso wie nach dem
initialisieren (ja nach controller!) auch das display nach dem off
befehl wieder auf on zu setzen.
da ich jedoch den schwarzen balken gesehen habe und er nicht
verschwunden ist, war mir der genaue kontrast erstmal herzlich egal =)