Прерывание не работает.
- Войдите на сайт для отправки комментариев
Пнд, 20/07/2020 - 20:11
Всем желаю здравствовать. Мне потребовалась помощь. Ситуация такая. Необходимо применить внешние прерывание 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.
Есть предположение, что pin2 это INT4
(Предположение, потому, что с ардуино мега 2560 не работал.)
Я вот сейчас вот это изучаю: https://tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html
Ну и другие части, соответственно. Боле доступным языком не попадалось. Может поможет?.
интересно, а кто Bruzzer-у минус поставил?
Jara - это не вы? - если вы, то зря, он дело говорит, проверьте соответвие номера и пина и номера прерывания
интересно, а кто Bruzzer-у минус поставил?
Jara - это не вы? - если вы, то зря, он дело говорит, проверьте соответвие номера и пина и номера прерывания
v258, в любой непонятной ситуации смотри даташит. Прерывание INT0 сидит на выводе мк 43( PD0) или == арду-пин №21
А я глянул в описание на этом же сайте ))
Значит у нас на сайте неправильное описание, там int.0 на пине 2 для Mega2560.
На нашем сайте, в отличие от 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).На нашем сайте, в отличие от 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).Опа :) все было так просто, пока не пришел калапанга :)
Теперь уж и я стал сомневатся - так что, у ТС в первом посту номер прерывания и пин соответвуют друг другу или нет? :)
Теперь уж и я стал сомневатся - так что, у ТС в первом посту номер прерывания и пин соответвуют друг другу или нет? :)
Я так понимаю, что через регистры он включает настоящий int0 ATmega2560, который искать надо на том пине, что написал dimax.
А, используя ардуиновскую attachinterrupt и задействуя якобы int0, на ATmega2560 на самом деле задействуется его int4, который небось на 2 пине ардуины и есть, как в табличке и указано. (это проверять надо по даташиту или исходникам attachinterrupt).
Всем желаю здравствовать.
Ну что-ж, ответ dimaxa и был правильным. Я перекопал кучу информации в инете где говорится, что прерывание INT0 сидит на пине2 в ардуино и куча табличек где во едино разные ардуино сведены пересмотрел, а то, что бы глянуть в даташит ума и не хватило. DIMAX огромное спасибо, буду поменьше читать статьи и побольше даташит.
Да кстати минусы я не ставил.
Всем спасибо. Всем удачи.