Delay zeiten im Mikrocontroller effektiver ausschöpfen

Gast #1049849
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?
Gast
@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.
Gast
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.
Gast
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:
Gast
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.
Gast
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

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.