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]