www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lib für DOG-Mxxx LCD (4bit oder i2c)


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir folgende Schaltung zusammengebaut.
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCD...

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?...
-> 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ß

Autor: Visitor (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt ist die Initialisierung relativ gut verständlich erklärt.

Autor: Marco (Gast)
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang mal mein Code für 4Bit Modus. Geschrieben für MSP430 @ 4MHz.

Autor: Jörg S. (joerg-s)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und die h-Datei...

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.
// ***********************************************************************
// Grundinitialisierung des LCD DOG-M 162 4-Bit
// ***********************************************************************
void init_lcd(void) {
unsigned char i_n;
  delay(5); // ca. 50ms Wartezeit nach dem Einschalten 
  // Grundinitialisierung ohne Busy-Flag Auswertung
  LCD_DATA7 = 0;     // Initialisierung 3x 0011 xxxx 
  LCD_DATA6 = 0;
  LCD_DATA5 = 1;
  LCD_DATA4 = 1;
  LCD_RW = 0;
  LCD_RS = 0;
  for( i_n = 3; i_n; i_n--){      
    delay(5);
    LCD_E1 = 1;
    LCD_E1 = 0;
  }
  delay(5);
  LCD_DATA7 = 0;     // Initialisierung 0010 xxxx (4-Bit Mode) 
  LCD_DATA6 = 0;
  LCD_DATA5 = 1;
  LCD_DATA4 = 0;
  LCD_E1 = 1;
  LCD_E1 = 0;
  delay(5);

  // ab hier darf das Busy-Flag ausgewertet werden
  write_lcd(0x29,1);               // 4-Bit IS 0,1
  write_lcd(0x53,1);               // 52 Boster aus, Kontrast C5,C4
  write_lcd(0x69,1);               // 69 Spannungsfolger und Verstärkung
  write_lcd(0x74,1);               // Kontrast C3,C2,C1
  write_lcd(0x0F,1);               // Display ein, Cursor ein, Cursor blinken
  write_lcd(0x06,1);               // Autoincrement
  clear_lcd();
}

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ß

Autor: Marco (Gast)
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:

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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:

was ist in deinem Code der Datentypen "bit"?

Autor: Matthias (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@matthias:

so jetzt bin ich fast durch aber was machst du bei:

byte idata zaehler;

Autor: Marco (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> byte idata zaehler;
mach "unsigned char zaehler;" draus. (idata sorgt beim 8051 dafür, dass 
die Variable zaehler im erweiterten, internen RAM angelegt wird)

Autor: Jörg S. (Gast)
Datum:

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

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.