Logging Frequenz programmieren



  • Hallo Zusammen,

    zuerst sollte ich sagen, dass ich Maschinenbauer bin, und Programmiertechnisch noch Anfänger bin (C). Habe folgendes Problem: Ich will einem A/D Converter in einer bestimmten Frequenz sagen, dass er nun einen A/D-Scan machen soll und die Werte speichern soll. Wie kann ich in C so etwas Programmieren, dass ein Aufruf alle z.B 0,02s (etspricht 50 Hz) ausgeführt wird?? Gibt es irgendeine Möglichkeit, eine Schleife alle 0,02s starten zu lassen? Problem ist ja, dass die Schleife keine konstante Ablaufzeit hat, so dass ich nicht einfach sleep() für z.B. 0,015s machen kann.
    Das Program soll auf eienm Linux-Computer (Kernel 2.4.22) mit 400 MHz laufen.

    Schon mal besten Dank für evtl. Antworten.

    Gruß, Igor

    P.S.: Ja, ich habe Google + SuFu bemüht 😃 , die gefunden Themen setzten sich aber mit dem Umgekehrten problem auseinander, nämlich eine verstrichene Zeit zu messen und nicht, wie hier nach einer BESTIMMTEN Zeit etwas zu machen.



  • Dann miss doch die verstrichene Zeit, und tue dann etwas, wenn die BESTIMMTE Zeit verstrichen ist.



  • im user-mode kannste z.b. gettimeofday() nehmen. wenn's 'realtime' sein soll, dann häng dich in den timer-interrupt im kernel ein. der läuft, glaube ich, mit 100Hz, so dass du jeden zweiten tick nehmen kannst.
    🙂



  • Danke für die Antwort Fricky,

    getttimeofday() hatte ich scon mal angesehen und dann wider verworfen, warum weiss ich gerade nicht...
    Wegen dem Linux-Interrupt (der tatsächlich 100Hz beträgt, was ja gut passen würde), muss ich mich jetzt mal schlau machen, wie ich den in C ansprechen kann. Aber eigentlich müsste ich ja nur die "Ticks" zählen und bei jedem zweiten meine Programmschleife starten?!

    Ciao, Igor



  • vielleicht hilft dir das: http://lwn.net/images/pdf/LDD3/ch07.pdf
    🙂



  • hallo Igor,

    ich habe in der unistd.h folgendes gefunden:

    /* Sleep USECONDS microseconds, or until a signal arrives that is not blocked
       or ignored.
    
       This function is a cancellation point and therefore not marked with
       __THROW.  */
    extern int usleep (__useconds_t __useconds);
    

    siehe dazu auch "man usleep".

    Viele Grüße
    Marco


Anmelden zum Antworten