- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: Tasterauswertung und Kollisionserkennung Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2006
    Ort
    Jena
    Beiträge
    10

    Tasterauswertung und Kollisionserkennung Problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo liebe Asuro Begeisterte,

    ich spiele schon einwenig mit dem Asuro herum doch ein Problem bekomm ich einfach nicht hin.
    Zum einen habe ich ein kleines Programm das die Taster auswertet und dementsprechend umdreht. Zum anderen habe ich mir das Kollisionsprogramm aus eurem Forum genommen.
    Beide funktionieren getrennt voneinander super. Versuche ich beide nur Schritt für Schritt zusammen zubringen habe ich beim Messen der Geschwindigkeit meine großen Probleme.
    Ich habe mir das Tasterprogramm genommen und die Geschwindigkeitsmessung eingebunden. Es wird noch nicht reagiert auf eine Änderung.

    1. Die gemessenen Geschwindigkeiten sind im Vergleich zum einzel Programm sehr viel kleiner( normal sind es 190, im Tasterprogramm sind es 150).
    2. Nachdem ich eine Taste gedrückt habe wird als Geschwindigkeit nur noch 0 angegeben.

    Warum ist das so? was habe ich vergessen?

    Bitte helft mir. Ich weiß einfach nicht mehr weiter.

    Hier mein Programm und die header- Datei habe ich auch angehangen.


    Code:
    #include "asuro.h"  // bitte die neue Datei benutzen
                        // asuro.h und asuro.c vom 31.03.05
    
    #define aus {MotorState(BREAK,BREAK);}
    #define go {MotorSpeed(150,150);MotorState(FWD,FWD);}
    #define backturn { MotorSpeed(50,-50);MotorState(RWD,RWD);msleep(500);}
    #define backward { MotorSpeed(-50,-50);MotorState(RWD,RWD);msleep(300);}
    #define rightturn { MotorSpeed(50,-50);msleep(300);}
    #define leftturn { MotorSpeed(-50,50);msleep(300);}
    
    static volatile uint8_t switched=0;
    uint8_t status_led = 0;
    
    inline void msleep(uint16_t time)
    {
       uint16_t i;
       for(i=time;i>0;i--)
          Sleep(72);
    }
    
    void status(void){
    	if (status_led == 0){
    		status_led = 1;
    		StatusLED(GREEN);
    	}
    	else if (status_led == 1){
    		status_led = 0;
    		StatusLED(RED);
    	}
    	return;
    }
    
    void write(char* text)
    {
       uint8_t i=0;
       while((text[i]!='\0')&&(i<255)) i++;
             
       SerWrite((unsigned char*)text,i);
    }
    
    void writeint(int16_t zahl)
    {
       char text[7]={'\0'};
       itoa(zahl,text,10);
       write(text);
    }
    
    int speed(void)
    {
       int rightspeed,leftspeed;
       int leftold,rightold;
    
       EncoderReset();      // reset encoder
    
    
       leftold=encoder[LEFT];
       rightold=encoder[RIGHT];
       msleep(300);
       leftspeed=encoder[LEFT]-leftold;
       rightspeed=encoder[RIGHT]-rightold;
    
       write("/n/r  speed Left,Right ");
       writeint(leftspeed);
       writeint(rightspeed);
       return leftspeed+rightspeed;
    }
    
    ISR(INT1_vect)
    {
    	StopSwitch();	
    	switched=1;
    }
    
    int main(void)
    {
    	int16_t num_of_switch;
    	int v;
    	
    	Init();
    	EncoderInit();
    	StatusLED(OFF);
    	write("\n\rASURO OK\n\r");
    
    	go;
    	msleep(500);
    
    	while(1)
    	{
    		BackLED(OFF,OFF);
    		StartSwitch();
    
    		while(switched == 0){
    			status();
    			v=speed();
          		write("\n\r speed ");
          		writeint(v);
    		}
    		
    
    		// Wenn Taster gedrückt wurde
    		if(switched == 1){
    			write("\n\r auf taster gefahren ");
    			num_of_switch = PollSwitch ();
    						
    			if(num_of_switch < 5){				
    				BackLED(OFF,ON);
    				backward;
    				rightturn;
    				go;
    				num_of_switch = 0;
    				msleep(500);
    			}
    			
    			if(num_of_switch > 5) {
    				BackLED(ON,OFF);
    				backward;
    				leftturn;
    				go;
    				num_of_switch = 0;
    				msleep(500);
    			}
    		switched = 0;
    		}
    	}
       return 0;
    }


    Danke für eure Hilfe.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.02.2008
    Ort
    Bremen
    Alter
    44
    Beiträge
    119
    Ich habs nur kurz überflogen - könnte es sein, dass das Setzen der BackLEDs zwischendurch dir die Odometrie kaputt macht?

    Ansteuerung der hinteren LEDs und die Odometrie funktioniert nicht gleichzeitig (siehe Doku der Asuro Library).

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2006
    Ort
    Jena
    Beiträge
    10
    Zitat Zitat von trapperjohn
    Ich habs nur kurz überflogen - könnte es sein, dass das Setzen der BackLEDs zwischendurch dir die Odometrie kaputt macht?

    Ansteuerung der hinteren LEDs und die Odometrie funktioniert nicht gleichzeitig (siehe Doku der Asuro Library).
    Du hast recht. Ich hab das gerade mal nachgelsen. Werd es heute abend gleich mal ausprobieren.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    hallo

    kommt denn irgendeine fehlermeldung, wenn du das programm versuchst zu compilieren?
    oder eine warnung?

    schönen abend noch

    max

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    backleds und odometrie funktionieren nicht gleichzeitig. allerdings produziert das auch keine fehler beim kompilieren.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo spomue,
    willkommen im Forum.

    Es sollte reichen, wenn du das ausserhalb der main() while(1)-Loop liegende EncoderInit(); in die While(1)-Schleife verschiebst. Im EncoderInit() wird alles für die Odometrie- und damit für die Encoder-Funktionalität wieder initialisiert.

    Wie von trapperjohn schon angedeutet bringt das Schalten an den Back-LED's tatsächlich alles durcheinander.
    Sinnvoll wäre dann wohl die Position direkt nach deinem BackLED(OFF,OFF);. Denn auch ein (OFF,OFF) fummelt an den Port-Pins PC0 und PC1 rum.

    Viel Erfolg
    Gruß Sternthaler

    P.S.: Warum kommt dann immer eine 0 aus der Speed()-Funktion?
    Es müsste daran liegen, dass die Umschaltung des doppelt belegten Port-Pins (Odometrie bzw. Back-LED's) dazu führt, dass beim ODO messen immer ein gleiches Ergebnis gemessen wird. Ist aber das Ergebnis immer gleich, kann die Encoder-Funktion keinen Schwarz-/Weis-Wechsel feststellen. Somit werden keine Tik's gezählt und somit steht der Asuro. -> Speed() = 0;
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress