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

Материал из CADR
Перейти к: навигация, поиск
(Дополнил)
(Общая информация)
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
 +
= Общая информация =
 +
* Методичка/Книга [https://docs.google.com/document/d/1bDCyNURCL4vtBt96BZDe56C4fJJWLA7_b3P4lXrUvzY/edit "Разработка микропроцессорных систем"]
 +
* [http://forum.arduino.cc/index.php?topic=73748.0 Loop-Back Test] -- описание одного из методов тестирования МК.
 +
* [https://cdn.solarbotics.com/products/documentation/ardx-eg-sola-russian.pdf Руководство по освоению Arduino] (на русском языке)
 +
* Brian W. Evans, [http://playground.arduino.cc/uploads/Main/arduino_notebook_v1-1.pdf arduino programming notebook] (на анлийском языке)
 +
 
= Прерывания =
 
= Прерывания =
Допустим, мы сделали "бегущий огонь" и теперь хотим прикрутить кнопку для управления режимом светодиодов:
 
 
<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: Строка 15:
 
* [[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
 +
 +
Судя по отзывам на AliExpress, некоторые Arduino на базе МК 168pa поставляются без загрузчика.  Необходимо прошить сначала загрузчик через USBasp, потом уже использовать обычное подключение по USB (встроенный USB-UART).
  
 
[[Категория:База знаний]]
 
[[Категория:База знаний]]

Версия 10:52, 20 марта 2019

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

Прерывания

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

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

Arduino Nano 168p

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

Судя по отзывам на AliExpress, некоторые Arduino на базе МК 168pa поставляются без загрузчика. Необходимо прошить сначала загрузчик через USBasp, потом уже использовать обычное подключение по USB (встроенный USB-UART).