Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
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:// | ||
</ | </ | ||
+ | |||
+ | |||