Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp36 [2024/11/17 16:32] – [Программный код эксперимента] labuser30products: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);
Строка 125: Строка 125:
 </code> </code>
  
 +Рассмотрим функцию-обработчик прерывания, она в свою очередь объявлена с атрибутом ICACHE_RAM_ATT. Причина аналогична указанной для переменных выше.  
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="34"]>
 +void ICACHE_RAM_ATTR callback() {
 +  bool value_a = digitalRead(ENC_A);
 +  bool value_b = digitalRead(ENC_B);
  
-Рассмотрим функцию-обработчик прерывания: +  state index(value_avalue_b);
-<code python[enable_line_numbers="2", start_line_numbers_at="26"]> +
-def callback(p): +
-    global count +
-    global encB +
-    global encA +
-    global states +
-    global old_state +
- +
-    value_a = encA.value() +
-    value_b = encB.value()+
  
-    current_state = states.index((value_a, value_b)) +  if ((state state_old == 1) or (state == 0 and state_old == 3)) { 
-     +    count++; 
-    if (current_state  old_state == 1) or (current_state == 0 and old_state == 3): +    if (not(count % 2)){ 
-        count += 1 +      Serial.println("+"); 
-        if not (count % 2): +      printLcd(count / 2); 
-            print('+'); +    } 
-            print_lcd(int(count/2)) +    state_old = state; 
-        old_state = current_state +  } 
-    elif (current_state  old_state == -1)  or (current_state == 3 and old_state == 0): +  else if ((state state_old == -1)  or (state == 3 and state_old == 0)) { 
-        count -= 1 +    count--; 
-        if not (count % 2): +    if (not(count % 2)){ 
-            print('-'); +      Serial.println("-"); 
-            print_lcd(int(count/2)) +      printLcd(count / 2); 
-        old_state current_state+    } 
 +    state_old state; 
 +  } 
 +}
 </code> </code>
  
 Она начинается с  Она начинается с 
-<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 энкодера. Определяем индекс состояния и проверяем можем ли мы сделать переход в данное состояние.
Строка 169: Строка 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>
  
Строка 178: Строка 174:
  
 Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний. Теперь самое главное. Обратим внимание на основной цикл программы. Мы в нем ничего не делаем. Все действия, связанные с работой с энкодером, происходят в обработчике прерывания и обрабатываются независимо от основной программы. В основном цикле мы можем заняться чем-то другим. В этом и смысл использования прерываний.
 +
 +<WRAP center round info 80%>
 +[[https://arduino.ru/Reference/Volatile|Подробнее о ключевом слове volatile в Arduino]]
 +
 +[[https://arduino.ru/Reference/AttachInterrupt|Подробнее о прерываниях в Arduino]]
 +
 +</WRAP>
 +