-         

Ergebnis 1 bis 7 von 7

Thema: Ein Problem mit LCD 1x16 Zeichen

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236

    Ein Problem mit LCD 1x16 Zeichen

    Anzeige

    Hallo,
    zur Zeit versuche ich dieses LCD 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 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
    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

    Gruß Sebastian

    P.S.
    Ich glaub es ist nicht unbedingt wichtig, aber Das Display wird von einem Tiny 24 in 4 Bit Modus angesteuert
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    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 (12 + (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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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...
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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 \/
    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

    Code:
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    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/artic...tionsgenerator etwas umzustricken (mein display ist anders und ich hätte gern ein poti zum einstellen der frequenz).

    gruesse von der katz

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo Robocat,

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

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

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •