-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Hilfe! Mein Programm funktionirt nich!

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    23.02.2007
    Ort
    Erlangen
    Alter
    23
    Beiträge
    322

    Hilfe! Mein Programm funktionirt nich!

    Anzeige

    Hi! ich hab mir grad ein Programm gebastelt, wo der asuro wenn er gegen etwas stößt eine rückwärtskurve macht. meiner ansicht nach müsste der folgenede progrmmcode funktionieren, aber er geht nicht:
    Code:
    #include "asuro.h"
    
    int main(void)
    {float x;
    float y;
    Init();
    x=PollSwitch();
    	while(1<2){
    		if (x==0) {
    			StatusLED(GREEN);
    			MotorDir(FWD,FWD);
    			MotorSpeed(120,120);
    		}
    		else {
    			StatusLED(RED);
    			MotorDir(RWD,RWD);
    			MotorSpeed(255,0);
    			y=0;
    			while(y<40){
    				Sleep(255);
    				y++;
    			}
    				
    		}
    	x=PollSwitch();
    	}	
    	while(1);
    	return 0;
    }
    Bitte helft mir!!!!!!!!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2007
    Beiträge
    26
    Was funktioniert den nicht? Compiliern (sollte klappen, mir ist nichts aufgefallen) oder die Funktion? Was macht der Asuro den falsch?
    (ich nehm mal an er macht dauernd die rückwärtskurve)

    achja, statt while(1<2) reicht auch while(1)... das is auch ne endlos schleife

    und float x und float y ist unnötig. für die reichen in dem fall wahscheinlich char werte, wenn nicht dann auf jeden fall int.

    edit: so.. habs mir nochmal länger angschaut.. mit dem programm sollte er nur diese kurven machen? oder?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.01.2007
    Alter
    27
    Beiträge
    6
    Also für die Funktion PollSwitch() reicht eine unsigned char -Variable.(nur so nebenbei)

    Zum Problem:
    Bei dieser Funktion sollte man am besten 2 Variablen anlegen, die
    den Wert der Schalter mittels PollSwitch() im Programm hintereinander
    einlesen. (Hat etwas mit den Kondensatoren zu tun die noch geladen sind
    u.s.w. ...) Dann fragst du sie auch beide ab.

    Beispiel:

    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	unsigned char s1,s2;
    	
            Init();
    	
    	while(1)
    	{
    		s1=PollSwitch();
    		s2=PollSwitch();
    		if((s1 && s2) == 0)
                    {
                          ....
                    }
             }
    }

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2007
    Ort
    Utzenstorf, BE, CH
    Alter
    33
    Beiträge
    9
    ich habe momentan ein ähnliches problem
    er fähr vorwärts, bis er anstösst, dann fährt er rückwärts, aber nur solange wie der schalter gedrückt ist... also sehr kurz
    dann fährt er immer vorwärts rückwärts
    irgendwie hab ich das mit der zeitverzögerung nicht so recht im griff

    Code:
    #include "asuro.h"
    
    int main()
    
    
    {
    	unsigned char s1,s2;
    
    	Init();
    
    	while(1)
    	{
    		s1=PollSwitch();
    		s2=PollSwitch();
    	
    			if((s1 && s2) == 0)
    			{	
    				FrontLED(ON);
    				MotorDir(FWD,FWD);
    				MotorSpeed(170,150);
    				StatusLED(GREEN);
    			}
    			else	
    			{
    				MotorDir(RWD, RWD);
    				MotorSpeed(100,150);
    				StatusLED(RED);
    				FrontLED(OFF);
    				BackLED(ON,ON);
    				Sleep(255);
    			}
    	}
    
    	return 0;
    }

    kann jemand einen fehler finden?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Beiträge
    62
    ein sleep(255) macht nur eine pause von 255/72.000 also rund 3,5ms Laut Anleitung
    Versuch mal sowas hier:
    Code:
    for (s1=0; s1 < 250; s1++) { Sleep(255); }
    Sollte knapp ne Sekunde dauern die Pause.
    18.März '07- mein erster ASURO

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2007
    Ort
    Utzenstorf, BE, CH
    Alter
    33
    Beiträge
    9
    hallo und danke
    etwa ähnliches hatte ich auch schon versucht, allerdings fährt er bei dieser lösung bereits von anfang an rückwärts, was ich, ehrlich gesagt, nicht verstehe


    Code:
    #include "asuro.h"
    
    int main()
    
    
    {
    	unsigned char s1,s2;
    int i;
    	Init();
    
    	while(1)
    	{
    		s1=PollSwitch();
    		s2=PollSwitch();
    	
    			if((s1 && s2) == 0)
    			{	
    				FrontLED(ON);
    				BackLED(OFF,OFF);
    				MotorDir(FWD,FWD);
    				MotorSpeed(170,150);
    				StatusLED(GREEN);
    			}
    			else	
    			{
    				MotorDir(RWD, RWD);
    				MotorSpeed(100,150);
    				StatusLED(RED);
    				FrontLED(OFF);
    				BackLED(ON,ON);
    				for (i=0; i < 250; i++) { Sleep(255); }
    			}
    	}
    
    	return 0;
    }

    könnte ich denn, theoretisch und nur zum testen, einfach mehrere sleepfunktionen hintereinander hängen?? weil alles andere, das ich bisher versuchte hat einfach nicht geklappt
    ich weiss, dass das unschön ist, aber dann würde ich immerhin sehen, dass es klappen könnte

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    26
    Beiträge
    344
    sicherlich kannst du das eine schleife macht ja auch nichts anderes!

    Martin

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2007
    Ort
    Utzenstorf, BE, CH
    Alter
    33
    Beiträge
    9
    leider funktioniert auch das nicht
    könnte ev mal jemand den code durchschauen und sagen, ob er den fehler findet?? langsam aber sicher verliere ich meine motivation alles was mit verzögerungen zu tun hat, klappt einfach nicht


    edit:
    ich korrigiere, solange die pollswitches nicht eingesetzt werden, klappt es tatsächlich
    das problem liegt also irgendwo bei den switchs

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    könnte ich denn ... mehrere sleepfunktionen hintereinander hängen??
    Drei Alternativen:

    1. Die Funktion Msleep(zeit) wartet zeit*1miliSek. , ist aber erst in den neueren Versionen der asuro.c verfügbar.

    2. Die Funktion Gettime() gibt die Zeit seit dem Systemstart des asuros in milliSek. zurück, ist aber auch erst in den neueren Versionen der asuro.c verfügbar. Anwendung:

    unsigned long int stopzeit;

    stopzeit=Gettime()+1000;
    while(Gettime()<stopzeit);
    Wartet eine Sekunde (und man könnte während des Wartens noch was tun in der while-Schleife, z.b. blinken)

    3. Mit einem Schleifenzähler der jeden Programmdurchlauf mitzählt ist man unabhängig von den Zeitfunktionen des asuros:

    unsigned long int loop_counter, stop_loop;
    loop_counter=0;
    stop_loop=0;

    while(1){
    loop_counter++;
    if (stop_loop==0) {
    Motoren_starten();
    stop_loop=loop_counter+1000;
    }
    if (loop_counter>stop_loop) {
    Motoren_stoppen();
    }
    }
    Den Vorteil solcher etwas aufwändigeren Konstruktionen (2.+3.) sehe ich darin, dass man während den Wartezyklen noch was anderes tun kann, z.B. blinken, Tasten abfragen oder einzelne Zeichen per IR-Schnittstelle senden... Bei Verwendung von Sleep() geht das nicht.

    Man muss allerdings bei 3. darauf achten, das loop_counter auch innerhalb der Warteschleife hochgezählt wird.

    könnte ev mal jemand den code durchschauen und sagen, ob er den fehler findet??
    Ob das

    if((s1 && s2) == 0)

    wie erwarten funktioniert weis ich nicht sicher. s1 && s2 ergibt false wenn s1=0 und s2=0 sind, aber false ist Typ boolean und 0 ist Typ byte(?), also sollte ein direkter Vergleich mit == eigentlich false ergeben: der asuro fährt nur rückwärts. Keine Ahnung, ob das wirklich so ist, aber sicherheitshalber würde ich schreiben:

    if ((s1&s2)) == 0)

    & ist bitweises Vergleichen und hat als Ergebniss den selben Typ wie s1 und s2. Dies kann man dann bedenkenlos auf ==0 prüfen. Oder man machts gleich so:

    if ((s1==0) && (s2==0))

    Gruß

    mic

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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2007
    Ort
    Utzenstorf, BE, CH
    Alter
    33
    Beiträge
    9
    erstmal vielen dank, ich verlier bald den überblick

    also hier ist mal eine abgeänderte version, allerdings fährt er immer noch schon von beginn weg rückwärts

    Code:
    {
    	unsigned char s1,s2;
    	int i;
    	Init();
    
    	while(1)
    	{
    		s1=PollSwitch();
    		s2=PollSwitch();
    	
    			if((s1=0)&&(s2=0))
    			{	
    				FrontLED(ON);
    				BackLED(OFF,OFF);
    				MotorDir(FWD,FWD);
    				MotorSpeed(170,150);
    				StatusLED(GREEN);
    			}
    			else	
    			{
    				MotorDir(RWD, RWD);
    				MotorSpeed(100,150);
    				StatusLED(RED);
    				FrontLED(OFF);
    				BackLED(ON,ON);
    				for (i=0; i < 250; i++) { Sleep(255); }
    			}
    	}
    
    	return 0;
    }

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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