Forum: Mikrocontroller und Digitale Elektronik Differenz zwischen Befehlsausführungszeiten und Timinganforderung ausgleichen


von Ralf (Gast)


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

von Kai S. (kai1986)


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

von Ralf (Gast)


Lesenswert?

Hallo Kai,

warum nur einen Takt Verlängerung? Ich glaube schon, dass ich beim 
achten Durchlauf fünf Zyklen drauf geben muss.

Ralf

von Kai S. (kai1986)


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

von Ralf (Gast)


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

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.