Forum: Mikrocontroller und Digitale Elektronik Brauche Rat bei Initialisierung KS0066


von funker (Gast)


Lesenswert?

Hallo,
ich möchte an meinem at90s8515 jetzt ein LCD anschliessen und im 4-Bit
Modus laufen lassen.
Ich will es irgendwie alleine hinbekommen, Fleurys test_lcd.c läuft
nicht, obwohl die Schaltung 1:1 (gleiche Pins und auch make) übernommen
wurde. Es bleibt schon bei der Initialisierung hängen, das ASM-Programm
aus dem Tut funzt jedenfalls. Absolut nichts gegen Fleury's Version,
aber ich habe es mir angewohnt aus anderen Programmen zu lernen und
übernehmen, und da komme ich mit dem scrollen nicht mehr mit. Ist halt
alles wahnsinnig gut definiert worden, aber wenig Lerneffekt für mich.
Eventuell könnte es auch am LCD (16x2) liegen, aber eher
unwahrscheinlich ist mit einem KS0066 Controller, aber der soll ja
HD44780 kompatibel sein.
datasheet:
http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183342-da-01-ml-lcd-modul_16x2_zeichen_de-en.pdf


Ich will mir jetzt selber eine Initialisierung basteln

#define DB4       0x01    //µC-PinA0
#define DB5       0x02          //A1
#define DB6       0x04
#define DB7       0x08
#define ENABLE    0x10          //R/W
#define RS        0x20          //RS
#define lDDR    DDRA
#define lPORT   PORTA
#define lPIN    PINA

static void delay(uint16_t us)
{
    while ( us ) us--;
}

/***********
für die init:
***********/

void lcd_init(void)
{
delay(15000);         //nach dem einschalten 15ms verz. laut Datasheet
lDDR = 0xff;           // Ax = ausgang
lPORTA = 0x00;         //PortA wird aktiviert - LCD Port
delay(15000);         //nochmal weil mir unklar ist, wann einschalten
                      //beginnt
lPORTA= (DB4 + DB5);   //laut Datenblatt muss ich die ersten beiden
                      //bits senden
lPORTA |= ENABLE;      //<- brauche ich den teil?
lPORTA &= ~ENABLE;     // heisst das, dass bei fallender Flanke...
                      // der Controller das Signal übernimmt?
                      // was bedeutet "|=" ungleich? u. "&= ~E."??
delay(4100);          // 4,1ms Verz. wird laut Datasheet gefordert
lPORTA |= ENABLE;      // schon wieder?
lPORTA &= ~ENABLE;

lPORTA= (DB4 + DB5);   // muss ich wiederholen, laut Datenblatt
lPORTA |= ENABLE;      //schon wieder? habe ich von einer LCD.c
lPORTA &= ~ENABLE;     //genommen

lcd_delay(100);       //Verz. >100us wird gefordert


lPORTA= (DB4 + DB5);   //zum 3.
lPORTA |= ENABLE;      //schon wieder? habe ich von einer LCD.c
lPORTA &= ~ENABLE;     //genommen

                      //ab jetzt kann das BusyFlag gelesen werden
                      //was das beutet ist mir auch unklar

lPORTA= DB5;          //4-Bit Modus
lPORTA |= ENABLE;      //schon wieder? habe ich von einer LCD.c
lPORTA &= ~ENABLE;     //genommen


lPORTA = (DB5 + DB7);  //jetzt komme ich nicht mehr weiter, kann ich
                       //das so machen? DB5=High-Nibble DB7=Low-N.??
                       //im low-nibble müsste ich jetzt DB7 aktivieren
                       //ausserdem ist DB4+5 mit einem x (nicht 0!)
                       //gekennzeichnet.


}


Danke schon mal fürs durchlesen.

Vielleicht kann mir jemand erklären wie ich die High-und Low-Nibbles
setzen kann. Was ist sonst noch falsch?
Die init schlug jedenfall, wie ich schon annahm, fehl.

von funker (Gast)


Lesenswert?

nachtrag:
Der compiler hat es jedenfalls so hingenommen, aber ich bin ja nicht
bis zum funcion-set gekommen, also konnte ich auch nicht die 2.Zeile
aktivieren um zu überprüfen ob alles bis dahin richtig war. Es ist
jedenfalls immer noch 1 schwarzer Balken und nicht 2, wie es nach einer
richtigen init sein sollte.

wegen den High/Low-Nibbles...

reicht es, wenn ich zum trennen der Nibbles einfach
delay(1);
dazwischen schreibe? Also:

lPortA = DB5  <-- high
delay(1);
lPortA = DB7  <-- low

ich möchte es eigentlich vermeiden, den 8bit modus zu benutzen, aber
vielleicht doch mal die Frage, ob es dann wie oben funktionieren
würde?
PinA, dann 8 Busleitungen und RS u R/W an einem anderen PIN?

von funker (Gast)


Lesenswert?

muss
#define lDDRA    DDRA
#define lPORTA   PORTA
#define lPINA    PINA

und im inti:
lDDRA = 0xff;

heissen

von funker (Gast)


Lesenswert?

I had a similar problem with the KS0066U controller. But, I found out
that the problem was not the code, it was the busy flag coming back
from the controller that was giving me problems.

http://www.avrfreaks.net/phorum/read.php?f=5&i=2288&t=2288#2288


Kann dazu jemand was sagen? Wie kann man sowas umgehen?

von funker (Gast)


Lesenswert?

Schon mal entschuldigung für die vielen postings!

Ich habe jetzt tcd-test von Peter Fleury nochmal getestet. Es tut sich
seltsames.
1. Die Schaltung wird ganz "normal" eingeschalten. -> 1 Balken aufm
Display.
2. Wenn ich den GND Pin vom µC von GND abklemme und beim Display auch
GND weglasse, so dass nur noch über das Poti auf GND liegt, dann
bekomme ich 2 Balken.
3. Ich hänge den µC an GND -> 1 Balken
4. µC weg von GND -> 2 Balken
5. wieder weg -> 1 Balken


Kann es sein, dass ich vor kurzem meinen µC doch beschädigt habe?

von funker (Gast)


Lesenswert?

Entschuldigung es hat sich gerade alles erledigt....

Bin gerade auf den Fehler gekommen und kann mich kaum noch halten vor
lachen. Als ich UART getestet habe lief zuerst auch wieder nichts, da
wollte ich schon für heute aufhören. Ich lege die Platine auf den
PC-Tower und plötzlich sendet UART ans Terminal. Zuerst hab ich es
nicht verstanden, ich dachte es wäre wieder eine kalte Lötstelle, aber
jetzt habe ich gemerkt, dass die GND Leitung direkt auf dem Gehäuse lag
und alles lief plötzlich...

mit Fleury...

wäre schön, wenn mir jemand bei meinem Versuch trotzdem noch helfen
könnte.

Ich verstehe nicht ob ich ENABLE vor oder nach dem Befehl brauche?
Vorher oder?

Die H/L Bytes werde ich mir selber irgendwie aus Fleurys LCD.c
basteln.

Ich sitze jetzt 10Std daran, habe eine Vorlesung sausen lassen und mir
ein neues LCD gekauft....
Jetzt gehts....

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.