Die Register I und J müssen einen Wert erhalten, damit die
vorgeschrieben Zeiten bei der Initialisierung eingehalten werden,
ansonsten geht nix. Z.B. bei 4MHz sieht meine Delay Routine so aus:
delay5ms: ;5ms Pause
ldi i, 50 ;50 * 0,1ms = 5ms
delay1: ;0,1ms Pause
ldi j, 100
delay1_: nop ;0,25 µsek Pause
;---> nop's hier hin bei 8MHz !
dec j ;0,25 µsek Pause
brne delay1_ ;0,50 µsek Pause = 1µsek * 100 = 0,1ms
dec i ;
brne delay1 ;
ret
Das Busy Flag kann bei der Initialisierung noch nicht abgefragt werden,
deshalb die Zeiten einhalten!
Bei 8MHz halbieren sich die Werte 0,25µs -> 0,125µs, hier solltest Du
entsprechend mehr NOP'S einfügen sie Delay.
init_lcd:
ldi temp,3 ;3* 5ms = 15ms
powerupwait: ;15ms warten auf Display POWER-UP
rcall delay5ms
dec temp
brne powerupwait ;immer noch aufs Display warten
ldi lcd_db, 0b00110000 ;muss 3mal hintereinander
gesendet
out PORTB, lcd_db ;werden zur Initialisierung
rcall lcd_command ;1
rcall delay5ms ;Beim ersten Befehl 5ms warten!
out PORTB, lcd_db
rcall lcd_command ;2
out PORTB, lcd_db ;
rcall lcd_command ;und 3!
ldi lcd_db, 0b00110000 ;Display: 1 Zeilen 5x8
Dots(8Bit-Modus)
out PORTB,lcd_db ;
rcall lcd_command
ldi lcd_db, 0b00001101 ;Display on, Coursor off, Courser-Blink
off;
out PORTB,lcd_db
rcall lcd_command
ret ;Und wieder zurück
so funzt es bei mir, versuchs halt mal.
Gruß Berny