Hallo zusammen!
Ich habe ein kleines Programm geschrieben um die Ansteuerung eines LCD
auszuprobieren. Dabei habe ich mich streng ans tutorial gehalten.
Trotzdem funktionierts nicht. Das LCD zeigt nichts an. Kann mir jemand
helfen? Was habe ich übersehen? Ich habe bereits ähnliche Beiträge im
Forum durchsucht aber nichts vergleichbares gefunden. Mein Atmega32
läuft mit 16MHz die Warteschleifen sind lang genug und mit dem Oszi
überprüft.
Hier mein code:
.include "m32def.inc"
.equ LCD_DDR = DDRA
.equ LCD_PORT = PORTA
.def temp = r16
.def temp1 = r17
.def temp2 = r18
.def data = r19
.def command = r20
ldi temp, LOW(RAMEND) ;Stack-Pointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0xFF ;LCD_PORT als Ausgang definieren
out LCD_DDR, temp
rjmp main ;Sprung zum Hauptprogramm
;Ein Daten-Byte an das LCD senden
lcd_data: mov temp1, data ;Oberes Nibble übertragen
swap temp1
andi temp1, 0b00001111
sbr temp1, 1<<4 ;RS Pin auf 1 setzen für Daten
out LCD_PORT, temp1
rcall lcd_enable
mov temp1, data ;Unteres Nibble übertragen
andi temp1, 0b00001111
sbr temp1, 1<<4 ;RS Pin auf 1 setzen für Daten
out LCD_PORT, temp1
rcall lcd_enable
rcall wait_50us
ret
;Einen Befehl an das LCD senden
lcd_command: mov temp1, command ;Oberes Nibble übertragen
swap temp1
andi temp1, 0b00001111 ;RS Pin bleibt auf 0 für Daten
out LCD_PORT, temp1
rcall lcd_enable
mov temp1, command ;Unteres Nibble übertragen
andi temp1, 0b00001111 ;RS Pin bleibt auf 0 für Daten
out LCD_PORT, temp1
rcall lcd_enable
rcall wait_50us
ret
;Enable Impuls
lcd_enable: sbi LCD_PORT, 5
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi LCD_PORT, 5
ret
;50us Warteschleife
wait_50us: ldi r16, 0 ;50us warten
wait_50us_loop: dec r16
brne wait_50us_loop
ret
;5ms Warteschleife
wait_5ms: ldi r16, 0 ;5ms warten
wait_5ms_1: ldi r17, 105
wait_5ms_loop: dec r17
brne wait_5ms_loop
dec r16
brne wait_5ms_1
ret
;Initialisierung des LCD
lcd_init: ldi temp2, 50 ;Wartezeit nach Einschalten
powerup_wait: rcall wait_5ms
dec temp2
brne powerup_wait
ldi temp, 0b00000011 ;Wird 3 mal hintereinander
gesendet
out LCD_PORT, temp
rcall lcd_enable
rcall wait_5ms
rcall lcd_enable
rcall wait_5ms
rcall lcd_enable
rcall wait_5ms
ldi temp, 0b00000010 ;Umschalten in den 4-Bit-Modus
out LCD_PORT, temp
rcall lcd_enable
rcall wait_5ms
ldi command, 0b00101000 ;Konfiguration des LCD:
rcall lcd_command ;4-Bit, 2-Zeilig, 5x7 Pixel
ldi command, 0b00001100 ;Display an, Cursor aus,
Cursor-Blinken aus
rcall lcd_command
ldi command, 0b00000100 ;Inkrement, kein Scrollen
rcall lcd_command
ret
;Löschen der Anzeige
lcd_clear: ldi command, 0b00000001
rcall lcd_command
rcall wait_5ms
ret
;Cursor auf Home-Position
lcd_home: ldi command, 0b00000010
rcall lcd_command
rcall wait_5ms
ret
;=============
;Hauptprogramm
;=============
main: rcall lcd_init
rcall lcd_clear
loop: ldi data, 'a'
rcall lcd_data
rjmp loop
rjmp end
end: rjmp end ;Endlosschleife am Programmende
Vielen Dank für die Hilfe!
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.