Не читает digitalRead(pd3_int1) c пина прерывания pd3_int1.
- Войдите на сайт для отправки комментариев
Пнд, 20/09/2021 - 16:24
Хочу считать состояние пина PD3 (int1). При запуске программы в setup(), пин INT1_PIN настроен как INPUT для приёма внешних прерываний RISING. В процессе работы схемы на пин устанавливается высокий уровень, однако чтение( 1 раз в 4 сек) постоянно возвращает низкий уровень.
как считывал:
Arduino-IDE.
1) val = digitalRead(INT1_PIN);
2) pinMode(INT1_PIN, OUTPUT);
val = digitalRead(INT1_PIN);
pinMode(INT1_PIN, INPUT);
В Си.
1) val = PORTD & (1 << INT1_PIN);
2) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
PORTD |= (1 << INT1_PIN);
val = PORTD & (1 << INT1_PIN);
PORTD &= ~(1 << INT1_PIN);
}
Фееричненько, особенно 2.
При запуске программы в setup(), пин INT1_PIN настроен как INPUT для приёма внешних прерываний RISING. В процессе работы схемы на пин устанавливается высокий уровень, однако чтение( 1 раз в 4 сек) постоянно возвращает низкий уровень.
ты пьяный что ли? попробуй сам прочитать что ты написал и переведи на нормальный русский
Что не понятно? Просто тролите?
Что не понятно?
да практически все
как это "пин настроен как инпут для прерываний..."?
"в процессе работы на нем появляется" - что? откуда?
"пин читается 4 раза в секунду" - мы точно про прерывания? :)
сорри за неточное цитирование., лень было твой бред квотировать
А что, то что в си в ардуино не компилируется? Про 2. По умолчанию после ресет все регистры обнуляются, поэтому при установке ноги на вывод на ней всегда будет 0. А вот если записать в в выходной регистр 1 и перевести ногу на вход, то подключится пуллап резистор и на ноге будет 1.
ddr2 - во-первых - вставляем код ТОЛЬКО по правилам форума
а во-вторых.... сначала исправь первое
молодец. А теперь покажи где у тебя обработчик прерывания
ddr2 - во-первых - вставляем код ТОЛЬКО по правилам форума
а во-вторых.... сначала исправь первое
закомментил настройку пина INPUT и заработало. )
Всем спасибо, работает !
Обработчик RISING на инт1 выставляется в другом обработчике прерывания.
ответь, пожалуйста, нафига тебе прерывания, если ты значения с пина в лупе читаешь?
Обработчик RISING на инт1 выставляется в другом обработчике прерывания.
опять бредишь?
Где сам обработчик? Ты вообще знаешь. как работает прерывание?
Ответь, ты хоть одну книжку по программированию ардуино открывал? А то все, что ты пишешь тут в форуме - бредятина сплошная
во нагородил )))
ответь, пожалуйста, нафига тебе прерывания, если ты значения с пина в лупе читаешь?
во нагородил )))
это он так программы пишет - нашел в инете строчку, вставил в программу - и проверяет, работает или нет.
для подобного теста "delay(1000); if (sec++ %4) {}" проще, чем городить асинхронный таймер.
пипец :)))
Ты точно пьяный вдупель. Или тупой как полено
Я тебя разве о делее спрашивал? Прерывание у тебя в коде где, дерево?
Ты точно пьяный вдупель. Или тупой как полено
Я тебя разве о делее спрашивал? Прерывание у тебя в коде где, дерево?
Какой ещё дерево? Это внешнее прерывание оно у меня не в коде.
дерево - это ты.
Нафига ты вставил в код прерывание, если ты не умеешь им пользоваться? Весь твой код от начала и до конца сплошной мусор.
что конкретно вам не нравится в этом коде?
то что ты его надергал из мнета, не понимая в нем ни строчки
можешь привести код целиком?
Обьясни мне, зачем у тебя строка 8? (в коде из сообщения 6)
Если вам интересно, то в интернете я такого не видел. Мне казалось что пинам внешних прерываний требуется настройка INPUT, и это не мешало пока не потребовалось читать из пина.
Строка 8 её в коде нет, это пример чтобы показать как я добавляю прерывание на int1, на самом деле прерывание int1 добавляется в обработчике для int0.
Строка 8 её в коде нет, это пример чтобы показать как я добавляю прерывание на int1, на самом деле прерывание int1 добавляется в обработчике для int0.
покажи полный код или давай закончим. Потому что я это (типа того что выделено) - читать больше не могу.
полный код
Иначе просто до свиданья
handler_int1_interrupt это подпрограмма, которая вызывается при срабатывании прерывания. Где она? Что она делает? Если она не описана, то компилятор просто городит заглушку, которая сразу возвращает управление основной программе после срабатывания прерывания.
Вы сами говорите что код у меня мусор. Стыдно выкладывать, зачем людей пугать и так понедельник.
Потому что PD3 для этих записей имеет разный смысл и соответственно разные значения. Напечатай а терминал PD3 и сам поймёшь. В ардуине есть функция переводящая PD3 к правильному значению для не работающей строчки. Сам найдёшь?
Потому что PD3 для этих записей имеет разный смысл и соответственно разные значения. Напечатай а терминал PD3 и сам поймёшь. В ардуине есть функция переводящая PD3 к правильному значению для не работающей строчки. Сам найдёшь?
а можно просто распиновку для Атмеги32u посмотреть и понять, что запись
ничего кроме нуля выдавать не может.
Тут даже смотреть никуда не надо. Чтение из PORTx - это с защелки, а с PINx - со входа. Почувствуйте разницу.
Тут даже смотреть никуда не надо. Чтение из PORTx - это с защелки, а с PINx - со входа. Почувствуйте разницу.
Во! спасибо! Я даже не обратил на это внимание. Я тут недавно на stm биты писал - читал и там как раз наткнулся на разницу смыслов digitalRead и прямой записи в регистр. Кое где функцию bit пришлось вставлять.
Спасибо разобрался в потрохах Arduino.h и pins_arduino.h :)
Вот так включается обработка прерывания на int1.
Не хрена, не так. В восьмой строке неверно указан параметр, в итоге получился бред.
А вообще, Вам правильно сказали, код нужен полностью или решайте свои проблемы самостоятельно.
Вот так включается обработка прерывания на int1.
Не хрена, не так. В восьмой строке неверно указан параметр, в итоге получился бред.
А вообще, Вам правильно сказали, код нужен полностью или решайте свои проблемы самостоятельно.
Верно подметили там должно быть PD2, вместо INT0.
Данные проблемы уже полностью решил, вобщем PIND.
Данные проблемы уже полностью решил, вобщем PIND.
ddr2 - у вас практичнски в каждой строке проблема. Пока моя идея. что это не код. а мусор - подтверждается.
До кучи - использовать обращение к Serial в прерывании -крайне не рекомендуется. особенно с вашим уровнем знаний...
Может все-таки сесть и сначала прочесть учебник какой-нить?
Да убрал Serial из прерывания, исправил detach, всё работает относительно стабильно. Состояние пина int1 читаю из PIND.
Всё также работает даже без (detach/attach) Interrupt в обработчике, достаточно флагов.
Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность? Есть ли смысл делать detachInterrupt ?
Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность?
опять не вопрос, а перл. Во-первых, "большое число прерываний", это сколько, по вашему?
А насчет производительности.... Сами то как думаете? - система однозадачная, как ни крути. Если контроллер занят в прерывании - значит ничего другого он уже не делает.
почему у меня опять ощущение, что вы не понимаете ни буквы в своем коде? Если attach/detach ни на что не влияют, значит скорее всего опять с прерываниями работаете неверно.
Вы почему код показать не хотите? боитесь, что кто-то украдет вашу "интеллектуальную собственность" ??
Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность?
Если контроллер занят в прерывании - значит ничего другого он уже не делает.
Я имею ввиду, есть ли у ATmega32 какая-то таблица активных (включённых) прерываний, или он пробегает по всей возможной таблице и вызывает обработчик если он установлен? Если последнее, то никакого смысла делать detach нет.
Если последнее, то никакого смысла делать detach нет.
железная логика...
если забыть про "дребезг контактов"
По прерываниям неплохо написано у коллеги с этого форума - Владимира Цыброва, почитайте, будет полезно
да неплохая статья, ещё бы добавить сколько бит каждый таймер.
да неплохая статья, ещё бы добавить сколько бит каждый таймер.
а что, прям сотни вариантов? :) эта инфа ищется гуглем в 1 секунду
Ну по памяти Timer1 - 16 бит, Тimer0/2 - 8 битные.
да неплохая статья, ещё бы добавить сколько бит каждый таймер.
непонятно, почему эта инфа должна быть в статье про прерывания
есть ли смысл отключать таймеры если они не используются?
Вам - нет смысла.
Я отключил на всякий случай.