mikrocontroller.net

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


Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir keiner helfen?

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei den SilabsTypen,  wie ist P2 konfiguriert?

Hast Du den ConfigWisard von Silabs?

MfG
Pieter

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn das sein:

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

das kommt oefters vor und ist eher sinnfrei.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.