Jag har köpt en DOGM163W-A kopplat in den enligt det står på databladet:
http://www.alcom.nl/images/nieuws/Elect ... r%2005.pdf
har även skrivit denna koden (som är lite kopierat av avrbeginners.net):
---------------------------------------
;3 raders EA Dog-m display på
;pa 0-7 = db 0-7 (8bitars adress)
.device ATmega8515
.include "m8515def.inc"
.equ LCD_E = 0 ;pb0 = e
.equ LCD_RW = 1 ;pb1 = r/w
.equ LCD_RS = 2 ;pb2 = rs
.equ LED = 3 ;pb3 = lysdiod (ej display)
.equ TIME_500ms = 0x85ee
.org 0x0000
rjmp Reset
.org ovf1addr
rjmp Timer_ovf
Reset:
ldi r16,high(RAMEND) ; Setup the Stack pointer
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16, high(TIME_500ms) ; load timer 1 register (TCNT1) with timer_value
out TCNT1H, r16 ;
ldi r16, low(TIME_500ms) ; load timer 1 register (TCNT1) with timer_value
out TCNT1L, r16
ldi r16, 0 ; stop Timer 1 (clear CS10 and CS12)
out TCCR1B, r16
ldi r16, 0b10000000 ; set bit 7 in TIMSK to enable Timer 1 overflow interrupt
out TIMSK, r16
sei
ldi r16, 0xff
out ddra, r16 ;Make porta outputs
nop
ldi r16, 0xff
out ddrb, r16 ;Make portb 0-3 outputs
nop
rcall Timer_start
loop: ;wait here for 500ms
sbrs r17,0
rjmp loop
ldi r17,0
;Init_display
ldi r16, 0x39
rcall lcd_command
rcall lcd_wait
ldi r16,0x1d
rcall lcd_command
rcall lcd_wait
ldi r16,0x50
rcall lcd_command
rcall lcd_wait
ldi r16,0x6c
rcall lcd_command
rcall lcd_wait
ldi r16,0x7c
rcall lcd_command
rcall lcd_wait
ldi r16,0x0f
rcall lcd_command
rcall lcd_wait
ldi r16, 0x01
rcall lcd_command
rcall lcd_wait
ldi r16, 0b00000110
rcall lcd_command
forever:
rjmp forever
LCD_Command:
cbi PortB, LCD_RS
out PortA, r16
sbi PortB, LCD_E
nop
nop
nop
cbi PortB, LCD_E
ret
LCD_wait:
rcall LCD_r_Addr
sbrc r16, 7
rjmp LCD_wait
cbi PortB, LED ;if wait turn on led
ret
LCD_r_Addr:
cbi PortB, LCD_RS
sbi PortB, LCD_RW
ldi r16, 0x00
out DDRA, r16
sbi PortB, LCD_E
nop
in r16, PinA
cbi PortB, LCD_E
ldi r17, 0xFF
out DDRA, r17
cbi PortB, LCD_RW
ret
LCD_w_Data:
sbi PortB, LCD_RS
out PortA, r16
sbi PortB, LCD_E
nop
nop
nop
cbi PortB, LCD_E
cbi PortB, LCD_RS
ret
;Subroutine to start the timer
Timer_start:
ldi r16, 0b00000011 ; set CS10 - CS13 for 64 cycle prescaler
out TCCR1B, r16
ret
;ISR for timer overflow
Timer_ovf:
push r16
in r16, sreg
push r16
ldi r16, 0 ; stop Timer 1 (clear CS10 and CS12)
out TCCR1B, r16
ldi r17, 0b00000001
pop r16
out sreg, r16
pop r16
reti
-----------------------------------
Men den är bara blank.... vad e felet!!!!
håller på att bli tokig har provat allt (nästan)
finns det någon som pillat med denna innan eller liknande display och kan hjälpa mej, är jag väldigt tacksam.
Atmega8515 + DOGM163W-A Problem!
Jag fick hem en DOGM162W-A i fredags och tråcklade ihop den med en atmega88. Sedan initierade jag den enligt exemplet på pdf-bladet du nämner, funkade direkt. Trevlig display.
Lat som jag är har jag dock övergivit assembler för många år sedan och vägrar gå tillbaka. Det enda som inte står uttryckligen är att du måste toggla E signalen mellan varje kod du skickar.
(edit, ser att du redan gör det)
(edit2, borde du inte nolla R/W signalen i command, eller har du gjort det någon annanstans?)
Kan eventuellt posta min initiering senare i eftermiddag om du vill.
Lat som jag är har jag dock övergivit assembler för många år sedan och vägrar gå tillbaka. Det enda som inte står uttryckligen är att du måste toggla E signalen mellan varje kod du skickar.
(edit, ser att du redan gör det)
(edit2, borde du inte nolla R/W signalen i command, eller har du gjort det någon annanstans?)
Kan eventuellt posta min initiering senare i eftermiddag om du vill.
Här är några av mina displayfunktioner, jag kör dispinit och sedan är det bara att skriva ut text med disptext.
Som du ser är dispinit rakt av exemplet (förutom att jag stängt av cursor).
Som du ser är dispinit rakt av exemplet (förutom att jag stängt av cursor).
Kod: Markera allt
// displaysignaler
#define setRS PORTB |= _BV(PB7)
#define clrRS PORTB &= ~_BV(PB7)
#define setRW PORTB |= _BV(PB6)
#define clrRW PORTB &= ~_BV(PB6)
#define setE PORTB |= _BV(PB0)
#define clrE PORTB &= ~_BV(PB0)
void toggleE()
{
wait(1);
setE;
wait(1); // E är hög ca 150 us
clrE;
wait(1);
}
void dispinit()
{
clrRS;
clrRW;
PORTD= 0x39;
toggleE();
PORTD= 0x1c;
toggleE();
PORTD= 0x52;
toggleE();
PORTD= 0x69;
toggleE();
PORTD= 0x74;
toggleE();
PORTD= 0x0c;
toggleE();
PORTD= 0x01;
toggleE();
PORTD= 0x06;
toggleE();
setRS;
}
void dispclear()
{
clrRS;
PORTD = 0x01;
toggleE();
setRS;
wait(4);
}
// rad 1 = 0-15
// rad 2 = 64-79
void disppos(short a)
{
clrRS;
PORTD = a;
PORTD |= 0x80; // maska på msb
toggleE();
setRS;
wait(10);
}
void disptext(char*st)
{
short i=0;
while (st[i] != 0 )
{
switch(st[i])
{
case 'å':
PORTD= 0x83;
break;
case 'ä':
PORTD= 0x84;
break;
case 'ö':
PORTD= 0x94;
break;
default:
PORTD= st[i];
}
toggleE();
i++;
if ( i>15 )
break;
}
}
Tack för hjälpen!
nu blinkar lcd cursorn så den borde blitt initierad rätt nu
använde ditt upplägg på programmet iaf fast med lite modifikationer, det verka funka bra.
Vet inte vad jag gjort för fel innan ... tror det va att jag inte hade tillräckligt med delay... ska felsöka sen:)
Edit: Nu e det bara problemet att den inte vill skriva ut tecken, hur löser man det, jag har provat med att sätta RS hög och sedan skriva tecken och toggla E men den bara flyttar cusorn men skriver inte ut tecknen... har du nån aning vad felet är?
Jätte tack för hjälpen iallafall!!!
nu blinkar lcd cursorn så den borde blitt initierad rätt nu
använde ditt upplägg på programmet iaf fast med lite modifikationer, det verka funka bra.
Vet inte vad jag gjort för fel innan ... tror det va att jag inte hade tillräckligt med delay... ska felsöka sen:)
Edit: Nu e det bara problemet att den inte vill skriva ut tecken, hur löser man det, jag har provat med att sätta RS hög och sedan skriva tecken och toggla E men den bara flyttar cusorn men skriver inte ut tecknen... har du nån aning vad felet är?
Jätte tack för hjälpen iallafall!!!