uController Ausgang ansteuern über x Sekunden



  • Ich muss für eine zet von 1 - 50sekunden " genau weis ich das noch nicht, muss erst getestet werden" einen ausgang schalten damit mein Magnetventil öffnet und flüssigkeit in ein glas laufen läst.

    Wie kann ich sekundengenau einen ausgang schalten ?

    Ich habe derzeit

    static void delay (long x) // Zeitverzögerung Einbauen
    {
    unsigned long i,j;
    for (j=0;j<x;j++)
    for (i=0;i<50000;i++);
    
    }
    
    aufruf dann mit delay(zeit);
    

    Aber zum schalten der ausgänge muss ich das genauer haben und auch länger.Wird ja das magnetventiel angesteuert und bis ein glas befüllt ist dauert das nunmal etwas.

    würde mich über eine hilfe sehr freuen



  • Pure Schleifen würde ich für eine zeit verzögerte Ausführung von Code nicht verwenden, da die Geschwindigkeit, mit der eine Schleife durchlaufen wird auch von der Prozessor-Geschwindigkeit abhängt, die auf verschiedenen System unterschiedlich sein kann.

    Wenn du eine ähnliche Lösung haben möchtest würde ich Thread.Sleep benutzen, hier kannst du eine Zeit in Millisekunden angeben, die der aktuelle Thread schlafen gelegt werden soll. Wenn ich mich recht erinnere ist die Genauigkeit allerdings nicht sehr hoch.

    Grundsätzlich würde ich aber sowieso eine Lösung über Timer bevorzugen. Da gibt es allerdings mehrere Möglichkeiten. Du musst also selbst entscheiden, was für dich am besten passt, deswegen poste ich dir einfach mal die Links:
    System.Timers.Timer Löst beim Ablauf des Timers ein Ereignis aus. Das Ereignis wird in einem ThreadPool-Thread ausgelöst.
    System.Threading.Timer Ruft beim Ablauf des Timers eine Callback-Methode auf. Auch hier läuft der Timer in einem ThreadPool-Thread.
    System.Windows.Forms.Timer Löst beim Ablauf des Timers ein Ereignis aus. Das Event wird aber in dem Thread ausgelöst, in dem der Timer erstellt wurde. Das ist v.a. für Anwendungsfälle wichtig, in denen auf die GUI zugegriffen wird. Da Zugriffe auf die GUI-Elemente nur in dem Thread erlaubt sind, in dem Sie erstellt wurden.



  • Und ich bin mir relativ sicher das es für uController noch kein C# und .NET Framework gibt 😉


  • Administrator

    loks schrieb:

    Und ich bin mir relativ sicher das es für uController noch kein C# und .NET Framework gibt 😉

    Denke ich auch. Die Frage ist aber, ist das nun C oder C++? Wenn ich die Deklaration der Variablen anschauen, würde ich jetzt allerdings auf C tippen.

    @Oldnitro,
    Ich verschiebe dich mal in die C Abteilung. Falls du damit unzufrieden bist, einfach motzen 🙂

    Grüssli



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • falls dein board keinen taktgeber hat wirst du um einen schleife nicht herumkommen. in der schleife natürlich immer schön mit clock() die zeit messen und dann agieren. evtl. bietet deine cpu auch noch genauere zeitgeber an.



  • einen schleife... 🙄



  • Dein µC (welcher ist es denn?) wird bestimmt einen oder mehrere Timer haben. Die zählen dann mit irgendeinem Takt (interner, interner/2, interner/4, ..., externer, usw.) hoch (oder auch runter) und können u.U. mit einem Wert "vorgeladen" werden. Jedesmal wenn der Timer über- bzw. unterläuft würdest du dann einen Interrupt bekommen in welchem du den entpsrechenden Ausgang setzt/zurücksetzt. Sollte der Timer schneller überlaufen als von dir benötigt, dann kannst du dies einfach jedesmal mitzählen und so letztendlich die Zeit einstellen. Prinzip klar?



  • Tim schrieb:

    Dein µC (welcher ist es denn?) wird bestimmt einen oder mehrere Timer haben. Die zählen dann mit irgendeinem Takt (interner, interner/2, interner/4, ..., externer, usw.) hoch (oder auch runter) und können u.U. mit einem Wert "vorgeladen" werden. Jedesmal wenn der Timer über- bzw. unterläuft würdest du dann einen Interrupt bekommen in welchem du den entpsrechenden Ausgang setzt/zurücksetzt. Sollte der Timer schneller überlaufen als von dir benötigt, dann kannst du dies einfach jedesmal mitzählen und so letztendlich die Zeit einstellen. Prinzip klar?

    Jo die meisten von ARM oder die AVR's von ATMEL haben einen Timer Interrupt welcher pi mal daumen (und je nach taktfrequenz) auf mehrere µs plus ein paar zyklen genau ist,.....


Log in to reply