www.mikrocontroller.net

Forum: Compiler & IDEs Timing-Funktion


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Alex (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.