Работа с прерываниями Мега2560

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Друзья добрый день!

Подскажите, странная штука (хотя чудес не бывает).

Есть у меня кусок кода который занимается обработкой работы энкодера, но поменяв с 328 на 2560 он работать перестал. Испытания я проводил на 328меге, а реальное устройство 2560.В общем встрял я , а квалификации решить данный вопрос не хватает. Помогите пожалйста..

#include <Rotary.h>
 
Rotary r = Rotary(2, 3);
 
void setup() {
  Serial.begin(9600);
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
}
 
void loop() {
 
}
 
ISR(PCINT2_vect) {
  unsigned char result = r.process();
  if (result == DIR_NONE) {
    // do nothing
  }
  else if (result == DIR_CW) {
    Serial.println("ClockWise");
  }
  else if (result == DIR_CCW) {
    Serial.println("CounterClockWise");
  }
}
andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015
evgeny_zaryanov,
в 328 PCINT на каждой ноге, а в 2560 - нет. 
Кроме того, сами PCINT с теми же номерами располагаются на других ногах, если в Uno PCINT18 и PCINT19 находятся на 2 и 3 ноге, то в Меге - на А10 и А11.
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

del

Siegurd
Offline
Зарегистрирован: 16.05.2017

Сам делаю проект на меге. И с энкодером наигрался знатно.

У Вас все очень просто. Достаточно воспользоваться простым примером из сайта ардуино:

volatile byte state = LOW;
const byte interruptPin = 2;


void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {

}

void blink() {
  state = !state;
}

И конечно же не забываем о номерах ножек на которых взможны прерывания и номерах прерываний:

BOARD INT.0 INT.1 INT.2 INT.3 INT.4 INT.5

Mega2560

2

3

21

20

19

18

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Siegurd, у ТС вариант именно на PCINT. Опять же, обычных прерываний может банально не хватить: если сиспользовать по паре на каждый энкодер, то их общее количество окажется сильно ограниченным (я, например, использую 5 штук).