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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren