Hej!
Jag har en 4*20 lcd display som är rätt kopplad till en ATMEGA8535.
Problemet är att jag egentligen inte är bekant med protokollet för att driva en sådan display. Det står att den använder "KS 0066 or equivalent". Det finns ett ben som ska vara ett för att sätta den i write läge, det är satt till ett. Sen finns det två andra intressanta ben, Enable och RS. Rs har jag listat ut att det bestämmer om man skriver en adress eller om man skickar tecknet, rätt så?
Problemet artar sig så att jag lyckat cleara den, eller om den inte hinner starta upp, för efter uppskattnings vis 0.3 sek så dör hela uC´n och startar om, så display och kontroll lysdiod ligger alltså bara och blinkar.
Kan någon ge råd och tips?
Varför startar den om? (Atmel)
Jag har provat diverse matningskällor, som 9v batteri 9v adapter en annan 9 volts adapter och tillsist en 12v adapter.
Så det verkar väldigt konstigt. Jag har provat att mäta över 5v och jord, har bara en voltmeter, men borde man inte se siffrorna flimmra lite om det dippar i bland? Det gör dom iaf inte, anger 5.04 V hela tiden!
Så det verkar väldigt konstigt. Jag har provat att mäta över 5v och jord, har bara en voltmeter, men borde man inte se siffrorna flimmra lite om det dippar i bland? Det gör dom iaf inte, anger 5.04 V hela tiden!
Här kommer koden jag använder:
.include "8535def.inc"
.org $0000
.def temp = r20
.def temp2 = r21
.def temp3 = r23
.def temp4 = r24
reset:
ldi temp, low(RAMEND) ; Nollställer stackpekaren
out SPL, temp ;
ldi temp, high(RAMEND) ;
out SPH, temp ;
;------------- Def av portar
ldi temp, 0b11111111
out ddrd, temp
ldi temp, 0b11111111
out ddra, temp
;_------------------------------
cbi portd,pd6 ; Sätter displayen i write
sbi portd,pd3; lysdiod koll för att veta att processorn körs
rcall lcd_init ; initierar displayen
main:
ldi r16,0x00;Sätta cursor för utskrift
rcall LCD_instr
ldi r16,'T' ;
rcall LCD_write
test:
rjmp test
LCD_instr:
rcall LCD_wait
cbi PortD,pd5 ;LCD_RS=0
out PortA, r16 ;Lägg ut data (Instruction Code)
sbi PortD,pd7 ;LCD_E=1
nop
nop ;
nop ;
cbi PortD,pd7; LCD_E ;LCD_E=0
ret ;Hoppa tillbaka ifrån subrutin
; Skriva ut på displayen
LCD_write:
rcall LCD_wait
rcall LCD_wait ;Väntar ca30ms
rcall LCD_wait
rcall lcd_wait
rcall LCD_wait
rcall lcd_wait
sbi PortD, pd5 ;LCD_RS=1
out PortA, r16 ;Lägg ut data (Tecken)
sbi PortD, pd7 ;LCD_E=1
nop ;Vänta lagom långt
nop ;
nop ;
cbi PortD,pd7 ;LCD_E ;LCD_E=0
cbi PortD, pd5;LCD_RS ;LCD_RS=0
ret
LCD_init:
rcall LCD_wait; delay för att displayen ska hinna starta, behövs kanske inte
rcall LCD_wait
rcall LCD_wait
rcall LCD_wait
rcall LCD_wait
ldi r16, 0b00001111 ;Display on. Cursor off. flyttar höger ;Off
rcall LCD_instr
ldi r16, 0b00000001 ;Clear display
rcall LCD_instr
ldi r16, 0b00111100
rcall LCD_instr
;
ldi r16, 0b00000010 ;Return Home
rcall LCD_instr
ret
LCD_wait:
ldi TEMP,0x20 ;
w1:
ldi TEMP2,0xFF
w2:
dec TEMP2
brne w2
dec TEMP
brne w1
ret
forever:
rjmp forever
Fast tror inte felet finns här, eller? Jag är säker på att den är HD44780 kompatibel.
.include "8535def.inc"
.org $0000
.def temp = r20
.def temp2 = r21
.def temp3 = r23
.def temp4 = r24
reset:
ldi temp, low(RAMEND) ; Nollställer stackpekaren
out SPL, temp ;
ldi temp, high(RAMEND) ;
out SPH, temp ;
;------------- Def av portar
ldi temp, 0b11111111
out ddrd, temp
ldi temp, 0b11111111
out ddra, temp
;_------------------------------
cbi portd,pd6 ; Sätter displayen i write
sbi portd,pd3; lysdiod koll för att veta att processorn körs
rcall lcd_init ; initierar displayen
main:
ldi r16,0x00;Sätta cursor för utskrift
rcall LCD_instr
ldi r16,'T' ;
rcall LCD_write
test:
rjmp test
LCD_instr:
rcall LCD_wait
cbi PortD,pd5 ;LCD_RS=0
out PortA, r16 ;Lägg ut data (Instruction Code)
sbi PortD,pd7 ;LCD_E=1
nop
nop ;
nop ;
cbi PortD,pd7; LCD_E ;LCD_E=0
ret ;Hoppa tillbaka ifrån subrutin
; Skriva ut på displayen
LCD_write:
rcall LCD_wait
rcall LCD_wait ;Väntar ca30ms
rcall LCD_wait
rcall lcd_wait
rcall LCD_wait
rcall lcd_wait
sbi PortD, pd5 ;LCD_RS=1
out PortA, r16 ;Lägg ut data (Tecken)
sbi PortD, pd7 ;LCD_E=1
nop ;Vänta lagom långt

nop ;
nop ;
cbi PortD,pd7 ;LCD_E ;LCD_E=0
cbi PortD, pd5;LCD_RS ;LCD_RS=0
ret
LCD_init:
rcall LCD_wait; delay för att displayen ska hinna starta, behövs kanske inte
rcall LCD_wait
rcall LCD_wait
rcall LCD_wait
rcall LCD_wait
ldi r16, 0b00001111 ;Display on. Cursor off. flyttar höger ;Off
rcall LCD_instr
ldi r16, 0b00000001 ;Clear display
rcall LCD_instr
ldi r16, 0b00111100
rcall LCD_instr
;
ldi r16, 0b00000010 ;Return Home
rcall LCD_instr
ret
LCD_wait:
ldi TEMP,0x20 ;
w1:
ldi TEMP2,0xFF
w2:
dec TEMP2
brne w2
dec TEMP
brne w1
ret
forever:
rjmp forever
Fast tror inte felet finns här, eller? Jag är säker på att den är HD44780 kompatibel.