PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein Problem mit LCD 1x16 Zeichen



izaseba
26.01.2008, 21:19
Hallo,
zur Zeit versuche ich dieses LCD (http://www.csd-electronics.de/data/pdf/DEM16101H.pdf) am laufen zu bekommen.

Ein Problem gibt es mit DDRAM Adressierung und zwar ist es eigentlich ein 2x8 Zeichen Display wo Zeichen 0-7 An der DDRAM Adresse 0-7 liegen und Zeichen 8-15 an 40-47

Soweit so gut,
ich sende Zeichen über UART, und die werden schön an der aktuellen Cursorposition dargestellt und der DDRAM wird schön inkrementiert.
Jetzt habe ich natürlich den Wunsch den Cursor an einer beliebigen Stelle im LCD zu setzen.
Dafür wird ein Befehl per UART gesendet und hinterher die neue Position zwischen 0-15.

Um den Cursor an eine Stelle im DDRAM zu positionieren sendet man halt ein Command(RS Low) mit gesetztem Bit 7 + die gewollte Adresse.

So, soviel zur Vorgeschichte 8-[ mein Problem jetzt, es klappt nicht ganz
und zwar werden die Adressen 0-7 sauber angefahren, die 40 auch noch, nur alles was über 40 ist nicht, der Cursor bleibt stur an der Adresse 40 stehen :-(

Angesteuert wird das ganze mit diesem Code


loop_1_2:
cpi tmp1,SET_CURSOR
brne loop_1_3
lds tmp1,Befehl_Puffer;Nur Spalten auslesen, der Rest ist erstmal uninteressant
ldi param1,0x80 ;Adresse 0
cpi tmp1,8 ;testen ob wir unter 8 sind
brlo loop_1_2_1 ;wenn ja springen
ori param1,0x28 ;wir sind ueber 7 die DDRAM liegt ueber 0x28
subi tmp1,8 ;dann noch 8 abziehen
loop_1_2_1:
add param1,tmp1;Jetzt steht die Adresse
mov Zeichenzaehler,param1 ;sichern
rcall LCD_command ;und ab aufs Display
rjmp loop


Mein Logik sagt, es ist richtig, AVR-Studio Simulator schickt mir auch immer die gewollte Adresse an LCD_command nur das Display tut es nicht.

Dann hab ich noch eine Zweite Funktion geschrieben wo ich per UART direkt ein Komando an das Display schicken kann, mit dem gleichem Ergebnis, 0-7 und 40 funktioniert der Rest nicht.

So jetzt meine Frage, kennt jemand so ein Verhalten und kann mir weiterhelfen, das ist echt doof, sonst klappt alles, auch die Adressierung von CGRAM, ich weiß wirklich nicht mehr weiter :cry:

Gruß Sebastian

P.S.
Ich glaub es ist nicht unbedingt wichtig, aber Das Display wird von einem Tiny 24 in 4 Bit Modus angesteuert

robocat
26.01.2008, 21:48
weiss nicht, ob das weiterhilft, aber ich habe ein ähnliches display mit den 2ten 8 zeichen ab addresse 40.. allerdings 0x40 = 64.
der set_cursor befehl ist das "linkeste" bit, eine position berechnet sich damit zu 0b10000000 (128) + (y<<6) + x (mit y=1 für die zeichen 9-16).

gruesse

EDIT: ich seh gerade, dass bei diesem lcd die 2te hälfte wirklich bei dez. 40 beginnt.. sry

izaseba
26.01.2008, 22:11
Hallo robocat,

Danke für die Antwort.

Du bist mein Retter !

natürlich 0x40 !, man bin ich dumm
Damit muß ich für den Anfang der zweiten Zeile 0xC0 senden und nicht 0xA8, was sich ergibt, wenn man 40 Dezimal nimmt.
Nur dumm, daß ich mit 0xA8 auch in der zweiten Zeile gelandet bin .

Jetzt klappt es, und es kann weitergehen, danke nochmals

Sebastian

P.S. Zu deinem EDIT
Bin ich also doch nicht ganz dumm ?
Demnach haben die ja 0x vergessen davorzuschreiben, oder geht man davon aus, daß die Adressen immer Hex angegeben werden...

robocat
26.01.2008, 22:34
ich habe nur im datenblatt das "DDRAM 80x8 bits for digits" gelesen, und da wäre es naheliegend, wenn jede displayhälfte 40 bytes bekäme. scheint aber (wie bei meinem lcd mit ks0073 controller) üblich zu sein, dass die 2te hälfte bei dez. 64 losgeht. kA wieso. aber freut mich, dass ich dir helfen konnte.

da ich im moment auch mit so einem display rumspiele hätte ich auch eine frage:

wenn ich einen text > 8 zeichen ausgeben will, muss ich dann die ausgegebenen zeichen mitzählen - oder wie macht man das geschickt? denn bis zur 8ten stelle kann ich die bytes ja einfach nacheinander schreiben, aber beim 9ten zeichen müsste ich vorher die addresse ändern.. (hoffe du verstehst, was ich meine)

gruesse

izaseba
26.01.2008, 23:03
wenn ich einen text > 8 zeichen ausgeben will, muss ich dann die ausgegebenen zeichen mitzählen - oder wie macht man das geschickt? denn bis zur 8ten stelle kann ich die bytes ja einfach nacheinander schreiben, aber beim 9ten zeichen müsste ich vorher die addresse ändern.. (hoffe du verstehst, was ich meine)


Ja ich verstehe, was Du meinst ;-) Da bin ich schon durch \:D/
Mir ist auch nichts besseres eingefallen, als die Zeichen mitzuzählen :-(
Hab mir einen Register dafür 'gesichert'
Allerdings zähle ich nicht die Zeichennummer sondern DDRAM Adressen, also Anfangswert 0x80.
Es hat den Vorteil, daß man eben ein Command senden kann ohne von Zeichennummer auf Adresse umrechnen zu müssen, sehr sinnvoll, wenn man kurz an CGRAM zugreifen will(eigene Zeichen übertragen z.B.)
Also
CGRAM Adresse einstellen
Data reinschreiben,
wenn fertig ein Command mit dem Inhalt von Zeichenregister absetzten
und schon steht der Cursor, da wo er war...

Ich schicke Dir ein Codeschnippsel

Zeichenzaehler speichert mir halt die Adresse
param1 ubergibt Variablen an Funktionen.
Zusätzlich prüfe ich noch, ob man nicht mehr als 16 Zeichen schreiben will,
wenn ja wird vorne weitergemacht.

Ich hoffe, daß Du Assembler lesen kannst, in C habe ich ein 1 Zeiliges Display noch nicht gemacht, und es ist mir gerade nach Assembler 8-[



loop_ascii:
cpi Zeichenzaehler,0x88
brne loop_2_2
;wir sind an der Schwelle zwischen Zeichen 8 und 9 hier muß zuerst neue Adresse gesendet werden
push param1 ; das Zeichen Sichern
ldi param1,0xC0 ;DDRAM auf Adresse 40 Einstellen->9. Zeichen
mov Zeichenzaehler,param1
rcall LCD_command
pop param1
loop_2_2:
inc Zeichenzaehler
cpi Zeichenzaehler,0xC9;Pruefen, ob wir ueber die Displaygrenze hinaus sind
brlo loop_2_3
ldi Zeichenzaehler,0x80 ;wenn ja fangen wir von vorne an
push param1
mov param1,Zeichenzaehler
rcall LCD_command
pop param1
loop_2_3:
rcall LCD_data
rjmp loop

robocat
27.01.2008, 20:11
danke izaseba, genauso habe ich es jetzt gemacht. normalerweise bevorzuge ich c, aber diesmal ist asm-code ganz willkommen, weil ich dabei bin, den code für den funktionsgenerator von Andreas Schwarz http://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator etwas umzustricken (mein display ist anders und ich hätte gern ein poti zum einstellen der frequenz).

gruesse von der katz

izaseba
28.01.2008, 16:11
Hallo Robocat,

Ja das Projekt von Andreas Schwarz kenne ich, hab mir auch schon angeguckt, ich habe aber irgendwie keine Verwendung dafür :-k

Dann wünsche ich Dir viel Erfolg damit...

Gruß Sebastian