Hallo
Ich kann es natürlich nicht testen:
Code:
#define AVRGCC
#include <avr/io.h>
//#include <compiler.h>
/**
PD2 Spur A
PD3 Spur B
PB0 links
PB1 rechts
1 2 3 4
A 0 1 1 0
B 0 0 1 1
**/
#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)
{
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;
}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) dir=1; else dir=0; // dir==1 ist rechts/aufsteigend
}
else
{
if(spurb_akt) dir=0; else dir=1;
}
}
else // Bitwechsel war bei Spur A
{
if(spurb_akt)
{
if(spura_akt) dir=0; else dir=1;
}
else
{
if(spura_akt) dir=1; else dir=0;
}
}
spura_old=spura_akt;
spurb_old=spurb_akt;
if(dir)
{
Rechts1;
Links0;
if(count<31) count++; else count=0;
}
else
{
Rechts0;
Links1;
if(count>0) count--; else count=31;
}
}
return(0);
}
Ich hoffe, ich habe es ungefähr getroffen. Der Motor dreht dauerhaft in Richtung der letzten Geberdrehung, der Zähler wird bei jedem Geberimpuls geändert (mit Nulldurchgang).
Gruß
mic
[Edit]Ähm, irgendwie verstehe ich gar nicht was du eigentlich bezwecken möchtest. Wie soll denn die Drehbewegung des Geber nach Ausgang Links-Rechts verteilt werden? Mit einer Anzeige könntest du den Zähler verfolgen und kontrollieren ob alle Geberimpulse erkannt werden/ ob der Nulldurchgang immer an der selben Stelle auftritt.
Lesezeichen