Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Подключение кнопки к микроконтроллеру



Если мы подключим один из контактов, например, к общему проводу («земле»), а второй к выбранному выводу микроконтроллера, переключенного в режим входа, то выяснится, что такой метод не работает. При нажатии кнопки вывод микроконтроллера соединяется с землей, и программа будет считывать (с помощью функции digitalRead) логический 0 с этого вывода, но при отпущенной кнопке вывод микроконтроллера не будет соединен ни с какой линией, что часто называют «висит в воздухе». В таком режиме программа будет считать с вывода и 0 и 1 совершенно случайным образом.

Правильное подключение предполагает, что в разомкнутом состоянии вывод микроконтроллера должен быть соединен через резистор, например с шиной питания, а в замкнутом - с землей, либо наоборот. Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм. Оба варианта подключения можно изобразить следующим образом:

Первый вариант предпочтительнее, поскольку подтягивающие к +5В резисторы уже есть внутри микроконтроллера – их нужно только программно включить. Кнопка будет либо соединять вывод микроконтроллера с землей, либо разъединять, и тогда он " притянется" резистором к +5В.

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

Пример программы, зажигающей светодиод на 13 выводе при нажатии кнопки на 2 выводе будет выглядеть примерно так:

void setup() {
pinMode(13, OUTPUT); //13й вывод - выход
pinMode(2, INPUT); //2й – вход. Здесь кнопка, замыкающая на землю
digitalWrite(2, HIGH); //включаем подтягивающий резистор
}
void loop() {
digitalWrite(13, ! digitalRead(2));
}

Обращаем внимание на то, что значение, прочитанное с 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) Радиальные и векторные прерывания, примеры.

 

Режимы обмена по магистрали - Обмен по прерываниям.
Прерывание микропроцессорной системы бывает двух основных типов: векторное прерывание и радиальное прерывание.
При векторном прерывании код номера прерывания передаётся процессору тем устройством, которое запросило его. Для этого процессор проводит цикл чтения по магистрали и по шине данных и получает код номера прерывания. Шина адресов не используется. На каждый номер прерывания предусмотрена специальная программа обработки. Когда поступает какое-либо прерывание, процессор прекращает выполнение текущей программы, сохраняет содержимое основных регистров в специальной СТЭК-памяти (“stack”) и загружает начальный адрес программы обработки соответствующего прерывания. При завершении программы обработки прерывания процессор возвращает из СТЭК-памяти (“stack”) сохранённые значения регистра, и прерванная программа продолжается.

При радиальном прерывании в магистрали имеются столько линий запроса прерывания сколько всего может быть разных прерываний, т.е. каждое устройство ввода/вывода имеют свою линию запроса. Процессор определяет номер прерывания по номеру линии, по которому пришел сигнал прерывания. При использовании радиальных прерываний в систему включается дополнительная система - контролер прерывания. Векторные прерывания обеспечивают системе большую гибкость, в системе их может быть очень много, однако, они требуют дополнительных аппаратных узлов во всех устройствах для обслуживания цикла безадресного чтения. Радиальных прерываний в системе немного.
При этом тип прерывания каждое радиальное прерывание требует введение дополнительных линий в шину управления системой.

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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.019 с.)
Главная | Случайная страница | Обратная связь