Cześć,
Przerwania to dla mnie jeszcze pewne wyzwanie
Mam enkoder (wybierak) i chcę odczytać jego ruch.
Przeszukałem internet i znalazłem kilka rozwiązań
Na początku chciałem klasycznie wykrywać "wzrost" na pinie i odczyt drugiego pinu - i na zasadzie czy ten drugi jest wysoki czy niski ustalam kierunek obrotu, ale okazało się że dane są pomieszane (pewnie drgania styków)
Kombinowałem z ograniczeniem częstotliwości ale to i tak czasem powodowało błędny odczyt.
Ostatecznie mam taką funkcje która każdy obrót odczytuje poprawnie ale i tak chciałbym podpytać jak można przyspieszyć funkcję (mam dużo ifów podejrzewam że to daje spore opóźnienie...)
NA początku szukania trafiłem na informacje że funkcje z przerwań można wymusić żeby były w ramie (szybciej się powinny wykonywać) ale teraz nie pamiętam jak to wymusić
W "stan_kola" zapisuje bitowo kolejność stanów na koniec sprawdzam czy "przebieg" jest zgodny z oczekiwanym i na tej zasadzie zmieniam licznik count1.
Przerwania to dla mnie jeszcze pewne wyzwanie
Mam enkoder (wybierak) i chcę odczytać jego ruch.
Przeszukałem internet i znalazłem kilka rozwiązań
Na początku chciałem klasycznie wykrywać "wzrost" na pinie i odczyt drugiego pinu - i na zasadzie czy ten drugi jest wysoki czy niski ustalam kierunek obrotu, ale okazało się że dane są pomieszane (pewnie drgania styków)
Kombinowałem z ograniczeniem częstotliwości ale to i tak czasem powodowało błędny odczyt.
Ostatecznie mam taką funkcje która każdy obrót odczytuje poprawnie ale i tak chciałbym podpytać jak można przyspieszyć funkcję (mam dużo ifów podejrzewam że to daje spore opóźnienie...)
NA początku szukania trafiłem na informacje że funkcje z przerwań można wymusić żeby były w ramie (szybciej się powinny wykonywać) ale teraz nie pamiętam jak to wymusić
Kod:
byte InputKola1A = 33;
byte InputKola1B = 36;
volatile int count1 = 0;
volatile byte stan_kola=0;
int last_count1 = 9999;
void setup() {
Serial.begin(115200);
pinMode(InputKola1A, INPUT);
pinMode(InputKola1B, INPUT);
Serial.println("start");
//CHANGE, LOW,RISING,FALLING
// attachInterrupt(digitalPinToInterrupt(interruptPin), blink, );
attachInterrupt(InputKola1A, Kolo1A, CHANGE);
attachInterrupt(InputKola1B, Kolo1B, CHANGE);
}
void Kolo1A() {//funkcja odpowiadająca za reakcję na zmianę stanu na PINie A
if (digitalRead(InputKola1A)){
if(stan_kola==0)//pierwszy "wzrost"
{
stan_kola=B10000000;
}
if(stan_kola==B01000000)//drugi "wzrost"
{
stan_kola=B01100000;
}
}
else
{
if((stan_kola==B10010000)||(stan_kola==B01100000))//pierwszy "spadek"
{
stan_kola=stan_kola | B00001000;
}
if((stan_kola==B10010100)||(stan_kola==B01100100))//drugi "spadek"
{
stan_kola=stan_kola | B00000010;
if(stan_kola==B01100110){count1--;}
stan_kola=0;
}
}
}
void Kolo1B() {//funkcja odpowiadająca za reakcję na zmianę stanu na PINie B
if (digitalRead(InputKola1B)){
if(stan_kola==0)//pierwszy "wzrost"
{
stan_kola=B01000000;
}
if(stan_kola==B10000000)//drugi "wzrost"
{
stan_kola=B10010000;
}
}
else
{
if((stan_kola==B10010000)||(stan_kola==B01100000))//pierwszy "spadek"
{
stan_kola=stan_kola | B00000100;
}
if((stan_kola==B10011000)||(stan_kola==B01101000))//drugi "spadek"
{
stan_kola=stan_kola | B00000001;
if(stan_kola==B10011001){count1++;}
stan_kola=0;
}
}
}
void loop() {
if(last_count1!=count1){
Serial.println(count1);
last_count1=count1;
}
}
W "stan_kola" zapisuje bitowo kolejność stanów na koniec sprawdzam czy "przebieg" jest zgodny z oczekiwanym i na tej zasadzie zmieniam licznik count1.