Hallo Mikrocontroller-Freunde, ich arbeite momentan an einem µcontroller-projekt mit LCD-Display ansteuerung (standart mit 2x16 Zeichen). Zur ansteuerung des Displays werden oft 39µs Delay benötigt. Bei meiner anwendung mit 16MHz prozessortakt habe ich eine Delayschleife mit 39 x 16 nop's = 624 nop's. D.h. jedesmal wenn ich dem Display datepakete zusende schlage ich 624 Taktzyklus-zeiten tot! Zumal sende ich dem Display in der sekunde 10 x 8 x 8 = 640 Datenpakete. Das wären 399360 taktzyklen in der sekunde. Frage: gibt es eine Möglichkeit den µcontroller in dieser tot-zeit andere nützliche dinge tun zu lassen? Wäre dankbar für info's.
1. Falsche Forumsabteulung ;), hier´ist Code_sammlung_ 2. Mach die Ansteuerung doch in nem Timerinterrupt
a) falsches Forum b) 39µs sind eine schlechte Idee, denn das ist außerhalb der Specs (39µs sind der typische Wert, die Oszillatortoleranz liegt bei etwa +/-50%, 100µs sind also ein besserer Wert) c) Schon mal die Suche benutzt (z.B. LCD Wartezeit) eingegeben?
@merkez: Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen!
lesen lernen! wrote: > @merkez: Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen > lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen > lernen! Lesen lernen! Was bist du denn für ein Clown ? Wenn du die mal ausrechnest, welchen Anteil diese Totzeit an der gesammten prozessorzeit hat wirst du auf 2,5% kommen. ob es sich nun lohnt oder nicht hierfür einen eigenen Timerinterrupt zu erstellen ist vom Programm und der allgemeinen Auslastung des µC abhängig...manchmal (sehr selten) brauch man ein paar Prozent, oder es sind mehrere dinge die auf die art zeit verschwenden und deswegen muss eine andere lösung her....in dem fall ist wie schon oben geschrieben ein Timerinterrupt das Mittel der Wahl. Hier kann dann während der Totzeit beliebig anderer Code ausgeführt werden.
Vergiss die 39us, die sind unwichtig. Ich verwende einen timer, der alle 10ms kommt und haemmere alle 10ms ein Zeichen raus. Auch Controlzeichen. Ein Buffer, der alles enthaelt, dh. Init, Function set, home, Cursor auf 2 Zeile, die Zeichen... kommt alles im Kreis rum dran.
ich glaube ich habe es falsch gefragt: wenn ich ein zeichen auf dem Display rausgebe, so muß ich min. 39µs delay'en: void LCDWriteByte(unsigned char data) { LCDWriteNibble(data >> 4); LCDWriteNibble(data & 0x0F); delay1us(40); //etwas auf die Anzeige warten } mache dann im Delay: void delay1us(unsigned int time) { while(time--) { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } } also 40 x 10 nop's = 400 ticks verschwendet! Ich dachte beim aufruf "delay1us(40);" Springt es raus in ein bestimmtes interrupt indem eine bestimmte routine gemacht werden kann. PS: 1. 39µ sind im Datenblatt angegeben, ich verwende 40µ. unter 33µs macht mein Display fehler. Aber 100µs wären zuviel. 2. ich glaube nicht im falschen forum gelandet zu sein, da ich eine idee für eine neue Funktion habe die schon sinn macht, besonders wenn die resourcen knapp sind.
merkez wrote: > 1. 39µ sind im Datenblatt angegeben, ich verwende 40µ. unter 33µs macht > mein Display fehler. Aber 100µs wären zuviel. Wenn du meinst.... > 2. ich glaube nicht im falschen forum gelandet zu sein, Ich glaube schon: Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie hier posten. Fragen werden gelöscht! merkez wrote: > Frage:
1. 39µs+50% = 58,5µs, da sind 100µs immernoch übertrieben! Im Datenblatt steht immernoch >=39µs, das heisst für mich minimum 39µs. 2. und schlauberger wo kann man fragen stellen? Wenn's gelöscht wird bitte!
ich glaub du machst dir grad den falschen zum feind bei displayfragen.... davon abgesehen ist dein ton unter aller sau, DU willst was wissen, wir haben NICHTS davon dir zu antworten und mit aller freiheit, ich verzichte darauf dir zu helfen
merkez wrote: > Im Datenblatt > steht immernoch >=39µs, das heisst für mich minimum 39µs. Es wird funktionieren, unter normalen Bedingungen. Aber spätestens wenn das LCD mal mit 3,3V laufen soll wird es Probleme geben. Man muss eben alle Toleranzen aufaddieren, dann sind es sogar weitaus über 50%: - internen Oszillator - Frequenzbestimmender Widerstand - Spannung Ich habe viel mit LCDs zu tun und ich kenne große Firmen die auch so schlau sein wollten und sich nicht an die Specs gehalten haben. Als dann der orginale HD44780 abgekündigt wurde, und irgendein Nachbau auf den LCDs war, lief dann nichts mehr. Ich habe mir vor vielen Jahren eine Software für den 44780 geschrieben, streng nach Datenblatt, mit ausreichend Platz in allen Richtungen. Ich hatte seitdem nie Probleme, egal welcher 44780 Nachbau letztendlich auf dem Display saß. Wenn man sich die vielen HD44780 Threads hier im Forum anschaut, dann scheinen ziemlich viele Timingprobleme zu haben, eben deshalb weil viele die 35-40µs einsetzen und nicht bedenken, dass es die typischen und nicht die maximalen Werte sind.
Bei meinen Programmen schaue ich (auser direkt beim Start) nach dem Busy-Bit. Und das vor dem Schreiben. Ich kann also neue Ausgaben vorbereiten (Daten aus Tabelle holen etc.) während das Display arbeitet. gruß hans
hans wrote: > Bei meinen Programmen schaue ich (auser direkt beim Start) nach dem > Busy-Bit. Und das vor dem Schreiben. Ich kann also neue Ausgaben > vorbereiten (Daten aus Tabelle holen etc.) während das Display arbeitet. Das sind doch nur Pinats, d.h. Du verwartest trotzdem die meiste Zeit. LCD-Ausgabe im Hintergrund mittels Timerinterrupt und das Thema ist gegessen. Ne extra Leitung zum Busy lesen ist völlig unnötig. Peter
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.