Forum: Mikrocontroller und Digitale Elektronik KS0066 (conrad) mit ATMEGA16 in C


von Philipp M. (philppus)


Angehängte Dateien:

Lesenswert?

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:
1
#define PORT PORTD

von Hubert G. (hubertg)


Lesenswert?

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.

von Philipp M. (philppus)


Lesenswert?

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)

von Hubert G. (hubertg)


Lesenswert?

http://palmavr.sourceforge.net/cgi-bin/fc.cgi
Ext. Crystal/Resonator Medium Frequ. Startup Time 258 CK +4ms

von Ja mann (Gast)


Lesenswert?

>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

von holger (Gast)


Lesenswert?

>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.

von Philipp M. (philppus)


Lesenswert?

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!

von Hubert G. (hubertg)


Lesenswert?

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?

von Philipp M. (philppus)


Lesenswert?

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
void lcd_enable(uint8_t wert){
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
int main(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
40
_delay_us(120);
41
42
43
lcd_enable(0b00000000);
44
lcd_enable(0b00010000);//LCD clear
45
_delay_ms(6);
46
47
lcd_enable(0b00000000);
48
lcd_enable(0b01100000);//increment ON, shift OFF
49
_delay_ms(10);}

von Philipp M. (philppus)


Lesenswert?

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     ***  ***

von Leser (Gast)


Lesenswert?

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.

von Ing. (Gast)


Lesenswert?

_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.

von Philipp M. (philppus)


Lesenswert?

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
void lcd_command(uint8_t befehl){
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
void lcd_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
int main(void){
52
53
DDRB=0xff;
54
55
lcd_init();
56
PORTB=0b00000111;
57
58
while(1);
59
return 0;
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!

von Philipp M. (philppus)


Lesenswert?

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ß... =(

von Hubert G. (hubertg)


Lesenswert?

Bist du dir sicher das der Atmega auch läuft? Lass mal eine LED blinken.

von Philipp M. (philppus)


Lesenswert?

ja, der atmega läuft, habe mir die komplette initialisierung quasi schon 
per LED ausgeben lassen!

von Philipp M. (philppus)


Angehängte Dateien:

Lesenswert?

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...

von verwirrter (Gast)


Lesenswert?

Sag uns doch auch noch welcher Controller dann verbaut ist. Wäre doch 
für viele hilfreich.

von jo (Gast)


Lesenswert?

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...

von mr_t (Gast)


Lesenswert?

is zwar nen ziehmlich simpler vorschlag, aba es wird trotzdem oft 
vergessen den kontrast richtig einzustellen...

von Philipp M. (philppus)


Lesenswert?

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 =)

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.