Forum: Mikrocontroller und Digitale Elektronik LCD Wait Busy


von I. L. (Gast)


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

von I. L. (Gast)


Lesenswert?

Achso, ich verwende ein "Displaytech 162" von Reichelt, also ne standart 
Krücke...


Gruß Knut

von spess53 (Gast)


Lesenswert?

Hi

Um das Busy-Flag zu lesen muss E auf H sein. Also:

E auf H
Lesen
E auf L

MfG Spess

von I. L. (Gast)


Lesenswert?

Funktioniert leider auch nicht...

Trotzdem danke

von Bernhard M. (boregard)


Lesenswert?

was ist das?
1
   while (PINA,PA7)
2
   {
3
     _delay_us(10);
4
     toggle_e();
5
   }

ich hätte da folgendes erwartet:
1
   while (PINA & (1 << PA7))
2
   {
3
     _delay_us(10);
4
     toggle_e();
5
   }

von I. L. (Gast)


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

von I. L. (Gast)


Lesenswert?

Keiner ne Idee?


Gruß Knut

von Hc Z. (mizch)


Lesenswert?

Ingo L. schrieb:
> while (PINA,PA7 & (1<<PA7))

Was ist das?  Du hast while (0) sehr umständlich ausgedrückt.

von I. L. (Gast)


Lesenswert?

Oh mann, ich bin heute scheinbar nicht bei der Sache. Natürlich, das war 
das Problem... Funktioniert! Besten Dank.


Gruß Knut

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.