von
Jeremia (jeb) (Gast)
16.02.2007 22:24
Hallo!
Ich bin noch ziemlich neu im Mikrocontrollerbereich, habe aber bereits
Erfahrung im Programmieren. Ich versuche gerade, ein LCD-Display mit
meinem ATmega32 anzusteuern. Leider funktioniert es nicht. Es handelt
sich um ein DEM16481, gekauft bei csd-electronics. Es ist ein
KS0070B-Chip drauf. Der Code entspricht ziemlich dem im AVR-Tutorial .
Angepasst sind nur die Pins und die delay_5ms-Funktion. DB 4-7 sind an
Port-C 4-7. Nachdem der Code nicht funktionierte, probierte ich es nach
der Variante im Datenblatt aus:
http://www.csd-electronics.de/data/pdf/DEM16481SYH-LY.pdf aber auch das
ging nicht. Ich würde mich freuen, wenn sich jemand meinen Code angucken
könnte. Mir ist bewusst, das es recht viele Zeilen sind. Im IRC hab ich
auch schon nachgefragt.
Vielen Dank,
jeb
test.asm: 1 .include "m32def.inc"
2 rjmp start
3 ;; other includes
4 .include "lcd.inc"
5
6 start:
7
8 ;; RAM-Setup
9 ldi r16,LOW(RAMEND)
10 out SPL,r16
11 ldi r16,HIGH(RAMEND)
12 out SPH,r16
13
14 ;; LCD-Setup
15 ldi r16,0xFF
16 out DDRC,r16
17 out PORTC,r16
18
19 ;; Checking LCD-Display
20 rcall lcd_init
21 rcall lcd_clear
22
23 ldi r16,'T'
24 rcall lcd_data
25
26 ldi r16,'e'
27 rcall lcd_data
28
29 ldi r16,'s'
30 rcall lcd_data
31
32 ldi r16,'t'
33 rcall lcd_data
34
35 ldi r16,'!'
36 rcall lcd_data
37
38 end: rjmp end
lcd.inc: 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;;; LCD-Routines ;;;;
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;; Functions for public access: ;;
5 ;; ============================ ;;
6 ;; ;;
7 ;; lcd_init: inits the lcd ;;
8 ;; with needed ;;
9 ;; data ;;
10 ;; lcd_command: sends a cmd ;;
11 ;; to the lcd ;;
12 ;; lcd_data: sends a data ;;
13 ;; byte to lcd ;;
14 ;; lcd_clear: clears lcd ;;
15 ;; lcd_home: moves cursor ;;
16 ;; to beginning ;;
17 ;; ;;
18 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19
20 .equ LCD_PORT = PORTC
21 .equ LCD_DDR = DDRC
22 .equ PIN_E = 3
23 .equ PIN_RS = 2
24
25 .equ DELAY_50US = $42
26 .equ DELAY_5MS = 100
27
28
29 ; Delay 50us
30 lcd_delay_50us:
31 push r16
32 ldi r16,DELAY_50US
33 lcd_delay_50us_:
34 dec r16
35 brne lcd_delay_50us_
36 pop r16
37 ret
38
39 ; Delay 5ms
40 lcd_delay_5ms:
41 push r16
42 push r17
43 ldi r17,DELAY_5MS
44 lcd_delay_5ms_:
45 ldi r16,DELAY_50US
46 lcd_delay_5ms__:
47 dec r16
48 brne lcd_delay_5ms__
49 dec r17
50 brne lcd_delay_5ms_
51 pop r17
52 pop r16
53 ret
54
55 ; Enable ON -> store data in LCD
56 lcd_enable:
57 sbi LCD_PORT,PIN_E
58 nop
59 nop
60 nop
61 cbi LCD_PORT,PIN_E
62 ret
63
64 ; Send command to LCD
65 lcd_command:
66 push r17
67 push r16
68 mov r17,r16
69 andi r16,0b11110000
70 out LCD_PORT,r16
71 rcall lcd_enable
72 swap r17
73 andi r17,0b11110000
74 out LCD_PORT,r17
75 rcall lcd_enable
76 rcall lcd_delay_50us
77 pop r16
78 pop r17
79 ret
80
81 ; Send data to LCD (rs=1)
82 lcd_data:
83 push r17
84 push r16
85 mov r17,r16
86 andi r16,0b11110000
87 sbr r16,1<<PIN_RS
88 out LCD_PORT,r16
89 rcall lcd_enable
90 swap r17
91 andi r17,0b11110000
92 sbr r17,1<<PIN_RS
93 out LCD_PORT,r17
94 rcall lcd_enable
95 rcall lcd_delay_50us
96 pop r16
97 pop r17
98 ret
99
100 ; Initialize LCD
101 lcd_init:
102 push r16 ; Setting data direction
103 ldi r16,0xFF
104 out LCD_DDR,r16
105
106 ldi r16,6 ; Wait for lcd power-up
107 lcd_powerup:
108 rcall lcd_delay_5ms
109 dec r16
110 brne lcd_powerup
111
112 ; ldi r16,0b00000011 ; Send init-msg 3x
113 ; out LCD_PORT,r16
114 ; rcall lcd_enable
115 ; rcall lcd_delay_5ms
116 ; rcall lcd_enable
117 ; rcall lcd_delay_5ms
118 ; rcall lcd_enable
119 ; rcall lcd_delay_5ms
120 ; ldi r16,0b00000010 ; 4-bit mode
121 ; out LCD_PORT,r16
122 ; rcall lcd_enable
123 ; rcall lcd_delay_5ms
124 ; ldi r16,0b00101000 ; 4-bit,2/4 lines
125 ; rcall lcd_command
126 ; ldi r16,0b00001100 ; display=on,cursor=off,blink=off
127 ; rcall lcd_command
128 ; ldi r16,0b00000100 ; dec,no scroll
129 ; rcall lcd_command
130
131 ; init like in datasheet for dem16481
132 ldi r16,0b00100000
133 rcall lcd_command
134 rcall lcd_command
135 ldi r16,0b10000000
136 rcall lcd_command
137 ldi r16,0b00000000
138 rcall lcd_command
139 ldi r16,0b11000000
140 rcall lcd_command
141 ldi r16,0b00000000
142 rcall lcd_command
143 ldi r16,0b00010000
144 rcall lcd_command
145 rcall lcd_delay_5ms
146 ldi r16,0b00000000
147 rcall lcd_command
148 ldi r16,0b01000000
149 rcall lcd_command
150
151 pop r16
152 ret
153
154 ; Clear LCD
155 lcd_clear:
156 push r16
157 ldi r16,0b00000001
158 rcall lcd_command
159 rcall lcd_delay_5ms
160 pop r16
161 ret
162
163 ; Cursor @ home position
164 lcd_home:
165 push r16
166 ldi r16,0b00000010
167 rcall lcd_command
168 rcall lcd_delay_5ms
169 pop r16
170 ret
von
Otto (Gast)
16.02.2007 22:35
Hallo Jeremia,
für meinen Geschmack sind sowohl die
"Delays" im "LCD-Init" als auch das
"LCD-enable" sehr kurz....
Gruss Otto
von
Jeremia (jeb) (Gast)
16.02.2007 22:38
Hi!
Würden 5ms genügen? Probiere das mit den nops mal aus. Laut Datenblatt
genügen 220ns.
mfg, jeb
von
Jeremia (jeb) (Gast)
16.02.2007 22:48
Folgendes ist mir aufgefallen: Wenn ich die Stromversorgung einschalte,
dann sind für etwa 1s alle Zeichen auf dem Display scwarz, dann nur noch
die 1. und 3. Reihe. Trenne ich das Display vom Netz und schliesse ich
es wieder an, so sind es direkt 1 und 3. Könnte das am Programm oder
daran liegen, dass Programmer, Controller und Display gleichzeitig
anfangen zu arbeiten?
von
Otto (Gast)
16.02.2007 22:57
Hallo Jeremia,
dann wird generell nur die 2. Reihe initialisiert
ggf. gehen daher Deine Buchstaben ins Nirvana
(in die erste nicht initialisierte Zeile)
Versuche mal, 120 Zeichen auszugeben, dann siehst
Du ob die 2. Zeile richtig initialisiert ist.
Und überprüfe bitte Dein "Init"
Gruss Otto
von
Jeremia (jeb) (Gast)
16.02.2007 23:19
Hi!
Also ich habe noch zwei Fehler gefunden (1x falscher pin, einige labels
falsch) und jetzt funktioniert es. Vielen Dank.
mfg, jeb
von
arthur (Gast)
06.04.2009 17:51
habe auch so ein Display heute gekauft.
hast am Display Änderungen an den Jumpers vornehmen müssen oder sonst
was am Display?
Danke Arthur
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.