Hallo robotka,

zu der Ausgabe vom AVR-Studio kann ich leider nichts kompetentes beitragen, da ich wie gesagt die GCC-Toolchain verwendet.

Vielleicht hilft Dir aber ein kleines Programm weiter, dass ich geschrieben habe um die Fehlerquellen bei meinem ähnlichen Problem ein zu kreisen

Code:
/*-------+---------+---------+---------+---------+---------+---------+---------+
*
*    Datei:        LCD-Test1.c
*     erstellt:    im Januar 2010
*    von:        Bot-Builder
*
*    Hardware:    Bot-Board ATMega 16 V2
*                ATMega 32 und 7,3728 Mhz,
*                Bot-Board LC-Display V1,
*                Bot-Board Portanzeige mit LED
*
*    Resourcen
*
*    Timer0:        frei
*
*    Timer1:        frei
*
*    Timer2:        frei
*
*
*    Interrupt:    keine
*
*    I/O-Pins:
*
*
*    Funktionsbeschreibung:
*        In diesem Programm wird die vollständige  Initialisierung des
*        LC-Display ohne Verwendung von Biblotheken abgearbeitet.
*        Zum Debuggen wurden Verzögerungen verwendet.
*        Das LC-Display ist wie folgt angeschlossen:
*            PC0        DB7
*            PC1        DB6
*            PC2        DB5
*            PC3        DB4
*                    DB3        an gnd
*                    DB2        an gnd
*                    DB1        an gnd
*                    DB0        an gnd
*            PC4        Enable Hintergrundbeleuchtung
*            PC5        E (Taktleitung)
*            PC6        R/W
*            PC7        RS
*
*        Zur Kontrolle werden auf Port D die gleichen Daten ausgegeben
*        und mit den LEDs dargestellt.
*
*        Das Display wird somit im 4-Bit Modus verwendet.
*
*        JTAG Interface mit den Fuses ausgeschaltet!
*        sonst funktioniert Port C nicht vollständig.
*
*        Bei dieser Beschaltung kann das Busyflag ausgelesen werden!
*
*
*
*    Bemerkungen:  
* 
*
*    letzte Änderung: 25.01.2010
*
*
---------+---------+---------+---------+---------+---------+---------+---------+*/


/*-------+---------+---------+---------+---------+---------+---------+---------+
*   #include-Dateien
*--------+---------+---------+---------+---------+---------+---------+---------+*/
#include <avr/io.h>
#include <util/delay.h>        // definiert _delay_ms() 


/*-------+---------+---------+---------+---------+---------+---------+---------+
*   Variablen.- und Konstantendefintionen
*--------+---------+---------+---------+---------+---------+---------+---------+*/
#define delay(us)  _delay_loop_2 (((F_CPU/4000)*us)/1000)        // wartet µs

#define Pause1 50
#define Pause2 50

/*-------+---------+---------+---------+---------+---------+---------+---------+
*   Interrupts
*--------+---------+---------+---------+---------+---------+---------+---------+*/
//  hier keine


/*-------+---------+---------+---------+---------+---------+---------+---------+
*   Funktionen():
*--------+---------+---------+---------+---------+---------+---------+---------+*/
/*-------+---------+---------+---------+---------+---------+---------+---------+
*   delay_ms(ms):
*        wartet ms Millisekunden
*--------+---------+---------+---------+---------+---------+---------+---------+*/
void delay_ms(uint16_t ms)
{
  for(uint16_t t=0; t<=ms; t++)
    _delay_ms(1); 
}



/*-------+---------+---------+---------+---------+---------+---------+---------+
*   main()
---------+---------+---------+---------+---------+---------+---------+---------+*/
int main()
{
    //    Initialiserung
    //    der Ports
    //    alle Pins als Ausgang
    //    also im Datenrichtungsregister an allen Stelle eine Eins
    //    DDRC |= ( (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1 << DDC6) | (1 << DDC7) ); 
    DDRC = 0xff;
    DDRD = 0xff;
    
    //    alle Ausgänge auf low
    PORTC = 0x00;
    PORTB = 0x00;
    //    Warten damit die Flanke sicher alle fallen
    //    laut Datenblatt reichen 15ms nach erreichen 
    //    der Arbeitsspannung von 4,5V aus
    delay_ms(100);
    

    //    Initialisierung des LC-Displays
    //    zunächst in den 8-Bit Modus schalten
    //    DB7 = 0, DB6 = 0 und DB5 = 1
    //    schaltet in die Funktionsdefinition um,
    //    dann bedeutet
    //    DB4 = 1, 8-Bit-Modus
    //    DB3 bis DB0 liegen fest auf gnd
    //    zunächst also die Daten ans LC-Display legen, RS und R/W bleiben null
    //    also PC2 und PC3 auf high
    //    also muss 0b 0000 1100
    //    (mit RS und R/W = 0)
    //    übertragen werden
    
    //    vereinfacht geschrieben
    PORTC = 0x0c;
    PORTD = 0x0c;

    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    und noch eine Verzögerung weil Busy hier noch nicht
    //    ausgewertet werden kann
    delay_ms(5);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    das Ganze zur Sicherheit noch zwei Mal wiederholen
    //    erste Wiederholung
    //    vereinfacht geschrieben
    PORTC = 0x0c;
    PORTD = 0x0c;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zweite Wiederholung
    //    vereinfacht geschrieben
    PORTC = 0x0c;
    PORTD = 0x0c;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    
    //    und jetzt in den 4-Bit-Modus schalten
    //    also DB5 = 1 und DB4 = 0
    //    also PC2 = 1 und PC3 = 0
    //    also 0b 0000 0100
    //    mit RS und R/W = 0
    //    vereinfacht geschrieben
    PORTC = 0x04;
    PORTD = 0x04;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    die übrigen Betriebsparameter einstellen


    //    Funktionsdefinition        0b 001
    //    4-Bit                          0
    //    2/4zeiliges Display                1
    //    5x7 Dots Zeichen                 0
    //    unerheblich                       00
    //    also                    0b 0010 1000
    //    muss übertragen werden
    
    //    zunächst das höherwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    //    Befehl schreiben
    //    also R/W = 0, RS = 0
    //    also PC6 = 0, PC7 = 0
    
    //    vereinfachte Schreibweise
    PORTC = 0x02;
    PORTD = 0x02;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zunächst das niederwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    
    //    vereinfachte Schreibweise
    PORTC = 0x08;
    PORTD = 0x08;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    

    //    Display/Cursor            0b 0000 1
    //    Display an                         1
    //    Cursor an                          1
    //    Cursor blinken                       1
    //    also                    0b 0000 1111
    //    muss übertragen werden
    
    //    zunächst das höherwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    //    Befehl schreiben
    //    also R/W = 0, RS = 0
    //    also PC6 = 0, PC7 = 0
    
    //    vereinfachte Schreibweise
    PORTC = 0x00;
    PORTD = 0x00;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zunächst das niederwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    
    //    vereinfachte Schreibweise
    PORTC = 0x0f;
    PORTD = 0x0f;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);


    //    Modus festlegen                    0b 0000 01
    //    Cursorposition inkrementieren              1
    //    Displayinhalt fest, Cursor schieben           1
    //    also                    0b 0000 0111
    //    muss übertragen werden
    
    //    zunächst das höherwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    //    Befehl schreiben
    //    also R/W = 0, RS = 0
    //    also PC6 = 0, PC7 = 0
    
    //    vereinfachte Schreibweise
    PORTC = 0x00;
    PORTD = 0x00;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zunächst das niederwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    
    //    vereinfachte Schreibweise
    PORTC = 0x07;
    PORTD = 0x07;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    

    //    Display löschen                    0b 0000 0001
    //    muss übertragen werden
    
    //    zunächst das höherwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    //    Befehl schreiben
    //    also R/W = 0, RS = 0
    //    also PC6 = 0, PC7 = 0
    
    //    vereinfachte Schreibweise
    PORTC = 0x00;
    PORTD = 0x00;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zunächst das niederwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    
    //    vereinfachte Schreibweise
    PORTC = 0x01;
    PORTD = 0x01;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    //    zusätzliche Wartezeit für Löschen
    delay(4000);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    

    //    Cursor Home                    0b 0000 001
    //    unerheblich                               0
    //    also                        0b 0000 0010
    //    muss übertragen werden
    
    //    zunächst das höherwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    //    Befehl schreiben
    //    also R/W = 0, RS = 0
    //    also PC6 = 0, PC7 = 0
    
    //    vereinfachte Schreibweise
    PORTC = 0x00;
    PORTD = 0x00;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    zunächst das niederwertige Nibbel an DB7 bis DB4
    //    also PC0 bis PC4
    
    //    vereinfachte Schreibweise
    PORTC = 0x02;
    PORTD = 0x02;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    //    zusätzliche Wartezeit für Löschen
    delay(4000);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause1);
    
    //
    //    Initialisierung ist damit abgeschlossen
    //
    
    //    kleinen Text ausgeben
    //    also Daten schreiben
    //    R/W = 0, RS = 1
    //    also PC6 = 0, PC7 = 1
    
    //    Buchstabe 'H' übertragen
    //    also 0b 0100 1000

    //    auch hier zuerst höherwertiges Nibbble übertragen,
    //    allerdings mit gesetztem PC7
    
    //    also zuerst 0b 1000 0100
    //    vereinfachte Schreibweise
    PORTC = 0x84;
    PORTD = 0x84;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann 0b 1000 1000
    //    vereinfachte Schreibweise
    PORTC = 0x88;
    PORTD = 0x88;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    

    //    Buchstabe 'a' übertragen
    //    also 0b 0110 0001

    //    auch hier zuerst höherwertiges Nibbble übertragen,
    //    allerdings mit gesetztem PC7
    
    //    also zuerst 0b 1000 0110
    //    vereinfachte Schreibweise
    PORTC = 0x86;
    PORTD = 0x86;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann 0b 1000 0001
    //    vereinfachte Schreibweise
    PORTC = 0x81;
    PORTD = 0x81;
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung auf high legen
    //    also PC5
    PORTC |= (1 << PC5);
    PORTD |= (1 << PD5);
    //    Warten damit die Flanke sicher entsteht
    delay(100);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    
    //    dann die Enableleitung wieder auf low legen
    //    also PC5
    PORTC &= ~(1 << PC5);
    PORTD &= ~(1 << PD5);
    //    Warten damit die Flanke sicher gefallen ist
    delay(200);
    
    //    Verzögerung zum Debuggen
    delay_ms(Pause2);
    



    //    Hintergrundbeleuchtung an
    PORTC = 0x10;
    PORTD = 0x10;
    
    while (1)
        {
        }
        return 0;
    
    
}
Wie Du siehst wird hier die komplette Initialisierung in der main() Funktion abgearbeitet. Wie im Kopf zu lesen ist, habe ich damals mein LCD an den Port C angeschlossen und zur Kontrolle acht LEDs an Port D angeschlossen. Wenn Du nun D verwendetest müsste das Programm sogar ohne Änderungen bei Dir laufen. Allerdings muss natürlich die Taktfrequenz richtig angegeben sein.

Es ist übertrieben detailliert kommentiert, war mir damals bei der Fehlerbehebung eine große Hilfe.

Nun hoffe ich, dass es auch Dir hilft.

gutes Gelingen

Uwe