- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Zeitsteuerung für asuro

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    45

    Zeitsteuerung für asuro

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo asurofreunde.da mein asuro mit 4 US-sensoren nun ewig ohne anzuecken durch die wohnung kurft,hab`ich mir überlegt,ob man eine zeitsteuerung ins US-prog.einflechten kann,sodass er z.B. nach einer frei wählbaren zeit selbst abschaltet,und nach dem nächsten einschalten die zeit wieder läuft.Habe leider keine peilung wie die befehlszeile aussehen muss,und ob die am anfang oder ende des prog. stehen muss.
    Hat einer einen tipp,oder wurde das schon gefragt,und ich habs übersehen?

    Dank und gruss Hans2

  2. #2
    Wenn ich es jetzt richtig verstanden habe und du meinst, dass er einen bestimmten "Zeitwert" abspeichert, bevor man den ASURO ausschaltet und ihn dann weiter verwendet, dann geht das schon.
    Versuch mal den Wert im EEPROM-Speicher vom ASURO abzuspeichern und nach dem Starten wieder einzulesen.

    Falls du wissen möchtest, wie, musst du das schon selber rausfinden. Ich kenn' mich nicht so gut mit dem EEPROM aus und hab die einzigen Befehle, die ich mal gesehen habe auch nicht mehr im Kopf. Aber guck' mal im Datenblatt vom ATMega8, da gibt's auf jeden Fall Informationen, oder hier müsste auch einiges an Infos vorhanden sein.

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    wie der eeprom geht, weiss ich zwar. aber meinst du nicht, dass z.B. nach 10 minuten der asuro stehen bleibt, und nach dem nächsten start wieder 10 minuten fährt usw?

    das liesse sich elegant über die vorhandene timebase lösen.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    45
    hallo damaltor,genau so dachte ich.er soll ca. 10 min. fahren,und sich dann selbst auschalten.dann mache ich den schalter aus,und stelle ihn weg. beim nächsten einschalten,soll er das gleiche wieder machen.wäre das möglich?.....gruss auch an d1ko.

    Beste grüsse hans

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    30
    Beiträge
    98
    du könntest auch einen timer einbauen, der nach zehn minuten den asuro in eine endlos sleep-schleife sichickt.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  6. #6
    Ach so, tut mir leid, ich hab' das irgendwie falsch verstanden. (Das EEPROM wirst du aber so oder so bei deinem Problem brauchen.^^)

    Hier schon mal ein Ansatz, wie sich das lösen lässt:
    (Ich benutze die alte ASURO-Library, also die, die auf der ASURO-CD mitgeliefert wird. Falls du die neue hast, lässt sich das Problem bestimmt ähnlich lösen (hoffe ich...).)

    An deiner Stelle würde ich das Zählen einem Interrupt überlassen:
    Öffne zuerst die Datei asuro.c (müsste in deinem ASURO-Verzeichnis unter ...\ASURO_src\FirstTry zu finden sein).
    Dort müssten ziemlich am Anfang diese Zeilen stehen:

    Code:
    volatile unsigned char count72kHz;
    
    /* uses timer2 (36kHz for IR communication */
    /* counts falling and rising edge => 36kHz*2 = 72kHz */
    SIGNAL (SIG_OUTPUT_COMPARE2)
    {
    	count72kHz ++;
    }
    SIGNAL (SIG_OUTPUT_COMPARE2) ist ein Interrupt, der verwendet wird, um z.B in der Sleep-Funktion die 72kHz-Takte zu zählen. Immer, wenn eine 72.000stel Sekunde vorbei ist, wird der Interrupt ausgelöst, der den Counter inkrementiert. Die Sleep-Funktion sieht nebenbei so aus:

    Code:
    /* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */
    void Sleep(unsigned char time72kHz)
    {
    	count72kHz = 0;
    	while (count72kHz < time72kHz);
    }
    Falls du dir den Rest dazu selber ausdenken möchtest, dann lies ab hier nicht mehr weiter .

    Code:
    Damit du jetzt die Zeit nach dem Einschalten zählen kannst, musst du nur noch in dem oben genannten Interrupt SIGNAL (SIG_OUTPUT_COMPARE2) einen Mechanismus einbauen, der zuerst die Millisekunden, Sekunden und dann die Minuten zählt. Wenn die gewünschte Zeit vorbei ist, sollte ein Flag im Interrupt aktiviert werden, den das Hauptprogramm benutzen kann.
    Mehr verrat' ich nicht.^^
    MFG D1K0

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    45
    Hallo,d1ko,schade,dass du nicht mehr verrätst.Ich bin zwar gut im Elektronkbau,aber programmieren ist nicht meine stärke.Ich habe mir die aktuelle US-version runtergeladen,und in dem Prog,habe ich nur zeiten,drehrichtung,und geschwindigkeit geändert.Alles andere ist mir noch suspekt.Hatte gehofft,dass mir einer sagt,wo,und was ich ins dieses prog. einfügen muss.Gruss Hans aus bremen

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Hallo Hans,
    mit der schönen Funktion Gettime() aus der Lib 2.71 lässt sich eine Zeitsteuerung auch realisieren, wenn man sich mit Interrupts nicht auskennt:
    der ASURO als Wecker
    Gruss
    M.

  9. #9
    Zitat Zitat von Hans2
    Hallo,d1ko,schade,dass du nicht mehr verrätst.Ich bin zwar gut im Elektronkbau,aber programmieren ist nicht meine stärke.Ich habe mir die aktuelle US-version runtergeladen,und in dem Prog,habe ich nur zeiten,drehrichtung,und geschwindigkeit geändert.Alles andere ist mir noch suspekt.Hatte gehofft,dass mir einer sagt,wo,und was ich ins dieses prog. einfügen muss.Gruss Hans aus bremen
    Oh, ich dachte, ich hätte schon zuviel verraten und würde dir den Spaß verderben, wenn ich dir einfach den ganzen Code aufschreibe...

    Also hier ein Lösungsvorschlag:

    Im Interrupt wird wie oben erwähnt alles ausgerechnet:
    D.h. du must in asuro.c folgendes ändern:

    Code:
    volatile unsigned char count72kHz = 0;
    volatile unsigned int countmsec = 0;
    volatile unsigned char countsec = 0;
    volatile unsigned char countmin = 0;
    volatile char flag = 0;
    
    /* uses timer2 (36kHz for IR communication */
    /* counts falling and rising edge => 36kHz*2 = 72kHz */
    SIGNAL (SIG_OUTPUT_COMPARE2)
    {
    	count72kHz ++;
    	if (count72kHz == 72)
    	{
    	   countmsec++
    		count72kHz = 0;
    	}
    	if (countmsec == 1000)
    	{
    	   countsec++;
    		countmsec = 0;
    	}
       if (countsec == 60)
    	{
    	   countmin++;
    		countsec = 0;
    	}
    	if (countmin == 10)
    	{
    		flag = 1;
    	}
    }
    Dadurch 10 Minuten nach dem Einschalten der Flag gesetzt.
    (Man könnte auch Speicherplatz sparen und nur mit countsec die gewünschte Zeit in Sekunden angeben, aber ich hab es zur Demonstration einfach mal auch mit Minutenzähler gemacht.)

    Du wolltest ja, dass er nach 10 Minuten nichts mehr macht. Dazu musst du im Hauptprogramm einfach den Flag in eine if-Schleife einbauen, in der eine Endlosschleife eingebaut ist.^^
    Sieht dann so aus:

    Code:
    if (flag ==1) 
    {
           // Motor etc. abschalten
           while(1);
    }
    Das muss dann an irgendeiner Stelle in der Endlosschleife deines Programms eingebaut werden. (Es soll also ständig abgefragt werden.)

    Mit dem Programm macht der ASURO also nach 10min nichts mehr.
    Damit er die Zeit nach dem Einschalten weiter hochzählen kann, muss man den countmin-Wert vor dem Abschalten im EEPROM abspeichern und nach dem Einschalten auslesen und weiter hochzählen lassen.
    Wie das mit dem EEPROM geht, weiß ich leider auch nicht genau.
    Hoffe, ich konnte dir trotzdem helfen.

    MFG D1K0

    EDIT:
    Sorry, ich hab vergessen die Millisekunden im Interrupt hochzuzählen (72 * 1000 Takte pro Sekunde). .
    Hab' das jetzt geändert. Ach ja, das Programm habe ich nicht getestet, ich weiß deshalb nicht, ob irgendwo ein Fehler drinsteckt oder nicht.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    45
    Hallo D1KO,ich hab`mir deinen vorschlag angeschaut,und hab`noch ne frage.Dein prog. bezieht sich aur IR,und ich spreche von Ultraschall.Das verwirrt mich nun.Vielleicht kannst du mir das nochmal erläutern.ob das trotzdem so ginge.
    Danke und gruss
    Hans2

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen