Forum: Compiler & IDEs LCD Display an Mega32


von Jürgen S. (jsachs)


Lesenswert?

Hallo,

nachdem ich mein Problem mit Port C nun im Griff habe, kommt auch gleich 
das nächste. Das Problem verfolgt mich schon seit Stunden oder besser 
Tagen.

Ich habe an Port C alle 8 Datenbits des LCD, die Steuerleitungen hängen 
an Port D (siehe Header File).

Mein Problem ist nun, das das Auslesen des Busy Bits des LCD nicht 
klappt. Ich lese immer eine "0". Ich hänge in der Busy Loop fest.
Kommentiere ich das "Busy Wait" aus und mache einen entsprechend langen 
Delay, funktioniert alles wie erwartet, nur viel zu langsamm.

Nur komme ich nicht dahinter was ich falsch mache.
Vielleicht kann ja einer nen Blick auf den Code werfen und mir sagen 
woran es liegt ?!

Erwähnen sollte ich noch, das ich mit dem Oszi das gleiche Messe. sobald 
"E" High wird, wird Bit 7 "0" :-( Eventuell ist es ja was im Init.

Es ist ein 2*40 Zeichen Display.

Danke
Juergen

PS: Ich willo den 8 Bit Modus nutzen, da später ein Display ran soll, 
das nur 8 Bit kann....

von Werner B. (Gast)


Lesenswert?

> Vielleicht kann ja einer nen Blick auf den Code werfen und mir sagen
woran es liegt ?!

Wo ist der Code?

von Jürgen S. (jsachs)


Angehängte Dateien:

Lesenswert?

Hmm,

kann es sein, das wenn man die Beitrags Vorschau betätigt Anhänge 
rausfallen....
Egal, hier kommt der Code...

von Werner B. (Gast)


Lesenswert?

So auf den ersten Blick...

etwas was mir auch immer wieder passiert
1
c = PORTC;
 in
1
c = PINC;
 ändern.

Werde mal weiterforschen ...

von Werner B. (Gast)


Lesenswert?

Vorschlag zum Testen. Mach ein lcdWaitBusy draus.
1
uint8_t lcdWaitBusy(void)
2
{
3
    uint8_t c;
4
    uint8_t timeout = 255;
5
  
6
    do {
7
  RS_LOW;
8
  RW_HIGH;
9
  E_LOW;    
10
  // minimum 140ns verzögern (aus Datenblatt des Original 44780), 
11
        // da sollten die beiden Befehle bei 4MHz reichen
12
  LCD_DDR = 0x00;
13
  LCD_PORT = 0xff;  // Pullups an
14
    
15
  E_HIGH;
16
   // jetzt minimum 450ns warten
17
  lcd_e_delay(); 
18
  c = PINC & _BV(7);
19
20
  E_LOW;
21
  RW_LOW;
22
        if(c) lcd_e_delay(); // nach lesen min 400ns warten
23
    } while(c && --timeout);
24
    LCD_DDR = 0xFF;   // zurück auf output
25
    return (c);
26
}

  

von Werner B. (Gast)


Lesenswert?

Upps! in der Vorschau war's anders formatiert :-(

von Jürgen S. (jsachs)


Lesenswert?

Einen Busy Wait kann ich in meiner App leider nicht nutzen.
Mehr wie "LCD hat Zeit, Ok nextes Zeichen ausgeben, Nein, also weiter im 
Text" kann ich nicht verwenden....

Danke für den Wink mit dem "PINC", das dürfte mein Problem sein !!

So was hatte ich schon vermutet, aber nach einer gewissen Zeit sieht man 
den Wald vor lauter Bäumen nicht mehr.


Grosses DAnke !!

Juergen

von Franz-Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Anbei Code für das Busy-Flag testen

von Jürgen S. (jsachs)


Lesenswert?

Danke für den Code.
Aber wie gesagt ein Busy Wait kann ich nicht verwenden.
Aber nach Ersetzen des PORTC durch PINC ging alles. Naja bei den Tastern 
usw. überall darauf geachtet, nur hier eben nicht. Manchmal ist man eben 
Betriebsblind :-)

Danke für die Hilfe
Juergen

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.