Прерывание не работает.

Jara
Offline
Зарегистрирован: 20.07.2020

Всем желаю здравствовать. Мне потребовалась помощь. Ситуация такая. Необходимо применить внешние прерывание INT0 на ардуино мега 2560. Казалось бы ну чего проще. Ардуиновские функции (attachInterrupt() и другие) работают прекрасно, НО, захотелось поиграться и включить и настроить прерывание через регистры и кнопочкой их потыкать чтоб светодиодик на плате горел и не работает. Код проще некуда, приведён ниже. Я уж всяко пробовал, не работает. Подскажите пожалуйста чего здесь не так, может в настройках проекта надо настроить.

ISR(INT0_vect) 
{
   digitalWrite(13, !digitalRead(13));
}
void setup() 
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT_PULLUP);// по нажатию кнопки
  //включим прерывания INT0 по нисходящему фронту
  EICRA |= (1<<ISC01);
  //разрешим внешние прерывания INT0
  EIMSK |= (1<<INT0); 
  sei();
}
  
void loop() {}

Заранее спасибо. С уважением Jara.
 

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Есть предположение, что pin2 это INT4

(Предположение, потому, что с ардуино мега 2560 не работал.)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я вот сейчас вот это изучаю: https://tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html

Ну и другие части, соответственно. Боле доступным языком не попадалось. Может поможет?.

b707
Offline
Зарегистрирован: 26.05.2017

интересно, а кто Bruzzer-у минус поставил?

Jara - это не вы? - если вы, то зря, он дело говорит, проверьте соответвие номера и пина и номера прерывания

v258
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

интересно, а кто Bruzzer-у минус поставил?

Jara - это не вы? - если вы, то зря, он дело говорит, проверьте соответвие номера и пина и номера прерывания

Внешнее прерывание: 
2 (прерывание 0), 
3 (прерывание 1), 
18 (прерывание 5), 
19 (прерывание 4), 
20 (прерывание 3), и 
21 (прерывание 2). 
Данные выводы могут быть сконфигурированы на вызов прерывания либо на младшем значении, либо на переднем или заднем фронте, 
или при изменении значения. Подробная информация находится в описании функции attachInterrupt().

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

v258, в любой непонятной ситуации смотри даташит. Прерывание INT0 сидит на выводе мк 43( PD0) или == арду-пин №21

v258
Offline
Зарегистрирован: 25.05.2020

А я глянул в описание на этом же сайте ))

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Значит у нас на сайте неправильное описание, там int.0 на пине 2 для Mega2560.

kalapanga
Offline
Зарегистрирован: 23.10.2016

На нашем сайте, в отличие от arduino.cc, в описании функции attachinterrupt перед табличкой соответствия номеров прерывания и пинов не хватает важной приписки:

Note that in the table below, the interrupt numbers refer to the number to be passed to attachInterrupt(). For historical reasons, this numbering does not always correspond directly to the interrupt numbering on the ATmega chip (e.g. int.0 corresponds to INT4 on the ATmega2560 chip).

 

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga пишет:

На нашем сайте, в отличие от arduino.cc, в описании функции attachinterrupt перед табличкой соответствия номеров прерывания и пинов не хватает важной приписки:

Note that in the table below, the interrupt numbers refer to the number to be passed to attachInterrupt(). For historical reasons, this numbering does not always correspond directly to the interrupt numbering on the ATmega chip (e.g. int.0 corresponds to INT4 on the ATmega2560 chip).

 

Опа :) все было так просто, пока не пришел калапанга :)

Теперь уж и я стал сомневатся - так что, у ТС в первом посту номер прерывания и пин соответвуют друг другу или нет? :)

kalapanga
Offline
Зарегистрирован: 23.10.2016

b707 пишет:

Теперь уж и я стал сомневатся - так что, у ТС в первом посту номер прерывания и пин соответвуют друг другу или нет? :)

Я так понимаю, что через регистры он включает настоящий int0 ATmega2560, который искать надо на том пине, что написал dimax.

А, используя ардуиновскую attachinterrupt и задействуя якобы int0, на ATmega2560 на самом деле задействуется его int4, который небось на 2 пине ардуины и есть, как в табличке и указано. (это проверять надо по даташиту или исходникам attachinterrupt).

Jara
Offline
Зарегистрирован: 20.07.2020

Всем желаю здравствовать.
Ну что-ж, ответ dimaxa  и был правильным. Я перекопал кучу информации в инете где говорится, что прерывание INT0 сидит на пине2 в ардуино и куча табличек где во едино разные ардуино сведены пересмотрел, а то, что бы глянуть в даташит ума и не хватило. DIMAX огромное спасибо, буду поменьше читать статьи и побольше даташит.
Да кстати минусы я не ставил.

Всем спасибо. Всем удачи.