Arduino — различия между версиями

Материал из CADR
Перейти к: навигация, поиск
(Дополнил)
(Указал книгу вместо дублирующего описания: дополнил)
Строка 1: Строка 1:
 +
= Общая информация =
 +
* Методичка/Книга [https://docs.google.com/document/d/1bDCyNURCL4vtBt96BZDe56C4fJJWLA7_b3P4lXrUvzY/edit "Разработка микропроцессорных систем"]
 +
 
= Прерывания =
 
= Прерывания =
Допустим, мы сделали "бегущий огонь" и теперь хотим прикрутить кнопку для управления режимом светодиодов:
 
 
<pre>
 
const int LED_MIN = 22;
 
const int LED_MAX = 30;
 
const int DELAY  = 100;
 
 
void setup() {
 
  for (int pin = LED_MIN; pin <= LED_MAX; ++pin)
 
    pinMode(pin, OUTPUT);
 
}
 
 
void blink(int pin) {
 
  digitalWrite(pin, HIGH);
 
  delay(DELAY);
 
  digitalWrite(pin, LOW);
 
  delay(DELAY);
 
}
 
 
void loop() {
 
  for (int pin = LED_MIN; pin <= LED_MAX; ++pin)
 
    blink(pin);
 
}
 
</pre>
 
 
Самым прямолинейным решением, на первый взгляд, является считывание значение кнопки в начале <code>loop</code>.  К примеру:
 
 
<pre>
 
const int BUTTON  = 31;
 
 
// ... пропущена часть кода из предыдущей программы ...
 
 
boolean isEnabled = false;
 
 
void loop() {
 
  if (digitalRead(BUTTON))
 
    isEnabled = ! isEnabled;
 
 
  if (isEnabled) {
 
    for (int pin = LED_MIN; pin <= LED_MAX; pin++)
 
      blink(pin);
 
  }
 
}
 
</pre>
 
 
Собираем схему, добавляем считывание значения с цифрового порта и логику переключения режимов.  Всё бы хорошо, но наше кратковременное нажатие на кнопку обычно приводит к многократному считыванию значения: за время, пока нажата кнопка, <code>loop</code> успевает отработать несколько раз; как следствие, логика не работает, как должна.
 
 
Плюс, добавляя кнопку в наш проект, мы добавляем в наш проект неопределённость -- нажатие на кнопку может возникнуть в любой момент; в таких случаях говорят, что событие возникает асинхронно (по отношению к нашей программе.)  Если нажатие на кнопку возникло в тот момент, когда Arduino "не смотрела" на значение на порту и занималась другим делами, то событие пройдёт незамеченным.  Если же всё делать по-нормальному, то мы должны обрабатывать это событие в тот момент, как оно возникла. 
 
 
Для правильного решения данной задачи необходимо использовать прерывания.
 
 
== Реакция на внешние события ==
 
Для обработки внешнего асинхронного события нам потребуются как минимум две вещи:
 
* Написать обработчик события
 
* Связать обработчик с внешним событием
 
 
TODO
 
 
== Прерывания по таймеру ==
 
TODO
 
 
== См. также ==
 
 
* [http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-tutorial-on-arduino-interrupts/ We interrupt this program to bring you an Arduino interrupt tutorial] (англ.)
 
* [http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-tutorial-on-arduino-interrupts/ We interrupt this program to bring you an Arduino interrupt tutorial] (англ.)
 
* [http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/ Microcontroller tutorial series: AVR and Arduino timer interrupts] (англ.)
 
* [http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/ Microcontroller tutorial series: AVR and Arduino timer interrupts] (англ.)
Строка 71: Строка 12:
 
* [[Arduino/MT-16S2H|ЖК-дисплей МЭЛТ MT-16S2H]]
 
* [[Arduino/MT-16S2H|ЖК-дисплей МЭЛТ MT-16S2H]]
 
* [[Arduino/RotaryDial|Дисковый номеронабиратель]]
 
* [[Arduino/RotaryDial|Дисковый номеронабиратель]]
 +
 +
= Arduino Nano 168p =
 +
Специфика работы с Arduino Nano на базе микроконтроллера MEGA 168PA.
 +
* http://playground.arduino.cc/Bootloader/ArduinoBootloader168P
  
 
[[Категория:База знаний]]
 
[[Категория:База знаний]]

Версия 08:44, 5 июля 2017

Общая информация

Прерывания

Работа с программатором

Подключение оборудования

Arduino Nano 168p

Специфика работы с Arduino Nano на базе микроконтроллера MEGA 168PA.