- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Asuro - Probleme mit Msleep Funktion

  1. #1

    Asuro - Probleme mit Msleep Funktion

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich bin dabei die ersten Programme für meinen Asuro zu erstellen und hänge nur leider gerade an einem Problem fest.

    Ich möchte das der Asuro vorwärts fährt und wenn er auf ein Hindernis trifft (bemerkt durch die Taster K1 bis K6) den Rückwärtsgang für 2 Sekunden einlegt und dann
    wieder vorwärts fährt. Mit diesen 2 Sekunden beim Rückwärtsfahren habe ich ein Problem was ich nicht verstehe. Nach einiger Zeit googeln habe ich zwei Methoden
    versucht (for(i=0; i<2000; i++) Sleep(72); und Msleep(2000); ), beide bringen das selbe Ergebnis. Der Asuro fährt nach dem Einschalten sofort Rückwärts und reagiert auf nichts mehr. Sobald ich die Wartezeit wieder rausnehme, läuft er wieder einwandfrei.

    Hat einer von Euch eine Idee, wo hier mein Wissens- oder Gedankenfehler liegt?

    Code:
    #include "asuro.h"
     
     int main(void)
    {
    	Init();
    	
    	while (1)
    	{
    		if (PollSwitch() > 0)
    		{
    			MotorDir(RWD, RWD);
    			MotorSpeed(80, 80);
    			StatusLED(RED);
    //			Msleep(1000);
    		}
    		else
    		{
    			MotorDir(FWD, FWD);
    			MotorSpeed(120, 120);
    			StatusLED(GREEN);
    		}
    	}
    	return(0);
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Dein "Wissensfeher", wenn man das so nennen mag, liegt darin, dass du der Funktion PollSwitch() zu sehr vertraust. Sie liefert leider nicht immer die erwarteten Werte. Neben Löt- und Bestückungsfehlern (in der Anleitung ab Seite 30 beschrieben) wirken sich auch Bauteiletoleranzen als fehlerhafte Werte aus. Deshalb muss man gelegentlich die Formel zur Tastenberechnung "kalibrieren". Dazu ändert man in der Datei asuro.c in der Funktion PollSwitch() die return-Zeile. Bei mir sieht diese Stelle so aus:

    Code:
    	return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
    Meist reicht es, wenn man an der 61 rummfummelt.

    Bei laufenden Motoren kommen dann zusätzliche Ungenauigkeiten hinzu. Deshalb ist eine Mehrfachabfrage von PollSwitch() immer sinnvoll:

    Code:
    sw1=PollSwitch();
    sw2=PollSwitch();
    
    If((sw1 == sw2) && (sw1 > 0)) ...
    Wenn man nur testen möchte, ob eine Taste gedrückt wurde, kann man auch den AD-Wandler umgehen und direkt den Pin abfragen:

    if(!(PINC & (1<<PC4))) ...
    (aus http://www.arexx.com/forum/viewtopic.php?p=1323#1319)

    Meist ist es auch hilfreich, wenn man sich die gemessenen Werte von PollSwitch (oder auch andere Werte) über die serielle Schnittstelle zum PC senden läßt und in einem Terminal anzeigt. Dazu kann man die Funktion PrintInt() verwenden, die aber in der orginalen Library des asuro noch nicht enthalten ist. Deshalb würde ich dir empfehlen eine neuere Library zu verwenden. Ich benutze und empfehle die Version 2.3, weil sie noch sehr nahe an der orginalen Version ist, aber schon die Erweiterungen wie PrintInt() und Msleep() kennt und die 36kHz-Timermodifikation von Waste besitzt (z.B. für die IR-Abstandsmessung). Die aktuelle Version 2.8 funktioniert natürlich auch, bringt einen aber auch weiter weg von der eigentlichen Hardware des asuro:

    https://sourceforge.net/projects/asuro/files/AsuroLib/

    Gruß

    Micha
    Geändert von radbruch (01.05.2016 um 17:15 Uhr) Grund: Tippfehler
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Hallo Micha,

    super, vielen Dank für die schnelle Antwort und den Tipps!
    Ich werde das am kommenden Wochenende probieren... jetzt fordert meine Frau ihre Zeit ein

    Viele Grüße
    Carsten

  4. #4
    Hallo Micha,

    hier mal ein Update von heute.

    Ich habe die Taster kalibriert und nun stimmen alle Zahlenwerte von K1 bis K6.
    Bei K6 hatte der Asuro immer sehr unschlüssig reagiert (LED rot aber nicht rückwärts gefahren). Dies habe ich jetzt mit dem Wert
    der bei mir MY_SWITCH_TRESHHOLD heißt in den Griff bekommen (von 1010 auf 1018 gesetzt).
    Soweit so gut.


    Mit der Doppelabfrage der Tasterwerte habe ich mich bis eben beschäftigt, tut nur leider bei mir nicht. Wenn ich if((sw1 == sw2) && (sw1 > 0)) eingebe,
    fährt der Asuro vorwärts, die LED leuchtet grün, er reagiert aber auf keine der K-Taster
    Mein Msleep-Problem konnte ich auch noch nicht lösen, ist leider noch wie beschrieben.

    Ich nutze die Library v280rc2 geladen von Sourceforge.

    Hast Du noch eine Idee?

    Hier noch der aktuelle Code:
    Code:
    #include "asuro.h"
    
    unsigned char sw1, sw2; 
    
    
    int main(void)
    {
        Init();
        sw1=PollSwitch();
        sw2=PollSwitch();
    
    
        
        while (1)
        {
    //        if (PollSwitch() > 0)
            if((sw1 == sw2) && (sw1 > 0))
            {
                MotorDir(RWD, RWD);
                MotorSpeed(80, 80);
                StatusLED(RED);
    //            Msleep(2000);
            }
            else
            {
                MotorDir(FWD, FWD);
                MotorSpeed(120, 120);
                StatusLED(GREEN);
            }
        }
        return(0);
    }

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Code:
    sw1=PollSwitch();
    sw2=PollSwitch();
        
        while (1)
        {
    //        if (PollSwitch() > 0)
               if((sw1 == sw2) && (sw1 > 0))
    Jeder durchlauf von den While-schleife mussen naturlich sw1 und sw2 wieder neu eingestellt werden mit PollSwitch ergebnissen. Sonnst wird er immer seine Entscheidungen auf alte daten bassieren.
    Geändert von Valen (08.05.2016 um 20:49 Uhr)

  6. #6
    Hallo Valen,

    vielen Dank für deinen Tipp, nun klappt das mit den Tastern.
    Das Msleep Problem konnte ich damit leider doch nicht lösen, hier werde ich noch einmal in mich gehen müssen... oder es gleich
    über die Odometrie lösen.

    Viele Grüße
    Carsten

Ähnliche Themen

  1. Probleme bei globaler Variable in Funktion
    Von Cyrus777 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 09.02.2012, 15:38
  2. Msleep legt Asuro lahm
    Von paulsenior im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 16.05.2009, 16:24
  3. Asuro C / Msleep geht nicht
    Von FredWeise im Forum Asuro
    Antworten: 13
    Letzter Beitrag: 06.02.2009, 17:57
  4. Probleme mit der PollSwitch-Funktion
    Von smith im Forum Asuro
    Antworten: 11
    Letzter Beitrag: 12.11.2006, 00:09
  5. Msleep Funktion
    Von stollentroll im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 11.08.2006, 10:55

Stichworte

Berechtigungen

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

Labornetzteil AliExpress