OK. Dann ist hier das ganze nochmal mit Code tags

Code:
#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

#include "config.h"
#include "main.h"

#define CLOCK 8000000UL
// quite acurate delay delay by active waiting ...
#define LCD_DELAY_MICROSEC(a) ((a)*CLOCK/6000000)
#define LCD_DELAY_MILLISEC(a) ((a)*CLOCK/6000)

void lcd_delay(unsigned long int ticks);

__asm__ (
  "lcd_delay:                 \n"
  "        subi r22,lo8(1)    \n"  // 1 clk
  "        sbci r23,hi8(1)    \n"  // 1 clk
  "        sbci r24,hlo8(1)   \n"  // 1 clk
  "        sbci r25,hhi8(1)   \n"  // 1 clk
  "        brne lcd_delay     \n"  // 2 clk
  "        ret                \n"
  );


// hitachi hd44780 controller commands
#define LCD_CLEAR           0x01
#define LCD_SET_ENTRY_MODE  0x04
#define LCD_ENTRY_INCR      0x02
#define LCD_ON              0x08
#define LCD_DISPLAY_ON      0x04
#define LCD_DISPLAY         0x08

#define LCD_FUNCTION        0x20
#define LCD_8_BIT           0x10
#define LCD_DOUBLE          0x08
#define LCD_SET_DISP_ADDR   0x80

#define LCD_BUSY            0x80

int main(void)
{
	_delay_ms(100);

	lcd_init();

	lcd_print("Hallo");

	while(1)
	{
	}

	return 0;
}


// disable LCD by asserting E
static inline void lcd_enable(void)
{
	// enable LCD
	LCD_CTRL_PORT |=  _BV(LCD_CTRL_E1); 
	lcd_delay(LCD_DELAY_MICROSEC(10));
}

// disable LCD by deasserting E
static inline void lcd_disable(void)
{
	LCD_CTRL_PORT &= ~_BV(LCD_CTRL_E1);
	lcd_delay(LCD_DELAY_MICROSEC(10));
}

// switch LCD data port to input
static inline void lcd_data_input(void)
{
	LCD_DATA_DDR  =  0x00;                  // data lines are input
	LCD_DATA_PORT =  0xff;                  // enable pull-ups
}

// access LCD by enabling and disabling E
static inline void lcd_write(unsigned char data)
{
	LCD_CTRL_PORT &= ~_BV(LCD_CTRL_RW);   // write

	LCD_DATA_DDR = 0xFF;       // set data I/O lines to output (8bit)
	LCD_DATA_PORT = data;      // output data, 8bits

	lcd_enable();
	lcd_disable();
	lcd_data_input();
}

static void lcd_wait_while_busy(void)
{
	// wait until LCD busy bit goes to zero
	LCD_CTRL_PORT &= ~_BV(LCD_CTRL_RS); // ctrl access
	lcd_data_input();
	LCD_CTRL_PORT |=  _BV(LCD_CTRL_RW); // read

	lcd_enable();

	/* wait for BUSY flag to be gone */
	while(LCD_DATA_PIN & LCD_BUSY)
	{
		lcd_disable();
		lcd_enable();
	}

	lcd_disable();
}

// write the control byte to the display controller
static void lcd_write_ctrl(unsigned char data)
{
	lcd_wait_while_busy();

	LCD_CTRL_PORT &= ~_BV(LCD_CTRL_RS);  // ctrl access

	lcd_write(data);
}

// write a data byte to the display
static void lcd_write_data(unsigned char data)
{
	lcd_wait_while_busy();

	LCD_CTRL_PORT |=  _BV(LCD_CTRL_RS);   // data access

	lcd_write(data);
}

//Init lcd
void lcd_init(void)
{
	// Controller 1
	{
		// make the three control lines outputs
		LCD_CTRL_PORT &= ~(_BV(LCD_CTRL_RS) | _BV(LCD_CTRL_RW) | _BV(LCD_CTRL_E1) | _BV(LCD_CTRL_E2)); //everything to low
		LCD_CTRL_DDR  |=  (_BV(LCD_CTRL_RS) | _BV(LCD_CTRL_RW) | _BV(LCD_CTRL_E1) | _BV(LCD_CTRL_E2)); //everything outgoing ports

		// don't drive data lines
		lcd_data_input();
	
		// writing three times the config byte makes sure, that 
		// the interface is in 8 bit mode afterwards
		lcd_write_ctrl(LCD_FUNCTION | LCD_8_BIT | LCD_DOUBLE);
		lcd_write_ctrl(LCD_FUNCTION | LCD_8_BIT | LCD_DOUBLE);
		lcd_write_ctrl(LCD_FUNCTION | LCD_8_BIT | LCD_DOUBLE);

		lcd_write_ctrl(LCD_ON | LCD_DISPLAY_ON);
		lcd_write_ctrl(LCD_SET_ENTRY_MODE | LCD_ENTRY_INCR);
	}
}

//prints text to display
static void lcd_print(char *str)
{
	while(*str)
		lcd_write_data(*str++);
}