PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATTiny25 _delay_ms mit Variable als Parameter



Bumbum
19.07.2012, 16:36
Hallo,

ich habe ein Problem bei der Programmierung eines ATTiny25. Ich möchte der _delay_ms Funktion gerne eine U8 Variable übergeben:



U8 MagnetTime = 10;
_delay_ms (MagnetTime);


Der Wert 10 dient nur als Beispiel und soll dann im Programm zur Laufzeit berechnet werden.

Ich weiß, dass die Funktion _delay_ms Konstanten als Parameter erwartet. Gibt es eine Alternative oder muss ich diese selbst programmieren?

Viele Grüße
Andreas

Besserwessi
19.07.2012, 16:59
Mit dem Delay_ms geht es nicht - Das kann man aber relativ einfach selber programmieren:
Einfach ein For Schleife die entsprechend oft ein Delay mit 1 ms Aufruft. Für mehr Auflösung kann man ggf. auch auf 100 µs runter gehen, ohne das die Fehler zu groß werden.

Bumbum
19.07.2012, 18:30
Hallo Besserwessi,

das ist ein sehr guter Denkanstoss, so werde ich das machen. Vielen Dank!

Viele Grüße
Andreas

oberallgeier
19.07.2012, 22:37
Hallo Andreas,

mein selbstgezimmertes waitms() läuft ziemlich sauber eine Sekunde !wenn kein Interrupt stört! - wird allerdings in meinem interruptdurchseuchten controller nicht immer genau sein. Die Zahl 4000 ist natürlich sehr vom Controllertakt abhängig - ich habe fast immer 20 MHz. Dabei kann ich auch eine - dann aber doch eher fehlerhafte - Mikrosekunde warten.

Hier der waitms() - Code, der ist aus dem Demoprogramm der RN-Control (klick mal) (http://www.rn-wissen.de/index.php/RN-Control_Demoprogramm_in_C) :

/* ================================================== ============================ */
/* ================================================== ============================ */
/*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/
void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
/* ================================================== ============================ */

Uuuuuups - nun ist der Fünftausender voll . . .