Hallo, ich habe mir folgende Schaltung zusammengebaut. http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCDErweiterung Hierbei verwende ich ein DOG-M162 und möchte dies wahlweise im 4bit Modus oder über i2c ansteuern. Leider habe ich es bisher nicht geschaft dieses zum laufen zu bringen. getestet habe ich - LCDlib von Peter Fleury http://homepage.hispeed.ch/peterfleury/lcdlibrary.zip - AsuroLCD lib http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27717&highlight= -> hierbei fehlt mir irgendwie die essential.c - i2clcd http://computerheld.de/i2clcd/ ->nicht für den ST7036 geignet primär würde es mir erst mal reichen wenn ich das LCD im 4bit Modus, also D4 - D7 RS RW E betreiben könnte. Danach würde ich es dann mit i2C probieren. Würde mich freuen wenn ihr mich dabei unterstützen könntet. Vielleicht bin ich beim testen auch einfach zu schnell gewesen und habe wichtige Zwischenschritte beim testen vergessen. Aktuell macht das LCD einfach garnix :) Achso: mein Controller ist ein Mega32 mit 16 MHz Wenn ich jetzt noch was wichtiges vergessen habe einfach melden. Gruß
Im Datenblatt ist die Initialisierung relativ gut verständlich erklärt.
Nun die habe ich auch gelesen. Jedoch ist diese lediglich für den 8bit modus beschrieben. Ich will ja den 4bit modus nutzen. Mich würde dann interessieren ob ich für erste test die lcd lib von peter fleury hernehmen kann und dann versuche des timinig und initialisierung hinzubekommen oder ob sich diese arbeit bereits jemand gemacht hat. Dann könnte ich darauf aufsetzen.
Vielleicht hilft Dir mein Programm für DOG-M 162 (Anlage) etwas weiter. Ist zwar für 8051, aber das Prinzip ist entscheidend. Die Init gilt für 5V-Betrieb im 4-Bit Mode. ST7036 hat paar Eigenheiten gegenüber den Standard LCD-Controller HD44780. Nach dem Einschalten ist das Teil grundsätzlich im 8-Bit Modus. Das Busy-Flag darf am Beginn der Initialisierung noch nicht abfgefragt werden, genaueres steht im Datenblatt. Weiterhin gibt es Unterschiede in der Zeilenaddressierung. Wenn man was vom Display einlesen will (z.B. das Busy-Flag), gibt es manchmal Probleme, weil die Display-Ausgänge extrem schwach sind, sie können nur sehr geringe Ströme liefern (bedingt durch COG-technik). Man braucht auf der µC-Seite also einen sehr hochohmigen Port, oder man verzichtet ganz auf die Einles-Geschichte.
1 | // ***********************************************************************
|
2 | // Grundinitialisierung des LCD DOG-M 162 4-Bit
|
3 | // ***********************************************************************
|
4 | void init_lcd(void) { |
5 | unsigned char i_n; |
6 | delay(5); // ca. 50ms Wartezeit nach dem Einschalten |
7 | // Grundinitialisierung ohne Busy-Flag Auswertung
|
8 | LCD_DATA7 = 0; // Initialisierung 3x 0011 xxxx |
9 | LCD_DATA6 = 0; |
10 | LCD_DATA5 = 1; |
11 | LCD_DATA4 = 1; |
12 | LCD_RW = 0; |
13 | LCD_RS = 0; |
14 | for( i_n = 3; i_n; i_n--){ |
15 | delay(5); |
16 | LCD_E1 = 1; |
17 | LCD_E1 = 0; |
18 | }
|
19 | delay(5); |
20 | LCD_DATA7 = 0; // Initialisierung 0010 xxxx (4-Bit Mode) |
21 | LCD_DATA6 = 0; |
22 | LCD_DATA5 = 1; |
23 | LCD_DATA4 = 0; |
24 | LCD_E1 = 1; |
25 | LCD_E1 = 0; |
26 | delay(5); |
27 | |
28 | // ab hier darf das Busy-Flag ausgewertet werden
|
29 | write_lcd(0x29,1); // 4-Bit IS 0,1 |
30 | write_lcd(0x53,1); // 52 Boster aus, Kontrast C5,C4 |
31 | write_lcd(0x69,1); // 69 Spannungsfolger und Verstärkung |
32 | write_lcd(0x74,1); // Kontrast C3,C2,C1 |
33 | write_lcd(0x0F,1); // Display ein, Cursor ein, Cursor blinken |
34 | write_lcd(0x06,1); // Autoincrement |
35 | clear_lcd(); |
36 | }
|
Nach der Initialisierung können dann die Standardfunktionen, wie bei HD44780 Controllern verwendet werden. I2C hat DOG-M 162 nicht, seriell geht nur per SPI-Interface. Gruß
@Jörg: Danke ich werde es mal testen. Aber mich würde noch interessieren wo du die Port-Pins definierst und was in der treiber_import.h steht, die ist nicht dabei. da ich jetzt mit 16MHz arbeite, wo legst du das timing fest?
> Aber mich würde noch interessieren wo du die Port-Pins definierst In einer Datei die über "treiber_import.h" integriert wird :) > wo legst du das timing fest? Im Code stehen enstprechende delay Aufrufe mit festen Werten.
> "bit" Bitadressierbarkeit, eine 8051 Besonderheit, Variable belegt wirklich nur 1 Bit im internen Speicher. Kannst es durch "char" oder ähnliches ersetzen, Wert ist nur 0 oder 1 Gruß
@Matthias: OK ich teste es übrigens werde ich die delay funktionen durch die in der AVRLIB ersetzen. Aber mal was anderes: Gibt es wirklich noch keinen der die LCDLib von Peter Fleury auf ein DOGM LCD angepasst hat? denke man müsste nur an der Initialisierung was ändern. Aber wie gesagt, da ich mich nicht so auskenne bin ich da mal vorsichtig. Schreibt Ihr euch beim einsatz des DOGM immer eigene Lib's ?
@matthias: vielleicht steh ich gerade auf dem schlauch aber folgendes ist mir nicht ganz klar: LCD_DATA7 = lcd_byte & 0x80; LCD_DATA6 = lcd_byte & 0x40; LCD_DATA5 = lcd_byte & 0x20; LCD_DATA4 = lcd_byte & 0x10; LCD_E1 = 1; Hier wird doch jeweils ein Pin des Ports gesetzt bzw. gelöscht oder interpretier ich das falsch? Wenn es doch so ist wie kannst du einem Bit einen Byte wert zuweisen? Danke schon mal :)
>Hier wird doch jeweils ein Pin des Ports gesetzt bzw. gelöscht oder >interpretier ich das falsch? richtig >Wenn es doch so ist wie kannst du einem Bit einen Byte wert zuweisen? Bit: alles größer 0 wird automatisch zu 1 (Bitkonvertierung) Byte --> Bit Typen 0x00 --> 0 0x01 --> 1 0x02 --> 1 0x03 --> 1 ... 0xFF --> 1
@matthias: so jetzt bin ich fast durch aber was machst du bei: byte idata zaehler;
@Jörg: irgendwie fehlen mir noch manche Passagen um deinen Code zu verstehen. Was verbirgt sich hinter der funktion put_Data_to_Port weiterhin würde mich interessieren was sich hinter LCD_SET_WRITE; // RW auf low LCD_E_LOW; // E auf low LCD_SET_INSTRUCTION; // RS auf low verbirgt. Kannst du mir sagen welchen Hex-Wert die Übergabeparameter in den Funktionen LCD_put_Data_out(FUNCTION_EXT_MODE); // 8/4 Bit operation, 1/2 Zeilen LCD_put_Data_out(BIAS_SET); // Bias LCD_put_Data_out(POWER_ICON); // Booster Einstellung LCD_put_Data_out(FOLLOWER_CTRL); // Follower Einstellung LCD_put_Data_out(CONTRAST_SET); // Kontrast Einstellung LCD_put_Data_out(ENTRY_MODE_SET); // Cursor inc. dec. LCD_put_Data_out(DISPLAY_ON); // Display ein und Cursor ein/aus, Cursor blinken ein/aus haben? denke du hast das alles in der treiber.h definiert kannst die nicht auch zur verfügung stellen? gruß
> byte idata zaehler; mach "unsigned char zaehler;" draus. (idata sorgt beim 8051 dafür, dass die Variable zaehler im erweiterten, internen RAM angelegt wird)
> Was verbirgt sich hinter der funktion put_Data_to_Port Sowas in der Art: #define put_Data_to_Port(x) P5OUT &=~0x0F; P5OUT |= x & 0x0F; Also das Stück Software was die Bits auf die Port Ausgänge legt. > weiterhin würde mich interessieren was sich hinter > LCD_SET_WRITE; // RW auf low > LCD_E_LOW; // E auf low >LCD_SET_INSTRUCTION; // RS auf low > verbirgt. Sowas in der Art: #define LCD_SET_WRITE P3OUT &=~ 0x40; Also einfach nur Port-Pins high oder low schalten. > Kannst du mir sagen welchen Hex-Wert die Übergabeparameter in den > Funktionen haben? Steht in der h-Datei die oben schon verlinkt ist. http://www.mikrocontroller.net/attachment/27639/lcd_dogm.h > denke du hast das alles in der treiber.h definiert Nein hab ich nicht :)
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.