| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| products:laboratory_iot_c:exp36 [2024/11/17 16:36] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp36 [2024/11/17 17:04] (текущий) – [Программный код эксперимента] labuser30 |
|---|
| |
| Рассмотрим функцию-обработчик прерывания, она в свою очередь объявлена с атрибутом ICACHE_RAM_ATT. Причина аналогична указанной для переменных выше. | Рассмотрим функцию-обработчик прерывания, она в свою очередь объявлена с атрибутом ICACHE_RAM_ATT. Причина аналогична указанной для переменных выше. |
| <code arduino[enable_line_numbers="2", start_line_numbers_at="33"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="34"]> |
| void ICACHE_RAM_ATTR callback() { | void ICACHE_RAM_ATTR callback() { |
| bool value_a = digitalRead(ENC_A); | bool value_a = digitalRead(ENC_A); |
| |
| Она начинается с | Она начинается с |
| <code arduino[enable_line_numbers="2", start_line_numbers_at="27"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="35"]> |
| global count | bool value_a = digitalRead(ENC_A); |
| global encB | bool value_b = digitalRead(ENC_B); |
| global encA | |
| global states | |
| global old_state | |
| </code> | </code> |
| |
| Ключевое слово ''global'' сообщает интерпретатору Python о том, что мы хотим использовать переменную, объявленную за пределами текущей функции. По умолчанию, все переменные, созданные внутри функции доступны (имеют //область видимости//) в пределах именно этой функции. Как только функция завершается такие переменные уничтожаются. Такие переменные называются //локальными//. Ключевое слово ''global'' дает возможность обратиться к //глобальной// переменной. | Здесь мы впервые объявляем переменные внутри функции. По умолчанию, все переменные, созданные внутри функции доступны (имеют //область видимости//) в пределах именно этой функции. Как только функция завершается такие переменные уничтожаются. Такие переменные называются //локальными//, а объявленные в основной программе — //глобальными//. |
| |
| Потом, как и раньше, мы определяем текущее состояние линий A и B энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние. | Потом, как и раньше, мы определяем текущее состояние линий A и B энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние. |
| Как мы заметили ранее, при одном щелчке энкодера происходит смена двух состояний энкодера. Чтобы одному щелчку соответствовало изменение счетчика на 1, мы просто проверяем счетчик на четность. | Как мы заметили ранее, при одном щелчке энкодера происходит смена двух состояний энкодера. Чтобы одному щелчку соответствовало изменение счетчика на 1, мы просто проверяем счетчик на четность. |
| |
| <code python[enable_line_numbers="2", start_line_numbers_at="40"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="42"]> |
| if not (count % 2): | if (not(count % 2)){ |
| print('+'); | Serial.println("+"); |
| print_lcd(int(count/2)) | printLcd(count / 2); |
| | } |
| </code> | </code> |
| |
| |
| Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний. | Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний. |
| | |
| | <WRAP center round info 80%> |
| | [[https://arduino.ru/Reference/Volatile|Подробнее о ключевом слове volatile в Arduino]] |
| | |
| | [[https://arduino.ru/Reference/AttachInterrupt|Подробнее о прерываниях в Arduino]] |
| | |
| | </WRAP> |
| | |
| |
| |