Forum: Compiler & IDEs Timing-Funktion


von Alex (Gast)


Lesenswert?

Hallo,

zur Ansteuerung eines Sensors benötige ich eine Funktion in C (avrgcc),
welche mir ein delay mit einer Auflösung von etwa 1us erzeugen kann. Nun
ist die Frage, wie das anzustellen ist. Sicherlich könnte man auch einen
Timer verwenden, dessen Zählregister vorladen und dann die Interrupts
(TOV) verwenden, einfacher wäre es jedoch mit einem simplen delay(10)
oder so. Der Takt beträgt beispielsweise 8MHz. Ein adaptieren der
Funktion auf 16MHz sollte dann ja kein Problem mehr darstellen.
Gefunden habe ich im Netz z.B. Funktionen nach dem Muster:

void delay (unsigned char us) {
   while (us)
      us--;
}

Das wird nur sicherlich bei meinem Quarz nicht wirklich funktionieren.
Assemblerdateien erzeugt mir das avrgcc im Moment nicht (Was müsste man
da im makefile editieren?), diese könnten mir ja vielleicht bei meinem
Problem helfen.

Schon mal vielen Dank für eure Hilfe,
Alex

von Hans (Gast)


Lesenswert?

schau dir mal das an...
http://www.egnite.de/ethernut/GCCAVRInlAsmCB.pdf

da drinnen is diese funktion beschrieben.....

void delay(uint8_t ms)
{
uint16_t cnt;
asm volatile(
"\n"
"L_dl1%=:" "\n\t"
"mov %A0, %A2" "\n\t"
"mov %B0, %B2" "\n"
"L_dl2%=:" "\n\t"
"sbiw %A0, 1" "\n\t"
"brne L_dl2%=" "\n\t"
"dec %1" "\n\t"
"brne L_dl1%=" "\n\t"
: "=&w" (cnt)
: "r" (ms), "r" (delay_count)
);
}


The purpose of this function is to delay the program execution by a
specified number of milliseconds,
using a counting loop. The global 16 bit variable delay_count must
contain the CPU clock frequency in
Hertz divided by 4000 and must have been set before calling this
routine for the first time.


gut wenn 4000 ms auflösung gibt...dann müsste 4 doch us geben ;) wenn
ich das mal so in den raum stellen darf... oder andere variante..

für jede quarz-frequenz die du verwendest eine zeile ala
asm volatile("nop;nop......");
machen ;)

kannst dir aussuchen ...

das mit c-funktionen ist so eine geschichte... hängt da vom compiler
und von den einstellungen ab was der draus macht...also in dem fall
inline-asm ;)

73 de oe6jwf

von Alex (Gast)


Lesenswert?

Die Frage ist halt: Schafft der AVR exakt ein "nop" je Takt? Dann
hätte man zumindest für sehr kurze delays schon einmal ein Lösung.

von Alex (Gast)


Lesenswert?

Wenn man dann noch wüsste, wie lange er für
unsigned char i = 0;
for (i=0; i<x; i++)
    asm volatile("nop;nop......");

x wäre dann eine Zahl zwischen 0 und 255.
So könnte man die nops in der for-Schleife (z.B. 8 Stück) beliebig
hochskalieren. Die Frage ist nur, wie lange er für einen
Schleifendurchlauf braucht.

Gruß, Alex

von mthomas (Gast)


Lesenswert?

nehme an, es handelt sich um eine 1-wire ansteuerung. vielleicht helfen
dabei die 1-wire routinen aus der "component-library"
(avrfreaks.net/academy/user-projects) und der procyon avr-lib (google
hilft) als "denkvorlage".

von Alex (Gast)


Lesenswert?

Erstmal danke für die zwei Tipps, mal schauen, was sich draus machen
lässt.

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
Noch kein Account? Hier anmelden.