Witam!
Mam problem z zainicjowaniem wyświetlacza, kombinuje już od kilku dni ale nic nie wychodzi. Potrzebuje aby pracował on w trybie 4-bit.
Wpierw korzystałem z biblioteki: rklibavr lecz nic z tego nie wyszło - zero reakcji. Następnie napisałem obsługę wyświetlacza w asm, bity danych to 4 starsze dla portu C, bity sterujące to 4 młodsze.
Próbowałem inicjalizacji dla sterownika KS0070B jak i HD44780. Zmieniłem na drugi (identyczny) wyświetlacz. I dalej nic. Przebiegi na nogach zgodne programem.
Nie mam pojęcia co robię nie tak. Proszę o pomoc.
Mam problem z zainicjowaniem wyświetlacza, kombinuje już od kilku dni ale nic nie wychodzi. Potrzebuje aby pracował on w trybie 4-bit.
Wpierw korzystałem z biblioteki: rklibavr lecz nic z tego nie wyszło - zero reakcji. Następnie napisałem obsługę wyświetlacza w asm, bity danych to 4 starsze dla portu C, bity sterujące to 4 młodsze.
.include<m8535def.inc>
.org 0x000
rjmp RESET
.org 0x015
.def wyswietl1 = r16
.def wyswietl2 = r17
.def wyswietl = r18
.equ Black = 3
.equ E = 2
.equ RW = 1
.equ RS = 0
RESET:
;obsluga przerwania reset
ldi r16, low(ramend)
ldi r17, high(ramend)
out spl, r16
out sph, r17
ldi r16, $00
ldi r17, $FF
ldi r18, $0F
out ddrB, r18
out portB, r16
out ddrC, r17
out portC, r16
ldi r23, 0x60 ; czekaj 50ms
rcall waitms
; inicjalizacja
;ldi wyswietl, 0b00110000
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
;ldi wyswietl, 0b00110000
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
;ldi wyswietl, 0b00110000
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
;ldi wyswietl, $20 ;4-bit
;rcall send1;
;ldi r23, 0x10 ; czekaj 5ms
;rcall waitms
;ldi wyswietl, $20 ;4-bit
;rcall send1;
;ldi r23, 0x10 ; czekaj 5ms
;rcall waitms
ldi wyswietl, 0b00100000 ;4-bit
rcall send1;
ldi r23, 0x10 ; czekaj 10ms
rcall waitms
ldi wyswietl, 0b00100000 ;4-bit
rcall send1;
ldi r23, 0x10 ; czekaj 10ms
rcall waitms
ldi wyswietl1, 0b00100000 ;font
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl2, 0b11000000
rcall send;
ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl1, 0b00000000 ;08
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl2, 0b11110000
rcall send;
ldi r23, 0x5 ; czekaj 5ms
rcall waitms
;ldi wyswietl1, 0b00000000 ;01
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
;ldi wyswietl2, 0b00000000
;rcall send;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl1, 0b00000000 ;ids
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl2, 0b01110000
rcall send;
ldi r23, 0x5 ; czekaj 5ms
rcall waitms
;ldi wyswietl2, $70
loop:
sbi portC, Black
ldi wyswietl1, $49
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl2, $89
rcall send;
ldi r23, 0x5 ; czekaj 5ms
rcall waitms
ldi wyswietl1, $79
;rcall send1;
;ldi r23, 0x5 ; czekaj 5ms
;rcall waitms
ldi wyswietl2, $79
rcall send;
ldi r23, 0x5 ; czekaj 5ms
rcall waitms
rcall loop
send:
mov wyswietl, wyswietl1
rcall send1;
mov wyswietl, wyswietl2
rcall send1;
rcall czek;
ret
send1:
out portc, wyswietl
sbi portc, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
cbi portc, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
ret
czek:
ldi r24, $0F
ldi r25, $00
;out portc, r25
out ddrC, r24
sbi portC, RW
sbi portC, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
in wyswietl, portC
cbi portc, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
sbi portC, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
in r23, portC
cbi portc, E
ldi r23, 0x01 ; czekaj 1ms
rcall waitms
sbrc wyswietl, 7
rcall czek
ldi r24, $FF
ldi r25, $00
cbi portC, RW
out ddrC, r24
out portC, r25
ret;
waitms:
mov r22, r23; ustaw czas opóźnienia
; powtórz n razy pętlę L,
; co da opóźnienie ok. n * 1 ms
L:
; powtórz 10 razy pętlę L0,
; co da opóźnienie ok 1ms
ldi r21, 10
L0:
; powtórz 100 razy pętlę L1,
; co da opóźnienie ok. 100 us
ldi r20, 100
L1:
nop ; 1 cykl
dec r20 ; 1 cykl
brne l1 ; 2 cykle
; koniec pętli L1
dec r21
brne l0
; koniec pętli L0
dec r22
brne L
; koniec pętli L
ret
Próbowałem inicjalizacji dla sterownika KS0070B jak i HD44780. Zmieniłem na drugi (identyczny) wyświetlacz. I dalej nic. Przebiegi na nogach zgodne programem.
Nie mam pojęcia co robię nie tak. Proszę o pomoc.