www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kontrast EA DOG 162


Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Habe vor Kurzem ein Display von Electronic Assembly in die Hände 
bekommen.
Bisher läuft es recht gut, nur bin ich mit dem Kontrast überhaupt nicht 
zufrieden!

Den kann man ja bereits bei der init festlegen. ich habe alle C-Bits 
laut DB gesetzt, nur sehe ich immer noch gleich viel. Einen Text zu 
schreiben geht, nur lesen wird verdammt schwer.


Gibt es da irgendeine Lösung, oder habden diese Displays generell einen 
schlechten Kontrast? Ansocnsten sehen die wirklich top aus...

Oder mache ich nur etwas grundsätzlich verdreht?

Freue mich auf jede Hilfe!!

Vielen Dank und freundliche winterliche Grüße

philipp

Autor: Erwin Reuss (er-tronik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dabe das Teil in einem Projekt im Einsatz.
Zur Kontraständerung muß zunächst die Instruction-Tabelle umgeschaltet 
werden.

Hier ist meine Init-Sequenz:

void Lcd_Init(void)
{
  Lcd_Ctrl(0b00111001);    // 8-Bit, 2 Zeilen, Instr. Table 1
  Lcd_Ctrl(0b00011101);    // BS:1/4, 3-Zeiliges LCD
  Lcd_Ctrl(0b01010000);    // Booster aus Kontrast C5, C4 setzen
  Lcd_Ctrl(0b01101100);    // Spannungsfolger und Verstärkung setzen
  Lcd_Ctrl(0b00001100);    // Display ein, Cursor aus
  Lcd_Ctrl(0b00000110);    // Cursor Auto-Increment
  Lcd_Ctrl(0b00111000);    // 8-Bit, 2 Zeilen, Instr. Table 0
}

Und hier die Routine zur Kontrasteinstellung:

void Lcd_SetContrast(U8 b)
{
  Lcd_Ctrl(0b00111001);    // 8-Bit, 2 Zeilen, Instr. Table 1
  Lcd_Ctrl(b | 0b01110000); // Kontrast C3,C2,C1,C0 setzen
  Lcd_Ctrl(0b00111000);    // 8-Bit, 2 Zeilen, Instr. Table 0
}

Ich hoffe, ich konnte Dir damit helfen.

mfG. Erwin Reuss

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

Bewertung
0 lesenswert
nicht lesenswert
Was denn für ein Display genau? Die Dinger mit Hintergrundbeleuchtung 
sind natürlich nicht so toll was den Kontrast an geht. Das normale 
EA-Dog ohne Hintergrundbeleuchtung ist aber sehr gut lesbar.

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Erwin

Super, jetzt habe ich erst überrissen was es mit den verschiedenen 
Instruction tables auf sich hat. Nun funkt es auch tadellos mit dem 
Contrast. (Das Display ist ein 16x2 EA DOG-M mit blauer 
Hintergrundbeleuchtung)

Achja noch etwas. Ich versuchte das Display so zu initialisieren, dass 
es die Zeichen doppelt so groß darstellt. Nun sehe ich die zeichen zwar 
doppelt so groß, nur leider fehlen zwischen den zeilen pixel. Ist es bei 
der Initialisierung ausreichend in Fubction Set DH="1" und N="0" zu 
setzen? oder muss ich sonst noch was einstellen?


vielen dank nochmals!!!

schöne grüße

philipp

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

Bewertung
0 lesenswert
nicht lesenswert
> nur leider fehlen zwischen den zeilen pixel.
Was vollkommen normal ist, da du ja ein 2-Zeilen Display hast.

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, eigentlich logisch. Da hab ich mich wohl zu früh gefreut. Wäre doch 
ein super Feature gewesen, naja egal.

Das Teil läuft jetzt ziemlich gut, sieht auch super aus!!


Hat jemand schon mal etwas mit customchars mit so einem DOG-Display 
ausprobiert? Das wäre so das nächste was in in Angriff nehmen würde



grüße
philipp

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

Bewertung
0 lesenswert
nicht lesenswert
> Hat jemand schon mal etwas mit customchars mit so einem DOG-Display
> ausprobiert?
Ja :)
////////////////////////////////////////////////////////////////////////
/*!
 * \brief LCD Zeichen Generieren
 * \param new_char Datenstring mit Hex Werten für 8 Zeilen und 5 Spalten
 * \param addr CGRAM Adresse 0x00 oder 0x08
 */
void LCD_generate_icon (unsigned char *new_char, unsigned char addr)
{
  unsigned char i;

  i = 0;

  LCD_SET_INSTRUCTION;                  // RS auf low (Instruction)

  put_LCD_Data_out(FUNCTION_NORM_MODE); // 8/4 Bit operation, 1/2 Zeilen
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(addr);               // Set CGRAM Adress
  LCD_clock();                          // Befehl ausfuehren


  LCD_SET_DATA;                         // RS auf high (Daten)

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren

  put_LCD_Data_out(new_char[i++]);      // Char Zeile einfach auf Port 
  LCD_clock();                          // Befehl ausfuehren
}
////////////////////////////////////////////////////////////////////////

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

Bewertung
0 lesenswert
nicht lesenswert
Wobei mir auffällt das man das auch schön in ner Schleife hätte 
programmieren können... Na ja, egal, es funktioniert ;)

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!

Eine Frage gleich dazu:
Ein Zeichen besteht ja bekanntemaßen aus pixeln, welche ich 
setzten(einschalten) und löschen(ausschalten kann. Ist es dann auch 
richtig, dass ich zb. wenn ich ein "T" darstellen will 8mal 8bit (da 8 
Spalten) mit richtig gesetzten Bits? verdammt, das kling 
unverständlich...

also so:

1.)  000111111
2.)  000001000
3.)  000001000
4.)  000001000
5.)  000001000
6.)  000001000
7.)  000001000
8.)  000000000

Da Du in deinem Code nur 7 mal etwas schreibst, gehe ich davon aus, dass 
man eine Nullzeile gar nicht schreiben bräuchte. Könnte ich diese denn 
überhaupt verweden? Wäre ja eigenlich für den Cursor gedacht?

Benutzt du bei deinem Code den internen Icon-Speicher? oder geht es auch 
ohne?


Vielen vielen Dank für deine Hilfe

grüße
philipp

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, noch eine Sache die ich nicht ganz verstehe: Mit der Instruction 
Table 0 kann ich ja bereits bei der Initialisierung die CGRAM-Adresse 
setzen. Muss ich das machen? Oder mache ich das z.b auch nach der init, 
indem ich mit dem FunctionSet in die IT0 gehe und dort meine Adresse 
setzte?


Achja, der CGRAM hat 6bits platz, also 63 Mögliche Speicherstellen, 
nicht?

Im DB des ST7036 steht:
"In the character generator RAM, the user can rewrite character patterns 
by program. For 5 x 8 dots, eight character patterns can be written."

Heißt das, ich kann nur 8 Zeichen speichern, oder sind da die Zeilen 
gemeint?


so, morgen werde ich mich mal dran wagen!!

grüße

philipp

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt verzfeifle ich!

Wie ich meine Zeichen ins CGRAM bekomme, ist mittlerweile ziemlich klar; 
Nur eine Frage bleibt noch:
Die Adressen des CGRAM wie verwende ich die? Es sind ja 6bits da, kann 
ich die adressen so vergeben: zb adr 15 = 0b01001111 (die letzten 1er 
für 15 dez, der erste für den Befehl laut DB)
Oder kann ich nur jedes Bit für ein Zeichen nutzten? zb. 0b01000001 für 
das erste zeichen; 0b01000010 fürs zweite?


Wenn ich nun die Zeichen im Display habe, wie sag ich dem Ding, dass er 
mir das Zeichen anzeichen soll?


Hier mein Code; vielleicht hilfts:


void lcd_generate_icon(unsigned char *zeichen, unsigned char adr)
{ unsigned char i=0, a;
  a=(adr<<3) | 0x40;
  lcd_write(0b00101000, 0);  //Function Set mit IT0  - Instruction
  lcd_write(0b01000000, 0);  //CGRAM adresse setzten - Instruction
  for(i=0; i<8; i++)
  {  lcd_write(0b01000000, 0);
     lcd_write(*zeichen, 1);  /Daten ins RAM schreiben - Data
     zeichen++;
  }
}


Meine Idee zum Anzeigen war:

void lcd_show_icon(unsigned char adr)
{  unsigned char a;
   a=(adr<<3) | 0x40;
   lcd_write(0b00101000, 0);  //Function Set mit IT0  - Instruction
   lcd_write(a, 0);
}

Das funktioniert allerdings NICHT!!! Verdammt!

Kann mir jemand einen guten Tip geben? Wäre demjenigen sehr dankbar!

freundliche Grüße
philipp

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Nun läufts! Jawohl!

War ein Denkfehler drin, aber nun gehts prima

Autor: Ivo Burkart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Philipp Putzer: Wäre es möglich dass Du Deinen LCD-Code mal komplett 
postest? Ich will das Ding auch mit 8 Bit betreiben und bekomme es nicht 
zum laufen.

Danke schonmal :-)
Ivo

Autor: Philipp Putzer (putzer_philipp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja, kann ich machen. Ist aber nicht alles von mir, nur der Teil fürs 
DOG-LCD.

Hier erst mal die C-Datei

Grüße

Autor: Philipp Putzer (putzer_philipp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und die Header

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.