Чтение онлайн

на главную - закладки

Жанры

Программируем Arduino. Основы работы со скетчами
Шрифт:

Рис. 4.4. Регистры для порта D

Регистр DDRD (Data Direction Register D — регистр D направления передачи данных) имеет 8 бит, каждый из которых определяет режим работы соответствующего контакта — вход или выход. Если бит установлен в значение 1, контакт работает как выход, в противном случае — как вход. Этим регистром управляет функция pinMode. Регистр PORTD

используется для установки выходного напряжения на выходе, то есть digitalWrite устанавливает соответствующий бит, 1 или 0, чтобы установить на указанном контакте уровень напряжения HIGH или LOW.

Последний регистр называется PIND (Port Input D — вход порта D). Читая содержимое этого регистра, можно определить, на какие контакты подано напряжение HIGH, а на какие — LOW.

Каждый из трех портов имеет свои три регистра, для порта B они называются DDRB, PORTB и PINB, а для порта C — DDRC, PORTC и PINC.

Очень быстрый вывод цифровых сигналов

Следующий скетч обращается к портам напрямую, без применения pinMode и digitalWrite:

// sketch_04_09_square_ports

byte state = 0;

void setup

{

DDRB = B00000100;

while (true)

{

PORTB = B00000100;

PORTB = B00000000;

}

}

void loop

{

}

Скетч должен переключать контакт D10, который связан с портом B, поэтому вначале контакт настраивается на работу в режиме выхода, для чего третий бит справа в регистре DDRB устанавливается в 1. Обратите внимание на то, что B00000100 — это двоичная константа. В главном цикле мы сначала устанавливаем тот же бит в 1, а затем сбрасываем его в 0. Установка бита производится как простое присваивание значения регистру PORTB, как если бы это была обычная переменная.

Этот скетч способен генерировать сигнал с частотой 3,97 МГц (рис. 4.5) — почти 4 млн импульсов в секунду, что почти в 46 раз быстрее, чем с использованием digitalWrite.

Рис. 4.5. Сигнал с частотой 4 МГц, сгенерированный платой Arduino

Сигнал далек от прямоугольной формы из-за переходных процессов, которые вполне ожидаемы на такой частоте.

Еще одно преимущество непосредственного использования регистров порта — возможность вывода сигналов сразу на восемь контактов, что может пригодиться для вывода данных в параллельную шину данных.

Быстрый ввод цифровых сигналов

Тот же прием непосредственного доступа к регистрам можно использовать для увеличения скорости ввода цифровых сигналов. Хотя, если вы предполагаете таким способом определять моменты появления очень коротких импульсов, подумайте о возможности использования прерываний, они являются лучшим решением этой задачи (см. главу 3).

Прямой доступ к порту может пригодиться, например, когда требуется прочитать состояние сразу нескольких контактов. Следующий скетч читает все контакты, связанные с портом B (с D8 по D13), и выводит результат в монитор последовательного порта в виде двоичного числа (рис. 4.6).

Рис. 4.6.

Чтение состояния сразу восьми контактов

// sketch_04_010_direct_read

byte state = 0;

void setup

{

DDRB = B00000000; // все контакты на ввод

Serial.begin(9600);

}

void loop

{

Serial.println(PINB, 2);

delay(1000);

}

Сбросом всех битов в регистре DDRB в 0 соответствующие контакты на плате настраиваются на работу в режиме входов. В цикле вызывается функция Serial.println, которая посылает число в монитор последовательного порта. Чтобы число посылалось в двоичной форме, а не в десятичной, как обычно, передается дополнительный аргумент 2.

Увеличение скорости ввода аналоговых сигналов

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

// sketch 04_11_analog

void setup

{

Serial.begin(9600);

while (! Serial) {};

Serial.println("Starting Test");

long startTime = millis;

// Далее следует код тестирования

long i = 0;

for (i = 0; i < 1000000; i ++)

{

analogRead(A0);

}

// конец кода, выполняющего тестирование

long endTime = millis;

Serial.println("Finished Test");

Serial.print("Seconds taken: ");

Serial.println((endTime — startTime) / 1000l);

}

void loop

{

}

На плате Arduino Uno этот скетч выполняется 112 с. То есть Uno выполняет в секунду около 9000 операций чтения аналоговых сигналов.

Функция analogRead использует АЦП, имеющийся в микроконтроллере на плате Arduino. В Arduino используется тип АЦП, который называют АЦП с последовательной аппроксимацией. Он действует методом постепенного приближения, сравнивая аналоговый сигнал с опорным напряжением. АЦП управляется таймером, поэтому есть возможность ускорить преобразование, увеличив частоту.

Следующий скетч увеличивает частоту АЦП со 128 кГц до 1 МГц, что должно увеличить скорость чтения в восемь раз:

// sketch 04_11_analog_fast

const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

const byte PS_16 = (1 << ADPS2);

void setup

{

ADCSRA &= ~PS_128; // сбросить масштаб 128

ADCSRA |= PS_16; // добавить масштаб 16 (1 МГц)

Serial.begin(9600);

while (! Serial) {};

Serial.println(PS_128, 2);

Serial.println(PS_16, 2);

Serial.println("Starting Test");

long startTime = millis;

// Далее следует код тестирования

long i = 0;

for (i = 0; i < 1000000; i ++)

{

analogRead(A0);

}

// конец кода, выполняющего тестирование

long endTime = millis;

Serial.println("Finished Test");

Serial.print("Seconds taken: ");

Serial.println((endTime — startTime) / 1000l);

}

void loop

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9