Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung des ST7036 Controllers mit einem 8051


von Peter K. (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei ein 2 zeiliges LCD-Display eines ST7036 Controllers 
mit einem 8051µC ansteuern zu können.

Allerdings hakt bei mir schon die Initialisierung, denn ich möchte, um 
die Initialisierung zu checken, den Cursor mit ausgeben. Dazu habe ich 
laut Datenblatt folgende Initialisierung eingerichtet. Aber irgenwie 
gibt er mir den nicht aus.

Hier ist der Code der Initialisierung für 4Bit Modus mit Cursor Anzeige
void LCDinit(void){
  delay(100);            //Verögerung nach Start
  P2MDOUT |= 0xFF;        //Port 2 als Ausgang deklarieren
  delay(1);
  P2 |= 0x3;
  delay(2);
  P2 &= 0x00;
  P2 |= 0x3;
  delay(1);
  P2 &= 0x00;
  P2 |= 0x3;
  delay(1);
  P2 &= 0x00;
  P2 |= 0x2;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x2;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x9;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x1;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x4;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x5;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x5;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x6;
  delay(1);

  P2 &= 0x00;
  P2 |= 0xD;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x7;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x8;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x2;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x8;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x0;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x8;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x0;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x1;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x0;
  delay(1);

  P2 &= 0x00;
  P2 |= 0x6;
  delay(1);
  }


Hab ich hier irgendwo bereits einen Fehler? Ich habe versucht anhand des 
Datenblatts zu arbeiten.

Das alles steht auf Seite 41 des Datasheets. Hab das 3mal gegengecheckt. 
Ich weiss nicht weiter. Auch die Suche im Forum und die gefundenden 
Beispiele helfen mir nicht weiter.
Wäre für Hilfe dankbar

von Matthias K. (matthiask)


Lesenswert?


von Peter K. (Gast)


Lesenswert?

Ja DOG-M
Der Link scheint defekt zu sein. Aber da wird seriell wohl beschrieben. 
Ich benutze aber den 4Bit Modus mit nicht nur 3 Pins.

Geht speziell um die Initialisierung, den Rest möchte ich lieber selber 
erarbeiten. Aber ich weiss momentan nicht wo der Fehler ist. Deswegen 
wollte ich die Initialisierung gegen checken...

von Peter D. (peda)


Lesenswert?

Dein Spaghettiprogramm ist erstklassig, besonders die ausführlichen 
Kommentare.
Das guckt sich garantiert keiner an.

LCD ansteuern (4-Bit) geht so:
1. Nibble-Funktion schreiben
2. Byte-Funktion schreiben, die 1. benutzt
3. Daten-Funktion schreiben, die 2. benutzt
4. Kommando-Funktion schreiben, die 2. benutzt
5. Init-Funktion schreiben, die 1. und 4. benutzt

Es gibt also nur eine einzige Funktion, die die Daten-Pins und den E-Pin 
anfassen darf. Und das ist nicht 5. !!!


Peter

von Peter K. (Gast)


Lesenswert?

Sorry. Ich habe noch nicht soviel Erfahrung in Programmierung mit 
Mikrocontroller. Wie das alles grundsätzlich funktioniert ist mir klar. 
Wann welche Bits gesetzt/nicht gesetzt werden müssen.

Ich möchte nur wissen, ob die Initialiserung generell richtig ist!

Die Codes zur Ansteuerung habe ich die Hex-Codes aus dem Datenblatt 
genommen...

von Pieter (Gast)


Lesenswert?

>>delay(1);

soll das ein Delay von 1ms sein?
Dann sieh ins Datenblatt, da sind unterschiedliche und längere Zeiten 
angegeben.

Wie ist den der Port2 mit der LCD verschaltet?

Pieter

von Peter K. (Gast)


Lesenswert?

delay(1) dauert länger als 1ms....

Im Datenblatt steht ja größer als 50 ms... Kann es dann zu lange sein? 
so dass ich das alles verkürzen muss?

PORT   LCD
P2.0    D4 (31)
P2.1    D5 (30)
P2.2    D6 (29)
P2.3    D7 (28)
P2.4    RS (39)
P2.5    R/W (37)
P2.6    E (36)


Hier ist die Verögerung:
// TIMER FÜR VERZÖGERUNG:
  OSCXCN = 0x77;             // ext. clock oscillator: 22.1184 MHz, 
divided by 2
  while(NOT(OSCXCN&0x80));     // >system clock: 11.0592 MHz
  OSCICN = 0x88;             // use missing clock detector
  CKCON = 0x00;             // Timer2, SystemTakt/12 
(11.0592MHz/12=921.6 kHz
  RCAP2 = 921;            // Reload: 1 ms/12/(11.0592 MHz)^1 =46080 
counts
  T2 = RCAP4;             // Timer2 mit ReloadWert initialisieren
  T2CON = 0x04;             // Timer2 in Mode 1 starten
// initialize


Und der Timer Aufruf:

void delay(double ms){
  int tick= 0;
  while (tick<=ms){

               if (TF2) {        // 1 ms Timer2Ueberlauf?
                 TF2 = 0;             // Ja, dann Timer2Flag sofort 
loeschen
          tick++;

             }
    }
}

Es handelt sich um einen 8051 der Firma Silicon Labs!

Hab ich in der Rechnung einen Fehler?

von Peter K. (Gast)


Lesenswert?

Kann mir keiner helfen?

Ich verzweifel hier... Das will einfach nicht funktionieren.... :(

von Peter D. (peda)


Lesenswert?

Peter K. schrieb:
> Ich möchte nur wissen, ob die Initialiserung generell richtig ist!

Das weiß ich nicht, solange Du Deinen Code nicht modular schreibst.

Der Grund, modular zu schreiben ist, daß man Fehler besser erkennen 
kann.

Du schreibst eine Funktion lcd_nibble, dann muß man nur prüfen, ob diese 
eine Funktion richtig ist.

Dann rufst Du sie auf mit verschiedenen Hex-Werten.
Dann muß man nur prüfen, ob diese Hex-Werte richtig sind. Daß sie 
richtig an das LCD gesendet werden, muß man nun nicht mehr überprüfen.



Natürlich mußt Du zuerst eine Delayfunktion basteln und überprüfen.
Du rufst sie auf mit einem Delays von 1s und schaltest jedesmal ne LED 
um.
Und mit ner Stoppuhr prüfst Du, ob das auch wirklich 1s dauert.


Peter

von Pieter (Gast)


Lesenswert?

bei den SilabsTypen,  wie ist P2 konfiguriert?

Hast Du den ConfigWisard von Silabs?

MfG
Pieter

von Mattias (Gast)


Lesenswert?

Hast du schon eine Lösung gefunden? Sitze an dem selben Problem und bin 
am verzweifeln. Ich habe schon die Pin´s des Displays mit einem 
Logikanalyser gemessen aber bisher ohne Erfolg.

Gruß Mattias

von Ralf (Gast)


Lesenswert?

> Ich habe schon die Pin´s des Displays mit einem Logikanalyser gemessen
> aber bisher ohne Erfolg.
Was war ohne Erfolg? Das Messen oder sind die gemessen theoretisch in 
Ordnung?

Ralf

von Thomas (Gast)


Lesenswert?

Was soll denn das sein:

P2 &= 0x00;
P2 |= 0x0;

das kommt oefters vor und ist eher sinnfrei.

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.