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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.