* * *

Подробности

Но было бы ошибкой считать, что прерывания в Arduino не используются вовсе. Например, в Arduino отсчет времени реализован совершенно так же, как мы делали в главе 19, только не с помощью Time1, как у нас, а через восьмиразрядный Timer0. Здесь тоже устанавливается прерывание таймера по переполнению и тоже с коэффициентом предделителя 64. При обычной тактовой частоте Arduino, равной 16 МГц, прерывания переполнения восьмиразрядного таймера происходят каждые (64/16)·256 = 1024 микросекунды, что позволяет реализовать такие функции, как millis () или delay (). Самый частый отсчет возможен при таком коэффициенте каждые 4 микросекунды, что обуславливает приведенное в справочнике по функциям Arduino максимальное разрешение функции отсчета микросекунд micros (). Любопытно, что задержка в микросекундах (т. е. функция delayMicroseconds ()) при этом реализована в виде простой программной задержки, как мы делали в первом примере главы 19. Функции коммуникационного порта, кстати, также основаны на прерываниях (см. далее).

* * *

Блок определений содержит обычные для почти любого языка программирования ссылки на включаемые библиотеки и определения переменных, например:

#include <LiquidCrystal.h> //подключаем библиотеку для работы со строчным ЖК-индикатором

int i; //переменная i — 16-разрядный счетчик

byte temp = 0; //рабочая переменная типа byte

float temperature; //переменная — действительное число для значения температуры

Определение наименований выводов, как констант:

#define dataPin 16 //dataPin — цифровой вывод 16[40] (т. е. вывод А2 платы, см. далее)

Выводы можно определять и как переменные целого типа:

int ledPin =3; // цифровой выход управления светодиодом

Строчные и заглавные буквы здесь различаются, например, string () и String () — это разные функции (см. справочник по языку на сайте [23]). В языке С любые определения можно делать в любом месте программы, выносить их в начало необязательно. Только стоит учесть, что, например, вызов переменной, определенной внутри некоей функции (локальная переменная), в другой функции вызовет сообщение об ошибке. Для того чтобы переменная действовала для всей программы, она должна быть определена именно в начале, до всех функций (глобальная переменная). Нюанс заключается в том, что глобальная переменная займет ресурсы контроллера на все время работы программы, тогда как локальная освободит их по окончании действия функции. В условиях ограниченных ресурсов МК это может оказаться существенным фактором, влияющим на скорость выполнения программы.

Наша процедура Reset (блок установок) здесь выглядит, как функция setup:

void setup()

{

< операторы >

}

Следует заметить, что в языке С служебное слово void («пустота») обозначает, что за ним последует то, что в человеческом языке носит название «процедура» — т. е. функция, не возвращающая никакого значения. Между фигурными скобками здесь размещаются те операторы, которые должны выполняться при запуске программы один раз. После setup обычно идет функция (на самом деле тоже процедура) бесконечного цикла, которая обозначается словом loop («петля»):

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату