styra HDA44780 med Atmega8 ger ingen vettig utskrift?
Postat: 16 april 2006, 16:43:03
Nu har jag fastnat i mitt bygge, och det är LCD-styrningen som spökar. Jag använder mig at en Atmega8 samt en HDA44780-kompatibel LCD, men har stora problem med styrningen. Min kod verkar stämma och fungera, mina kopplingar borde vara korrekta, men det enda resultatet jag får på displayen är bara att pixlar över hela skärmen tänd och släcks i oregelbundna mönster. det är inte alltid hela teckenfönster som tänds och släcks.
jag kar koppat såhär men trimpot och grejer, om man bortser från LPT-porten:

min kod ser ut såhär:
main.c:
lcd.c
kan det vara fel på min initiering?
jag kar koppat såhär men trimpot och grejer, om man bortser från LPT-porten:

min kod ser ut såhär:
main.c:
Kod: Markera allt
#include <avr/delay.h>
#include "lcd.h"
#define F_CPU 1000000
#define START_DELAY 1000
int main()
{
_delay_ms(START_DELAY);
init_display();
while(1){
printchar('A');
printchar('l');
printchar('s');
printchar('k');
printchar('a');
printchar('l');
printchar('l');
printchar('a');
printchar('r');
printchar('e');
printchar('A');
printchar('l');
printchar('s');
printchar('k');
printchar('a');
printchar('l');
printchar('l');
printchar('a');
printchar('r');
}
return 0;
}
Kod: Markera allt
#define DELAY 1000
#define CLR_DELAY 1000
void inline strobe()
{
PORTD |= 0x01; // E=1 ger puls
_delay_ms(1000); // Väntar då E regisreras
PORTD &=~0x01; // E=0 avslutar puls
}
void clear_display()
{
PORTD &=~0x02; // RS=0 (instruktioner)
PORTB=0b00000001;
strobe();
_delay_ms(10000);
}
void init_display()
{
DDRD=0x03; // Sätter port D till utport
DDRB=0xFF; // Sätter port B till utport
PORTD &=~0x02; // RS=0 (instruktioner)
PORTB=0b00001111; // Instruktionen för att starta
strobe();
_delay_ms(10000);
PORTB=0b00111000; // Instruktionen för function set
strobe();
_delay_ms(10000);
clear_display(); // Instruktion för att cleara display
}
void move_cursor(unsigned char adress)
{
PORTD &=~0x02; // RS=0 (instruktioner)
PORTB=adress;
strobe();
_delay_us(DELAY);
}
void printchar(unsigned char c)
{
PORTD |= 0x02; // RS=1 (data)
PORTB=c;
strobe();
_delay_ms(DELAY);
}