-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: PollSwitch() + Geradeausfahren

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.11.2006
    Beiträge
    40

    PollSwitch() + Geradeausfahren

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi,
    ich habe einmal die PollSwitch funktion mit waste's geradeaus funktion kombiniert. irgendwie klappt das überhaupt nicht! entweder wird sofort die while-schleife übersprungen und die LED blinkt, oder die motoren laufen nicht an, dh. LED ist grün, bewegen tut sich nix, drückt man jedoch einen taster verlässt er die schleife. hier mal der code:

    Code:
    include "asuro.h"
    
    int main(void){
    
    int speedL, speedR;
    int j;
    int diff, wegL, wegR;
    unsigned int odo[2];
    unsigned char flankeL=FALSE, flankeR=FALSE, speed;
    
    Init();
    
    MotorDir(FWD,FWD);
    StatusLED(GREEN);
    speed=200;
    speedL=0;
    speedR=0;
    wegL=0;
    wegR=0;
    	
    
    	
    
    	while(PollSwitch()==0){
    		OdometrieData(odo);
    		if((odo[0]<550)&&(flankeL==TRUE)){wegL++; flankeL=FALSE;}
    		if((odo[0]>650)&&(flankeL==FALSE)){wegL++; flankeL=TRUE;}
    		if((odo[1]<550)&&(flankeR==TRUE)){wegR++; flankeR=FALSE;}
    		if((odo[1]>650)&&(flankeR==FALSE)){wegR++; flankeR=TRUE;}
    		diff=wegR-wegL;
    		if(diff>0){speedR--;}
    		else if(diff<0){speedL--;}
    		else{
    			speedL=speed;
    			speedR=speed;
    		}
    		if(speedL<0){speedL=0;}
    		if(speedR<0){speedR=0;}
    		MotorSpeed(speedL,speedR);
    	}
    	
    
    	
    	MotorDir(BREAK,BREAK);
    	MotorSpeed(0,0);
    	while(1){
    		StatusLED(RED);
    		for(j=0;j<70;j++){
    			Sleep(255);
    		}
    		StatusLED(GREEN);
    		for(j=0;j<70;j++){
    			Sleep(255);
    		}
    	}
    	
    	
    	
    
    	while(1);
    	return(0);
    }

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    das liegt daran, dass die funktion pollswitch oft falsche werte zurückgibt. gerade kurz nach dem anschalten des asuro sind die werte stark fehlerhaft. deshalb wird manchmal die schleife übersprungen und die led blinkt gleich.

    um das zu verhindern müsstest du die funktion einige male abfragen, bevor du mit dem wert arbeitest.

    dass die motoren gelegentlich einfach nicht anlaufen, obwohl die led grün ist, liegt glaube ich daran dass du ein paar geschweifte klammern {} falsch gesetzt hast, hab aber nicht genau geschaut.

    probier doch erstmal einige kleinere programme selbst zu programmieren, und versuche dabei die allgemeine programmierung zu lernen und zu vertiefen, und vor allem die ganzen kleinen eigenheiten des asuro zu verstehen.
    aus dem kopieren von programmcodes lernt man nichts. lass doch den asuro erst mal krumm fahren, und auf die taster reagieren. oder versuch, mithilfe der odometrie selbst eine möglichkeit zu finden, den asuro geradeausfahen zu lassen.
    wenn du ein solches programm selbst entwickelt hast, kannst du
    -stolz darauf sein
    -den code sehr gut verstehen und leicht verändern bzw anpassen
    -den code (weil du selbst ihn ja gut verstehst) leicht mit anderen funktionen kombinieren
    ...und lernen tuste au noch was dabei =)
    kleinschreibung ist cool!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.11.2006
    Beiträge
    40
    habe die taster schon ausprobiert, dh. ohne regelung fürs geradeausfahren da hat er wunderbar funktioniert. den code für die regelung habe ich nachvollzogen und verstanden. habe auch schon eine for-schleife (pollswitch wird 5mal abgefragt) davor eingebaut gehabt, das bringt auch nix

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    hmm... hast du dich mal mit interrutgesteuerter tastererkennung beschäftigt? das dürfte die sache einfacher machen. in der main-funktion steht dabei nur der code fürs geradeausfahren, und in der interruptroutine steht der code fürs anhalten und blinken.
    kleinschreibung ist cool!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    24.11.2006
    Beiträge
    40
    ok. danke. dann werde ich mir das mal ansehen!

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    einige infos gibts in dem asuro buch... wenn du das hast dann solltest du mal reinschaun, damit habe ich interruptprogrammierung auch kapiert =)

    mit der neuen lib (version 2.6, in version 3.0 wurden nur sinnlose namensänderungen und kleine aufräumarbeiten durchgeführt) brauchst du gar nicht so weit ein die materie einsteigen. es gibt eine variable namens switched, die sofort 1 wird wenn ein taster gedrückt wird. dadurch könntest du diese variable abfragen und damit erkennen ob ein taster gedrückt wurde.
    kleinschreibung ist cool!

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    dadurch wäre der code fürs blinken aber wieder in der main funktion drinne.

    man muss im prinzip blos die libg leicht moduifizieren. das ist besser

    und drann denken dat interrupt muss erst mit StartSwitch aktivirt werden

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    24.11.2006
    Beiträge
    40
    eine frage noch, bevor ich mich auf das register stürze. habe mir gerade einmal die test.c vom selftest und da eben die switchtest funktion angeschaut. wäre die taster abfrage stabiler wenn ich jeden der 6 taster analog wie in switchtest programmiere?

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    also von der theorie her ist es egal (wenn eine taste gedrückt wird, ist pollswitch() größer als 0 und wenn nicht, dann eben nicht.

    woran das nun liegt bei dir... naja... eben einfach am asuro =)
    kleinschreibung ist cool!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    24.11.2006
    Beiträge
    40
    also, SIG_INTERRUPT1 wird anscheinend von den Kollisionstastern verwendet. diesen Interrupt kann ich also mit StartSwitch() aktivieren. Wie kann ich diesen jetzt gestalten? muss ich dazu SIGNAL (SIG_INTERRUPT1) in der Asuro.c umschreiben?
    wie kann ich dann meine bedingung aufstellen, dass wenn einer der taster gedrückt wird der interrupt abläuft, muss ich StartSwitch in die while-Bedingung einbauen, oder direkt am Anfang deklarieren?

    fragen über fragen...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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