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
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...
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
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...
>>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
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?
Kann mir keiner helfen? Ich verzweifel hier... Das will einfach nicht funktionieren.... :(
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
bei den SilabsTypen, wie ist P2 konfiguriert? Hast Du den ConfigWisard von Silabs? MfG Pieter
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.