• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Encoder na przerwaniach - czy tak może być?
#4
Na przerywaniach to też lipa z obsługą bo trzeba eliminować drgania styków, najlepiej to się robi na timerze...

Masz mój przykład powinien pasować jak masz atmegę 2560

Timer1 wykorzystuje

//////////// Encoder
#define PinB        31 //BTN_EN1 31 [RAMPS14-SMART-ADAPTER]
#define PinA        33 //BTN_EN2 33 [RAMPS14-SMART-ADAPTER]
#define PinSW      35 //BTN_ENC 35 [RAMPS14-SMART-ADAPTER]

volatile bool Old_Pin_A,Old_Pin_B,Old_Pin_SW;
volatile bool UP, DOWN, SW;

ISR(TIMER1_COMPA_vect) {
  // READ ROTARY

  bool Pin_A = digitalRead(PinA);
  bool Pin_B = digitalRead(PinB);
  bool Pin_SW = digitalRead(PinSW);

  if(Pin_A != Old_Pin_A && Pin_A) {
    if(Pin_B != Pin_A){
      UP =true;
    }
  }

  if(Pin_B != Old_Pin_B && Pin_B) {
    if(Pin_A != Pin_B){
      DOWN =true;
    }
  }

  if(Pin_SW != Old_Pin_SW){
    if(Pin_SW == LOW){
      SW = true;
    }
  }


  Old_Pin_A = Pin_A;
  Old_Pin_B = Pin_B;
  Old_Pin_SW = Pin_SW;


}

void setup(){

///////////
  pinMode (PinA,INPUT_PULLUP);
  pinMode (PinB,INPUT_PULLUP);
  pinMode (PinSW,INPUT_PULLUP);
  Old_Pin_A = digitalRead(PinA);
  Old_Pin_B = digitalRead(PinB);
  Old_Pin_SW = digitalRead(PinSW);

////////////// Timer1 encoder

  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 249;  // 1000 Hz (16000000/((249+1)*64))
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();

}

void loop(){
}




Przepinuj jak ci pasuje....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Encoder na przerwaniach - czy tak może być? - przez Jarewa0606 - 13-02-2022, 22:52

Skocz do:


Przeglądający: 1 gości