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
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
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.
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
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.