- LiFePO4 Speicher Test         
Ergebnis 1 bis 2 von 2

Thema: asuro geht nicht mehr aus schleife raus/problem mit taster

  1. #1

    asuro geht nicht mehr aus schleife raus/problem mit taster

    Anzeige

    LiFePo4 Akku selber bauen - Video
    es geht um den farbig markierten teil am ende des codes. das problem ist, dass wenn das erste mal irgendeine der besagten tasten gedrückt wird, der asuro das macht was er soll. dh. er stößt vorne an, dadurch wird irgendeine der vorderen tasten gedrückt und er fährt ein stück zurück, dann weiter vorwärts. stößt er dann wieder vorne an, fährt er allerdings nicht mehr zurück. d.h. er bleibt irgendwie im code hängen oder so. woran könnte das liegen? danke schonmal!

    Code:
    #include "asuro.h"
    
    
    #define FULL_L 210
    #define FULL_R 210
    
    void KurzzurueckunddannLinkskurve(void)
    {
    	float endtime;
    	endtime = Gettime() + 1000;
    	while (Gettime() < endtime/2)
    	{
    		MotorDir(RWD,RWD);
    		MotorSpeed(FULL_L,FULL_R);
    	}
    	while (Gettime() > endtime/2 && Gettime() < endtime)
    	{
    		MotorDir(FWD,FWD);
    		MotorSpeed(FULL_L - 100, FULL_R);
    	}
    }
    
    void StarkeLinkskurve(void)
    {
    	MotorDir(RWD,FWD);
    	MotorSpeed(10,FULL_R);
    }
    
    /*starke rechtskurve - zeitabhaengig (winkel fahren)*/
    void StarkeRechtskurve(void)
    {
    	MotorDir(FWD,FWD);
    	MotorSpeed(FULL_L,FULL_R - 100);
    }
    
    
    int main(void)
    {
    	unsigned char t1, t2;
    
    	Init();
    	while (1)
    	{
    		t1 = PollSwitch();
    		t2 = PollSwitch();
    		if (t1 == 0 && t2 == 0) /* keine Taste */
    		{
    			StarkeRechtskurve(); /* vorwaerts fahren */
    			FrontLED(ON);
    			BackLED(OFF,OFF);
    		}
    		else if (t1 && t2 && t1 == t2) // irgendeine taste ist gedrueckt]
    		{
    			if (t1 & 0x02 || t2 & 0x10)
    			{
    				KurzzurueckunddannLinkskurve();
    			}
    
    			Msleep(1000); /* 1 Sekunde warten */
    		}
    	}
    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

    Deine float/gettime()-Funktion in KurzzurueckunddannLinkskurve() kommt mir etwas spanisch vor. Rückgabewert von gettime() ist unsigned long, ich weiß nicht was passiert wenn gettime() überläuft und endtime deshalb nie erreicht wird? Besser wäre auf jeden Fall anstelle von float auch unsigned long für endtime zu verwenden. (Warum eigentlich endtime/2?) Vermutlich bleibt dein Programm irgendwie hier stecken:

    Code:
    	while (Gettime() > endtime/2 && Gettime() < endtime)
    	{
    		MotorDir(FWD,FWD);
    		MotorSpeed(FULL_L - 100, FULL_R);
    	}
    Das würde ich allerdings etwas anders formulieren weil zu häufiges und schnelles Aufrufen von MotorSpeed() möglicherweise Probleme verursachen könnte:

    Code:
    	MotorDir(FWD,FWD);
    	MotorSpeed(FULL_L - 100, FULL_R);
    	while (Gettime() > endtime/2 && Gettime() < endtime);
    Und nun kannst du dir das gettime() sparen und durch schlichtes Msleep() ersetzen...
    Code:
    	MotorDir(FWD,FWD);
    	MotorSpeed(FULL_L - 100, FULL_R);
    	Msleep(1000);
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

Labornetzteil AliExpress