Wartezeit in C

Hallo zusammen,

ich bräuchte eine Wartezeit von 5us und weiß nicht wie ich das am besten realisieren könnte.

MC ist Fujitsu FR50 91360 // Comp. Softune

es gibt ja diverse Möglichekiten wie:

udelay()… funzt aber leider nicht :frowning:
sleep()… Basis müsste da Sekunden sein d.h. unpasend
oder ne „nooperation“-funktion… fragt sich nur wie die heißen müsste :smiley:

naja vielleicht hat ja jemand nen Lösungsansatz für mich

MfG
Sven Geisenhof

PS: bitte keine Antworten wie „google hilft“ oder „lern programmieren“

Hallo zusammen,

ich bräuchte eine Wartezeit von 5us und weiß nicht wie ich das
am besten realisieren könnte.

MC ist Fujitsu FR50 91360 // Comp. Softune

Hilfreich waere hier sicherlich die Benennung des Betriebssystems, welches benutzt wird.

Unter Linux/Solaris gibt es ein usleep und nanosleep.
Unter Windows ist Sleep() in der Lage, mit Millisekunden zu arbeiten.

Wichtig !!! Keine der genannten Funktionen kann exakt 5us schlafen, da hier keine RT Kernels vorliegen. Die Aufloesung ist in der Regel 1ms bis 10ms (sprich ein „sleep(5us)“ entspricht einem sleep(1ms) !

oder ne „nooperation“-funktion… fragt sich nur wie die heißen

__asm { nop }

asm { nop }

__asm__ (
„nop\n\t“
);

aber das haengt natuerlich sehr stark vom Compiler ab !!!

Gruss
norsemanna

Hilfreich waere hier sicherlich die Benennung des
Betriebssystems, welches benutzt wird.

programmiert wird von einem win-rechner aus

Unter Linux/Solaris gibt es ein usleep und nanosleep.
Unter Windows ist Sleep() in der Lage, mit Millisekunden zu
arbeiten.

kleiner als millisekunden als zeitbasis ist unter win nicht möglich??

__asm { nop }

asm { nop }

__asm__ (
„nop\n\t“
aber das haengt natuerlich sehr stark vom Compiler ab !!!

der compiler: softune workbench

schon mal danke für die infos… :wink:

grüße
sven

Hilfreich waere hier sicherlich die Benennung des
Betriebssystems, welches benutzt wird.

programmiert wird von einem win-rechner aus

ok, so wie es aussieht, hast du 'nen Crosscompiler, dann interessieren natürlich die Aussagen für Windows/Linux/Solaris nicht.

Laut Datenblatt hat der 91360 2 Kanaele für frei programmierbare Timer (und es gibt 'ne realtime clock). Vielleicht kann man auch dort ansetzen.

Gruss
norsemanna

Moin,

kleiner als millisekunden als zeitbasis ist unter win nicht
möglich??

Nach meiner Erfahrung: Korrekt. Für alles zeitlich genauer als auf wenige 1ms geregelte benötigt man RT-System - die natürlich gleich viel mehr Geld kosten wie z.B. http://search.ni.com/nisearch/main/p?q=realtime&x=0&y=0

Gruß,
Ingo

Hallo,

je nach verwendeter Quarzfrequenz sind 5µs evt. schon sehr wenig. Möglichkeiten:

  • Berechnen, aus Quarz, Datenbuch (wieviel Quarzschwingungen ein NOP braucht), und dann entsprechende Anzahl an NOPs einfügen.
  • wenn RTOS oder Interrupts aktiv: Wie werden Taskwechsel / Interrupts verhindert
  • Wenn zuviele Nops notwendig : Unterprogramm, dass z.B. Anzahl an µs übergeben bekommt, und in einer (doppelt) geschachtelten Schleife wartet. ganz wichtig: Den Begriff „volatile“ nachschlagen, auch wenn der meist bei inline-Assembler nicht gebraucht wird.
  • Wenn Interrupts möglich und schnell genug: Timer aufsetzen und interrupt auslösen lassen
  • Zur Kontrolle immer Ausgangspin (oder z.B. ungenutztes Adressbit) verwenden um mit Oszilloskop echte Zeit zu messen (direkt high, low, dann high, warten, low. Differenz sollte dann dem Warteaufruf entsprechen
  • Sicherstellen, dass die Nacharbeiten vor dem Start, und die Vorbereitung nach dem Ende die 5µs nicht unzulässig verlängern.

Viel Erfolg!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo zusammen,

schon mal vielen vielen dank für die schnelle kompetente hilfe an alle :smile:

ich muss jetzt mal „versuchen“ diese tips umzusetzen und melde mich mit feeedback zurück :smiley:

nochmal vielen dank
sven geisenhof