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.
Hi Sany! Eine vollständige Beschreibung findest du hier: http://www.lcd-module.de/eng/pdf/zubehoer/ks0108b.pdf Gruß! Wieland
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
> 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
> 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.
...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.. ;-)
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 :)
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.
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
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
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.
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.
Hab grade noch was Interessantes gefunden und zwar ein AM29F040B-90PC V Das müsste doch eigentlich ein einsetzbarer flash sein?
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 :(
> RESET liegt dauerhaft auf GND.
Dann KANN ja nichts funktionieren.
Das ist als ob man beim Auto dauernd den Anlasser betätigt hat.
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...
Hmmm..., sieht im Datenblatt gerade anders herum aus. Gruß Reinhard
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..
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...
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
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!
>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.
Wie kann man das Problem beseitigen? Keine Ahnung da ich nur C Code gefunden habe!
sieh bei www.icplan.de nach - da wird Dir geholfen Gruss Otto
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
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 :)
>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.
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
> 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
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
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
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
Wie springt er in/nach char _out10, was ist register (welches)? Grüße
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
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.
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
Hallo, interessiere mich fuer das Tool 'avalon', welches 'spess53' als Screenshot angehaengt hat. Kennt jemand den Ursprung? Danke.
Hi >interessiere mich fuer das Tool 'avalon', welches 'spess53' als >Screenshot angehaengt hat. >Kennt jemand den Ursprung? Ja. Selbstgeschrieben. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.