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]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 ;------------------------------------------------------------>







Zitieren

Lesezeichen