Forum: Mikrocontroller und Digitale Elektronik LCD Initialisierung


von Peter (Gast)


Lesenswert?

Hallo,

da ichs jetzt endlich mal geschafft habe meinen uC zu flashen sitze ich 
vor dem nächsten Problem.

Hab mir ne einfache Routine zur LCD Initialisierung geschrieben und zwar 
für ein 20x4 (204B Serie, KS0066U controller). Aber leider funktioniert 
das nicht so wirklich, vielleicht kann mal jemand drübersehen.

.include "m32def.inc"
.cseg

.org 0x00 rjmp main ; Reset Handler
.org 0x02  reti ; IRQ0 Handler
.org 0x04  reti ; IRQ1 Handler
.org 0x06  reti ; Timer2 Compare Handler
.org 0x08  reti ; Timer2 Overflow Handler
.org 0x0A  reti ; Timer1 Capture Handler
.org 0x0C  reti ; Timer1 CompareA Handler
.org 0x0E  reti ; Timer1 CompareB Handler
.org 0x10  reti ; Timer1 Overflow Handler
.org 0x12  reti ; T0overflow ; Timer0 Overflow Handler
.org 0x14  reti ; SPI Transfer Complete Handler
.org 0x16  reti ; USART RX Complete Handler
.org 0x18  reti ; UDR Empty Handler
.org 0x1A  reti ; USART TX Complete Handler
.org 0x1C  reti ; ADC Conversion Complete Handler
.org 0x1E  reti ; EEPROM Ready Handler
.org 0x20  reti ; Analog Comparator Handler
.org 0x22  reti ; Two-wire Serial Interface Handler
.org 0x24  reti ; IRQ2 Handler
.org 0x26  reti ; Timer0 Compare Handler
.org 0x28  reti ; Store Program Memory Ready Handler

;Definitionen


.def temp1=r16
.def temp2=r17

main:


; UND LOS 
-------------------------------------------------------------------

; Initialisierungen

  ldi r16, LOW(RAMEND)  ;Einrichtung des Stacks für Rückssprung
    out SPL, r16
    ldi r17, HIGH(RAMEND)
    out SPH, r17


  rjmp lcd_init

loop07:

  rjmp loop07



; 5. LCD-Routine

lcd_command:

  push r16        ;Register sichern
  push r17

  ser r16
  out DDRA, r16      ;PortA als Ausgang
  out DDRC, r16      ;PortC als Ausgang
  CBI PORTC, 1      ;R/W=Low, Schreiben aktiv
  CBI PORTC, 2      ;RS=Low, Commandos werden gesendet
  OUT PORTA, temp1
  Rcall lcd_enable
  nop
  Rcall lcd_delay50us

  pop r17          ;Register wieder herstellen
  pop r16
  ret


lcd_enable:

  ser r16
  out DDRC, r16      ;PortC als Ausgang
  sbi PORTC, 0      ;Enable-Bit setzen
  nop            ;warten
  nop            ;warten
  nop            ;warten  (mindestens 220ns)
  nop            ;warten
  nop
  nop
  nop
  nop            ;warten
  nop            ;warten
  cbi PORTC, 0      ;Enable-Bit rücksetzen
  ret

;LCD -> 50us Warteschleife

lcd_delay50us:

  push r16
  push r17
  ldi temp1, 0x05

de_loop1:  ldi temp2, 0x34
de_loop2:  dec temp2
      brne de_loop2
      dec temp1
      brne de_loop1

  pop r17
  pop r16
  ret

;LCD -> 5ms Warteschleife

lcd_delay5ms:

  push r16
  push r17
  ldi temp1, 99

de2_loop:

  rcall lcd_delay50us
  dec temp1
  brne de2_loop
  pop r17
  pop r16
  ret

;   5.6 LCD -> Initialisierung

lcd_init:

  push r16        ;Register sicheren
  push r17

  ldi temp1, 50      ;250ms Wartezeit fürs Display

powerupwait:

  rcall lcd_delay5ms
  dec temp1
  brne powerupwait
  ser temp1
  out DDRA, temp1      ;PortA auf Ausgang
  out DDRC, temp1      ;PortC auf Ausgang
  ldi temp1, 0x30      ;LCD-Start-Sequenz
  out PORTA, temp1    ;RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
  clr temp1        ;0  0  0  0  1  1        
  out PORTC, temp1
  rcall lcd_enable    ;1x gesendet
  rcall lcd_delay5ms
  rcall lcd_enable    ;2x gesendet
  rcall lcd_delay5ms
  rcall lcd_enable    ;3x gesendet
  rcall lcd_delay5ms
  ldi temp1, 0x30      ;8-bit Modus aktivieren, 1 Line, 5*7 Dots
  out PORTA, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x08      ;Display off
  out Porta, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x01      ;Display clear
  out Porta, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x06      ;Increment, noShift
  out porta, temp1
  rcall lcd_enable
  rcall lcd_delay5ms    ;Initialisierung beendet

  pop r17
  pop r16

  rjmp loop07

von Peter (Gast)


Lesenswert?

Ach ja nochwas, das ganze läuft an nem ATmega32 mit 16MHz, im moment zum 
testen allerdings nur mit 1MHZ weil ich dachte dass es vielleicht an den 
Wartezyklen liegt ..

von johnny.m (Gast)


Lesenswert?

Wenn Du jetzt noch sagst, was genau "nicht so wirklich" funktioniert, 
wäre das hilfreich...

BTW: Für den ATMega32 stimmt die Interrupt-Tabelle aber überhaupt nicht. 
Der Mega32 hat mehr als 8 KB Flash und deshalb sind die Vektoren 32 Bit 
lang, weil rjmp nur 8K ansprechen kann. Dürfte aber für Deine Anwendung 
keine Schwierigkeiten machen. Am besten immer die Vektortabelle aus dem 
entsprechenden Datenblatt übernehmen. Dann passiert sowas nicht.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Es gibt hier auf der Seite ja auch kein Tutorium, das dieses so seltene 
Thema auch noch beschreibt...

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

ich sehe nirgends eine Busyflag-Abfrage, ist der Controller kompatibel 
zum HD44780?

von johnny.m (Gast)


Lesenswert?

@Christoph:
Der macht das mit den delays. Wenn das wirklich 5 ms sind, dann sollte 
das dicke reichen. Hab jetzt nur keine Lust, das nachzurechnen...

von Peter (Gast)


Lesenswert?

Das Problem ist dass mein Display einfach nur die beiden schwarzen 
Balken zeigt.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Zuviel Kontrastspannung?!

von Dennis (Gast)


Lesenswert?

beide, oder nur eine reihe und eine halbe o.ä!?

eigentlich benötigt man bei dem ersten delay doch mindestens 11ms, 
oder!?

naja, ich würde einfach mal versuchen die wartezyklen noch größer zu 
machen, größer schadet eigentlich nie, nur wenn sie zu kurz sind,gibts 
probleme...

d.

von Peter (Gast)


Lesenswert?

Es ist ein 4 Zeilen Display, Zeile 1 und 3 zeigen schwarz, liegt das 
wirklich nur an der zu hohen Kontrastspannung?

@Dennis

Zur Initialisierung sinds sogar 250ms die ich dem Display Zeit gebe, 50 
mal in die 5ms Schleife.

von Holger K. (krulli) Benutzerseite


Lesenswert?

Peter wrote:
> Es ist ein 4 Zeilen Display, Zeile 1 und 3 zeigen schwarz, liegt das
> wirklich nur an der zu hohen Kontrastspannung?

Nein, das bedeutet, das dass Display immer noch nicht initialisiert ist.

von jack (Gast)


Lesenswert?

>lcd_enable:
>...
>sbi PORTC, 0      ;Enable-Bit setzen
>...
>cbi PORTC, 0      ;Enable-Bit rücksetzen

was soll das?

von johnny.m (Gast)


Lesenswert?

> out PORTA, temp1    ;RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
> clr temp1        ;0  0  0  0  1  1      *  *
Schau Dir mal den Kommentar zu diesen beiden Zeilen an. Abgesehen davon, 
dass der Kommentar mit der zweiten Codezeile überhaupt nichts zu tun 
hat, ist er zusätzlich noch irreführend. Sowas macht so ein Programm 
fürchterlich schwer lesbar und eine Fehlersuche echt anstrengend. 
Außerdem hast Du in Deinem Code z.B. mindestens drei verschiedene 
Schreibweisen für PORTA. So ein Programm zu lesen macht echt keinen 
Spaß! Da musst Du doch selbst irgendwann die Übersicht verlieren, oder 
nicht? Schreib das Programm doch erst mal ins reine. Groß- und 
Kleinschreibung sind zwar dem Assembler egal, aber dem menschliche Leser 
fehlen dadurch durchaus Blickfangpunkte. Und wenn Du r16 und r17 schon 
extra Namen gibst, warum verwendest Du sie dann nur ab und zu mal?

Wozu soll übrigens das "pop r16" und "pop r17" vor dem Sprung in die 
Endlosschleife dienen? Ist zwar an dieser Stelle auch Wurscht, aber 
nicht dass Du bei einer Erweiterung darüber stolperst. Wenn man popt, 
ohne dass vorher was gepusht wurde, gibts u.U. Probleme mit dem Stack.

Noch ne Frage zur Sicherheit: Dein µC läuft aber, oder?

von jack (Gast)


Lesenswert?

stimmt schon...

von Peter (Gast)


Lesenswert?

@Jack

Das ist doch nötig um dem LCD zu sagen dass die Daten auf den Leitungen 
DB0-7 jetzt richtig anliegen, nicht? Steht doch in sämtlichen Tutorien 
so.

@Johnny.m

Sorry für das Chaos, ich werds mal ins Reine fassen und das mit dem 
Kommentar liegt daran dass er eigentlich über 4 Zeilen geht, sieht 
vielleicht etwas komisch aus.

Der uC sollte laufen, hab einfach mal auf PORTA 0xAA ausgegeben und das 
hat er brav erledigt.


von Falk (Gast)


Lesenswert?

Hast du geprüft ob alle Verbindungen zwischen uC - LCD in Ordnung sind? 
Mal alle einzeln wackeln lassen und schauen.

MfG
Falk

von Peter (Gast)


Lesenswert?

Wackeln lassen?

Wie solls denn eigentlich nach Initialisierung aussehen? Keine schwarzen 
Balken mehr auf jeden Fall, nehm ich mal an.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wackeln lassen?

Du toggelst einen Pin nach dem anderen und schaust mit
einem Multimeter bzw. Ossi nach ob am LCD auch tatsächlich
sich am richtigen Pin was tut.

> Wie solls denn eigentlich nach Initialisierung aussehen?

Richtig. Die schwarzen Balken müssen verschwinden.

von Peter (Gast)


Lesenswert?

Jetzt hab ich versucht die Pins einzeln zu toggeln, allerdings jedes mal 
neu geflasht, also für jeden Pin, weil ich wissen wollte ob er das auch 
vernünftig macht. Allerdings gibts da auch Probleme, ich hab den uC 
jetzt eigentlich so geflasht, dass PORTA PIN 2 Spg. führen sollte, 
allerdings scheint immer noch das Programm von davor drinnen zu sein, 
also führt PIN1 die Spg. Hab auch den ISP Programmer weggenommen und die 
Versorgungsspannung kurz, alles nach dem Flashen. Hat aber nix geholfen.

Peter

von Falk (Gast)


Lesenswert?

@Peter

> Jetzt hab ich versucht die Pins einzeln zu toggeln, allerdings jedes mal
> neu geflasht, also für jeden Pin, weil ich wissen wollte ob er das auch

Naja, so kann mans auch machen. Aber hast du nciht einen Taster an dem 
Ding? ODer wenigstens ein freis Pin um einen Taster anzuschliessen? Da 
kannst du nämlich per Taster die einzelnen Pins durchschalten und 
wackeln lassen. Musst dann nur einmal flaschen (was immens Zeit spart) 
und kannst vor allem dynamisch debuggen.

> also führt PIN1 die Spg. Hab auch den ISP Programmer weggenommen und die

Pin kurzgeschlossen? Sowas sollte man fix messen können.

MFG
Falk

von Peter (Gast)


Lesenswert?

verdammt ich weiß worans lag, ich hab vergessen zu assemblieren, hab nur 
gespeichert, args. Sorry

von Peter (Gast)


Lesenswert?

Wieso steht eigentlich im Datenblatt was von 5*7 Dots und die beiden 
schwarzen Balken vor der Initialisierung haben pro Zeichen 5*8 Dots?

Hab mir das Programm jetzt noch mal angesehen, die Leitungen überprüft 
kann nichts finden, die schwarzen Balken verschwinden einfach nicht, die 
Initialisierung klappt also nicht.

Peter

von Falk (Gast)


Lesenswert?

Mach mal was andere schon empfohlen haben. Schreib das Programm SAUBER! 
Wahrscheinlich wird irgendwo mal r16/temp1 verwechselt und überschrieben 
und dadurch ist dann der Inhalt im Eimer.

MfG
Falk

von johnny.m (Gast)


Lesenswert?

> Wieso steht eigentlich im Datenblatt was von 5*7 Dots und die beiden
> schwarzen Balken vor der Initialisierung haben pro Zeichen 5*8 Dots?
Weil da die Cursorzeile mit drin ist.

von Peter (Gast)


Lesenswert?

@johnny.m

Achso, danke.

von Karl heinz B. (kbucheg)


Lesenswert?

> Mach mal was andere ...

Oder geh im AVR Studio in den Simulator und geh mal
mit Einzelschritten die Initialisierungssequenz durch.
Nach jedem Schritt die simulierten Port Pins beobachten
und überlegen ob das so sein kann bzw. so sein soll.

von Peter (Gast)


Lesenswert?

Hab das Programm jetzt nochmal etwas gesäubert, vielleicht kann mans 
schöner lesen.


.include "m32def.inc"
.cseg

.def temp1=r16
.def temp2=r17

main:


; UND LOS 
-------------------------------------------------------------------

; Initialisierungen

  ldi r16, LOW(RAMEND)  ;Einrichtung des Stacks für Rückssprung
    out SPL, r16
    ldi r17, HIGH(RAMEND)
    out SPH, r17

  rjmp lcd_init      ;Sprung zur LCD Initialisierung

loop11:

  rjmp loop11        ;Endlosschleife nach Initialisierung


; 5. LCD-Routine

;  5.1 LCD -> Daten übertragen

lcd_data:

  push temp1        ;Register sichern
  push temp2

  ser r18
  out DDRA, r18      ;PortA als Ausgang
  out DDRC, r18      ;PortC als Ausgang
  CBI PORTC, 1      ;R/W=Low, Schreiben aktiv
  SBI PORTC, 2      ;RS=High, Daten werden gesendet
  OUT PORTA, temp1    ;Übergabe des zu sendenden Bytes an das LCD
  rcall lcd_enable    ;Aufruf lcd_enable
  nop
  rcall lcd_delay50us    ;Aufruf lcd_delay50us
  nop

  pop temp2        ;Register wieder herstellen
  pop temp1
  ret            ;Rücksprung

;   5.2 LCD -> Commandos übertragen

lcd_command:

  push temp1        ;Register sichern
  push temp2

  ser r18
  out DDRA, r18      ;PortA als Ausgang
  out DDRC, r18      ;PortC als Ausgang
  CBI PORTC, 1      ;R/W=Low, Schreiben aktiv
  CBI PORTC, 2      ;RS=Low, Commandos werden gesendet
  OUT PORTA, temp1    ;Übergabe des Commando-Bytes an das LCD
  rcall lcd_enable    ;Aufruf lcd_enable
  nop
  Rcall lcd_delay50us    ;Aufruf lcd_delay50us
  nop

  pop temp2        ;Register wieder herstellen
  pop temp1
  ret            ;Rücksprung

;  5.3 LCD -> Enable-Bit setzen

lcd_enable:
  push r18        ;Register sichern
  ser r18
  out DDRC, r18      ;PortC als Ausgang
  sbi PORTC, 0      ;Enable-Bit setzen
  nop            ;warten
  nop            ;warten
  nop            ;warten  (mindestens 220ns)
  nop            ;warten
  nop            ;warten
  nop            ;warten
  cbi PORTC, 0      ;Enable-Bit rücksetzen
  pop r18          ;Register wieder herstellen
  ret            ;Rücksprung

;  5.4 LCD -> 50us Warteschleife

lcd_delay50us:

  push temp1        ;Register sichern
  push temp2
  ldi temp1, 0x05      ;Schleifenindex Nr.1 temp1 auf 0x05 setzen

de_loop1:  ldi temp2, 0x34  ;Schleifenindex Nr.2 temp2 auf 0x34 setzen
de_loop2:  dec temp2
      brne de_loop2
      dec temp1
      brne de_loop1

  pop temp2        ;Register wieder herstellen
  pop temp1
  ret            ;Rücksprung

;   5.5 LCD -> 5ms Warteschleife

lcd_delay5ms:

  push temp1        ;Register sichern
  push temp2
  ldi temp1, 99      ;Schleifenindex auf 99 setzen

de2_loop:

  rcall lcd_delay50us
  dec temp1
  brne de2_loop
  pop temp2        ;Register wieder herstellen
  pop temp1
  ret            ;Rücksprung

;   5.6 LCD -> Initialisierung

lcd_init:

  ldi temp1, 100      ;500ms Wartezeit fürs Display

powerupwait:

  rcall lcd_delay5ms
  dec temp1
  brne powerupwait
  ser r18
  out DDRA, r18      ;PortA auf Ausgang
  out DDRC, r18      ;PortC auf Ausgang
  ldi temp1, 0x30      ;LCD-Start-Sequenz
  out PORTA, temp1    ;RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
              ;*    0  0  1  1        *
  clr temp1        ;RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
  out PORTC, temp1    ;0  0                
  rcall lcd_enable    ;1x gesendet
  rcall lcd_delay5ms
  rcall lcd_enable    ;2x gesendet
  rcall lcd_delay5ms
  rcall lcd_enable    ;3x gesendet -> LCD bereit
  rcall lcd_delay5ms
  ldi temp1, 0x30      ;8-bit Modus aktivieren, 1 Line, 5*7 Dots
  out PORTA, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x08      ;Display off
  out PORTA, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x01      ;Display clear
  out PORTA, temp1
  rcall lcd_enable
  rcall lcd_delay5ms
  ldi temp1, 0x06      ;Increment, noShift
  out PORTA, temp1
  rcall lcd_enable
  rcall lcd_delay5ms    ;Initialisierung beendet

  rjmp loop11        ;Sprung zur Endlosschleife

von Peter (Gast)


Lesenswert?

@kbucheg

bin ich schon durchgegangen, stimmt soweit alles wenn ich das richtig 
überblicke

von Falk (Gast)


Lesenswert?

@Peter

> Hab das Programm jetzt nochmal etwas gesäubert, vielleicht kann mans
> schöner lesen.

Was ist das nennenswert gesäubert?

MfG
Falk



von Peter (Gast)


Lesenswert?

Was könnte man deiner Meinung nach denn noch ändern?

von Falk (Gast)


Angehängte Dateien:

Lesenswert?

@Peter

> Was könnte man deiner Meinung nach denn noch ändern?

Nun, man könnte WIRKLICH Ordnung schaffen. Nicht aus reinem Selbstzweck, 
sondern damit man Fehler schneller sieht. Siehe Anhang.

MfG
Falk

von Peter (Gast)


Lesenswert?

Jetzt hab ichs verstanden, danke.

von Stefan W. (wswbln)


Lesenswert?

...Du verwendest Port C - hast Du auch das JTAG-Interface abgeschaltet?
Auch ein immer wieder gerne gemachtes Fehlerlein...

von Peter (Gast)


Lesenswert?

Also der JTAG Interface Enabled Haken ist auf jedenfall nicht gesetzt 
wenn ich die Fuses auslese, das heißt doch deaktiviert oder?

von Falk (Gast)


Lesenswert?

@Peter

> Also der JTAG Interface Enabled Haken ist auf jedenfall nicht gesetzt
> wenn ich die Fuses auslese, das heißt doch deaktiviert oder?

Denke ich schon. Aber wenn dein Pin-Wackeltest mit ALLEN Pins 
funktioniert, dann ist das nicht das Problem.
Erfolge? Wahrscheinlich nicht? Hmmm. Wie sieht denn dein Gesamtaufbau 
aus? Mach mal ein Bild.

MfG
Falk

von Jens B. (sio2)


Lesenswert?

Schalte doch mal alle pins am portc auf H und auch mal auf L, und dann 
kannste messen, ob jtag auch wirklich aus ist. Die Fuses sind bisschen 
blöd zu handeln. Wenn du jtag nicht ausgeschaltet hast, ist es mit 
sicherheit noch an.

von Peter (Gast)


Lesenswert?

@Jens B.

Hab ich soeben gemacht, funktioniert alles einwandfrei sowohl H als auch 
L.

von Peter (Gast)


Lesenswert?

Hab mich jetzt mal mit dem Multimeter drangesetzt und wenn ich die 
Spannungsversorgung draufgebe, dann sind erstmal die Bits RW, RS, und 
DB0-DB7 für ca. 9-10 Sekunden auf High. Wenn ich das LCD ausstecke und 
direkt am uC messe, dann ist das nicht der Fall. Woran liegt das denn, 
dass die Pins so lange alle auf H-Level liegen?

Peter

von Falk (Gast)


Lesenswert?

@Peter


>direkt am uC messe, dann ist das nicht der Fall. Woran liegt das denn,
>dass die Pins so lange alle auf H-Level liegen?

Die Eingänge sind extrem hochohmig (100 MOhm ++). Die entladen sich nur 
sehr langsam über dein Multimeter.

MfG
Falk

von Peter (Gast)


Lesenswert?

Hm .. mit 16MHz fallen die Ausgänge schneller in den Low-Pegel zurück. 
Aber was ich nicht verstehe ist dass die Pins überhaupt High-Pegel 
führen.

von Falk (Gast)


Lesenswert?

????
Wenn das LCD am uC hängt, dürfte gar nix fallen. Denn der uC treibt die 
Pins, LOW oder HIGH. Und das sofort (us!) nach dem Reset. Was für 
superbilligen Klingeldraht hast du denn da verwendet?

MFG
Falk

von Peter (Gast)


Lesenswert?

Also nochmal, wenn ich auf die Schaltung (uC und Display) Spannung gebe 
und ich am Display messe, dann sind die Pins RW, RS, DB0-DB7 alle auf 
High und das für ca. 9-10 Sekunden.

Wenn ich nun aber das Display wegnehme und dann Spg. wegnehme und wieder 
draufgebe, dann sind alle Pegel wie sie sein sollten (am uC gemessen). 
Also muss es wohl so sein, dass das Display irgendwie die H-Pegel 
produziert. Nur leider werd ich aus der ganzen Geschichte nicht schlau.

Und ich muss sagen mich wundert auch nicht dass sich das Display nicht 
initialisieren lässt bei dem was ich da mit dem Multimeter direkt nach 
dem Einschalten messe.

von Falk (Gast)


Lesenswert?

@Peter

>Also nochmal, wenn ich auf die Schaltung (uC und Display) Spannung gebe
>und ich am Display messe, dann sind die Pins RW, RS, DB0-DB7 alle auf
>High und das für ca. 9-10 Sekunden.

Dann ist was faul. Das Programm setzt die alle auf LOW. Bist du sicher, 
dass der uC läuft?

MfG
Falk

von Peter (Gast)


Lesenswert?

Wenn ich es mit einfachen Programmen probiere, also einfach nur ein Port 
setzen, rücksetzen solche Geschichten dann funktioniert das wunderbar.

Nur eben bei diesem Initialisierungsprogramm macht passiert das was ich 
oben beschrieben habe.

von Peter (Gast)


Lesenswert?

Ach ja hab noch vergessen zu sagen dass die Pins DB1 und DB2 nach den 
10Sekunden auch noch High sind, aber das liegt wohl daran, dass das der 
letzte Wert ist den ich in meiner Initialisierungsroutine auf PortA 
ausgebe (0x06).

von Peter (Gast)


Lesenswert?

Uah, ich habs.

War ne Mischung aus ausgeschaltetem Display und zu extremen Kontrast.

Nochmal danke an alle die geholfen haben. ;)

von Falk (Gast)


Lesenswert?

@Peter

>Uah, ich habs.

Gott sei Dank.

>War ne Mischung aus ausgeschaltetem Display und zu extremen Kontrast.

Wie ausgeschaltet?

MFG
Falk

von Peter (Gast)


Lesenswert?

Mit 0x08 in der Initialisierung schaltet man Display, Cursor und 
Blinking off. Von daher hab ich nichts gesehen und in Kombination mit 
dem zu hohen Kontrast hatte ich nur die Balken gesehen.

;)

von Peter (Gast)


Lesenswert?

Eine Frage hätte ich noch, und zwar muss ich das LCD auf 1 Zeilig oder 2 
Zeilig stellen wenn ich alle 4 Zeilen nutzen will?

Gibts vielleicht wo nen Thread oder ne Seite wo das schön beschrieben 
ist wie das auch mit Zeile 2 und 4 klappt, also das Ansprechen. Hab 
schon versucht die richtigen Adressen für Zeile 2 und 4 anzugeben, 
bisher ohne Erfolg.

von Falk (Gast)


Lesenswert?

@Peter

>Eine Frage hätte ich noch, und zwar muss ich das LCD auf 1 Zeilig oder 2
>Zeilig stellen wenn ich alle 4 Zeilen nutzen will?

2 zeilig.

>ist wie das auch mit Zeile 2 und 4 klappt, also das Ansprechen. Hab
>schon versucht die richtigen Adressen für Zeile 2 und 4 anzugeben,
>bisher ohne Erfolg.

1. Zeile  0x00
2. Zeile 0x40
3. Zeile 0x10
4. Zeile 0x50

MFG
Falk

von Werner B. (Gast)


Lesenswert?

Bei einem 20*4 LCD wird 0x10 für Zeile 3 nicht reichen, ich "tippe" mal 
auf 0x14, und 0x54 für Zeile 4; Sollte aber im Datenblatt stehen.

von Falk (Gast)


Lesenswert?

Die Angaben sind für 16x4 LCDs.

MfG
Falk

von Peter (Gast)


Lesenswert?

Habs ausprobiert, mit 2 Zeilen gehts ;).

Ausserdem hab ich eben mal versucht ein eigenes Zeichen zu entwerfen, 
aber
das will irgendwie nicht funktionieren, der Code sieht so aus.

;CustomChar Generator

  ldi temp1, 0x40
  rcall lcd_command
  ldi temp1, 0x1F
  rcall lcd_data

  ldi temp1, 0x41
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x42
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x43
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x44
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x45
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x46
  rcall lcd_command
  ldi temp1, 0x11
  rcall lcd_data

  ldi temp1, 0x47
  rcall lcd_command
  ldi temp1, 0x1F
  rcall lcd_data
  rcall lcd_delay5ms



  ldi temp1, 0x00                ;Ausgabe des Zeichens
  rcall lcd_data
  rcall lcd_delay5ms


Habt ihr ne Idee, ich seh den Fehler grad nicht :(

von Karl heinz B. (kbucheg)


Lesenswert?

Hast du nach der Character-Definition die Schreibposition
wieder in den sichtabren Bereich zurück gesetzt?

Ein Character zu definieren ist auch nichts anderes als
normale Zeichen ausgeben. Nur dass diese 'Zeichen' in einem
speziellen Speicher landen, von dem sie dann zum Zeichnen
benutzt werden.
Du brauchst auch nicht die Schreibposition erhöhen.
Mit der Ausgabe von 0x40 auf das Commandoregister
setzt du den Ausgabecursor in diesen speziellen Speicher-
bereich. Nachfolgende Ausgaben landen dann in diesem
Speicherbereich, genauso wie sie es auch bei der normalen
Ausgabe im sichtbaren Bereich machen. Der Cursor wird dabei
automatisch erhöht. D.h. du setzt mit dem 0x40 einfach den
Cursor um und gibst danach 8 Byte als Daten aus.
Danach aber nicht vergessen, den Ausgabecursor wieder in den
sichtbraen Bereich zurückzusetzen!

von Peter (Gast)


Lesenswert?

So, brauchte erstmal ein Käffchen um den Kopf wieder klar zu kriegen. 
Natürlich muss ich vorher wieder mit 0x80 ins DD-Ram um dann mit 0x00 
das eben erstellte Zeichen auszugeben ;) ..

Danke für den kleinen Tip

von Falk (Gast)


Lesenswert?

@Peter

>So, brauchte erstmal ein Käffchen um den Kopf wieder klar zu kriegen.

Du brauchst auch einen besseren Programmierstil. Schreib doch einfach zu 
jedem Kommand als Kommentar was es macht. Gerade in Assembler ist das 
äusserst nützlich, ja geradezu zwingend.

MFG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.