Forum: Mikrocontroller und Digitale Elektronik 128x64 Grafik LCD An Atmega 8/16/32


von Daniel S. (sany)


Lesenswert?

Hallöchen,

Bin nun im Besitz eines Grafischen 128x64 LCDs von Pollin (TG12864B-13) 
mit einem KS0108 kompatiblen Controller.

Ich hab folgende PINS aus dem Datenblatt:

1 -> VSS
2 -> VDD
3 -> V0
4 -> D/I
5 -> R/W
6 -> E
7 -> DB0
8 -> DB1
9 -> DB2
10 -> DB3
11 -> DB4
12 -> DB5
13 -> DB6
14 -> DB7
15 -> CS1
16 -> CS2
17 -> /RST
18 -> VEE
19 -> A
20 -> K

Hab gleich mehrere Fragen bezüglich des Anschlusses an meinen Atmel,
Hab folgende Atmels zur Verfügung: AtMega8515, 2x Atmega 16 und ein 
Atmega 32

1. Welche PINS muss Ich nun an meinen Atmel Anschließen?
2. Was hat V0, D/I, CS1, CS2, RST  VEE / A und K für eine Funktion?

Ist es besser wenn ich einen Atmel für die Display Ansteuerung nutze und 
einen Atmel für mein eigentliches Programm verwende?

Kann meinem Datenblatt nicht wirklich viel diesbezüglich entnehmen.

Wo finde ich denn ein Datenblatt zum ansteuern des LCDs? Hab unter 
google zum KS0180 nichts gefunden :(

Wäre für Hilfe Dankbar :)

Sany.

von Patrick W. (wieland)


Lesenswert?

Hi Sany!

Eine vollständige Beschreibung findest du hier:
http://www.lcd-module.de/eng/pdf/zubehoer/ks0108b.pdf

Gruß!
Wieland

von Daniel S. (sany)


Lesenswert?

Vielen dank.

Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich 
nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen 
soll?

gruß
daniel

von Magnus Müller (Gast)


Lesenswert?

> Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich
> nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen
> soll?

Alle drei sind dafür geeignet (stellen eine ausreichende Anzahl von 
Ports zur Verfügung). Die Frage ist eher: wieviele Portpins benötigst Du 
noch für andere Zwecke?

Gruß,
Magnetus

von Patrick W. (wieland)


Lesenswert?

> Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich
> nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen
> soll?

Nimm den ATmega16, der ist billiger als der ATmega32 und du hast zwei 
Stück davon, es ist also nicht ganz so schlimm, wenn dir einer 
kaputtgeht.
An welche Ports du das Display hängst ist völlig egal, aber ich würde 
die Leitungen für die Datenbits, also DB0..DB7, auf jedenfall zusammen 
an einen Port packen (z.B. PA0..PA7). Wenn du nicht beabsichtigst auch 
vom Bilschirm zu "lesen", dann kannst du (nagel mich bitte nicht darauf 
fest, sondern schau nochmal im Datenblatt nach) die R/W-Leitung auch 
dauerhaft mit GND verbinden. Die Reset-Logik des Displays würde ich mit 
der des Atmels verdrahten, dann startet das LCD auch nach dem 
Programmieren über das ISP immer ordentlich neu.

von Stefan W. (wswbln)


Lesenswert?

...wenn Du mehrere Fonts und Grafikelemente auf dem Display nutzen 
möchtest, wirst Du bald feststellen, dass das Flash gar nicht gross 
genug sein kann.. ;-)

von Daniel S. (sany)


Angehängte Dateien:

Lesenswert?

Hey,

Danke für eure vielen Beiträge, hab garnicht gedacht das ich noch solche
Informationen erhalte.

Wo ich aber aktuell echt mehr Infos brauchen könnte, welche Bedeutung 
die PINs A und K vom LCD haben??

Ich bestrome mein VSS und VDD mit 5V und mein Kontrast mit 9V. nun ist 
die Frage, ob nun V0 Plus ist und VEE GND ist von meinem Kontrast...

(Datenblatt von Pollin als anlage)

Also R/W auf GND zu legen, ist wie ich in mehreren Beiträgen gelesen
habe, zwar möglich, aber auch nur wenn man die Busy Zeiten des Displays
ganz genau nimmt oder weiss..

Da ich diese ebenfalls nicht weiss und auch nicht fest anlegen möchte,
werde ich die R/W Leitung nutzen :)


Also das der Flash natürlich nieee groß genug sein kann ist mir klar,
vorallem in sachen Grafik LCD..

Aber ich hab hier noch ein hübsches Flash oder EPPROM von Atmel
rumliegen mit 256KB (AT28C256 15PC) kann ich eigentlich auch an den
Atmel dran klemmen und nutzen ?? oder würde das nciht funktionieren??

Vielen dank :)

von Uwe N. (ulegan)


Lesenswert?

Das mit der Kontrastspannung steht doch im Datenblatt: aus Vee kommt 
eine Spannung raus, die 9V negativer ist als Vdd. Du musst also keine 9V 
anlegen. Mit einem Poti stellt man die Spannung an V0 ein. Was nicht 
drin steht ist der Wert des Poti's, ich würde mal 10kOhm versuchen.
A und K sind die Anschlüsse der LED für die Hintergrundbeleuchtung. A 
ist + und K ist -. Aber vermutlich gehört ein Vorwiderstand vor A, so 
wie es bei LED's immer sein muss. Wie gross der sein muss kann man nur 
schätzen: etwa 100mA maximal für die LED, ergibt bei 5V und blauer LED 
etwa 1,5V/100mA=15 Ohm. Ziemlich wenig... Ich würde mal 100 Ohm 
verwenden, oder mehr. Bei einem ähnlichen Display versorge ich die 
Beleuchtung aus einem Portpin über 220 Ohm, das reicht im dunkeln völlig 
aus.

von Uwe N. (ulegan)


Lesenswert?

und noch zum Prozessor:
meine erste Anwendung mit einem solchen Display hab ich mit einem mega8 
gemacht, der Zeichensatz (große Zeichen) frass den halben Speicher. Die 
andere Hälfte verbrauchte dann eine unbedacht eingesetzte 
Gleitkomma-Multiplikation... Glücklicherweise hatte ich den mega168 im 
gleichen Gehäuse mit doppeltem Speicher.
Mega16 und mega32 sind doch bis auf die Speichergröße völlig gleich, 
wenn der 16-er voll ist kannst du immer noch auf den mega32 umsteigen.
Das mit dem externen Flash geht zwar, macht das ohnehin langsame Display 
aber auch nicht gerade schneller.
Ausserdem ist doch ein 28C256 ein paralleles EEPROM, das verbraucht dir 
viele Portleitungen.

Uwe

von Oliver (Gast)


Lesenswert?

Bei den geringen Preisunterschieden (ehrlich, selbst beim Reichelt reden 
wir hier nur von ein paar Euros), nimm den Prozessor mit dem größten 
Flash und SRam, den du kriegen kannst. Also, wenn DIP40 deine bevorzugte 
Bauform ist, den 32ger, oder gleich einen 644er. Alles andere ist am 
falschen Ende gespart. Nichts ist blöder, als sich bei der Einarbeitung 
in neue Hardware von Anfang an mit Speicherlimitationen rumschlagen zu 
müssen.
Später, als "Profi", kann man immer noch abspecken.

Oliver

von Markus (Gast)


Lesenswert?

Bezüglich der Portauswahl würde ich den Port, welcher auch für die 
Programmierung des Atmel zuständig ist (PortB?), nicht als LCD-Port 
verwenden, wenn das LCD diese Leitungen auch schaltet (z. B. Busy-Pin). 
Bei mir gab es manchmal Programmierfehler, von denen ich vermute, dass 
sie davon gekommen sein könnten.

Was den Speicher (SRAM) angeht (wovon der ATmega32 doppelt so viel hat 
wie der ATmega16), denke ich, dass dieser nicht groß genug sein kann. 
Bei Stack-Überläufen hat es bei mir mitunter recht lange Fehlersuchen 
gegeben, weil das Programmverhalten dann ziemlich undefiniert erscheint.

von Daniel S. (sany)


Lesenswert?

Hallo,

Danke Uwe, werde das gleich mal ausprobieren, hab gar nicht 
gesehen/gelesen das da eine Negativ Spannung rauskommt ;)

Also ich will mich nicht unbedingt auf die DIL40 festnageln, nur das 
sind halt die Prozessoren die ich aktuell nur zur Verfügung habe.

Meine Belegung sieht eigentlich so aus:

Hab mir zwei Ports am LCD geschaffen, der erste Port fasst alle 
Leitungen DB0 - DB7 und den schließe ich an PortA an meinem STK500 an.

Der Rest der Leitungen wie D/I, R/W und CS1/CS2 liegt an PortC an.

von Daniel S. (sany)


Lesenswert?

Hab grade noch was Interessantes gefunden und zwar ein AM29F040B-90PC V

Das müsste doch eigentlich ein einsetzbarer flash sein?

von Daniel S. (sany)


Lesenswert?

Hallöchen,

Jetzt muss ich meinen Beitrag nochmal nach oben holen.

Also ich krieg das mit dem GLCD und dem KS0108 Controller irgendwie 
einfach nicht gebacken.

Also, die DB0-DB7 liegen an Port A
Die Steuerleitungen wie DI, RW, EN, CS1, CS2 liegen auf Port C
RESET liegt dauerhaft auf GND.

(JTAG Deaktiviert im AtMega16)

Ich beziehe die +5V direkt vom STK500 Board.

Hab das hier im Board erhältliche GLCD Library soweit kompiliert, auch 
für den Atmega16 optimiert und alle Settings eingestellt.

Nur mein GLCD will einfach nicht rennen.

Wenn ich mein STK500 einschalte, blinkt kurz mein GLCD und geht danach 
dann an.

Dann hab ich das Problem das die linke Hälfte komplett mit Pixel 
ausgefüllt ist, die rechte jedoch bleibt ohne Pixel.

Was könnte das sein? Die Verkabelung stimmt jedoch :(

von Werner B. (Gast)


Lesenswert?

> RESET liegt dauerhaft auf GND.

Dann KANN ja nichts funktionieren.
Das ist als ob man beim Auto dauernd den Anlasser betätigt hat.

von Daniel S. (sany)


Lesenswert?

Was hat dies mit dem RESET vom Display zu tun?

Liegt das RESET vom Display auf +5V macht das Display ein Reset, daher 
ist es wohl logisch das ich RESET auf GND lege...

von Reinhard R. (reirawb)


Lesenswert?

Hmmm..., sieht im Datenblatt gerade anders herum aus.

Gruß Reinhard

von Daniel S. (sany)


Lesenswert?

Reinhard Richter wrote:
> Hmmm..., sieht im Datenblatt gerade anders herum aus.
>
> Gruß Reinhard

Hm, also wie gesagt, wenn ich 5V anlege an RESET wird der Display Inhalt 
gelöscht. Halte ich diese 5V wird nichts mehr angezeigt.

Lass ich nun RESET auf GND wird auch wieder meine linke Seite vom 
Display angezeigt..

von Daniel S. (sany)


Lesenswert?

Hallo Zusammen,

Hab das Problem nun endlich gefunden, es war jedenfalls korrekt 
verkabelt.

Was mich aber etwas Mürrisch stimmt an der ganzen Geschichte:

Mein STK500 wird von einem eigenen Trafo 12V gespeist (17,6VA)

Ich hatte ja wie besagt das LCD mit 5V vom STK500 versorgt, das war 
soweit der Dokumentation auch i.O auch in Ordnung wenn ich einen 
passenden Elko dazwischen schalte. Hab mich für einen bereits 
vorhandenen (10V 440uF) entschieden.

Nun aus unerklärlichen Gründen, wurde der LM317M auf dem STK500 richtig 
heiß. Das Board funktionierte auch tadellos sowie auch die konstanten 5V 
stimmten.
(Die Spannung konnte ich leider nicht messen, da das STK500 bei jeder 
kleinsten Überspannung abschaltet)

Hab dann ein PC-Netzteil zu Rate gezogen, dort mein LCD Verkabelt und 
angeschlossen, nun wurde auf dem Display nichts angezeigt, aber es 
flackerte deutlich weniger...

Nun mal die CS1 und CS2 Leitungen auf low gelegt nun rannte mein Display 
los...

von Stefan W. (wswbln)


Lesenswert?

Daniel Steiner wrote:
> Hallo Zusammen,
>
> ...Mein STK500 wird von einem eigenen Trafo 12V gespeist (17,6VA)...

> Nun aus unerklärlichen Gründen, wurde der LM317M auf dem STK500 richtig
> heiß.

Jo, völlig unerklärlich...   :LOL:

> Nun mal die CS1 und CS2 Leitungen auf low gelegt nun rannte mein Display
> los...

..und? Hast Du's wieder eingefangen??


SCNR,
Stefan

von I_NEED_INPUT (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen ich habe ein Problem,

siehe Bild

und zwar:

hab ich mir am WE ein LCD TG12864B-13 bei Pollin best.
Anschluss hat alles funktioniert (Beleuchtung außen vor da keine lust)

Ich möchte einen Text ausgeben in zwei Zeilen

CODE hier in ASSEMBLER:
1
;***************************************************************
2
;Programm LCD.ASM
3
;Es wird vorausgesetzt, dass die Anzeige einen HD44780 oder
4
;kompatiblen Controller verwendet.
5
;ATmega8535 mit 8 MHz Takt
6
;***************************************************************
7
8
.device  ATmega8535
9
.include "m8535def.inc"      ;muss im selben
10
          ;Verzeichnis stehen
11
;*************************************************************** 
12
;Board spezifizierungen
13
;***************************************************************
14
15
.ifndef XTAL
16
.equ XTAL = 8000000      ;Quarztakt hier: 8 MHz
17
18
;***************************************************************
19
;Definition der Steuerleitungen
20
;***************************************************************
21
22
.equ    E   = PA0    ;E an Pin PA0
23
.equ    RW  = PA1    ;RW an Pin PA1
24
.equ    RS  = PA2    ;RS an Pin PA2
25
.equ    CS1 = PA3    ;Linke Seite des Displays
26
.equ    CS2 = PA4    ;Rechte Seite des Displays
27
.equ    BF  = PC7    ;Busy flag
28
.equ    LED1 = 0b00100000
29
.equ    LED2 = 0b01000000
30
.equ    LED3 = 0b01100000
31
32
;***************************************************************
33
;LCD Befehle
34
;***************************************************************
35
36
.equ    clear_LCD  = 0b00000001  ;loesche Anzeige
37
.equ    home_LCD   = 0b00000010  ;return home
38
.equ    set_LCD    = 0b00111100  ;8 bits,2 Zeilen,5x7dots
39
.equ    LCD_on     = 0b00001110  ;schalte LCD ein
40
.equ    entry_mode = 0b00000110  ;setze Cursor
41
42
;***************************************************************
43
;Variablendefinition
44
;***************************************************************
45
46
.def    zeichen  = r0    ;Zeichen aus der Tabelle
47
.def    buffer  = r16    ;RX/TX Daten von/zu LCD
48
.def    counter  = r17    ;Zaehler fuer den Text
49
.def    temp1  = r18
50
.def    temp2  = r19
51
52
53
54
.CSEG
55
.ORG    0x00                ; Programm beginnt bei 0
56
      rjmp  main    ; Starte Hauptprogramm
57
58
;***************************************************************   
59
; Subroutine init
60
; Initialisiere PORTA
61
;***************************************************************   
62
63
init:  
64
65
    ldi     temp1,0b11111111  
66
    out    DDRA,temp1    ;PORTA ist Ausgang
67
    out    DDRD,temp1    ;PORTD ist Ausgang
68
    cbi    PORTA,E      ;E initialisieren
69
    cbi    PORTA,RS
70
    cbi    PORTA,RW
71
    cbi    PORTA,CS1    ;Linke Seite des Displays
72
    cbi    PORTA,CS2    ;Rechte Seite des Displays    
73
    ret
74
75
76
77
;***************************************************************
78
; Subroutine busy_flag
79
; Diese Routine testet, ob die LCD-Anzeige bereit ist, einen
80
; neuen Befehl oder weitere Daten zu empfangen.
81
;***************************************************************
82
83
busy_flag:    
84
    
85
    ldi    temp1,0b00000000  ;PORTC ist Eingang
86
    out    DDRC,temp1
87
    sbi    PORTA,CS1
88
    sbi    PORTA,CS2
89
    cbi    PORTA,RS    ;Befehl wird gesendet
90
    rcall  delay50us
91
    sbi    PORTA,RW    ;setze LCD in Lesemodus
92
    rcall  delay50us
93
    sbi    PORTA,E      ;spreche LCD an      
94
    rcall  delay50us
95
    sbic   PINC,BF      ;LCD bereit?                
96
    rjmp   busy_flag       ;nein, wiederhole
97
    cbi    PORTA,E      ;disable LCD        
98
    ret                     ;LCD bereit
99
100
101
;***************************************************************
102
; Subroutine write_data
103
; Diese Routine sendet Daten zur LCD-Anzeige.
104
; Die Daten muessen im Register buffer uebergeben werden.
105
;***************************************************************
106
107
write_data:
108
    rcall  busy_flag    ;LCD bereit?
109
    ldi    temp1,0b11111111  ;PORTC ist Ausgang
110
    out    DDRC,temp1
111
    sbi    PORTA,CS1
112
    sbi    PORTA,CS2
113
    sbi    PORTA,RS    ;Daten werden gesendet
114
    cbi    PORTA,RW    ;LCD in Schreibmodus
115
    sbi    PORTA,E      ;spreche LCD an
116
    out    PORTC,buffer  ;sende Daten
117
    cbi    PORTA,E      ;disable LCD
118
    ret
119
120
121
;***************************************************************
122
; Subroutine write_instr
123
; Diese Routine sendet Befehle zur LCD-Anzeige.
124
; Der Befehl muss im Register buffer uebergeben werden.
125
;***************************************************************
126
127
write_instr:
128
    rcall  busy_flag      ;LCD bereit?
129
    ldi    temp1,0b11111111  ;RB ist Ausgang
130
    out    DDRC,temp1
131
    sbi    PORTA,CS1
132
    sbi    PORTA,CS2
133
    cbi    PORTA,RS       ;Befehl wird gesendet
134
    cbi    PORTA,RW       ;LCD in Schreibmodus
135
    sbi    PORTA,E         ;spreche LCD an
136
    out    PORTC,buffer     ;sende Befehl
137
    cbi    PORTA,E         ;disable LCD
138
    ret
139
140
;*************************************************************** 
141
; Diese Routine errechnet die Pausenzeiten 50us
142
; in Abhängigkeit des eingebauten Quarz
143
;***************************************************************
144
145
delay50us:                           ; 50us Pause
146
        
147
    ldi    temp1, ( XTAL * 50 / 3 ) / 1000000
148
149
delay50us_:
150
    dec    temp1
151
    brne  delay50us_
152
    ret                          ; wieder zurück
153
 
154
;***************************************************************
155
; Hauptprogramm
156
; Schreibt "ATmega8535" in die erste Zeile und "LCD-Routine"
157
; in die zweite Zeile des LCDs.
158
;***************************************************************
159
160
main:  
161
    ldi    temp1,LOW(RAMEND)  ;setze Stack-Pointer
162
    out    SPL,temp1      ;an das SRAM-Ende
163
    ldi   temp1,HIGH(RAMEND)       
164
    out   SPH,temp1
165
166
    ldi    r19, LED1      ;LED1 AN
167
    out    PORTD, r19
168
169
    rcall  init        ;PORTA initialisieren
170
    
171
    ldi    r19, LED2      ;LED2 AN
172
    out    PORTD, r19
173
174
    ldi    buffer,set_LCD    ;setze LCD Funktion
175
    rcall  write_instr
176
177
    ldi    buffer,LCD_on    ;schalte LCD ein
178
    rcall  write_instr
179
180
    ldi    buffer,clear_LCD  ;loesche Anzeige
181
    rcall  write_instr
182
183
    ldi    buffer,entry_mode  ;Eingabemodus
184
    rcall  write_instr
185
186
    ldi    r19, LED3      ;LED1 & 2 AN
187
    out    PORTD, r19
188
189
;***************************************************************
190
;Holt den Text 'ATmega8535' aus der Tabelle und schreibt diesen
191
;in die erste Zeile der Anzeige
192
;***************************************************************
193
    ldi    counter,10      ;Zeichenzaehler
194
    ldi    ZL,LOW(Tabelle1*2)  ;Low-Zeiger auf Tabellenanfang
195
    ldi    ZH,HIGH(Tabelle1*2)  ;High-Zeiger auf Tabellenanfang
196
197
loop_msg1:
198
199
    lpm                      ;hole Zeichen aus Tabelle
200
    mov    buffer,zeichen    ;Zeichen uebergeben
201
    rcall  write_data        ;schreibe Zeichen in LCD
202
    adiw   ZL,1              ;16-Bit Zeiger erhoehen
203
    dec    counter           ;alle Zeichen gesendet?
204
    brne   loop_msg1         ;Nein! Sende naechstes Zeichen
205
206
;***************************************************************
207
;Holt den Text 'LCD-Routine' aus der Tabelle und schreibt diesen
208
;in die zweite Zeile der Anzeige
209
;***************************************************************
210
    
211
    ldi    buffer,0b11000000  ;LCD-Startadresse 2.Zeile
212
    rcall  write_instr        ;sende Befehl
213
    ldi    counter,11         ;Zeichenzaehler
214
    ldi    ZL,LOW(Tabelle2*2) ;Low-Zeiger auf Tabellenanfang
215
    ldi    ZH,HIGH(Tabelle2*2);High-Zeiger auf Tabellenanfang
216
217
loop_msg2:  
218
    
219
    lpm                       ;hole Zeichen aus Tabelle
220
    mov    buffer,zeichen     ;Zeichen uebergeben
221
    rcall  write_data         ;schreibe Zeichen in LCD
222
    adiw   ZL,1               ;16-Bit Zeiger erhoehen
223
224
no_carry2:  
225
    
226
    dec    counter        ;alle Zeichen gesendet?
227
    brne  loop_msg2       ;Nein! Sende naechstes Zeichen
228
229
230
231
;Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten
232
233
loop:  rjmp  loop
234
235
;***************************************************************
236
;Tabelle 1 mit dem Text "ATmega8535", der in die 1.Zeile
237
;geschrieben werden soll
238
;***************************************************************
239
240
Tabelle1:  .DB "ATmega8535"
241
242
;***************************************************************
243
;Tabelle 2 mit dem Text "LCD-Routine", der in die 2.Zeile
244
;geschrieben werden soll
245
;***************************************************************
246
247
Tabelle2:  .DB "LCD-Routine"
248
249
.EXIT

Es sollte eigentlich ATmega8535 und LCD-Routine auf beiden seiten 
ausgegeben werden doch statt dessen nur undefinierbar ausgegeben..
siehe Bild / Anhang

Danke im Voraus!

von holger (Gast)


Lesenswert?

>Es sollte eigentlich ATmega8535 und LCD-Routine auf beiden seiten
>ausgegeben werden doch statt dessen nur undefinierbar ausgegeben..
>siehe Bild / Anhang

Ohne Font wird da nie Text rauskommen ;)
Der KS0108 hat keinen eingebauten Font.

von I_NEED_INPUT (Gast)


Lesenswert?

Wie kann man das Problem beseitigen?

Keine Ahnung da ich nur C Code gefunden habe!

von Otto (Gast)


Lesenswert?

sieh bei www.icplan.de nach - da wird Dir geholfen

Gruss Otto

von Spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Übrigens

>   lpm                       ;hole Zeichen aus Tabelle
>   mov    buffer,zeichen     ;Zeichen uebergeben
>   rcall  write_data         ;schreibe Zeichen in LCD
>   adiw   ZL,1               ;16-Bit Zeiger erhoehen

geht einfacher:

    lpm buffer,Z+
    rcall  write_data         ;schreibe Zeichen in LCD

>Wie kann man das Problem beseitigen?

Du brauchst eine Tabelle mit .db-Anweisungen, die die Spalten deiner 
Zeichen enthalten. Hab mal schnell eine Tabelle für A..Z gemacht(Anhang)

MfG Spess

von I_NEED_INPUT (Gast)


Lesenswert?

Hi sorry aber habe keine Ahnung wie wo was und so hab ne gute lib mit 5 
verschiedenen Zeichensätzen gefunden doch das wars auch hab gedacht das 
der Standardzeichensatz auf/im Kontroller ist.

Kann mir jemand mal Anleitung geben DANKE schon mal für die 
Hilfestellung :)

von holger (Gast)


Lesenswert?

>Hi sorry aber habe keine Ahnung wie wo was und so hab ne gute lib mit 5
>verschiedenen Zeichensätzen gefunden doch das wars auch hab gedacht das
>der Standardzeichensatz auf/im Kontroller ist.

Ist er aber nicht. Besorg dir ein Display mit T6963 Controller.
Der kann auch Text.

>Kann mir jemand mal Anleitung geben DANKE schon mal für die
>Hilfestellung :)

Du musst jeden Buchstaben als Bitmap in deinem Speicher
ablegen und dann ausgeben. Dein Display hat übrigends zwei
Controller. Genau genommen hast du zwei Displays mit jeweils
64*64 Pixel vor dir.

von Otto (Gast)


Lesenswert?

Hallo,

Spess53 hat Dir bereits einen Hinweis gegeben.

Das Zeichen, dass Du darstellen willst, dient als Zeiger auf eine 
Tabelle aus 5 Bitmustern, die das eigentliche Zeichen repräsentieren.

Entweder legst Du eine Tabelle an, die nicht nur alle darzustellenden 
Zeichen, sondern auch die "Ersatzzeichen" für die nicht darstellbaren 
Zeichen enthält oder Du ziehst vom Zeichen ein Offset ab.

Willst Du eine "1" darstellen ($30), so könntest Du $30 subtrahieren und 
das Ergebnis als Zeiger auf die Tabelle verwenden.

Der Tabelleneintrag "0" enthält das Bitmuster für die "0"
Der Tabelleneintrag "1" enthält das Bitmuster für die "1"
....
Der Tabelleneintrag "n" enthält das Bitmuster für ein "z"

Anschliessend lädst Du nacheinander die 5 Bitmuster und schreibst diese 
auf das Display.

Gruss Otto

von Otto (Gast)


Lesenswert?

> Willst Du eine "1" darstellen ($30), so könntest Du $30 subtrahieren und
> das Ergebnis als Zeiger auf die Tabelle verwenden.

sollte "0" heissen - Entschuldigung

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Wo hängt es denn genau?

Ich versuch trotzdem mal einen Erklärungsversuch.

Wenn du ein Byte zum Display schickst, representieren die 8 Bits 8 
untereinanderliegende Pixel. Ein H-Bit heisst Pixel an. Ein L-Bit Pixel 
aus.
Bei einem 5x7 Font hast du 5 Spalten mit 7 Bits. Wenn du dir die linke 
Spalte von einem 'A' (Anhang) ansiehst sind Bit0 und 1 L und Bit2..6 H. 
Das ergibt Hex $7C usw. Um Das 'A' darzusellen musst du 5 Bytes mit den 
entsprechenden Bitmustern nacheinander an das Display senden. Die 
Bitmuster legt man üblicherweise im Flash ab.
Der ASCII-Zeichensatz belegt normalerweise die Codes $20..$7F. Dafür 
müssen jeweils 5Byte in der Tabelle stehen. Um ein 'A' zum Display zu 
senden errechnest aus dem ASCII-Code (A=$41) die Stelle, an der die 
Bitmuster stehen und gibst die aus.

MfG Spess

von Seppel (Gast)


Lesenswert?

Mh,

in der dritten Zeile deines ASM-Codes steht ja warum es nicht geht;-)
(HD44780=!KS108).
Schau Dir das hier mal an: Beitrag "GLCD Routinen ( KS0108, HD61202 )"

Grüße Seppel

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Ich habe dir mal nen Font, analog zum T6963 gemacht. Dazu noch eine 
Routine zum Ausgeben eines Zeichens. Ist zwar, mangels passendem Display 
nicht getestet. Müsste aber so funktionieren.

MfG Spess

von I_NEED_INPUT (Gast)


Lesenswert?

Hey danke probier ich gleich mal aus :-)

von I_NEED_INPUT (Gast)


Lesenswert?

Wie springt er in/nach char _out10, was ist register (welches)?

Grüße

von spess53 (Gast)


Lesenswert?

Hi

'Register' ist das Register, mit dem du das Darenbyte an deine 
Ausgaberoutine übergibst. Da musst du auch deine Routine einsetzen.

>Wie springt er in/nach char _out10,

Mit 'brne char_out10'.

MfG Spess

von I_NEED_INPUT (Gast)


Lesenswert?

Habs mal eingefügt ich kann jetzt ein A erkennen, jedoch sind es mehrere 
die von rechts nach links in so ner Art Laufschrift über den Bildschirm 
huschen.

Hier nochmal der Code:
1
main:  
2
    ldi    temp1, LOW(RAMEND)  ;setze Stack-Pointer
3
    out    SPL, temp1      ;an das SRAM-Ende
4
    ldi   temp1, HIGH(RAMEND)       
5
        out   SPH, temp1
6
7
    ldi    temp2, LED1      ;LED1 AN
8
    out    PORTD, temp2
9
10
    rcall  init        ;PORTA initialisieren
11
    
12
    ldi    temp2, LED2      ;LED2 AN
13
    out    PORTD, temp2
14
15
    ldi    buffer, set_LCD    ;setze LCD Funktion
16
    rcall  write_instr
17
18
    ldi    buffer, LCD_on    ;schalte LCD ein
19
    rcall  write_instr
20
21
    ldi    buffer, clear_LCD  ;loesche Anzeige
22
    rcall  write_instr
23
24
    ldi    buffer, entry_mode  ;Eingabemodus
25
    rcall  write_instr
26
27
    ldi    temp2, LED3      ;LED1 & 2 AN
28
    out    PORTD, temp2
29
30
    ldi r16,'A'
31
    rcall char_out
32
33
char_out:             
34
    push r17
35
    push ZL
36
    push ZH
37
38
    subi r16,$20                       ; erstes Zeichen subtrahieren
39
40
    mov ZL,r16                         ; Wert merken
41
    clr ZH                             ; 0 für adc
42
    clr r17                            ; Highbyte für Offset
43
    lsl r16
44
    rol r17                            ; (r16:r17)=2*Wert
45
    add r16,ZL                         ;
46
    adc r17,ZH                         ; (r16:r17)=3*Wert
47
    lsl r16                            ;
48
    rol r17                            ; (r16:r17)*2 -> Wert*6
49
    ldi ZL,Low(FONT5x7<<1)             ; Tabellenadresse nach Z
50
    ldi ZH,High(FONT5x7<<1)
51
    add ZL,r16                         ; Zeichenoffset addieren
52
    adc ZH,r17
53
54
    ldi r17,6                          ; 6 Bytes ausgeben
55
56
char_out10:           
57
    lpm buffer,Z+                    ; Byte für Display_out
58
                     
59
    rcall write_data                  ; zum Display
60
    dec r17
61
    brne char_out10
62
    pop ZH
63
    pop ZL
64
    pop r17
65
    ret
66
67
;Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten
68
69
loop:  rjmp  loop

Der Rest vom Code (vorher) ist wie im ersten posting geblieben.

von spess53 (Gast)


Lesenswert?

Hi

>    ldi r16,'A'
>    rcall char_out

>char_out:
>    push r17
>    push ZL
     ....
     ret

Du weisst was da passiert? Du rufst das Unterprogramm. Mit 'ret' springt 
an die Stelle nach 'rcall...' zurück und macht dort weiter (im 
Unterprogramm). Beim nächsten Erreichen von 'ret' springt dein Programm 
ins Nirvana und fängt irgendwann am Anfang wieder an.

Zum Testen:

               ldi r16,'A'
               rcall char_out

loop:          rjmp loop       ; Programm bleibt hier stehen

char_out:      push r17
               push ZL

MfG Spess

von bench (Gast)


Lesenswert?

Hallo,

interessiere mich fuer das Tool 'avalon', welches 'spess53' als 
Screenshot angehaengt hat.
Kennt jemand den Ursprung?

Danke.

von spess53 (Gast)


Lesenswert?

Hi

>interessiere mich fuer das Tool 'avalon', welches 'spess53' als
>Screenshot angehaengt hat.
>Kennt jemand den Ursprung?

Ja. Selbstgeschrieben.

MfG Spess

von Torsten G. (wawibu)


Lesenswert?

Finde das Tool auch sehr interessant. Stellst Du das ggf zur Verfügung?

Grüße
Torsten

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.