Forum: Mikrocontroller und Digitale Elektronik LCD DISPLAY 4x20


von Kay B. (newbie)


Angehängte Dateien:

Lesenswert?

hallo habe mir ein 8-kanal-dc-dimmer gebaut mit at90s8515
8-kanäle software pwm
8-tasten zum hochregeln und eine ship taste zum runterregeln
funktioniert super,das programm habe ich hier mal entdeckt habe es ein
wenig umgeändert.
habe zuzeit ein 2x16 lcd display dran was anzeigt welche taste grade
gedückt wurde das funktioniert auch.

meine frage:
1.wie kann ich das realiesieren das im display angezeigt wird wie oft
eine taste gedrückt wurde bis die volle helligkeit oder dunkeheit
ausgang=0 oder der aktuelle wert angezeigt wird

2.welchen befehl brauche ich wenn ich ein 4x16 lcd display um in zeile
3 oder 4 springe

die lcd display`s werden im  4bit modus betrieben
programm ist im anhang

vieleicht kann mir ja jemand ein bischen weiterhelfen.

danke schon mal im vorraus

von Jan (Gast)


Lesenswert?

1. Gib doch einfach den Wert aus, den du gerade für die jeweilige PWM
verwendest aus.
2. Das kann dir nur das Datenblatt verraten. Ich liege aber sehr
wahrscheinlich richtig, wenn ich sage: "Der gleiche wie für die ersten
beiden Zeilen!"  Bei Standard-LCD liegt die 3. Zeile hinter der 1.
Zeile und vor der 2. Zeile im Speicher.

von Sonic (Gast)


Lesenswert?

Hi, zu 2.: Zeile 3 und 4 sind normalerweise die 'Fortsetzung' der
Zeilen 1 bzw. 2. Das ist nix anderes als ein abgebrochenes 2x40 Zeichen
Display. Also Startadresse Zeile 1 :0x80, Zeile 2: 0xc0, Zeile 3: 0x90
und Zeile 4: 0xd0.

von Kay B. (newbie)


Lesenswert?

danke euch für die schnelle antwort werd das heut mal ausprobieren

von Karl der Käfer (Gast)


Lesenswert?

Um was für ein Display handelt es sich denn genau?
Ist es ein Display mi dem Controller KS0073 (z.B. EA DIP204) musst du
beim initialisieren den 4-zeilen modus aktivieren, indem du die
folgende Byte-Sequenz an das Display schickst (s.a. Datenblatt):

0x24
0x09
0x20

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Hi Kay...

Also das Grundprogramm (8-Kanal-Software-PWM) erkenne ich wieder. ;-)
Eine Software-PWM benötigt aber schon etwas Rechenzeit, denn man möchte
das Timer-Intervall recht kurz halten um eine möglichst hohe
PWM-Frequenz zu erreichen. Der Rest des Programms sollte demnach auch
recht effizient geschrieben werden.

Wenn Du Feedback über ein LCD haben willst, so ist das machbar. Aber
einige Dinge würde ich anders machen.

- Das LCD muss nur einmal initialisiert werden, das macht man am besten
in der Reset-Routine. Denn die Initialisierung dauert recht lange.

- Das Löschen des LCD mit lcd_clear sollte auch recht sparsam
eingesetzt werden da dieser Befehl auch recht lange dauert. Das Füllen
des LCDs mit Leerzeichen geht bedeutend schneller.

- Du solltest Dir unbedingt anschaun, wie man die Ausgabeposition auf
dem LCD einstellt (Set DD-RAM-Address) und welcher Adressbereich für
welche Zeile verantwortlich ist (wurde oben bereits genannt). Damit
kannst Du dann sehr effizient nur die Bereiche des LCDs ändern, die im
Moment auch verändert werden sollen. Eine Möglichkeit, die
Ausgabeposition des 4x27-LCDs von Pollin zu setzen, ist hier
beschrieben:
http://www.mikrocontroller.net/forum/read-1-164017.html#164026
Beim 4x20-LCD sieht das etwas anders aus, da es nur einen Controller
hat. Siehe LCD-Routinensammlung im Anhang...


- Du musst nicht jedes Zeichen einzeln ausgeben, man kann sich Routinen
basteln, die ganze Strings (Zeichenketten) ausgeben. Analysiere doch mal
diese Routinensammlung
http://www.mikrocontroller.net/forum/read-1-164017.html#164028
dann fällt Dir bestimmt ein, wie man es besser machen kann.

- Der Einsatz von selbst definierten Macros kann (nicht nur bei
LCD-Zugriff) allerhand Schreibarbeit sparen. Wie die oben genannten
Routinen mittels Macro aufgerufen werden, findest Du hier:
http://www.mikrocontroller.net/forum/read-1-164017.html#164207
http://www.hanneslux.de/avr/stopuhr/index.html
http://www.hanneslux.de/avr/zuenduhr/index.html

Viel Spaß...
...HanneS...

von Kay B. (newbie)


Lesenswert?

danke erst mal für die antworten.
bin noch nicht son fux in sachen avr,
aber am meisten würde mich interéssieren wie ich den momentanen
sollwert des ausgabe kanals zB. PB0 oder PB1 im display anzeigen
kann,da bin ich noch nicht so dahinter gkommen.

als display verwende ich zurzeit noch ein 2x16, sollte aber demnächst
ersetzt werden durch ein grössers zB. ein 4x20 wo mann mehr
informationen anzeigen kann.

von Kay B. (newbie)


Lesenswert?

hi HanneS
hab noch was vergessen,

wie kann ich denn deine LCD_4x20.inc in (mein) programm übernehmen?
um zum beispiel den aktuellen ausgabewert von PB0 anzuzeigen ein
passendes beispiel (mein)programm wär sehr hilfreich wenn es denn
geht.

danke schon mal.

von Hannes L. (hannes)


Lesenswert?

Der LCD-Treiber LCD_4x20.inc ist für Interrupt-Betrieb gedacht. Die
Zeichenausgabe-Routine sollte per Timer-Interrupt alle etwa 1ms
aufgerufen werden und ein Zeichen aus dem Ringbuffer ausgeben. Diese
Routinen solltest Du also erst verwenden, wenn Du sie verstehst und an
Deine Bedürfnisse anpassen kannst.

Ich gab Dir das Beispiel, damit Du Dir das "Locate" ansehen kannst.
Es müsste auch mit Deinen LCD-Routinen funktionieren, wenn Du die
Variablennamen anpasst.

Das Prinzip der Anwendung ist dann ganz einfach, mit
 locate zeile,spalte
legst Du die Ausgabeposition fest, mit
 printf text1
gibst Du den Text aus dem Flash aus, den Du mit
text1: .db "Das ist ein Text!",0
im Flash ablegst, wobei "text1:" das Label (zum Adressieren) ist und
doe 0 am Ende die Ende-Kennung für die Stringausgabe-Routine, die mit
dem Macro "printf" aufgerufen wird. Es ist darauf zu achten, dass der
String incl. Ende-Kennung geradzahlig ist, weil der Flash in nur
Doppelbyte-Schritten (Word) adressiert werden kann. Notfalls ist eine
zweite 0 anzuhängen.

Zum Ausgeben von Variablen (Register oder SRAM) kannst Du die Routinen
benutzen, die Du in den oben genannten Links findest. Das wäre die
Datei LCDprint.inc.

Um Routinen aus einer Include-Datei benutzen zu können, müssen diese
ins Programm eingebunden werden. Da sie vor dem ersten Aufruf stehen
sollen, bietet sich an, die Include-Directiven zwischen den
Interrupt-Vektoren und der Reset-Routine zu notieren.

Ein Beispiel, wie man die Routinen einbindet und benutzt, findest Du in
den obigen Links in der Datei Uhr2.asm.

Den Ausgabewert von PB0 kannst Du nicht ausgeben, PB0 ist ein Bitwert,
der kann nur 0 oder 1 sein. Du meinst vermutlich den zugehörigen
PWM-Wert, der im Register r0 (r0..r7 für die 8 Werte) liegt. Diese
Werte kannst Du ausgeben, indem Du (nach Positionierung des
Ausgabecursors mittels Locate) das Register an die Ausgaberputine für
8-Bit-Zahl übergibst, was mit dem Macro
 print8 r0
erfolgt. Durch eine kleine Änderung an der Ausgaberoutine kannst Du
(bei Bedarf) dreistellige Ausgabe (mit Führungsnullen) erzwingen. Da Du
aber mit einem PWM-Zählumfang von 100 (.equ pwu=100) arbeitest, dürfte
zweistellige Anzeige reichen.

Da reicht sogar Dein 2x16-LCD, wenn Du in jeder Zeile 4 zweistellige
Werte anzeigen lässt. Allerdings ist dann kein Platz mehr für
erklärenden Text. Die Ausgaberoutine sollte dann von der Mainloop etwa
2..4 mal pro Sekunde aufgerufen werden und könnte so aussehen:

 locate 0,0 ;erste Position der ersten Zeile
 print8 r0 ;1. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r1 ;2. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r2 ;3. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r3 ;4. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 locate 1,0 ;erste Position der zweiten Zeile
 print8 r4 ;5. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r5 ;6. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r6 ;7. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen
 print8 r7 ;8. Wert
 print '%' ;Prozent-Zeichen
 print ' ' ;Leerzeichen

Falls die Werte dreistellig werden könnten (100) dann solltest Du pwu
auf 99 setzen, damit die Werte garantiert zweistellig bleiben.

Etwas effizienter wird es, wenn Du die Werte in einer Schleife über
Pointerzugriff in ein anderes Register kopierst und die Ausgaberoutine
nur einmal schreibst. Das spart Flash, kostet aber geringfügig mehr
Rechenzeit.

...

von Kay B. (newbie)


Lesenswert?

hi hannes,

danke erstmal für die mühe


werd mir das in den nächsten tagen mal genau studieren damit ich das
auch mal begreife,zurzeit habe ich auch nicht soviel zeit.
falls ich damit noch probleme habe kann ich mich ja noch mal melden.

danke nochmals

von Kay B. (newbie)


Angehängte Dateien:

Lesenswert?

hallo hannes,

sitze jetzt schon den ganzen tag dran und komm auf keinen grünen
zweig.
allerdings weiss ich ich nicht so richtig wo ich  die richtigen zeilen
im programm schreibe,
Um den zugehörigen
PWM-Wert, der im Register r0..r7 anzeigen zulassen .

besteht denn die möglichkeit mal nur für einen wert das programm zum
laufen zubringen, wo ich denn weiter üben kann.
ihr hab ja da viel mehr erfahrung als ich.


habe das programm mal angehängt soweit ich gekommen bin

hoffe ich gehe hier keinen aufn geist

mfg kay

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Also so (wie im Anhang) funktioniert es. Dazu habe ich schnell noch
einen LCD-Treiber auf 2x16 angepasst, der folgt im nächsten Beitrag,
denn ZIP mag ich im Diskussionsforum nicht so sehr.

...

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Und hier ist der verwendete LCD-Treiber. Das eingebundene LCDprint poste
ich hier nicht nochmal, es entspricht dem bereits als Link genannten
LCDprint.

...

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Und so (Anhang) sieht es aus.

Ich hoffe, es dient Dir als Basis zum Weiterentwickeln.

Das Programm ist übrigens alles Andere als optimal, da müsste Vieles
verbessert werden.

Zuerst sollte man die 8 Sollwerte aus den Registern ins SRAM
verlagern.

Dann gibt es die temporäre Variable 'temp', aber auch die temporären
Variablen 'wl' und 'wh'. Da könnte mal aufgeräumt werden. Sowas
passiert nunmal, wenn man mal schnell Routinen verschiedener Herkunft
(oder aus verschiedenen "Epochen") zusammenkopiert.

Übrigens: Wenn Du beim Assemblieren Fehlermeldungen bekommst, dann
drück mal die F4-Taste oder mach' einen Doppelklick auf die
betreffende Fehlermeldung. "Da werden Sie geholfen..."

Achja, da ich keinen AT90S8515 mehr da habe (sind alle für die
Feuerwerk-Zündgeräte draufgegangen), musste ich das Programm auf
Mega8515 umschreiben, indem ich die Interrupt-Sprungtabelle
ausgetauscht habe. Ich habe den internen Oszillator auf 8MHz
eingestellt.

Viel Spaß damit...

...

von Kay B. (newbie)


Lesenswert?

hi hannes,
danke nochmal
kann ich mir dann mal genau anschauen und studieren
so jetzt muss ich zur arbeit.
danke.
mfg kay

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.