Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp36 [2024/11/17 16:36] – [Программный код эксперимента] labuser30products:laboratory_iot_c:exp36 [2024/11/17 17:04] (текущий) – [Программный код эксперимента] labuser30
Строка 126: Строка 126:
  
 Рассмотрим функцию-обработчик прерывания, она в свою очередь объявлена с атрибутом 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);
Строка 153: Строка 153:
  
 Она начинается с  Она начинается с 
-<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 энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние.
Строка 167: Строка 164:
 Как мы заметили ранее, при одном щелчке энкодера происходит смена двух состояний энкодера. Чтобы одному щелчку соответствовало изменение счетчика на 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>
  
Строка 176: Строка 174:
  
 Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний. Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний.
 +
 +<WRAP center round info 80%>
 +[[https://arduino.ru/Reference/Volatile|Подробнее о ключевом слове volatile в Arduino]]
 +
 +[[https://arduino.ru/Reference/AttachInterrupt|Подробнее о прерываниях в Arduino]]
 +
 +</WRAP>
 +