Прерывания на любых ногах Ардуино
- Войдите на сайт для отправки комментариев
Добрый вечер, господа! Образовалась у меня следующая проблема.....
Не могу заставить прерываться Ардуину нано при изменении состояния на 8 ноге (D8).
Да, в общем то, на любой, кроме 2 и 3, с которыми всё ясно)).
Вот маленькая тестовая программка. Из терминала видно, что рвётся только по переднему фронту.
А надо - по обоим, т.е. по изменению состояния на ноге.
const int pini = 8;
volatile unsigned long tim, timo, del;
boolean _out;
void setup()
{ Serial.begin(115200);
pinMode (pini,OUTPUT);
PORTB = 0b00000001;
PCICR = 0b00000001;
digitalWrite(pini, LOW);
PCMSK0 = 0b00000001;
}
/// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ISR(PCINT0_vect) {
if (!(PINB & (1 << PB0))) {
tim = micros();
del = tim - timo;
timo = tim;
Serial.print(" t ");
Serial.print(tim);
Serial.print(" d ");
Serial.println(del);
}
}
/// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void loop() {
digitalWrite(pini, _out);
_out ^= 1;
delay(500);
}
Терминал:
t 1000044 d 1000044
t 2000808 d 1000764
t 3001580 d 1000772
t 4002348 d 1000768
t 5003112 d 1000764
t 6003880 d 1000768
t 7004644 d 1000764
t 8005416 d 1000772
t 9006180 d 1000764
. . . . . . . . . . .
Или это не возможно?...
Ознакомтесь пожалуйста с - http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075
Проблема надумана (от больших знаний), но давайте Вы сначала нормально вставите код, а там поговорим.
Я очень извиняюсь......
Единственное, что приходит на ум (от недостатка знаний) - это проверять в прерывании, по какому фронту мы сюда попали и менять там же битик ICES1, разрешая прерывания по другому фронту. Но это, что называется, через одно место.... корявенько))
Не менее коряво по смыслу, но намного изящнее по содержанию))
Я сократил Ваш пример, убрав всё лишее и выбросил вывод в сериал из обработчика прерывания. Вместо этого, я по прерыванию длблирую восьмой пин на 13-ый. Всё отлично мигает 13-м пином, только что протестировал.
Все верно. Что то я не вникая в смысл вставил совершенно ненужную конструкцию if (!(PINB & (1 << PB0 { и попытался изобрести велосипед)))
Спасибо большое!
Я сократил Ваш пример, убрав всё лишее и выбросил вывод в сериал из обработчика прерывания. Вместо этого, я по прерыванию длблирую восьмой пин на 13-ый. Всё отлично мигает 13-м пином, только что протестировал.
А где прочитать про загадочные строки 6 и 7?
А где прочитать про загадочные строки 6 и 7?
http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A...