13-02-2022, 22:52
(Ten post był ostatnio modyfikowany: 13-02-2022, 22:53 przez Jarewa0606.)
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....
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ą.