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.
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?
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
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.