Прерывания на Mega2560
- Войдите на сайт для отправки комментариев
Хочу сделать программку обработки нажатия кнопки с вызовом функции обработки через прерывания. Плата 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() { }