Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp36 [2020/05/22 14:18] – [Программный код эксперимента] labuser29products:laboratory_iot:exp36 [2024/11/17 16:27] (текущий) – [Программный код эксперимента] labuser30
Строка 12: Строка 12:
  
 ==== Прерывания ==== ==== Прерывания ====
-Оказывается есть отличное решение этой проблемы. Микроконтроллер умеет аппаратно отслеживать изменения состояния выводов. Пока процессор занят чем-то по-настоящему важным за состоянием пинов слежит специальная электронная схема. Как только изменение происходит, схема сигнализирует об этом процессору, который прерывает исполнение основной программы для того, чтобы обработать это прерывание — исполнить небольшой код, реагирующий на событие.+Оказывается есть отличное решение этой проблемы. Микроконтроллер умеет аппаратно отслеживать изменения состояния выводов. Пока процессор занят чем-то по-настоящему важным за состоянием пинов следит специальная электронная схема. Как только изменение происходит, схема сигнализирует об этом процессору, который прерывает исполнение основной программы для того, чтобы обработать это прерывание — исполнить небольшой код, реагирующий на событие.
  
 //Прерывание// — это сигнал (событие), который заставляет контроллер прекратить выполнение текущей задачи и приступить к исполнению другой, имеющей более высокий приоритет. После выполнения высокоприоритетной задачи, контроллер возвращается к той, которой был занят до прерывания. //Прерывание// — это сигнал (событие), который заставляет контроллер прекратить выполнение текущей задачи и приступить к исполнению другой, имеющей более высокий приоритет. После выполнения высокоприоритетной задачи, контроллер возвращается к той, которой был занят до прерывания.
  
-Представь, что что ты — это микрокоонтроллер и ты очень занят важным делом — читаешь эту статью. Но внезапно начинает звонить твой телефон. Ты откладываешь статью и занимаешься обработкой этого прерывания — отвечаешь на звонок и ведешь беседу. Как только беседа завершена, ты возвращаешься к чтению статьи с того места, где прервался. Примерно так устроена обработка прерываний в микроконтроллере.+Представь, что ты — это микроконтроллер и ты очень занят важным делом — читаешь эту статью. Но внезапно начинает звонить твой телефон. Ты откладываешь статью и занимаешься обработкой этого прерывания — отвечаешь на звонок и ведешь беседу. Как только беседа завершена, ты возвращаешься к чтению статьи с того места, где прервался. Примерно так устроена обработка прерываний в микроконтроллере.
  
 ==== Эксперимент ==== ==== Эксперимент ====
-Попробуем применить прерывания для работы с энкодером. Нам потребуется сделать две вещи — настроить прерывание и написать функцию- обработчик прерывания.+Попробуем применить прерывания для работы с энкодером. Нам потребуется сделать две вещи — настроить прерывание и написать функцию-обработчик прерывания.
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
Строка 31: Строка 31:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp35[enable_line_numbers="2", start_line_numbers_at="1"]>+<file python Exp36.py[enable_line_numbers="2", start_line_numbers_at="1"]>
 from machine import I2C, Pin from machine import I2C, Pin
 from esp8266_i2c_lcd import I2cLcd from esp8266_i2c_lcd import I2cLcd
Строка 37: Строка 37:
 _init() _init()
  
-DEFAULT_I2C_ADDR = 0x3F+DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате
  
 encA = Pin(13, Pin.IN) encA = Pin(13, Pin.IN)
Строка 111: Строка 111:
 События можно комбинировать. Например, если нужна реакция и на событие ''Pin.IRQ_FALLING'' и ''Pin.IRQ_RISING'', то можно записать так: ''trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING)''. События можно комбинировать. Например, если нужна реакция и на событие ''Pin.IRQ_FALLING'' и ''Pin.IRQ_RISING'', то можно записать так: ''trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING)''.
  
-Рассмотрим функцию- обработчик прерывания:+Рассмотрим функцию-обработчик прерывания:
 <code python[enable_line_numbers="2", start_line_numbers_at="26"]> <code python[enable_line_numbers="2", start_line_numbers_at="26"]>
 def callback(p): def callback(p):
Строка 148: Строка 148:
 </code> </code>
  
-Ключеваое слово ''global'' сообщает интерпретатору Python о том, что мы хотим использовать переменную, объявленную за пределами текущей функции. По умолчанию, все переменные, созданные внутри функции доступны (имеют //область видимости//) в пределах именно этой функции. Как только функция завершается такие переменные уничтожаются. Такие переменные называются //локальными//. Ключевое слово ''global'' дает возможность обратиться к //глобальной// переменной.+Ключевое слово ''global'' сообщает интерпретатору Python о том, что мы хотим использовать переменную, объявленную за пределами текущей функции. По умолчанию, все переменные, созданные внутри функции доступны (имеют //область видимости//) в пределах именно этой функции. Как только функция завершается такие переменные уничтожаются. Такие переменные называются //локальными//. Ключевое слово ''global'' дает возможность обратиться к //глобальной// переменной.
  
 Потом, как и раньше, мы определяем текущее состояние линий A и B энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние. Потом, как и раньше, мы определяем текущее состояние линий A и B энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние.
Строка 165: Строка 165:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-В этом эксперименте мы производили настройку аппаратных средств микроконтроллера, а именно настраивали прерывания. Как мы уже узнали, работа прерываний не зависит от программы и происходит автоматически. Это значит, что обработчик прерывания будет вызываться даже после завершения работы нашей программы, ведь настройки никуда не исчезли. Это может оказать влияние на следующие эксперименты, в которых не нужны эти прерывания. Они могут мешать. Для того, чтобы следующий эксперименты проходили нормально, необходимо перезагрузить микроконтроллер. Это можно сделать выдернув на некоторое время кабель USB или нажать на кнопку Reset на плате конструктора.+В этом эксперименте мы производили настройку аппаратных средств микроконтроллера, а именно настраивали прерывания. Как мы уже узнали, работа прерываний не зависит от программы и происходит автоматически. Это значит, что обработчик прерывания будет вызываться даже после завершения работы нашей программы, ведь настройки никуда не исчезли. Это может оказать влияние на следующие эксперименты, в которых не нужны эти прерывания. Они могут мешать. Для того, чтобы следующие эксперименты проходили нормально, **необходимо перезагрузить микроконтроллер**. Это можно сделать выдернув на некоторое время кабель USB или нажать на кнопку Reset на плате конструктора.
 </WRAP> </WRAP>