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
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
Hallo Kai, warum nur einen Takt Verlängerung? Ich glaube schon, dass ich beim achten Durchlauf fünf Zyklen drauf geben muss. Ralf
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.