Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot_c:exp36 [2024/11/17 16:19] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp36 [2024/11/17 17:04] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 65: | Строка 65: | ||
| } | } | ||
| - | void ICACHE_RAM_ATTR callback(){ | + | void ICACHE_RAM_ATTR callback() { |
| bool value_a = digitalRead(ENC_A); | bool value_a = digitalRead(ENC_A); | ||
| bool value_b = digitalRead(ENC_B); | bool value_b = digitalRead(ENC_B); | ||
| Строка 92: | Строка 92: | ||
| lcd.init(); | lcd.init(); | ||
| lcd.setBacklight(0); | lcd.setBacklight(0); | ||
| - | pinMode(ENC_A, | + | pinMode(ENC_A, |
| - | pinMode(ENC_B, | + | pinMode(ENC_B, |
| attachInterrupt(digitalPinToInterrupt(ENC_A), | attachInterrupt(digitalPinToInterrupt(ENC_A), | ||
| Строка 104: | Строка 104: | ||
| Сначала настраиваем прерывания: | Сначала настраиваем прерывания: | ||
| - | <code python[enable_line_numbers=" | + | <code python[enable_line_numbers=" |
| - | encA.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback) | + | |
| - | encB.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback) | + | |
| </ | </ | ||
| - | Мы настроили, | + | Мы настроили |
| Какие могут быть события: | Какие могут быть события: | ||
| - | * Pin.IRQ_FALLING | + | * FALLING |
| - | * Pin.IRQ_RISING | + | * RISING |
| - | * Pin.IRQ_LOW_LEVEL | + | * CHANGE любое изменение |
| - | * Pin.IRQ_HIGH_LEVEL | + | * LOW наличие логического 0 |
| + | * HIGH_LEVEL | ||
| - | События можно комбинировать. Например, если нужна реакция | + | Обратите внимание на новое |
| + | <code arduino[enable_line_numbers=" | ||
| + | volatile int count = 0; | ||
| + | volatile int state = 0; | ||
| + | volatile int state_old = 0; | ||
| + | </ | ||
| - | Рассмотрим функцию- обработчик прерывания: | + | Рассмотрим функцию-обработчик прерывания, она в свою очередь объявлена с атрибутом ICACHE_RAM_ATT. Причина аналогична указанной для переменных выше. |
| - | < | + | < |
| - | def callback(p): | + | void ICACHE_RAM_ATTR |
| - | | + | bool value_a = digitalRead(ENC_A); |
| - | | + | bool value_b = digitalRead(ENC_B); |
| - | global encA | + | |
| - | global states | + | |
| - | global old_state | + | |
| - | value_a | + | state = index(value_a, |
| - | | + | |
| - | current_state = states.index((value_a, value_b)) | + | if ((state - state_old |
| - | + | count++; | |
| - | if (current_state | + | if (not(count % 2)){ |
| - | count += 1 | + | |
| - | if not (count % 2): | + | |
| - | print('+'); | + | } |
| - | | + | |
| - | | + | } |
| - | | + | else if ((state |
| - | count -= 1 | + | count--; |
| - | if not (count % 2): | + | if (not(count % 2)){ |
| - | print('-'); | + | |
| - | | + | |
| - | | + | } |
| + | state_old | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| Она начинается с | Она начинается с | ||
| - | < | + | < |
| - | | + | bool value_a = digitalRead(ENC_A); |
| - | | + | bool value_b = digitalRead(ENC_B); |
| - | global encA | + | |
| - | global states | + | |
| - | global old_state | + | |
| </ | </ | ||
| - | Ключеваое слово '' | + | Здесь мы впервые объявляем переменные внутри функции. По умолчанию, |
| Потом, как и раньше, | Потом, как и раньше, | ||
| Строка 162: | Строка 164: | ||
| Как мы заметили ранее, при одном щелчке энкодера происходит смена двух состояний энкодера. Чтобы одному щелчку соответствовало изменение счетчика на 1, мы просто проверяем счетчик на четность. | Как мы заметили ранее, при одном щелчке энкодера происходит смена двух состояний энкодера. Чтобы одному щелчку соответствовало изменение счетчика на 1, мы просто проверяем счетчик на четность. | ||
| - | < | + | < |
| - | | + | if (not(count % 2)){ |
| - | print('+'); | + | |
| - | | + | |
| + | } | ||
| </ | </ | ||
| Строка 172: | Строка 175: | ||
| Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, | Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, | ||
| - | <WRAP center round important 60%> | + | <WRAP center round info 80%> |
| - | В этом эксперименте мы производили настройку аппаратных средств микроконтроллера, а именно настраивали прерывания. Как мы уже узнали, работа прерываний не зависит | + | [[https:// |
| + | |||
| + | [[https:// | ||
| </ | </ | ||
| + | |||
| + | |||