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!
Lesezeichen