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
Mein ISR code sieht so aus :
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.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 !! }
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
Glückwunsch! Nur weiter so!
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:
Den kurzen Code von RP6conrad habe ich nicht ausprobiert, weil ich ihn gerade nicht ganz verstanden habe. Ich glaube da fehlt noch ein Teil?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); }
Viele Grüße
Andreas
Nicht schlecht. Das versuche ich auch mal.
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
Lesezeichen