Forum: Mikrocontroller und Digitale Elektronik Delay zeiten im Mikrocontroller effektiver ausschöpfen


von merkez (Gast)


Lesenswert?

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.

von volltroll.de (Gast)


Lesenswert?

1. Falsche Forumsabteulung ;), hier´ist Code_sammlung_
2. Mach die Ansteuerung doch in nem Timerinterrupt

von Benedikt K. (benedikt)


Lesenswert?

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?

von lesen lernen! (Gast)


Lesenswert?

@merkez: Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen 
lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen 
lernen! Lesen lernen!

von Marc S. (euro)


Lesenswert?

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.

von aha (Gast)


Lesenswert?

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.

von merkez (Gast)


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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:

von merkez (Gast)


Lesenswert?

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!

von Michael H. (morph1)


Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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.

von hans (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.