millis(), aber im 0,1ms - Takt

Hallo,
ich versuche, die Auflösung bei der Funktion millis() auf das Zehnfache zu erhöhen z.B für den folgenden Auszug:

currentMillis1 = millis();
if((currentMillis1 - previousMillis1) >= speed[oldx1]) {
previousMillis1 = currentMillis1;
if (stepState1 == LOW) stepState1 = HIGH; else stepState1 = LOW;
digitalWrite(stepPin1, stepState1);

Der 1ms - Takt ist mir nicht fein genug, micros() ist zu fein. 0,1ms wären gerade richtig.

Hat jemand eine Idee?

unsigned long hektos() // suche dir einen schöneren Bezeichner aus
{
   return micros()/100;
}

micros() ist zu fein

Warum, was genau ist dir zu fein? micros() ist evtl gar nicht so fein wie du denkst. Auf einem 16MHz-Arduino hast du nur 4µs Auflösung im micros() Ergebnis.

Je nach dem, was dich daran stört, passt evtl. combies Vorschlag auch nicht ...

Und da gibt es auf avr - Ebene auch Hardware-Timer, die (beschränkt sogar ganz ohne Code) Pins toggeln können.

Hallo,

wenn es wirklich nur dazu dient einen Pin zu schalten im Takt, dann konfiguriere dir einen Timer selbst. Der läuft dann ohne weitere CPU Last exakt nebenbei mit genauen Taktverhältnis. Ansonsten wie gezeigt die micros runterteilen, hier musste Obacht geben das dein Programm in "loop" nicht länger benötigt wie die gewünschten 100µs. Falls das noch länger werden sollte. Auf der anderen Seite der Betrachtung, wenn dir 100µs ausreichen und der +/- 4µs Fehler tolerierbar ist , kann es auch sein du braucht gar kein genaues Timersignal. Die Anforderung musst du festlegen.

Edit:
oder ganz "brutal", die Konfig vom Timer 0 anpassen, sodass millis() nicht mehr ms zählt sondern 100µs entspricht :sunglasses:

Edit:
oder ganz "brutal", die Konfig vom Timer 0 anpassen, sodass millis() nicht mehr ms zählt sondern 100µs entspricht

Das dürfte die denkbar schlechteste aller bisherigen Ideen sein...
Dazu muss der Arduino Core verändert werden, denn ein Teil der Abhandlung steckt in Defines
Viele von delay(), millis() und micros() abhängige Libs werden versagen.

Das würde ich mal gerne sehen, wie du das in den Griff bekommst, und dabei die Klippen umschiffst.

hektos() hats gebracht. Danke.

@ combie: irgendwie verstehst du keine Ironie oder etwas Witz, egal, für genau den Code da ganz oben sollte es funktionieren, da ist nichts von anderen Libs oder delay weit und breit zu sehen, jeder Fall bekommt seine individuellen Lösungsvorschläge, zudem es mehrere Vorschläge gibt, einige sind gut und andere weniger gut, aber alle würden für genau den Fall funktionieren

Edit:
ich hatte irgendwie im Kopf die nutzen dafür einen Compare Match, die Zahl 124 will mir nicht aus dem Kopf, finde ich derzeit im core nicht. Deswegen ging ich von einer einfachen Anpassung des Prescalers und Compare aus. Die nutzen jedoch den Overflow Interrupt. Da wird das leider nichts mit einer “einfachen aber brutalen” Änderung. Naja, war ne Idee.