Энкодер, перенести на другие порты

Использую код dimax для работы с энкодером на прерываниях

//Энкодер на пинах А0, А1. Используется внутренняя подтяжка.
volatile int enc;
void setup(){                
Serial.begin(9600);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
PCIFR=PCIFR; PCICR=1<<PCIE1; //разрешить прерывание
PCMSK1=1<<PCINT8 | 1<<PCINT9; //выбрать вход на котором сработает прерывание 
}

ISR(PCINT1_vect){
static char EncPrev=0;      //предыдущее состояние энкодера
static char EncPrevPrev=0;  //пред-предыдущее состояние энкодера
  char EncCur = 0;
  if(!(PINC & (1 << PC0))){EncCur  = 1;} //опрос фазы 1 энкодера
  if(!(PINC & (1 << PC1))){ EncCur |= 2;} //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == 3 &&        //если предыдущее состояние 3
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == 2)          //если текущее состояние 2,
        enc++;            //шаг вверх
      else                          //иначе
        enc--;            //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }


  }



void loop() {
Serial.println(enc); 
}

https://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=5#comment-449417

прошу помощи, нужно перенести на другие порты, меняю в коде PCINT8 и PCINT9 на свои, но не работает на портах которые указываю ну к примеру PCINT0 и PCINT1.

Кода не будет?

код, 8 строка
родная:

PCMSK1=1<<PCINT8 | 1<<PCINT9;

моя:

PCMSK1=1<<PCINT0 | 1<<PCINT1;

читать даташит надо!
не в тот регистр ты свои 1<<PCINT0 | 1<<PCINT1 пихаешь.

1 лайк

Всё? Ну, тогда понятно. А кто за Вас будет менять строки №№7 и 8, а также строку #11?

PCIE1 относится ТОЛЬКО к PCINT14:8 Для PCINT7:0 существует PCIE0, а для PCINT23:16 – PCIE2

То же касается и PCMSK1. Это только для PCINT14:8. Для других надо использовать PCMSK0 и PCMSK2 (номера PCINT’ов по аналогии)

Наконец, векторы прерываний – тоже самое есть PCINT0_vect, PCINT1_vect, PCINT2_vect.

Всё это есть в даташите. Вы его принципиально не читаете или беспринципно?

3 лайка

хотел развернуть, смотрю ЕвгенийП печатает… и не стал :+1: :grin:

Эксплуататор :frowning:

:sweat_smile:
не, я с тех позиций, шоб не опозорится сильно.

так ткнул бы ссылкой в сайт Владимира, там всё разжёвано и в рот положено, сам то он тут сидит и помалкивает

Зачем? В даташите это тоже “всё разжёвано и в рот положено”, но ТС его не читает. С чего ему читать “сайт Владимира”?

Изык жеж разный, я что-то в последнее время вообще не могу читать английский


    D8 .. D13 - генерируют запрос прерывания PCINT0
A0 .. A5 - генерируют запрос прерывания PCINT1
D0 .. D7 - генерируют запрос прерывания PCINT2

Три регистра PCMSK0, PCMSK1 и PCMSK2 (Pin Change Mask Register) используются для указания входов, которым разрешено генерировать сигнал запроса прерывания. Соответствие битов регистров PCMSKx выводам микроконтроллера ATmega328/P (для 28-выводного DIP корпуса) и их обозначениям в IDE Arduino приведено в следующей таблице:

Бит 	Обозначение вывода (IDE Arduino)	Номер вывода (Микроконтроллер)	PCINTx
Регистр PCMSK0
0	D8	14	PCINT0
1	D9	15	PCINT1
2	D10	16	PCINT2
3	D11	17	PCINT3
4	D12	18	PCINT4
5	D13	19	PCINT5
6	-	9	PCINT6
7	-	10	PCINT7
Регистр PCMSK1
0	A0	23	PCINT8
1	A1	24	PCINT9
2	A2	25	PCINT10
3	A3	26	PCINT11
4	A4	27	PCINT12
5	A5	28	PCINT13
6	-	1	PCINT14
Регистр PCMSK2
0	D0	2	PCINT16
1	D1	3	PCINT17
2	D2	4	PCINT18
3	D3	5	PCINT19
4	D4	6	PCINT20
5	D5	11	PCINT21
6	D6	12	PCINT22
7	D7	13	PCINT23

1 лайк