Differenz zwischen Befehlsausführungszeiten und Timinganforderung ausgleichen

Gast #3111025
Lesenswert?
• ▲
▼
Hallo,

mich würde mal interessieren, wie man Differenzen zwischen 
Befehlsausführungszeiten und Timinganforderungen ausgleicht, wenn auf 
die Oszillatorfrequenz des Controllers kein Einfluss genommen werden 
kann. In meinem Fall sieht's so aus:

In einer Schleife werden Daten seriell ausgegeben. Um die 
Timinganforderung (ohne zulässige Toleranz) pro Bit einhalten zu können, 
sind 30,625 Maschinenzyklen nötig. Logischerweise kann ich nur 30 oder 
31 Zyklen pro Bit "verbrauchen".

Auf den nächsten ganzzahligen Wert komme ich nach acht Durchläufen: 
0,625 * 8 = 5.

Wie gleicht man das nun aus? Die Schleife auf 30 trimmen und bei jedem 
achten Durchlauf fünf Zyklen mehr verbraten? Stimmt die Rechnung so?

Das ganze funktioniert bereits fehlerfrei mit Einbeziehung der 
zulässigen Toleranzen (etwa 7,5 Zyklen Toleranz pro Bit) und weil die 
Übertragung asynchron ist und sich damit neu auf ein Bit synchronisiert, 
aber mich würde eben interessieren, wie man das ausgleicht.

Ralf
#3111034
Lesenswert?
• ▲
▼
Hallo,

du könntest einen Zähler mitlaufen lassen, der den Zeitfehler in achteln 
mitzählt und jedesmal, wenn der 8 überschreitet wartest du einen Takt 
länger.
Könnte dann ca. so aussehen:
Bit senden
30 Takte warten, Zähler 5 (+5)
Bit senden
30 Takte warten, Zähler 10 (+5)
Bit senden
31 Takte warten (da Zähler >=8), Zähler 7 (-8 +5)
Bit senden
...

Gruß Kai
#3111440
Lesenswert?
• ▲
▼
Hallo,

ja, nach 8 Durchläufen musst du insgesamt 5 Takte extra gewartet haben. 
Um die Abweichung aber möglichst klein zu halten, dürfte es geschickter 
sein, nicht auf einmal 5 Takte extra zu warten, sondern sobald du genug 
für einen zusätzlichen Takt zusammen hast, diesen schon zu warten, so 
wie es z.B. auch mit den Schaltjahren gemacht wird.

Ich hab es mal versucht in einer Tabelle zusammen zu stellen, sorry für 
die nicht dazupassenden Überschriften.

Durchlauf  Gesamtwartezeit  Gesamtwartetakte  Rest  Voller Takt? 
Taktzahl zwischen durchläufen

1  0        0    0,625  0  30
2  30,625   30   1,25   1  31
3  61,25    61   0,875  0  30
4  91,875   91   1,5    1  31
5  122,5    122  1,125  1  31
6  153,125  153  0,75   0  30
7  183,75   183  1,375  1  31
8  214,375  214  1      1  31

Damit bleibst du dann immer bei einer Abweichung von maximal einem 
Taktzyklus.

Gruß Kai
Gast #3112211
Lesenswert?
• ▲
▼
Hallo Kai,

jetzt wird's klarer, danke. Ob ich nun einmal fünf Takte warte oder 
immer gleich einen "verbrate", wenn genug Versatz zusammen gekommen ist 
dürfte bei dieser Anwendung keine Rolle spielen, aber ich versuch mal 
beides zu implementieren.

Ralf

Antwort schreiben

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.

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.