Forum: Mikrocontroller und Digitale Elektronik LCD-Dispaly ansteuern


von Wolfgang B. (apfelwolle)


Lesenswert?

Hallo,
ich hab zwar vor ewigen Zeiten Elektroniker gelernt aber mit PICs hatte 
ich bis heute nichts zu tun. Aber man möchte ja weiter kommen...

Ich möchte ein zwei bis drei Zeiliges LCD-Display ansteuern um dort 
einen Text abspielen zu lassen.

So nun zu meinen Fragen:

- Gibt es einen Schaltpalan mit erklärung für so was?
- welchen PIC nehme ich am besten?
- wieviel Text kann gespeichert werden?

Vielen Dank für Eure Antworten

Wolfgang

von juppi (Gast)


Lesenswert?

Sprut.de

von K. J. (Gast)


Lesenswert?

Wolfgang Bertram schrieb:
>
> - Gibt es einen Schaltpalan mit erklärung für so was?

Sprut.de

> - welchen PIC nehme ich am besten?

Denke mal das da noch andere Sachen dran sollen und nicht nur das 
Display vileicht nen 18f2550 oder 18f4550?

> - wieviel Text kann gespeichert werden?

Wen du es geschickt machst ne ganze mänge notfalls haste ja noch nen 
eeprom oder du dengelst nen externes an.

von portozahlender Entwickler (Gast)


Lesenswert?

>drei Zeiliges LCD-Display

Sehr ungewöhnlich, vielleicht reicht auch ein 2- oder 4-zeiliges aus?

>wieviel Text kann gespeichert werden?

Genau 1 alphanumerisches Zeichen pro Byte Speicher. Sobald du einen PIC 
ausgesucht und die LCD-Routinen fertig hast, kannst du das also leicht 
selbst 'ausrechnen'.

> - welchen PIC nehme ich am besten?

Such dir einen aus. Die parametrische Suche auf microchip.com kann hier 
weiterhelfen.

von Wolfgang B. (apfelwolle)


Lesenswert?

Danke für die schnellen Antworten.

Vielleicht hilft es wohl wenn ich Euch schreibe was ich bauen möchte.

Das Display soll in eine Art Diorama eingebaut werden welches einen 
Festen Text ausgibt. Der Text soll auf etwa fünf Seiten bei einem 
Display mit vier Zeilen angezeigt werden. Das ganze soll von selbst nach 
dem Einschalten starten und endlos bis zum Ausschalten laufen.

von Diensthabender Troll (Gast)


Lesenswert?

für diesen zweck reicht auch ein schön bedrucktes blatt papier. <:-)

wenn es statt des PICs auch ein AVR sein darf, dann schau mal hier:
http://www.mikrocontroller.net/articles/AVR

von K. J. (Gast)


Lesenswert?

naja bei einen 4x20 sind das 80 Zeichen x 4 Seiten alsoo 320 Zeichen des 
bekomste locker in fast jeden PIC

von Wolfgang B. (apfelwolle)


Lesenswert?

Ja ich glaube der AVR ist genau das was ich für mein Projekt brauche.
Mal sehen ob ich das so hin bekomme. Es hat zufällig nicht schon einmal 
wer so was gebaut? Wenn es recht ist berichte ich von meinem Projekt so 
jetzt ist lesen und googeln angesagt.

von Tim S. (Firma: Germany) (timex09)


Lesenswert?

www.myAVR.de

damit hab ich angefangen ist ganz easy erklärt usw....

von Diensthabender Troll (Gast)


Lesenswert?

> Es hat zufällig nicht schon einmal wer so was gebaut?

Aber sicher doch. Nur mit zusätzlichen Features wie Tasten, Sensoren und 
weiterer Peripherie. Beim stupiden Ausgeben eines festen Textes 
langweilt sich so ein AVR doch zu Tode. So ein kleiner Kerl kann doch 
noch allerhand mehr.

von Wolfgang B. (apfelwolle)


Lesenswert?

Das Projekt braucht halt nicht mehr. Aber heute so beim Werkeln an Haus 
und Hof sind mir da schon zwei Sachen aufgefallen die ich mit einer 
guten Steuerung verbessern könnte.

Im Moment schaue ich nach einer Entwicklungsumgebung mit Brenner weil 
ich nur mit Macs arbeite ist es nicht so einfach. Freitag geht es zu 
C.... zum Material kaufen.

von Wolfgang B. (apfelwolle)


Lesenswert?

So, ich habe mir ein Board (myavr) zugelegt einen Windowsrechner zum 
laufen gebracht und habe jetz auf meinem Display das Wort Test stehen!

Jetzt bekomme ich es nicht hin in Assembler einen konstanten Text in den 
Flash oder den Eprom zu schreiben.

Dann noch die Frage wie kann ich dann die Seiten wechseln.

Es soll dann so aussehen

Hallo

15 sek. Pause

Bla

15 sek. Pause

Bla

15 sek. Pause

wieder Hallo

Alles also in einer Endlosschleife

von Hannes Lux (Gast)


Angehängte Dateien:

Lesenswert?

> Jetzt bekomme ich es nicht hin in Assembler einen konstanten Text in den
> Flash oder den Eprom zu schreiben.

Da könnte Dir die .db-Anweisung helfen.

Irgendwo hinter oder zwischen den Programmroutinen ein Label (als Alias 
für die Adresse) und dahinter die Daten bzw. den Text:
1
mein_text:
2
.db "bla zum Ersten...",0
Aus dem Label "mein_text" kann der Assembler die Adresse berechnen.
Die Daten können in verschiedenen Formaten angegeben werden, dezimal, 
oktal, hexadezimal, binär oder ASCII. Auch Terme sind möglich. Im obigen 
Beispiel sind die Daten in ASCII angegeben. Die 0 amm Ende dient der 
Kennzeichnung des Stringendes für die Ausgaberoutine. Dafür gibt es zwar 
auch Platzhalter (aus der C-Syntax), ich bevorzuge aber die 0. Achte 
darauf, dass die Anzahl der Bytes um Flash immer geradzahlig sein muss, 
denn der Flash ist nicht in Bytes, sindern in Words (2 Bytes) 
organisiert.

Einzelheiten findet man in der Hilfe zum AVR-Assembler2, die Bestandteil 
der Hilfe des AVR-Studio4 ist.

Solltest Du Daten im EEPROM ablegen wollen, dann musst Du zuvor mit 
.eseg dem Assembler mitteilen, dass Du das EEP meinst.

> Dann noch die Frage wie kann ich dann die Seiten wechseln.

Indem Du einen anderen String an das LCD sendest.

Im Anhang ist der Teil meiner LCD-Routinensammlung, der zur Ausgabe von 
Texten dient, die im Flash liegen. Da ist auch eine Routine zum Ausgeben 
indizierter Texte dabei.

Hier noch ein Aufrufbeispiel dazu:
1
menuend:
2
 printt menutab,mp          ;Menütext ausgeben
3
4
menutab:
5
.dw mt0,mt1,mt2,mt3,mt4,mt5,mt6
6
menuend1:
7
 clr tfl                    ;Tastenflags löschen
8
 ret                        ;fertig
Weiter unten im Programmtext stehen dann die Daten:
1
mt0:    .db 4,0
2
mt1:    .db 4,"Max. Temperatur",13,5,39,"C",0,0
3
mt2:    .db 4,"Hysterese",13,5,39,"C",0,0
4
mt3:    .db 4,"Ausschalt-Zeit",13,6," mmm:ss",0,0
5
mt4:    .db 4,"Alarmton-Start",13,5,0
6
mt5:    .db 4,"Alarmton-Sweep",13,5,0
7
mt6:    .db 4," (c) 03/2007 by",13,"www.hanneslux.de",0
Hierbei ist "menutab" die Liste der Adressen der Menütexte. Sie wird 
nicht in numerischen Adressen angegeben, sondern in den Labels der 
Menütexte (mt0 bis mt6), die ja deren Adresse verkörpern. .dw dient zum 
Auflisten von Words (16-Bit-Zahlen), so wie .db zum Auflisten von Bytes 
dient.

...

von Hannes Lux (Gast)


Lesenswert?

Sorry, das Beispiel ist ein bisschen durcheinandergeraten. So sollte es 
richtig sein:

Hier noch ein Aufrufbeispiel dazu:
1
menuend:
2
 printt menutab,mp          ;Menütext ausgeben
3
menuend1:
4
 clr tfl                    ;Tastenflags löschen
5
 ret                        ;fertig
Weiter unten im Programmtext stehen dann die Daten:
1
menutab:
2
.dw mt0,mt1,mt2,mt3,mt4,mt5,mt6
3
4
mt0:    .db 4,0
5
mt1:    .db 4,"Max. Temperatur",13,5,39,"C",0,0
6
mt2:    .db 4,"Hysterese",13,5,39,"C",0,0
7
mt3:    .db 4,"Ausschalt-Zeit",13,6," mmm:ss",0,0
8
mt4:    .db 4,"Alarmton-Start",13,5,0
9
mt5:    .db 4,"Alarmton-Sweep",13,5,0
10
mt6:    .db 4," (c) 03/2007 by",13,"www.hanneslux.de",0

Erklärung siehe oben...

...

von Wolfgang B. (apfelwolle)


Lesenswert?

So gut der Code ist für Euch sicher etwas gebastelt aber ich möchte ja 
lernen! Schlimmer noch er geht nicht!

Ich dachte mir ich lass den ersten Text anzeigen.
Mache eine Pause und es kommt der nächste Text
1
.include "m8def.inc"
2
3
4
.def temp1 = r16
5
.def temp2 = r17
6
.def temp3 = r18
7
 
8
 
9
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
10
           out SPL, temp1
11
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
12
           out SPH, temp1
13
 
14
           rcall lcd_init              ; Display initialisieren
15
           rcall lcd_clear             ; Display löschen
16
 
17
           ldi ZL, LOW(text1*2)         ; Adresse des Strings in den
18
           ldi ZH, HIGH(text1*2)        ; Z-Pointer laden
19
20
           rcall lcd_flash_string      ; Unterprogramm gibt String aus der
21
                                       ; durch den Z-Pointer adressiert wird

RCALL Delay10

ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, temp1

           rcall lcd_init              ; Display initialisieren
           rcall lcd_clear             ; Display löschen

           ldi ZL, LOW(text2*2)         ; Adresse des Strings in den
           ldi ZH, HIGH(text2*2)        ; Z-Pointer laden

           rcall lcd_flash_string      ; Unterprogramm gibt String aus 
der
                                       ; durch den Z-Pointer adressiert 
wird

loop:
           rjmp loop


text1:
           .db "Test 1",0   ; Stringkonstante, durch eine 0

text2:
           .db "Test 2",0   ; Stringkonstante, durch eine 0



.include "lcd-routines.asm"            ; LCD Funktionen

 ; Einen konstanten Text aus dem Flash Speicher
 ; ausgeben. Der Text wird mit einer 0 beendet
lcd_flash_string:
           push  temp1
           push  ZH
           push  ZL

lcd_flash_string_1:
           lpm   temp1, Z+
           cpi   temp1, 0
           breq  lcd_flash_string_2
           rcall  lcd_data
           rjmp  lcd_flash_string_1

lcd_flash_string_2:
           pop   ZL
           pop   ZH
           pop   temp1
           ret

Delay10:
    NOP
    NOP
    NOP
  NOP
    NOP
    NOP
  NOP
    RET

von Wolfgang B. (apfelwolle)


Lesenswert?

Schrott was ich da gedacht habe NOP ist viel zu kurz!

Kann ich wenigstens so die Texte in den Speicher schreiben?

Dann funktioniert bei mir der Zeilenumbruch noch nicht. Wenn ich eine 10 
ans Ende stelle schreibt er nur ein seltsames Zeichen

von spess53 (Gast)


Lesenswert?

Hi

>Dann funktioniert bei mir der Zeilenumbruch noch nicht. Wenn ich eine 10
>ans Ende stelle schreibt er nur ein seltsames Zeichen

Das LCD kennt keinen Zeilenumbruch.

MfG Spess

von Wolfgang B. (apfelwolle)


Lesenswert?

Und wie komme ich dann in Zeile 2?

von Thomas (kosmos)


Angehängte Dateien:

Lesenswert?

wenn es sich um diesen Controller handelt 
http://www.mikrocontroller.net/articles/HD44780 dann musst du einfach an 
die entsprechende DDRAM Adresse dein Zeichen schreiben

bei meinem 2x20 Display hat geht die erste Zeile bis 80hex und die 
zweite geht bei 81hex los. Kommt aber immer aufs Display drauf an 
ansonsten probier mal die Adressen wie im Anhang also bis 40hex und ab 
41hex oder du läßt das Display schieben damit du siehst wo deine Daten 
landen.

von Wolfgang B. (apfelwolle)


Lesenswert?

GESCHAFFT!! Ich hatte erst Riesen Frust weil nichts geklappt hat aber 
dann habe ich mir Bascom heruntergeladen und alles in Basic 
programmiert: Basic kann ich noch etwas von früher somit waren alle 
meine Problem recht schnell gelöst. Das Gerät läuft nun und ist 
eingebaut. Derzeit is alles beim Grafiker zum  Bekleben der Frontplatte. 
Wenn alles fertig ist mache ich Bilder und stelle sie hier rein. Im 
Moment überlege ich, ob ich dem ganzen noch ein Thermometer spendiere. 
Ressourcen sind ja noch zu genüge auf dem Baustein frei. Mal sehen ob 
die Zeit noch reicht...

von Wolfgang B. (apfelwolle)


Angehängte Dateien:

Lesenswert?

So, Dank diesem klasse Forum mit klasse Leuten ist mein erstes Projekt 
fast fertig. Fast weil das Diorama noch eine Funkuhr bekommt ich aber 
keine Zeit mehr für den Einbau hatte. Kein zweifel nach Jahren der 
Abstinenz bin ich wieder zurück am Elektronik basteln und die nächsten 
Projekte sind schon in Planung. Dazu aber später mehr. Danke an alle. Im 
Anhang noch Bilder vom fertigen Diorama.

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.