Hallo noch mal,
ich habe deine Software gerade getestet und bin sehr zufrieden. Ich würde sagen nun funktioniert die Auswertung zu ca. 95%. Hier mal mein angepasster Code für meinen Anwendungsfall:
Code:
#define AVRGCC
#include <avr/io.h>
/**
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 & 0b00000100) == 0)
#define SpurB ((PIND & 0b00001000) == 0)
char SpurA_akt, SpurA_old, SpurB_akt, SpurB_old, count = 0, dir = 0;
int main(void)
{
DDRB = 0b00000011;
PORTB = 0b00000011;
DDRD = 0b00000000;
PORTD = 0b00001100;
Rechts0;
Links0;
SpurA_akt = SpurA_old = SpurA;
SpurB_akt = SpurB_old = SpurB;
while (1)
{
do // warten bis Bitwechsel erkannt wird
{
SpurA_akt = SpurA;
SpurB_akt = SpurB;
if (count > 0)
{
count--;
if (count == 0)
{
Rechts0;
Links0;
}
}
}
while ((SpurA_akt == SpurA_old) && (SpurB_akt == SpurB_old));
if (SpurA_akt == SpurA_old) // Bitwechsel war bei Spur B
{
if (SpurA_akt)
{
if (SpurB_akt)
Links1;
else
Rechts1;
}
else
{
if (SpurB_akt)
Rechts1;
else
Links1;
}
}
else // Bitwechsel war bei Spur A
{
if (SpurB_akt)
{
if (SpurA_akt)
Rechts1;
else
Links1;
}
else
{
if (SpurA_akt)
Links1;
else
Rechts1;
}
}
SpurA_old = SpurA_akt;
SpurB_old = SpurB_akt;
count = 4;
}
return(0);
}
Erstaunlicherweise funktioniert das ganze besser, wenn ich die Fuse aktiviere, die den internen Clock durch 8 teilt, also wenn der AVR langsamer läuft.
Wie könnte man das ganze jetzt noch verbessern, damit aus den 95% vielleicht 100% werden? In professionellen Geräten bekommen die das ja auch irgendwie hin.
Viele Grüße
Andreas
Lesezeichen