Forum: Mikrocontroller und Digitale Elektronik LCD und attiny2313.seltsam


von Daniel B. (und3rt4ker)


Lesenswert?

Hi@all


Ich habe das Wintek lcd(4*27) von Pollin über den 4 bit bus an den portd 
meines Attiny2313 angeschlossen. R/W ist dauerhaft auf low, weil ich das 
busyflag nicht auslesen will. Wenn ich jetzt den beiden strom gebe, 
initialisiert sich das Display anschienend nicht. Kann evtl. jemand von 
euch mal nachsehen, was an dem code nicht stimmt? Ich könnte mir 
vorstellen, das es an der Übertragung der Daten ab der Umschaltung in 
den 4bit mode liegt(das teste ich jetzt noch)oder aber an den timings.
GEstern hatte ich auf jeden Fall schonmal "Hello world" g. Jetzt sind 
es nur zwei Balken(Display bekommt Strom, initialisiert aber nicht..)



Danke
mit freundlichen Grüßen
Daniel

edit: initialisierung von: www.sprut.de/electronic/lcd/index.htm

von Daniel B. (und3rt4ker)


Angehängte Dateien:

Lesenswert?

hier der code

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Daniel ***** wrote:
> hier der code

Hmmm...

Versuche mal den Code im Anhang zu verstehen und baue, falls 
erforderlich, das Busywait aus (durch Warteschleife ersetzen). Der Code 
werkelt seit April 2005 zuverlässig vor sich hin. Die Warteschleife 
wurde mal halbherzig geändert, da stimmen Labels und Kommentare nicht 
mehr überein.

Das im Anhang ist aber nur die LCD-Routinensammlung. Wie diese in ein 
Programm eingebunden werden kann, siehst Du z.B. hier:
Beitrag "Re: MENÜ-STEUERUNG"

Viel Erfolg...

...

von Daniel B. (und3rt4ker)


Lesenswert?

Danke Hannes, jetzt weiß ich auch mal, das man das busyflag auch 
nibble-weise abfragen muss g.
Ich habe ein bischen am Timing rumgespielt, die initialisierung etwas 
umgeschrieben und schon gehts!

MfG Daniel

von Daniel B. (und3rt4ker)


Lesenswert?

HAllo nochmal.

Um in die zweite Zeile zu kommen muss man doch 0b11000000 als Befehl 
ausgeben oder?
Bei mir funktioniert das nicht.


MfG
Daniel

von Hannes L. (hannes)


Lesenswert?

An_der_Theke_r wrote:
> HAllo nochmal.
>
> Um in die zweite Zeile zu kommen muss man doch 0b11000000 als Befehl
> ausgeben oder?

Um in irgendeine der 4 Zeilen zu kommen, muss diese mit dem Macro 
"locate" ausgewählt werden. Dieses Macro wählt den zuständigen 
Controller aus und setzt die (der gewünschten Schreibposition) 
entsprechende DD-RAM-Adresse im LCD.

Die Befehle (zum LCD) dazu habe ich jetzt nicht im Kopf, um die hatte 
ich mich gekümmert, als ich vor Jahren die Routinen schrieb.

Bei neueren Projekten nutze ich übrigens eine andere Routine, da wird im 
SRAM des AVR ein Bildschirmspeicher verwaltet, der im Hintergrund an das 
LCD gesendet wird. Leider habe ich für das 4x27-LCD momentan keine 
"aufgeräumte" Routinensammlung parat, die letzten Projekte waren mit 
8x24-LCD.

> Bei mir funktioniert das nicht.
>
>
> MfG
> Daniel

;-)

...

von Daniel B. (und3rt4ker)


Lesenswert?

"Um in irgendeine der 4 Zeilen zu kommen, muss diese mit dem Macro
"locate" ausgewählt werden."

----ich glaube, es ist nicht ganz klar geworden, das _mein code jetzt 
geht. Deswegen frage ich mich, wie man mit dem Befehl, um den pointer im 
DD-Ram zu setzen, die zweite zeile erreicht, weil es mit dem befehl oben 
scheinbar nicht geht.
Sorry wegen dem Missverständniss

MFG
UNDERTHEKER*g*

von interessent (Gast)


Lesenswert?

Set DDRAM adress: 0b001A6A5A4A3A2A1A0

Wobei A6 bis A0 die Adresse darstellen. Zweite Zeile fängt soweit ich 
weiss bei bzw. mit 40 an.

von Daniel B. (und3rt4ker)


Lesenswert?

interessent wrote:
> Set DDRAM adress: 0b001A6A5A4A3A2A1A0
>
> Wobei A6 bis A0 die Adresse darstellen. Zweite Zeile fängt soweit ich
> weiss bei bzw. mit 40 an.

a6-a0=7bit
+001
---------
10bit

Da kann doch was nicht stimmen...

von Hannes L. (hannes)


Lesenswert?

Daniel ***** wrote:
> "Um in irgendeine der 4 Zeilen zu kommen, muss diese mit dem Macro
> "locate" ausgewählt werden."
>
> ----ich glaube, es ist nicht ganz klar geworden, das _mein code jetzt
> geht.

Nunja, ich ging davon aus, dass Du Dich von Deinem Code getrennt hast. 
Beim kurzun Überfliegen Deines Codes sah ich, dass Du sehr umständlich 
arbeitest, also Vieles separat erledigst, was zusammengefasst werden 
kann. Mein Code dagegen kümmert sich per Locate selbstständig um die 
Controllerwahl, denn die beiden Controller werden nicht (wie bei Dir) in 
getrennten Routinen behandelt, sondern in gemeinsamen Routinen und 
werden durch Variable (durch Locate voreingestellt) unterschieden.

> Deswegen frage ich mich, wie man mit dem Befehl, um den pointer im
> DD-Ram zu setzen, die zweite zeile erreicht, weil es mit dem befehl oben
> scheinbar nicht geht.

Die Ausgabeposition wird durch Senden von 0b1xxxxxxx über LCD_Command 
gesetzt (Set DD-RAM-Address), wobei "x" für die Adresse steht. Die erste 
Zeile beginnt an Adresse 0, die zweite an Adresse 64. Das Senden von $C0 
(0b11000000) ist also richtig. Aber vielleicht haperts ja noch irgendwo 
am Timing oder ganz woanders. Ich habe mir Dein Programm nicht bis ins 
letzte Detail angesehen, es ist mir einfach zu benutzerunfreundlich 
(Sorry).

> Sorry wegen dem Missverständniss
>
> MFG
> UNDERTHEKER*g*

Un(ter) der Theke?? - Ich dachte "An der Theke (stehende)r"?
Schlimmes Deutsch.
Na egal, dann eben Der, der die letzte Ruhestätte gräbt... g

Gruß,
Hannes

von Hannes L. (hannes)


Lesenswert?

Daniel ***** wrote:
> interessent wrote:
>> Set DDRAM adress: 0b001A6A5A4A3A2A1A0
>>
>> Wobei A6 bis A0 die Adresse darstellen. Zweite Zeile fängt soweit ich
>> weiss bei bzw. mit 40 an.
>
> a6-a0=7bit
> +001
> ---------
> 10bit
>
> Da kann doch was nicht stimmen...

Nunja, der Interessent hat RS und R/W aus der Tabelle im Datenblatt mal 
schnell mit zu den Datenbits gezählt. ;-)

...

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.