Timing-Funktion

Gast #177486
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
Gast
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
Gast
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
Gast
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".

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.