Witam,
piszę program pod mikrokontroler podłączony do impulsatora. Impulsator podłączony jest do pinów PA.1 i PA.2. Nie za bardzo wiem jak działa impulsator, co prawda przeglądałem kilka stron internetowych dotyczących owego tematu, próbowałem również skopiować kilka kodów, aby sprawdzić jak będą działać. Niestety, żaden nie działał w 100%, może impulsator jest uszkodzony. Impulsator zwiera piny do masy. Piny są podciągnięte do 5V za pomocą wbudowanych w mikrokontroler rezystorów.
Między innymi próbowałem wykorzystać kod:
Niestety kod nie działa mi w pełni...
Co jakiś czas, nie zlicza obrotu, albo zamiast wykryć obrót w prawo wykrywa w lewo i na odwrót
piszę program pod mikrokontroler podłączony do impulsatora. Impulsator podłączony jest do pinów PA.1 i PA.2. Nie za bardzo wiem jak działa impulsator, co prawda przeglądałem kilka stron internetowych dotyczących owego tematu, próbowałem również skopiować kilka kodów, aby sprawdzić jak będą działać. Niestety, żaden nie działał w 100%, może impulsator jest uszkodzony. Impulsator zwiera piny do masy. Piny są podciągnięte do 5V za pomocą wbudowanych w mikrokontroler rezystorów.
Między innymi próbowałem wykorzystać kod:
#define encoder_a ((PINC&_BV(2))>>2)
#define encoder_b ((PINC&_BV(1))>>1)
volatile unsigned char enc;
void impulsator(void)
{
static unsigned char poprzednia_a,poprzednia_b,poprzednia_c,poprzednia_d,tab[3],roznica;
if((poprzednia_a!=encoder_a)||(poprzednia_b!=encoder_b)) //jezeli zmini się stan na jakimkolwiek wejsciu
{
poprzednia_c=encoder_a; //przechowuja stany kanałow z czasu detekcji zmiany
poprzednia_d=encoder_b;
_delay_ms(1);
if((poprzednia_a!=encoder_a)||(poprzednia_b!=encoder_b))
{
if((poprzednia_c==1)&&(poprzednia_a==0)) //rosnace zbocze na kanale A
{ //numer zbocza 1
tab[2]=tab[1]; //przepisanie numeru wczesniejszego zbocza do tab[2]
tab[1]=1; //wpisanie zbocza ktore nastapilo teraz do tab[1]
poprzednia_a=1; //stan kanalu A do zmiennej poprzednia_a
}
if((poprzednia_c==0)&&(poprzednia_a==1)) //opadajace zbocze na kanale A
{ //numer zbocza 3
tab[2]=tab[1];
tab[1]=3;
poprzednia_a=0;
}
if((poprzednia_d==1)&&(poprzednia_b==0)) //rosnace zbocze na kanale B
{ //numer zbocza 5
tab[2]=tab[1];
tab[1]=5;
poprzednia_b=1;
}
if((poprzednia_d==0)&&(poprzednia_b==1)) //opadajace zbocze na kanale B
{ //numer zbocza 2
tab[2]=tab[1];
tab[1]=2;
poprzednia_b=0;
}
roznica=(tab[2]-tab[1]);
if((roznica==252)||(roznica==1)) //jezeli 2 rosnace zbocza lub 2 malejace zbocza kierunek w prawo to zwieksz enc
{
enc++;
tab[2]=150; //wpisz do tablic wartosci które nie zrobia zadnym zboczem detekci obrotu
tab[1]=150; }
if((roznica==4)||(roznica==255)) //to samo tylko kieruniek w lewo
{
enc--;
tab[2]=150;
tab[1]=150;
}
}
}
}
Niestety kod nie działa mi w pełni...
Co jakiś czas, nie zlicza obrotu, albo zamiast wykryć obrót w prawo wykrywa w lewo i na odwrót