- LiFePO4 Speicher Test         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 36 von 36

Thema: Drehimpulsgeber

  1. #31
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Anzeige

    E-Bike
    Mein ISR code sieht so aus :
    Code:
    /**
     * External Interrupt 0 ISR
     * (ENCL)
     *
     */
    ISR (INT0_vect)
    {	
    	if(PINC&KMI_L){
    		mleft_dist++;
    		mleft_counter++;	//writeString_P("ISR0");//controle interrupt		
    	    e_compass++;
    		delta_distance++;}	//richting robby !!
    	
    	else {
    		mleft_dist--;
    		mleft_counter--;
    		e_compass--;
    		delta_distance--;}	//delta_distance voor odometrie !!	
    	
    }
    In main gibt dan die Aenderung von mleft_dist wieviel tics und in welche Richtung da passiert sein. Der zweite variable mleft_counter wird jeden 100 mS ausgewertet und gibt dan die Geschwindigkeit for. Die variabel e_compass ist dan das unterschied in Abstand zwischen Rechter und Linker Rad.

  2. #32
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo,

    ich wollte mich noch mal melden, das ich es noch nicht geschafft habe den ISR-Code auszuprobieren. Sobald ich das habe, werde ich mich wieder melden, entweder mit Erfolgsbericht, oder mit neuen Problem.

    Viele Grüße
    Andreas

  3. #33
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Glückwunsch! Nur weiter so!

  4. #34
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo thewulf00,

    ich habe gerade eben endlich Zeit gefunden das ganze mit ISR auszuprobieren. Es funktioniert tatsächlich genauso perfekt wie der andere Code. Hier mal meine Lösung:

    Code:
    #define AVRGCC 
    
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    ISR (INT0_vect);
    ISR (INT1_vect);
    
    /** 
    PD2		Eingang		Spur A 
    PD3		Eingang		Spur B 
    
    PB0  	Ausgang 	links 
    PB1   	Ausgang 	rechts 
    **/ 
    
    #define Links1                     PORTB = (PORTB | (1<<PB0)) 
    #define Links0                     PORTB = ~(~PORTB | (1<<PB0)) 
    
    #define Rechts1                    PORTB = (PORTB | (1<<PB1)) 
    #define Rechts0                    PORTB = ~(~PORTB | (1<<PB1)) 
    
    #define SpurA                     ((PIND & (1<<PD2)) == 0)		//INT0
    #define SpurB                     ((PIND & (1<<PD3)) == 0)		//INT1
    
    volatile char Reset = 0;
    
    ISR (INT0_vect)
    {
    	if (Reset == 0)
    	{
    		if (SpurB)
        	{
    			if (SpurA)
    				Rechts1;
    			else
    				Links1;
    		}
    	    else
        	{
        		if (SpurA)
    				Links1;
    			else
    				Rechts1;
    		}
    
    		Reset = 4;
    	}
    }
    
    ISR (INT1_vect)
    {
    	if (Reset == 0)
    	{
    		if (SpurA) 
        	{ 
    	    	if (SpurB)
    				Links1;
    			else
    				Rechts1;
    		}
        	else 
        	{
    	    	if (SpurB)
    				Rechts1;
    			else
    				Links1;
    		}
    
    		Reset = 4;
    	}
    }
    
    int main(void) 
    { 
    	DDRB = 0b00000011;
    	PORTB = 0b00000011;
    
    	DDRD = 0b00000000;
    	PORTD = 0b00001100;
    
    	MCUCR = 0b00000101;
    	GIMSK = 0b11000000;
    
    	sei ();
    
    	while (1)
    	{
    		if (Reset > 0)
    			Reset--;
    		
    		if (Reset == 0)
    		{
    			Links0;
    			Rechts0;
    		}
    	}
       	
    	return(0);
    }
    Den kurzen Code von RP6conrad habe ich nicht ausprobiert, weil ich ihn gerade nicht ganz verstanden habe. Ich glaube da fehlt noch ein Teil?

    Viele Grüße
    Andreas

  5. #35
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Nicht schlecht. Das versuche ich auch mal.

  6. #36
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Funktioniert wirklich bestens. Ich hatte jetzt ein paar Tage Zeit damit zu spielen und es funktioniert wirklich genauso 100%ig wie der Code von mic.

    Allerdings habe ich da jetzt keine Maßnahmen zur Entprellung dran, da ich ja extra dafür den optischen Geber gekauft habe. Wie das mit den billigen "mechanischen" funktioniert kann ich nicht sagen. Da könnte das Prellen mit den IRQ's schon Probleme geben. Aber da könnte man vielleicht mit einem höheren Startwert für Reset entgegen wirken.

    Viele Grüße
    Andreas

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

Solar Speicher und Akkus Tests