Ich hab jetzt mal die änderungen vorgenommen, und mit dem delay generator eine schleife von 0,005sek (5ms) berechnet, wenn ich das programm brenne und starte passiert garnix...
und wenn ich in AVR studio simuliere scheint der beim lcd init festzustecken (in der ersten delay schleife, sieht so aus als würde der aus der schleife rauskommen und direkt wieder reingehen, wieso tut er das?
Code:
; LCD Routinen
;;;;;;;;;;;;;;;;;;
;4 Bit Interface
;Pinbelegung LCD
;
; RS - portD 2
; E - portD 3
; RW - Masse (write = Low)
; DB4 - portD 4
; DB5 - portD 5
; DB6 - portD 6
; DB7 - portD 7
;soll das display initalisieren
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lcd_init:
rcall delay5ms
ldi r16, 0b00110000 ;muss 3mal hintereinander gesendet
out Portd, r16 ;werden zur Initialisierung
rcall lcd_enable ;1
rcall delay5ms
rcall lcd_enable ;2
rcall delay5ms
rcall lcd_enable ;3
rcall delay5ms
ldi r16, 0b00100000 ;4bit-Modus einstellen
out Portd, r16
rcall lcd_enable
rcall delay5ms
ldi r16, 0b00101000 ;2 Zeilen einstellen...
rcall lcd_command
ldi r16, 0b00001100 ;Display an , Cursor u. Blinken aus
rcall lcd_command
ldi r16, 0b00000100 ;Increment ohne Display shift
rcall lcd_command
ret
;----------------------------------------->
lcd_data:
; soll daten an das LCD senden
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; erstmal das byte "sichern"
mov r17, r16
; dann die unteren bits im register auf 0 setzen
andi r16, 0b11110000
; danach RS (portD 2 auf High setzen) :
sbr r16, 0b00000100
; jetzt r16 nach portD ausgeben
out PORTD, r16
; nun muss nur noch die enable routine zum übergeben des halben bytes ausgeführt werden
rcall lcd_enable
; das selbe dann jetzt nochmal nur mit nem swap davor, um jetzt die andere hälfte des bytes zu übertragen
; und vorher aber noch das andere byte aus dem backup register holen
mov r16, r17
swap r16
andi r16, 0b11110000
sbr r16, 0b00000100
out PORTD, r16
rcall lcd_enable
;dann muss wohl noch eine delay routine ausgegeben werden, um ein paar millisekunden zu geben,
;damit das lcd die daten übernimmt, da ich ja R/W auf masse gelegt hab
rcall delay50us
; und dann zurück zum programm
ret
;------------------------------------------------------------>
lcd_command:
; soll kommandos an das LCD senden, wie lcd_data, nur ohne rs zu setzen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r17, r16
andi r16, 0b11110000
out PORTD, r16
rcall lcd_enable
; und die zweite hälfte
mov r16, r17
swap r16
andi r16, 0b11110000
out PORTD, r16
rcall lcd_enable
rcall delay50us
; und dann zurück
ret
;--------------------------------------------->
lcd_enable:
;soll den enable impuls erzeugen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; E auf High setzen (portD 3)
sbi PORTD, 3
; 5 taktzyklen warten
nop
nop
nop
nop
nop
; E wieder auf low
cbi PORTD, 3
; und zurück
ret
;-------------------------------------------------------------->
lcd_clear:
;soll das Display löschen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DB4 (portD 4 auf 1 setzen, rest auf 0
ldi r16, 0b00010000
;lcd_command ausführen
rcall lcd_command
;5ms warten
rcall delay5ms
;und zurück
ret
;------------------------------------------------------------->
delay50us:
; um dem lcd dieplay entsprechende reaktinszeiten zu lassen:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; delaying 200 cycles, 50us bei 4mhz
ldi R20, $42
WGLOOP0: dec R20
brne WGLOOP0
nop
nop
ret
;------------------------------------------------------------>
delay5ms:
; um dem lcd dieplay entsprechende reaktionszeiten zu lassen:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; delaying 19998 cycles, bein 4mhz 0,005 sek
ldi R20, $21
WGLOOP1: ldi R21, $C9
WGLOOP2: dec R21
brne WGLOOP2
dec R20
brne WGLOOP1
nop
nop
ret
;------------------------------------------------------------>
[/code]
Lesezeichen