Прерывания на Mega2560

Нет ответов
Boris1969
Offline
Зарегистрирован: 21.04.2016

Хочу сделать программку обработки нажатия кнопки с вызовом функции обработки через прерывания. Плата Arduino Mega2560 и Arduino Mega2560 R3 . По паспорту у них шесть выводов для организации внешних прерываний. Написал пограммку, собрал схемку на макетной плате. Для индикации использую два светодиода, переключающиеся при нажатии двух кнопок соответственно. В схеме кнопки подключены с RC цкпочками, дребезга контактов нет, проверял осцилографом. В результате выяснилось, что все нормально работает только на прерываниях 0,1,4. Прерывание 5 работает только на Mega2560 R3. На Mega 2560 на прерывании 5 есть некая непонятная реакция, кратковременные вспышки светодиодов, иногда включения. Прерывания 2 и 3 (каналы 21 и 20 соответственно) не работают вообще. При разборе выяснилось, что в режиме ввода на этих каналах сидит 5В и притянуть эти каналы к GND нельзя. Поэтому режим вызова прерывания RISING на этих каналах реализовать нельзя. В описании на плату это нигде не упоминается. И такая ситуация наблюдалась на трех платах - одной Mega2560 и двух Mega2560 R3. Проверять работу этих каналов для других режимов вызова прерывания пока не стал, может кто объяснит, почему не работает в таком состоянии? volatile int Led1, Led2, Kn1, Kn2; //********************************************* const int CHLed1=40; const int CHLed2=44; const int CHKn1=48; const int CHKn2=52; void setup() {   pinMode(CHKn1, INPUT);   pinMode(CHKn2, INPUT);   pinMode(CHLed1, OUTPUT);      pinMode(CHLed2, OUTPUT);      attachInterrupt(0,ReadKn,RISING);   attachInterrupt(1,ReadKn,RISING);   attachInterrupt(2,ReadKn,RISING);   attachInterrupt(3,ReadKn,RISING);   attachInterrupt(4,ReadKn,RISING);   attachInterrupt(5,ReadKn,RISING); } //********************************************** void ReadKn() {   Kn1=digitalRead(CHKn1);   Kn2=digitalRead(CHKn2);   if  (Kn1==HIGH)   {     Led1=abs(Led1-1);     digitalWrite(CHLed1,Led1);   }   if  (Kn2==HIGH)   {     Led2=abs(Led2-1);     digitalWrite(CHLed2,Led2);   }  } //********************************************** void loop() { }