www.mikrocontroller.net

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


Autor: merkez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: volltroll.de (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: lesen lernen! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@merkez: Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen 
lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen lernen! Lesen 
lernen! Lesen lernen!

Autor: Marc Seiffert (euro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: aha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: merkez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:

Autor: merkez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.