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
Lesezeichen