Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Подключение кнопки к микроконтроллеру
Если мы подключим один из контактов, например, к общему проводу («земле»), а второй к выбранному выводу микроконтроллера, переключенного в режим входа, то выяснится, что такой метод не работает. При нажатии кнопки вывод микроконтроллера соединяется с землей, и программа будет считывать (с помощью функции digitalRead) логический 0 с этого вывода, но при отпущенной кнопке вывод микроконтроллера не будет соединен ни с какой линией, что часто называют «висит в воздухе». В таком режиме программа будет считать с вывода и 0 и 1 совершенно случайным образом. Правильное подключение предполагает, что в разомкнутом состоянии вывод микроконтроллера должен быть соединен через резистор, например с шиной питания, а в замкнутом - с землей, либо наоборот. Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм. Оба варианта подключения можно изобразить следующим образом: Первый вариант предпочтительнее, поскольку подтягивающие к +5В резисторы уже есть внутри микроконтроллера – их нужно только программно включить. Кнопка будет либо соединять вывод микроконтроллера с землей, либо разъединять, и тогда он " притянется" резистором к +5В. После того, как вывод микроконтроллера установлен в режим входа, чтобы включить на нем подтягивающий резистор нужно " записать" в него 1. Пример программы, зажигающей светодиод на 13 выводе при нажатии кнопки на 2 выводе будет выглядеть примерно так: void setup() { Обращаем внимание на то, что значение, прочитанное с 2 вывода, инвертируется с помощью оператора «! », поскольку при нажатии на кнопку будет считываться «0», а при ее отпускании «1».
Дребезг контактов На практике зачастую приходится бороться с таким явлением, как дребезг контактов, которое заключается в том, что при соприкосновении или расхождении контактов в механических переключающих устройствах, таких, как реле или кнопка, происходит многократное замыкание и размыкание. Схематично это может быть представлено следующим образом: Чтобы микроконтроллер не обработал такую пачку переключений как множественное нажатие и отпускание кнопки нужно либо применить специальную схему, либо побороть дребезг программно. Идея программной борьбы проста – после того, как произошло переключение (от момента нажатия или отпускания кнопки), в течение некоторого защитного интервала времени игнорировать любые другие переключения. Существует специальная библиотека Bounce, упрощающая борьбу с дребезгом контактов, и имеющая дополнительные возможности: http: //www.arduino.cc/playground/Code/Bounce http: //www.arduino.cc/playground/uploads/Code/Bounce.zip Как и в большинстве случаев, установка библиотеки сводится к распаковке архива в подпапку \hardware\libraries\ папки с ПО Arduino. Полная документация на библиотеку может быть найдена на сайте разработчика, а здесь рассмотрим только наиболее важное. Bounce – конструктор объекта Вызов: Bounce имя_объекта = Bounce(вывод, интервал); Создает экземпляр класса Bounce, принимает номер вывода, с которого будет считываться сигнал, и длительность защитного интервала в миллисекундах. После создания объекта можно вызывать его методы. Метод Bounce:: update Вызов: имя_объекта.update() Возвращает значение типа int – истину, если состояние вывода изменилось, ложь, если нет. Метод Bounce:: read Вызов: имя_объекта.read() Возвращает значение типа int – состояние вывода. Метод Bounce:: rebounce Вызов: имя_объекта.rebounce(время_повтора) Повторяет последнее произошедшее событие через заданное время в миллисекундах. Рассмотрим исходный код программы, посылающей в последовательный порт сообщение «pressed» при нажатии кнопки, сообщение «released» при ее отпускании, и повторяющей сообщение «pressed» каждые пол секунды при удержании кнопки.
4) Сторожевой таймер.
Сторожевой таймер (контрольный таймер, англ. Watchdog timer — букв. «сторожевой пёс») — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему). Автоматизированные системы, не использующие оператора-человека, хотя тоже подвержены ошибкам, зависаниям и другим сбоям (в том числе аппаратным), с использованием сторожевых таймеров увеличивают стабильность работы — нет необходимости ручного сброса. Поэтому наиболее частое их использование — встроенные системы различного назначения.
5) Радиальные и векторные прерывания, примеры.
Режимы обмена по магистрали - Обмен по прерываниям. При радиальном прерывании в магистрали имеются столько линий запроса прерывания сколько всего может быть разных прерываний, т.е. каждое устройство ввода/вывода имеют свою линию запроса. Процессор определяет номер прерывания по номеру линии, по которому пришел сигнал прерывания. При использовании радиальных прерываний в систему включается дополнительная система - контролер прерывания. Векторные прерывания обеспечивают системе большую гибкость, в системе их может быть очень много, однако, они требуют дополнительных аппаратных узлов во всех устройствах для обслуживания цикла безадресного чтения. Радиальных прерываний в системе немного. 6) Стек, очередь. Стек Стеком (англ. stack) называется хранилище данных, в котором можно работать только с одним элементом: тем, который был добавлен в стек последним. Стек должен поддерживать следующие операции: Push Добавить (положить) в конец стека новый элемент Pop Извлечь из стека последний элемент Back Узнать значение последнего элемента (не удаляя его) Size Узнать количество элементов в стеке Clear Очистить стек (удалить из него все элементы) Хранить элементы стека мы будем в массиве. Для начала будем считать, что максимальное количество элементов в стеке не может превосходить константы MAX_SIZE, тогда для хранения элементов массива необходимо создать массив размера MAX_SIZE. Объявим структуру данных типа stack. const int MAX_SIZE=1000;struct stack { int m_size; // Количество элементов в стеке int m_elems[MAX_SIZE]; // Массив для хранения элементов stack(); // Конструктор ~stack(); // Деструктор void push(int d); // Добавить в стек новый элемент int pop(); // Удалить из стека последний элемент // и вернуть его значение int back(); // Вернуть значение последнего элемента int size(); // Вернуть количество элементов в стеке void clear(); // Очистить стек }; Объявленная здесь структура данных stack реализует стек целых чисел. Поле структуры m_size хранит количество элементов в стеке в настоящее время, сами элементы хранятся в элементах массива m_elems с индексами 0..m_size-1. Элементы, добавленные позже, получают большие номера. Упражнение A - простой стек Реализуйте структуру данных " стек", реализовав все указанные здесь методы. Напишите программу (функцию main), содержащую описание стека и моделирующую работу стека. Функция main считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения одной команды программа должна вывести одну строчку. Возможные команды для программы: Push n Добавить в стек число n (значение n задается после команды). Программа должна вывести ok. Pop Удалить из стека последний элемент. Программа должна вывести его значение. Back Программа должна вывести значение последнего элемента, не удаляя его из стека. Size Программа должна вывести количество элементов в стеке. Clear Программа должна очистить стек и вывести ok. Exit Программа должна вывести bye и завершить работу. Гарантируется, что набор входных команд удовлетворяет следующим требованиям: максимальное количество элементов в стеке в любой момент не превосходит 100, все команды pop_back и back корректны, то есть при их исполнении в стеке содержится хотя бы один элемент. Пример протокола работы программы Популярное:
|
Последнее изменение этой страницы: 2017-03-11; Просмотров: 805; Нарушение авторского права страницы