Hey,

hat ne ganze Weile gedauert, aber jetzt ist mir der Fehler aufgefallen. Eigentlich ne ganz einfache Sache und zwar habe ich vergessen das DDR für den Port nach dem Lesemodus wieder auf Output zu stellen. Also die busys Funktion sieht nun so aus:
Code:
void lcd_busy(void)
{    uint8_t rep;
    
    #ifdef _4_bit_mode_
        P_DD_DDR &= (~(0x0F << DD));        //Data-Port as Input
    #else
        P_DD_DDR = 0x00;                    
    #endif        
        
    SET_DD(0x0F);                            //internal Pull-Up's!
    
    RS_0;                                    //Instruction Register
    RW_1;                                    //Read-Mode
    
    _delay_us( t_W_RS_RW );
    
    do
    {    
        #ifdef _4_bit_mode_
                
                EN_1;
                _delay_us( t_H_EN );                //Wait for LCD: 5us
                        
                rep = ( (P_DD_IN >> DD) << 4 );        //Read high nibble
                EN_0;
                _delay_us( t_L_EN );                //Wait for LCD: 5us
                        
                EN_1;
                _delay_us( t_H_EN );
                
                rep |= ( (P_DD_IN >> DD) & 0x0F);    //Read low nibble
                EN_0;
                _delay_us( t_L_EN );
                                
        #else
                EN_1;
                _delay_us( t_H_EN);
                
                rep = P_DD_IN;
                EN_0;
                _delay_us( t_L_EN );
                
        #endif
                
    }while( 0x80 & rep );                    //Check Busy Flag
    
    #ifdef _4_bit_mode_
        P_DD_DDR |= (0x0F << DD);            //Data-Port as Input
    #else
        P_DD_DDR = 0xFF;
    #endif
    
    RW_0;
    RS_1;
}
Leider habe ich seit dem das Problem gelöst ist, wohl ein Neues dazubekommen. Irgendwie führt der µC nicht mehr so zuverlässig das Programm aus, manchamal schreibt er gar nichts aufs Display ( der Cursor fehlt dann auch), manchmal funktioniert alles einwandfrei und manchmal vertut er sich mit den Adressen des DDRAM und schreibt die Buchstaben an falsche Stellen. Ich habe im Moment keine Ahnung woran das liegen könnte. Hat jemand ein Idee? Könnte ich einen Fehler im C-Programm ausschließen, denn manchmal funktioniert der Mist ja??

Hier nochmal der Testcode, der sich auf die schon gepostete Lib bezieht:

Code:
#include <avr/io.h>
#include "HD44780.h"
#include "uart.h"

int main(void)
{    
    
    DDRC |= 0x3F;
    PORTC &= ~0x3F;
    
    lcd_init();
    
    lcd_write("LCD-Testing");
    
    lcd_pos(3,2);
    lcd_write("Welche Zeile?");
    
    lcd_pos(0,4);
    lcd_write("Zeile 4?");
    
    delay_ms(1000);
    PORTC |= 0x3F;
    while(1)
    {        
    }
}
Also ich bin schon wieder ratlos und deshalb um jede Hilfe oder Denkanstoß dankbar!