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....
> Vielleicht kann ja einer nen Blick auf den Code werfen und mir sagen
woran es liegt ?!
Wo ist der Code?
Hmm, kann es sein, das wenn man die Beitrags Vorschau betätigt Anhänge rausfallen.... Egal, hier kommt der Code...
So auf den ersten Blick... etwas was mir auch immer wieder passiert
1 | c = PORTC; |
in
1 | c = PINC; |
ändern. Werde mal weiterforschen ...
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 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.