Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht, komischerweise...
das ist ohne die zweite Routine definitiv nicht so.
Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit Bus
an meinem Controller angeschlossen.
Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display
eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht,
komischerweise...
das ist ohne die zweite Routine definitiv nicht so.
Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit
Bus
an meinem Controller angeschlossen.
ich versteh deinen Code schon, keine Angst.
Aber warum setzt du denn, bevor du die CGRAM Adresse und die Bytes mit
der Funktion define_char schickst, das Display auf die Table 0:1 ?
in Table 0:1 ist der eigentliche 'Set CGRAM Adress' Befehl der
'Contrast Set' Befehl... kratz..
Hallo,
ich habe die Lib vom Codevision etwas geändert, um das DOGM damit
nutzen zu können.
Der Contrast Befefl ist von mir.
Bei der Inti lade ich einen bestimmten Contrastwert, den ich dann,
falls nötig, ändern kann.
War nur so ein Test.
Den CGRAM beschreibe ich nach der Init.
Dabei muß das Display auf Tabelle 0:1 stehen.
Anliegend ist mal meine LIB, die H und ein kleines Prog.
Gruß Toby
Ich benutze kein Codevision AVR..
Wieso schreibst du denn ins CGRAM, bloß wenn du die Tabelle auf 0,1
stellst? Also wenn ich da was schreibe, schreibe ich ins DDRAM und das
wird auf dem Display angezeigt.
Normalerweise muss man ja, bevor man ins CGRAM schreibt, erst die CGRAM
Adresse setzen. Dann weiß der Controller bescheid. Und wenn man wieder
aufs Display schreiben möchte, muss man die DDRAM Adresse setzen. Aber
das machst du ja garnicht.
Diese Doku von dem DOG-M ist so unverständlich... hmpf!
Mit der Unverständlichkeit habe ich auch gekämpft.
Großes Prob war alleine schon die Init.
Ich habe erst die vom Datenblatt versucht.
Später die vom Controller.
Damit ging es dann auch.
Wegen der Tabellen schaue ich eben noch mal nach.
Aufjeden Fall geht es so, wie ich es habe.
Gruß Toby
Ich blick danicht durch. Wo sieht man denn die lcd_init() deklariert?
Wo schaltest du denn zwischen den Instruction Tabellen um? Kann mir
irgndwie nicht vorstellen dass das so funktioniert...
Hallo,
hier das Init :
// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
cbi __lcd_port,__lcd_enable ;EN=0
cbi __lcd_port,__lcd_rs ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x90;
_base_y[3]=lcd_columns+0xA0;
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x20);
_long_delay();
_lcd_ready(); // RS=0
_lcd_write_data(0x29);
_lcd_ready(); // RS=0
_lcd_write_data(0x14);
_lcd_ready(); // RS=0
_lcd_write_data(0x7A);
_lcd_ready(); // RS=0
_lcd_write_data(0x51);
_lcd_ready(); // RS=0
_lcd_write_data(0x6A);
_lcd_ready(); // RS=0
_lcd_write_data(0x0C);
_lcd_ready(); // RS=0
_lcd_write_data(0x01);
_lcd_ready(); // RS=0
_lcd_write_data(0x06);
Es steht in der Dog_LCD.lib
Zurück in die Tabelle 0:1 geht man durch clear_lcd.
Setze ich einen anderen Contrast oder eine Doppelte Zeilenhöhe,
gehe ich vorher in eine andere Tabelle:
void lcd_high (char high)
{
switch (high) {
case 1:
//3 Zeienbetrieb
_lcd_ready(); // RS=0
_lcd_write_data(0X28);
break;
case 2:
//unteren beiden Zeilen Zusammen
_lcd_ready(); // RS=0
_lcd_write_data(0x2E); //Table2
_lcd_ready(); // RS=0
_lcd_write_data(0x10); //UD auf 1
_lcd_ready(); // RS=0
_lcd_write_data(0x2C); //DH auf 1
break;
case 3:
//oberen beiden Zeilen Zusammen
_lcd_ready(); // RS=0
_lcd_write_data(0x2E); //Table2
_lcd_ready(); // RS=0
_lcd_write_data(0x18); //UD auf 0
_lcd_ready(); // RS=0
_lcd_write_data(0x2C); //DH auf 1
break;
};
}
Das ist genau die Init und Beschreibung, die im Datenblatt des
Controllers steht, und sie funktioniert.
Bitte hänge doch mal dein Programm incl. der Init des LCD an,
ich seh es mir mal an.
Gruß Toby
Gruß Toby
Und was ist daran jetzt anders als bei dir? Ich schalte auf die Table 0
um an die CGRAM Adressbefehle zu kommen und schreibe eine CGRAM
Adresse.. Danach 8x Daten und anschließend wieder die DDRAM Adresse 0
um wieder ASCII Daten übertragen zu können.
Verdammt, ich raffe es nicht. Dieses Display ist so schlecht
dokumentiert, oder ich habe wirklich einen Fehler in meinem Code.
ich hab mal die gesamte lcd.c angehangen. Überhalb von der Funktion
lcd_init sind die nicht-gepufferten Befehle und unterhalb sind die
gepufferten. lcd_init steht irgndwo in der mitte.
da siehst du, wie ich kläglich versuche den CustomChar 0 zu
beschreiben.
Es klappt aber nicht. Das Display verhält sich total komisch und tut
so, als würde es die 8 Zeichen auf mein Display ausgeben. Aber da sind
nur leere Felder.
Das CustomChar gebe ich mit lcd_putc(0); aus.
Hallo,
immer noch dabei?
Nun ja, mit welchem Compiler machst Du das ganze?
Ich würde gerne mal dein Prog bei mir ausprobieren.
Kannst es mir ja mal per Mail schicken.
Aber bitte hab Verständniss dafür, das ich nicht alles schreiben will,
damit es bei mir läuft.
Außerdem könnte es etwas dauern, da ich von einem Jahr mein DOGM zum
laufen gebracht hab, und hatte es bis heute so gelassen.
Gruß Toby
Hallo nochmal,
ich habe auch mal die Peter Flurry Lib fürs DOGM umgeschrieben.
Anliegend zeigt mein DOGM 163 ein Copyright Zeichen an.
Vielleicht hilft dir das???
Bei mir läuft es auf jeden Fall!
Gruß Toby
Hey Simon,
ich habe nun was rausgefunden!
Schau Dir nochmal angehängten Code an.
Die Lib ist in dem Zipfile von voher.
Setzt man die Double High auf 1 also 3 Zeilen Betrieb,
wird kein (c) Zeichen angezeigt.
Auf lcd_lines(2) oder (3) gehts.
Da ich immer mein Display beim Startup Bildschirm auf (3) oberen zeilen
zusammen gesetzt habe, ist mir das Problem nie aufgefallen.
Danach habe ich es wieder auf (1) gesetzt, und dann irgendwann mal den
GCRAM beschrieben.
Also, was macht die Funktion lcd_lines(3) anderes, als die
lcd_lines(1)???
Gruß Toby
Hi nochmal, es lässt mir keine Ruhe!
Also, erst auf Tabelle 0:0 (0x28) stellen, stimmt so.
geht jetzt bei mir auch.
Dann kommts :
Der RS Pin steht zum Init auf 0, richtig.
void lcd_cmd8(unsigned char cmd)
{
LCD_PORT = (cmd & 0xF0) >> 4;
LCD_PORT &= ~(1<<LCD_RS);
...
...
Aber beim CGRAM Beschreiben muß er auf 1 stehen.
So stehts in meiner Lib.
/* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */
Steht auch so im Datenblatt auf Seite 26.
Wenns klappt, sag kurz bescheid.
Gruß Toby
Ja, das war der Fehler im ersten Code den ich angehangen habe. Guck mal
in den zweiten (Datum: 06.06.2006 19:51).
Da habe ich das verbessert. Klappt trotzdem noch nicht.
Nett dass du dir meinen Code ansiehst, aber ich glaube ehrlichgesagt,
dass das keinen Sinn mehr hat.. Irgndwo wird da der Wurm sein, aber
mein Programm läuft ohne die Funktion ja einwandfrei.. Gibts halt
keinen Bargraphen auf dem Display ;)
Hi nochmal. Ich habe da noch eine Differenz zwischen unserern Codes
sehen können.
Vielleicht ist das die Lösung:
Du schreibst vor jedem Byte, dass in den CGRAM geladen wird die CGRAM
Adresse neu. Vielleicht sollte ich das auch mal versuchen, wobei das
Datenblatt das ja eigentlich nicht explizit vorschreibt.
(Da stand doch irgndwas davon, dass der Ram Counter inkrementiert wird,
wenn ein Byte geschrieben wird. Und das Ziel des Schreibens wird durch
ein vorhergehendes Adresssetzen gesetzt..)
Naja ein Versuch ist es allemal wert.
Hallo,
ich habe festgestellt, dass die Mitarbeiter bei
http://www.lcd-module.de recht zügig und kompetent auf technische
Anfragen reagieren. Schon mal probiert?
Gruß,
Dennis
I am new to this forum. Please excuse me I do not understand german.
I am trying create a character with the ST7036 lcd driver. I am looking
at the aboce example, but I do not know Atmel assembly. I do know ATmel
C.
Are there any more examples out there on how to create speacial
characters in C?
Thank you!
ich habe auch ewig mit der doku des display gehadert und schließlich
eine umfassende lib für den spi mode geschrieben. da klappt alles. für
den 4/8bit mode muss halt nur die Funktion dazugeschrieben werden.
vielleicht werdet ihr daraus ja schlau. ist im anhang. würde mich über
feedback freuen.
tino