Asuro einen Motor nur alle 5 Sekunden laufen lassen



  • ASURO Projekt Einen Motor pausieren lassen ? Editieren Zitieren
    Hallo
    Ich bin Schüler und anfänger was Programmieren betrifft... weshalb ich mir leider alles zusammenschnipseln muss.

    Mein Problemm ist, dass ich ein Projekt mit dem ASURO erarbeiten muss. Darum habe ich ihn zu einer Sortiermaschine umgebaut die drei verschieden große Murmeln sortiert. Ein Motor wirft meine Murmel in die Rollbahn und die Fototransistoren erkennen die jeweilige Kugelgröße durch mehr oder weniger helligkeit. Je nach Kugelgröße richtet der zweite Motor meinen Sortierarm aus, so das die Kugel in das gewünschte Fach rollt.
    Problem ist nun, das der Auswerfmotor {rechter Motor} (ganz am Ende des beigefügten Programmes siehe !!!!!!!! ) die ganze zeit läuft er soll aber eine bestimmte zeit pausieren bis die Kugel jnten ankommt. Mit Msleep funktioniert das ja nicht, da sonst das ganze Programm stopt und meine Fototransistoren die vorbeirollende Kugel nicht erkennen.

    Gibt es hier eine Möglichkeit nur den auswerf Motor eine bestimmte Zeit pausieren zu lasen ?

    #include <avr/io.h> 
    #include "asuro.h" 
    int main(void) 
    { 
    Init(); 
    unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander 
    FrontLED(ON); 
    Msleep(1000); 
    while (1) 
    { 
    
    LineData(data); 
    
    if ((data[0]<700) && (data [1]<700)) 
    { 
    MotorDir(FWD,FWD); 
    MotorSpeed(85,0); 
    Msleep(160); 
    MotorSpeed(0,0); 
    Msleep(3000); 
    MotorDir(RWD,RWD); 
    MotorSpeed(85,0); 
    Msleep(160); 
    MotorSpeed(0,0); 
    
    } 
    
    if ((data[0]>700) && (data[1]>700)) 
    { 
    MotorDir(FWD,FWD); 
    MotorSpeed(0,0); 
    
    } 
    
    if ((data[0]>700) && (data[1]<700)) 
    { 
    MotorDir(RWD,RWD); 
    MotorSpeed(85,0); 
    Msleep(160); 
    MotorSpeed(0,0); 
    Msleep(3000); 
    MotorDir(FWD,FWD); 
    MotorSpeed(85,0); 
    Msleep(160); 
    MotorSpeed(0,0); 
    } 
    
    MotorDir(FWD,FWD); !!!!!!!!!!!! 
    MotorSpeed(0,100); 
    Msleep(480); 
    MotorSpeed(0,0); 
    
    } 
    }
    

    Danke



  • Mach eine State Machine

    Merk dir den Einschaltzeitpunkt und dann schaust du in der Schleife immer wieder nach, ob die Zeit um ist und schaltest ihn dann aus.

    unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander
    

    Das ist "nur" eine Definition.
    Initialisiert wird eine Variable, wen ihr der erste Wert zugewiesen wird.
    Das kann auch mit der Definition erfolgen.

    Dein Einrückungsstil ist nicht lesbar.



  • Vielen Dank erstmal
    Aber ich sorry ich habe nicht verstanden was nicht lesbar ist und was ist/ bedeutet state machine ?


  • Mod

    Was macht man denn, wenn man nicht weiß, was ein Begriff bedeutet?



  • Luba1248 schrieb:

    Vielen Dank erstmal
    Aber ich sorry ich habe nicht verstanden was nicht lesbar ist und was ist/ bedeutet state machine ?

    eine state machine ist ein zustandsautomat, d.h. abhängig vom momentanen zustand erwartet die "machine" eine bestimmte eingabe bzw. zeigt ein bestimmtes verhalten und geht danach in den nächsten zustand über.

    ein süßwarenautomat z.b. hat folgende zustände

    - auswahlzustand: warte auf eingabe bzgl. gewünschter ware oder geldrückgabetaste
    - bezahlzustand: warte auf geldeinwurf
    - ausgabezustand: gib gewählte süßware aus

    und wenn die jeweilige bedingung erfüllt ist (eingabe erkannt, geforderter geldbetrag eingeworfen, ausgabevorgang abgeschlossen) wird in den jeweils nächsten zustand gewechselt.

    für dein problem nummerierst du dir die zustände am besten durch (#define murmeleingeworfen 0x0001, #define kleinemurmelerkannt 0x0002 usw) und lässt dann in einer switch-anweisung die jeweiligen verhaltensweisen ausführen und danach in den nächsten zustand wechseln.



  • Ja man schaut nach (Googelt oder ähnlich) doch war es mir immer noch nicht ganz klar.
    Danke noch für die erklärung.
    Nun habe ich noch nach langem herumprobieren und belesen herausgefunden, dass derAduro eine Gettime funktion besitzt doch weis ich nicht wie ich diese Anwenden kann. Beziehungsweise einbauen kann.

    Ich wollte sie zum beispiel so Testen:

    [code]#include <avr/io.h>
    #include "asuro.h"
    #include "myasuro.h"
    int main(void)
    { // Alle 500 ms die Front-LED umschalten.
    unsigned long zeit;
    unsigned char on_off = TRUE;
    zeit = Gettime ();
    while (1)
    {
    if (Gettime () > zeit + 500)
    {
    zeit = Gettime ();
    FrontLED (on_off);
    on_off ^= 1;
    }
    }
    }

    Doch leider ging die LED bei diesem Versuch nicht aus und an oder habe ich das Programm falsch verstanden ?
    PS: wie schreibe ich diese Gettime funktion in mein Programm beziehungsweise wo ? Weil mir ist nicht klar wie diese fuktioniertund was sie in meinem Beiapielprogramm macht, trotz nachlesen und belesen.


Anmelden zum Antworten