Ich versuche herauszufinden, wie man so etwas wie delay () in Arduino macht, aber nur für direkten AVR-Code. Was ist der typische Weg, um Wartezeiten und dergleichen auf AVR-Chips durchzuführen?
Sie haben ein paar Möglichkeiten:
1) Verwenden Sie einen Interrupt. Die Einrichtung ist etwas kompliziert, gibt Ihrem Gerät jedoch die Möglichkeit, andere Dinge zu tun, während es wartet. Anweisungen zum Einstellen eines Interrupts finden Sie in Ihrem AVR-Datenblatt. Für Verzögerungen, die größer als der Interrupt-Zähler sind, können Sie einen Vorteiler oder eine andere Variable verwenden, um Interrupts zu zählen, bis die gewünschte Wartezeit aufgetreten ist.
2) Verwenden Sie ein NOP in einer for-Schleife, um Ihre Wartezeit auszuführen. Laut dieser Seite - http://playground.arduino.cc/Main/AVR - dauert eine NOP-Operation 1 Taktzyklus - 1 Taktzyklus = 1/Frequenz. Bei 16 MHz benötigt ein NOP 62,5 ns zur Ausführung. Verwenden Sie beim Definieren Ihres Schleifenzählers eine lange Variable ohne Vorzeichen , damit Sie nicht überrollen.
Ihr Schleifenzähler sieht so aus (volatile stellt sicher, dass die Kompilierung den Code nicht optimiert):
void delay(unsigned long delay) {
volatile unsigned long i = 0;
for (i = 0; i < delay; i++) {
__asm__ __volatile__ ("nop");
}
}
Bearbeiten: Es wird etwas Overhead von der for-Schleife geben. Sie können dies experimentell (einfach) oder durch Zählen der Anweisungen (schwer) ermitteln.
util/delay
Grund (vgl. Gorloths Kommentar?)strtok()
oder malloc()
? Sie wollen eine Warteschleife optimieren ? Ich denke, ob Interrupts bevorzugt werden oder nicht, hängt wirklich von Ihrer Anwendung ab. Viele Male brauchen Sie eine Sperrwartezeit, oder?
Leon Heller
Gorloth