Hallo!

Mühe mich schon seit einiger Zeit ab, mit der Initialisierung eines LCDs mithilfe eines PICs.
Wie schon bemerkt handelt es sich um den P16F84A und ein 4x27 LCD mit 2xHD44780.
Hier ist übrigens etwas über die Vorgehensweise bei der Initialisierung des LCDs zu finden: http://home.arcor.de/stowoda/Text-LCDs.pdf

Code:
list p=16f84a

;***************************************************************************
;			PINBELEGUNG
;			   
;
; 	PORTA:		0 - RS
;			1 - RW
;			2 - E1 1.Controller
;			3 - E2 2.Controller
;			4 - 
;	
; 	PORTB:  		0 - D0
;			. - ..
;			. - ..
;			7 - D7
;
;**************************************************************************


	#include <P16F84A.INC>


	__CONFIG	_PWRTE_ON & _WDT_OFF & _XT_OSC




;***********************************************
;		VARIABLEN


schleife	 equ		 0x20
schleife2	equ		0x21
schleife3	equ		0x22
Daten		equ		0x23
count		 equ		 0x24
count2		equ		0x25


#define		RS		PORTA, 0
#define     	RW	       PORTA, 1
#define		E1		PORTA, 2
#define         E2		PORTA, 3






;***********************
;Initialisierung

Init
		
		bsf		STATUS, RP0
		movlw		B'00000000'
		movwf		TRISA
 		movwf		TRISB
		bcf		STATUS, RP0
		clrf		PORTA
		clrf		PORTB
		
		

;****************************
;LCD Initialisierung

LCD_Init
		
	
		movlw		0x30				
		movwf		Daten
		movlw		D'15'			; 15 ms
		movwf		count
		call 	         Wait_ms
		call		LCD_write_conf		; 30h ins Steuerregister
		movlw		D'5'			; 5 ms 
		movwf		count		
		call 		Wait_ms
		call		LCD_write_conf		; 30h ins Steuerregister
		call		Wait_us			; 100 us
		call		LCD_write_conf		; 30h ins Steuerregister
	
	
		movlw		0x30			; System Set, eine Zeile
		movwf		Daten
		call		LCD_write_conf
		movlw		B'00001000'		; LCD off
		movwf		Daten
		call		LCD_write_conf
		movlw		B'00000001'		; LCD clear
		movwf		Daten
		call		LCD_write_conf
		movlw		B'00000110'		; Entry mode set
		movwf		Daten
		call		LCD_write_conf
		movlw		B'00001101'		; LCD on
		movwf		Daten
		call		LCD_write_conf
		
;**************************************************
;		TEST, sende den Buchstaben A zum LCD
		
		movlw		B'00110000'
		movwf		Daten	
		call		LCD_write
	

Main	
		goto	Main


;*************************************************************
LCD_write_conf
			
		bcf		RS					; RS=0 --> Steuerregister
		bcf		RW					; RW=0 --> Schreiben
		nop
		bsf		E1
		nop					
		movf		Daten, w
		movwf		PORTB
		nop
		bcf		E1					; fallende Flanke von E
		nop
		return
		
		
;******************************************************************		
LCD_write

		call		Wait_us
		call		Wait_us
		bsf		RS
		bcf		RW
		nop
		bsf		E1
		nop
		movlw		Daten
		movwf		PORTB
		nop
		bcf		E1
		nop
		return









;********************************************************
;Warteschleife

Wait_ms
		movf	count, 0
		movwf	schleife
		
Wait2
		movlw	.110						; Konstante
		movwf	schleife2

Wait3	
		nop
		nop
		nop
		nop
		nop
		nop							; 
		nop							; 
		decfsz	schleife2, F					; 	
		goto	Wait3						; 
		
		decfsz	schleife, F
		goto	Wait2
		return

;***************************************************************
; Warteschleife 100us


		
Wait_us
		movlw	.25						; Konstante
		movwf	schleife2

Wait_us2
		
		nop
		nop							; 
		nop							; 
		decfsz	schleife2, F					; 	
		goto	Wait_us2						; 
		return

	end
Wenn ich den Saft einschalte dann seh ich manchmal einen Cursor und anschliessend ein Rautezeichen in der ersten Zeile, manchmal tauchen die Zeichen aber an anderen Stellen auf nicht immer am Anfang. Jedoch immer in der ersten Zeile.
Nach mehrmaliger Betätigung des Reset-Tasters sehe ich verschiedene Resultate und der Cursor springt, anscheinend zufällig in der ersten Zeile rum.

Kann es sein, dass in meinem Code das Timing nicht stimmt?
Könnte das jemand nachprüfen ( ob die Verzögerungsschleifen richtig gebaut sind? )

mfg und thx