-
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.
-
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:
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
-
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