Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung: ATmega32 + DEM16481


von Jeremia (jeb) (Gast)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

Hi!

Würden 5ms genügen? Probiere das mit den nops mal aus. Laut Datenblatt 
genügen 220ns.

mfg, jeb

von Jeremia (jeb) (Gast)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.