Не читает digitalRead(pd3_int1) c пина прерывания pd3_int1.

ddr2
Offline
Зарегистрирован: 27.12.2020

Хочу считать состояние пина 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);
     }

 

rkit
Offline
Зарегистрирован: 23.11.2016

Фееричненько, особенно 2.

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

ddr2 пишет:

При запуске программы в setup(), пин INT1_PIN настроен как INPUT для приёма внешних прерываний RISING. В процессе работы схемы на пин устанавливается высокий уровень, однако чтение( 1 раз в 4 сек) постоянно возвращает низкий уровень.

ты пьяный что ли? попробуй сам прочитать что ты написал и переведи на нормальный русский

ddr2
Offline
Зарегистрирован: 27.12.2020

Что не понятно? Просто тролите?

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

ddr2 пишет:

Что не понятно?

да практически все

как это "пин настроен как инпут для прерываний..."?

"в процессе работы на нем появляется" - что? откуда?

"пин читается 4 раза в секунду" - мы точно про прерывания? :)

 

сорри за неточное цитирование., лень было твой бред квотировать

 

nik182
Offline
Зарегистрирован: 04.05.2015

А что, то что в си в ардуино не компилируется? Про 2. По умолчанию после ресет все регистры обнуляются, поэтому при установке ноги на вывод на ней всегда будет 0. А вот если записать в в выходной регистр 1 и перевести ногу на вход, то подключится пуллап резистор и на ноге будет 1.  

ddr2
Offline
Зарегистрирован: 27.12.2020

#define INT1_PIN 3 // PD3 -> INT1

setup() {
  ........
  // int1 port interrupt, low-level detect
  pinMode(INT1_PIN, INPUT);
  .......
  attachInterrupt(INT1, low_level_interrupt, RISING);
}

loop() {
  ..........
   if ( (sec++ % 4) == 0 )  {

      val = digitalRead(INT1_PIN);

      if (val == HIGH) {
        Serial.print("Not ok");
      } else if (val == LOW) {
        Serial.print("Ok");
      }
   }
  ..........
}

 

 
ddr2
Offline
Зарегистрирован: 27.12.2020

nik182 пишет:
 А что, то что в си в ардуино не компилируется?  
Попробовал в другой системе, а туда не неохото переносить ардуино-кор и ставить арудино-иде. Ну и эксперимента ради.

nik182 пишет:
Про 2. По умолчанию после ресет все регистры обнуляются, поэтому при установке ноги на вывод на ней всегда будет 0. А вот если записать в в выходной регистр 1 и перевести ногу на вход, то подключится пуллап резистор и на ноге будет 1.
У меня в схеме  INT1_PIN подтянут к +3.3V. В процессе работы схемы пин зануляется (LOW), а потом туда приходят прерывания RISING (LOW -> HIGH), но я каждые 4 сек читаю чтобы понять не находится ли на пине уровень HIGH, но digitalRead() всегда выдаёт LOW, даже когда схема выставляет на нём HIGH (подтягивается к +3.3V). 

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

ddr2 - во-первых - вставляем код ТОЛЬКО по правилам форума

а во-вторых.... сначала исправь первое

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

молодец. А теперь покажи где у тебя обработчик прерывания

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 - во-первых - вставляем код ТОЛЬКО по правилам форума

а во-вторых.... сначала исправь первое

Исправил и то и другое. 

закомментил настройку пина INPUT и заработало. )

setup () { 
     //pinMode(INT1_PIN, INPUT);
}
 

Всем спасибо, работает !  

b707 пишет:
 А теперь покажи где у тебя обработчик прерывания 

Обработчик RISING на инт1 выставляется в другом обработчике прерывания. 
   

      detachInterrupt(digitalPinToInterrupt(INT0));
      attachInterrupt(INT1, low_level_interrupt, RISING);
 

 

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

ответь, пожалуйста, нафига тебе прерывания, если ты значения с пина в лупе читаешь?

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

ddr2 пишет:

Обработчик RISING на инт1 выставляется в другом обработчике прерывания. 
   

      detachInterrupt(digitalPinToInterrupt(INT0));
      attachInterrupt(INT1, low_level_interrupt, RISING);
 

 

опять бредишь?

Где сам обработчик? Ты вообще знаешь. как работает прерывание?

Ответь, ты хоть одну книжку по программированию ардуино открывал? А то все, что ты пишешь тут в форуме - бредятина сплошная

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

во нагородил )))

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ответь, пожалуйста, нафига тебе прерывания, если ты значения с пина в лупе читаешь?

для подобного теста "delay(1000); if (sec++ %4) {}" проще, чем городить асинхронный таймер. 

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

ua6em пишет:

во нагородил )))

это он так программы пишет - нашел в инете строчку, вставил в программу - и проверяет,  работает или нет.

 

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

ddr2 пишет:

для подобного теста "delay(1000); if (sec++ %4) {}" проще, чем городить асинхронный таймер. 

пипец :)))

Ты точно пьяный вдупель. Или тупой как полено

Я тебя разве о делее спрашивал? Прерывание у тебя в коде где, дерево?

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:
пипец :)))

Ты точно пьяный вдупель. Или тупой как полено

Я тебя разве о делее спрашивал? Прерывание у тебя в коде где, дерево?

Какой ещё дерево? Это внешнее прерывание оно у меня не в коде. 

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:
Ты вообще знаешь. как работает прерывание?
В общих чертах, но более подробно в  документации ATMega32, наверное есть. 

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

ddr2 пишет:

Какой ещё дерево? Это внешнее прерывание оно у меня не в коде. 

дерево - это ты.

Нафига ты вставил в код прерывание, если ты не умеешь им пользоваться? Весь твой код от начала и до конца сплошной мусор.

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:
 
ddr2 пишет:
 Какой ещё дерево? Это внешнее прерывание оно у меня не в коде.  
 
дерево - это ты.
что конкретно вам не нравится в этом коде?

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

ddr2 пишет:

что конкретно вам не нравится в этом коде?

то что ты его надергал из мнета, не понимая в нем ни строчки

можешь привести код целиком?

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:
то что ты его надергал из мнета, не понимая в нем ни строчки

Обьясни мне, зачем у тебя строка 8? (в коде из сообщения 6)

Если вам интересно, то в интернете я такого не видел. Мне казалось что пинам внешних прерываний требуется настройка INPUT, и это не мешало пока не потребовалось читать из пина.

Строка 8 её в коде нет, это пример чтобы показать как я добавляю прерывание на int1, на самом деле прерывание int1 добавляется в обработчике для int0.   

 

 

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

ddr2 пишет:

Строка 8 её в коде нет, это пример чтобы показать как я добавляю прерывание на int1, на самом деле прерывание int1 добавляется в обработчике для int0.   

покажи полный код или давай закончим. Потому что я это (типа того что выделено) - читать больше не могу.

ddr2
Offline
Зарегистрирован: 27.12.2020
Вот так включается обработка прерывания на int1. 

void handler_int0_interrupt() {
    
    if (_led_state != COMPLETE) {
      _led_state = COMPLETE;

      digitalWrite(LED_PIN, HIGH);

      detachInterrupt(digitalPinToInterrupt(INT0));
      attachInterrupt(INT1, handler_int1_interrupt, RISING);// INT1
      Serial.println("LED turn on");
    }
}

 

 

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

полный код

Иначе просто до свиданья

nik182
Offline
Зарегистрирован: 04.05.2015

handler_int1_interrupt это подпрограмма, которая вызывается при срабатывании прерывания. Где она? Что она делает? Если она не описана, то компилятор просто городит заглушку, которая сразу возвращает управление основной программе после срабатывания прерывания.

ddr2
Offline
Зарегистрирован: 27.12.2020

 

Вы сами говорите что код у меня мусор. Стыдно выкладывать, зачем людей пугать и так понедельник.

Кстати почему битовое чтение с порта не работает и постоянно выдаёт 0, в то время как digitalRead(PD3) работает. 
void loop() {

     if ( (sec % 4) == 0 )  {
         // PD3 -> INT1 
         // int val = PORTD & (1<<PD3);    // не работает. 
         int val = digitalRead(PD3);        //  работает. 

         if (val == HIGH) {
           Serial.print("Not ok");
         } else if (val == LOW) {
           Serial.print("Ok");
        }
     }
     delay(1000);
     sec++;
}

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

ddr2 пишет:

Кстати почему битовое чтение с порта не работает и постоянно выдаёт 0, в то время как digitalRead(PD3) работает. 
      // PD3 -> INT1 
      // int val = PORTD & (1<<PD3);    // не работает. 
      int val = digitalRead(PD3);        //  работает. 

Потому что PD3 для этих записей имеет разный смысл и соответственно разные значения. Напечатай а терминал PD3 и сам поймёшь. В ардуине есть функция переводящая PD3 к правильному значению для не работающей строчки. Сам найдёшь?

 

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

nik182 пишет:

Потому что PD3 для этих записей имеет разный смысл и соответственно разные значения. Напечатай а терминал PD3 и сам поймёшь. В ардуине есть функция переводящая PD3 к правильному значению для не работающей строчки. Сам найдёшь?

а можно просто распиновку для Атмеги32u посмотреть и понять, что запись

PORTD & (1<<PD3);

ничего кроме нуля выдавать не может.

Green
Offline
Зарегистрирован: 01.10.2015

Тут даже смотреть никуда не надо. Чтение из PORTx - это с защелки, а с PINx - со входа. Почувствуйте разницу.

nik182
Offline
Зарегистрирован: 04.05.2015

Green пишет:

Тут даже смотреть никуда не надо. Чтение из PORTx - это с защелки, а с PINx - со входа. Почувствуйте разницу.

Во! спасибо! Я даже не обратил на это внимание. Я тут недавно на stm биты писал - читал и там как раз наткнулся на разницу смыслов digitalRead и прямой записи в регистр.  Кое где функцию bit пришлось вставлять.

ddr2
Offline
Зарегистрирован: 27.12.2020

Спасибо разобрался в потрохах Arduino.h и pins_arduino.h :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ddr2 пишет:

Вот так включается обработка прерывания на int1. 

void handler_int0_interrupt() {
    
    if (_led_state != COMPLETE) {
      _led_state = COMPLETE;

      digitalWrite(LED_PIN, HIGH);

      detachInterrupt(digitalPinToInterrupt(INT0));
      attachInterrupt(INT1, handler_int1_interrupt, RISING);// INT1
      Serial.println("LED turn on");
    }
}

Не хрена, не так. В восьмой строке неверно указан параметр, в итоге получился бред.

А вообще, Вам правильно сказали, код нужен полностью или решайте свои проблемы самостоятельно.

ddr2
Offline
Зарегистрирован: 27.12.2020

ЕвгенийП пишет:

ddr2 пишет:

Вот так включается обработка прерывания на int1. 

void handler_int0_interrupt() {
    
    if (_led_state != COMPLETE) {
      _led_state = COMPLETE;

      digitalWrite(LED_PIN, HIGH);

      detachInterrupt(digitalPinToInterrupt(INT0));
      attachInterrupt(INT1, handler_int1_interrupt, RISING);// INT1
      Serial.println("LED turn on");
    }
}

Не хрена, не так. В восьмой строке неверно указан параметр, в итоге получился бред.

А вообще, Вам правильно сказали, код нужен полностью или решайте свои проблемы самостоятельно.

Верно подметили там должно быть PD2, вместо INT0.

Данные проблемы уже полностью решил, вобщем PIND.  

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

ddr2 пишет:

Данные проблемы уже полностью решил, вобщем PIND.  

ddr2 - у вас практичнски в каждой строке проблема. Пока моя идея. что это не код. а мусор - подтверждается.

До кучи - использовать обращение к Serial в прерывании -крайне не рекомендуется. особенно с вашим уровнем знаний...

Может все-таки сесть и сначала прочесть учебник какой-нить?

ddr2
Offline
Зарегистрирован: 27.12.2020

Да убрал Serial из прерывания, исправил detach, всё работает относительно стабильно. Состояние пина int1 читаю из PIND. 

Всё также работает даже без (detach/attach) Interrupt в обработчике, достаточно флагов.

Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность? Есть ли смысл делать detachInterrupt ?

 

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

ddr2 пишет:

Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность?

опять не вопрос, а перл. Во-первых, "большое число прерываний", это сколько, по вашему?

А насчет производительности.... Сами то как думаете?  - система однозадачная, как ни крути. Если контроллер занят в прерывании - значит ничего другого он уже не делает.

почему у меня опять ощущение, что вы не понимаете ни буквы в своем коде? Если attach/detach ни на что не влияют, значит скорее всего опять с прерываниями работаете неверно.

Вы почему код показать не хотите? боитесь, что кто-то украдет вашу "интеллектуальную собственность" ??

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 пишет:

Вот интересно, большое количество прерываний находящихся в опросе системы как-то снизят её производительность?

Если контроллер занят в прерывании - значит ничего другого он уже не делает.

Я имею ввиду, есть ли у ATmega32 какая-то таблица активных (включённых) прерываний, или он пробегает по всей возможной таблице и вызывает обработчик если он установлен? Если последнее, то никакого смысла делать detach нет.

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

ddr2 пишет:

Если последнее, то никакого смысла делать detach нет.

железная логика...

ddr2
Offline
Зарегистрирован: 27.12.2020

если забыть про "дребезг контактов

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

По прерываниям неплохо написано у коллеги с этого форума - Владимира Цыброва, почитайте, будет полезно

ddr2
Offline
Зарегистрирован: 27.12.2020

да неплохая статья, ещё бы добавить сколько бит каждый таймер. 

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

ddr2 пишет:

да неплохая статья, ещё бы добавить сколько бит каждый таймер. 

а что, прям сотни вариантов? :) эта инфа ищется гуглем в 1 секунду

ddr2
Offline
Зарегистрирован: 27.12.2020

Ну по памяти Timer1 - 16 бит, Тimer0/2 - 8 битные. 

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

ddr2 пишет:

да неплохая статья, ещё бы добавить сколько бит каждый таймер. 

непонятно, почему эта инфа должна быть в статье про прерывания

ddr2
Offline
Зарегистрирован: 27.12.2020

есть ли смысл отключать таймеры если они не используются?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вам - нет смысла.

ddr2
Offline
Зарегистрирован: 27.12.2020

Я отключил на всякий случай.