Hallo,
ich habe nun noch mal dein Programm angesehen und auch compiliert.
Für util/delay.h hattest du F_CPU noch nicht definiert, der Compiler hatte hier gewarnt. Das ist aber nicht der Fehler, da in dem Programm kein _delay_ aus delay.h genutzt wird.
Du hattest geschrieben, dass bei deinem Display WR auf GND und nicht einen IO-pin angeschlossen ist. Im Programm (lcd.h) ist das Signal RW übrigens auf LCD_PORT (PORTA, PA5).
Im Programm wird das BUSY Flag abgefragt. Das passiert unter anderem bei lcd_command() und lcd_data() ...
Code:
void lcd_command(uint8_t cmd)
{
lcd_waitbusy();
lcd_write(cmd,0);
}
void lcd_data(uint8_t data)
{
lcd_waitbusy();
lcd_write(data,1);
}
lcd_command() wird am Ende von lcd_init() aufgerufen. Hier kann es hängen, weil dein Display kein Read unterstützt (RW ist auf GND).
Bei der roten Stelle unten kann es hängen, wenn das "gelesene" Bit 7 LCD_BUSY high ist. Sowohl DB0..3 des AVR wie auch des Displays sind INPUT, hier wird sich also irgendein undefinierter Zustand einstellen.
Code:
static uint8_t lcd_waitbusy(void)
{
register uint8_t c;
/* wait until busy flag is cleared */
[B][COLOR=#b22222]while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}[/COLOR][/B]
/* the address counter is updated 4us after the busy flag is cleared */
delay(2);
/* now read the address counter */
return (lcd_read(0)); // return address counter
}/* lcd_waitbusy */
Um das Problem zu umgehen, könntest du versuchen, anstelle hier das BUSY Flag zu lesen und zu prüfen, ein delay zu verwenden. Wie groß dieses sein soll, kann ich nicht sagen, das hängt von deinem Display ab. Wie schon geschrieben, kann ich hier nichts austesten, da ich die Hardware nicht vorliegen habe.
Probiere es testweise vielleicht einfach mal mit _delay_ms(20) aus (wenns nicht funktioniert, verwende auch einfach andere Werte) ...
Code:
void lcd_command(uint8_t cmd)
{
[COLOR=#0000ff] _delay_ms(20);[/COLOR]
lcd_write(cmd,0);
}
void lcd_data(uint8_t data)
{
[COLOR=#0000ff] _delay_ms(20);[/COLOR]
lcd_write(data,1);
}
Hier können aber vielleicht auch andere User etwas dazu sagen, die sich mit alpanumerischen Display mehr auskennen.
Dirk
EDIT:
Nach dieser Eintellung solltest du nochmal schauen, du verwendest ein Display mit KS0073?!
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */