Moin,
ich habe ein Problem mit meiner Wait-Busy Routine. Wenn ich das 
Busy-Flag abfragen möchte klappt dies nicht. Ich habe eine 
While-Schleife in der ich den enable Pin des LCDs toggeln lasse um somit 
das Ding zu aktualisieren.
Aus irgend einem Grund ist das Busy-Flag immer genau dann 0 wenn ich das 
Enable Bit auf 1 setze, danach ist es wieder 1, also immer invertiert.
Wenn ich anstelle der While-Schleife eine Warteschleife mache klappt 
alles.
Dahe denke ich mal es liegt nur an der Wait-Busy Routine.
Auszug:
1  | #include "lcd.h"
  | 
2  | #define nop()  __asm__ __volatile__("nop"::)
 | 
3  | 
  | 
4  | /* toggle Enable Pin to initiate write */
  | 
5  | static void toggle_e(void)
  | 
6  | {
 | 
7  |   lcd_e_high();
  | 
8  |   nop();
  | 
9  |   nop();
  | 
10  |   nop();
  | 
11  |   nop();
  | 
12  |   nop();
  | 
13  |   lcd_e_low();
  | 
14  |   
  | 
15  | }
  | 
16  | 
  | 
17  | .
  | 
18  | .
  | 
19  | .
  | 
20  | /*************************************************************************
  | 
21  | Warte solange bus LCD nicht mehr busy
  | 
22  | *************************************************************************/
  | 
23  |   static uint8_t lcd_waitbusy(void)
  | 
24  | 
  | 
25  | {
 | 
26  |    
  | 
27  |   uint8_t c;    //Lesevariable für LCD
  | 
28  |   DDRA = 0;    // PORTA als Eingang
  | 
29  |   lcd_rw_high();    // Lesemodus für LCD
  | 
30  |   lcd_rs_low();          // RS = Low ==> Intruction Mode
  | 
31  |   toggle_e();
  | 
32  |   _delay_us(10);
  | 
33  |   c= PINA;    // PORTA auslesen
  | 
34  |   
  | 
35  |   while (PINA,PA7)
  | 
36  |   {
 | 
37  |   _delay_us(10);
  | 
38  |   toggle_e();
  | 
39  |   }
  | 
40  |   
  | 
41  |   lcd_rw_low();           // Lesemodus wieder aus => Schreibmodus
  | 
42  |   lcd_rs_high();
  | 
43  |   DDRA = 0b11111111;
  | 
44  |   
  | 
45  |   return (c);
  | 
46  |   
  | 
47  | 
  | 
48  | }// lcd_waitbusy
  | 
Das LCD hängt an PORTA, RS = PC7, R/W = PC6 und E = PC5.
Das Busy-Bit geht nie von allein auf 0, habs schonmal ohne das Toggeln 
in der Warterschleife probiert, klappt auch nicht.
Ich verwende einen Atmega16 und die aktuelle Version des AVR-Studios und 
WinAVR. Optimierung ist OS, Änderungen ändern nichts.
Wo is der Fehler, ich hoffe ich habe Nichts vergessen zu posten.
Gruß Knut