LCD Wait Busy

Gast #1968806
Lesenswert?

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
Gast #1968873
Lesenswert?

Uups, wie peinlich...
1
 static uint8_t lcd_waitbusy(void)
2

3
{
4
   
5
  uint8_t c;    // Lesevariable für LCD
6
  DDRA = 0;    // PORTA als Eingang
7
  lcd_rw_high();    // Lesemodus für LCD
8
  lcd_rs_low();    // RS = Low ==> Intruction Mode
9
  toggle_e();
10
  lcd_e_high();
11
  _delay_us(10);
12
  c= PINA;    // PORTA auslesen
13
  while (PINA,PA7 & (1<<PA7))
14
  {
15
  _delay_us(10);
16
  }
17
  lcd_e_low();
18
  
19
  
20
  _delay_us(10);
21
    
22
  lcd_rw_low();    // Lesemodus wieder aus => Schreibmodus
23
  lcd_rs_high();
24
  DDRA = 0b11111111;
25
  
26
  return (c);
27
  
28

29
}// lcd_waitbusy

Funktionert fast, es fehlen die ersten 7 Zeichen!
Woran liegt das jetzt wieder?

Gruß Knut

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren