Gast
#283799
Hallo Männers,
ich brauche mal eure Hilfe, bevor ich hier noch eine Koffeinvergiftung
und/oder graue Haare bekomme.
Zum Problem: Ich will mit der oben geposteten delay.h eine Verzögerung
von ca 200 bis 600 µs bewerkstelligen.
Als Hardware benutze ich einen ATmega 128 mit 16 MHz Taktfrequenz.
Die Funktion " _delay_us(double __us)" ist klar, hier wird der
übergebene Wert auf die Funktion " _delay_loop_1" angepaßt.
Laut Aussage des Kommentars kann ich mit _delay_us eine max Verzögerung
von 768µs / 16MHz = 48 µs erreichen.
Ergo, muß ich in der Funktion "_delay_loop_1" etwas "drehen".
Und damit sind wir bei meinem Problem:
static _inline_ void
_delay_loop_1(uint8_t __count)
{
_asm_ volatile (
"1: dec %0" "\n\t"
"brne 1b"
: "=r" (__count)
: "0" (__count)
);
}
Es wäre schön, wenn mir jemand von Euch diese 6 Zeilen mal erklären
könnte, und vielleicht auch die andere Funktion (_delay_loop_2).
Ich weiß, das hier mit dem 8Bit-Counter bzw. 16Bit-Counter etwas
decrementiert wird, kann das aber beim besten Willen nicht
nachvollziehen!! C ist das scheinbar nicht und Assembler auch nicht,
oder nur zum Teil.... Vielleicht ist das so was wie ne Makro-Anweisung
oder ähnlich, naja ich hoffe auf Euch!!!
Wenn ich das kapiert habe, kann ich mich entscheiden, ob ich mir was
neues einfallen lasse, oder hier weiter Zeit investiere.
Übrigens, die Datei "delay.h" stammt aus dem letzten WinAVR und
sollte bei jedem, der diesen nutzt mit dabei sein.
vielen Dank für Eure Mühe!
mfg
Asterix-007