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

на главную

Жанры

Программируем 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

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

Средневековая история. Тетралогия

Гончарова Галина Дмитриевна
Средневековая история
Фантастика:
фэнтези
попаданцы
9.16
рейтинг книги
Средневековая история. Тетралогия

Хозяйка Междуречья

Алеева Елена
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Хозяйка Междуречья

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

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

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

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Совок 2

Агарев Вадим
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Совок 2

Царь поневоле. Том 2

Распопов Дмитрий Викторович
5. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 2

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб