Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
Рис. 5.9. Функциональная схема 8 индикаторов для выходов с тремя состояниями
Вернемся к рассмотрению схемы индикации. Она представлена на рис. 5.9. Индикатор каждого разряда состоит из двух светодиодов: зеленого и красного. Если на выходе порта PORTx[i] формируется высокий логический уровень сигнала, то благодаря усилителю с большим коэффициентом усиления, который выполнен на операционном усилителе LM324, открывается транзистор 2N2907. Для зеленого светодиода создается прямое смещение напряжения и путь для протекания тока. В результате, зеленый светодиод светится и информирует пользователя о наличии высокого логического уровня на соответствующем выходе. Если на выходе порта PORTx[i] формируется низкий логический уровень сигнала, то открывается транзистор 2N2222, и светится красный светодиод. Если же выход порта PORTx[i] установлен в третье состояние, то пути для протекания токов светодиодов нет, они оба погашены.
5.4. Программное обслуживание дискретных входов и выходов
Для написания программного кода предположим, что входы порта PORTA подключены к блоку DIP переключателей, а выходы порта PORTB — к 8-разрядному светодиодному индикатору по схеме рис. 5.9. Необходимо считать байт данных с порта PORTA и вывести этот байт данных на порт PORTB.
.
.
unsigned char INМASK = 0х00;
unsigned char OUTМASK = 0xff;
unsigned char PORTA_value;
DDRA = INМASK; /*порт PORTA на ввод*/
DDRB = OUTМASK; /*порт PORTB на вывод*/
PORTA_value = PORTA; /*cчитать портPORTA*/
PORTB = PORTA_value; /*записать в порт PORTB*/
.
.
5.5. Подавление механического дребезга контактов переключателей
Ранее, в параграфе 5.2, Вы познакомились с различными типами механических переключателей. Переключатели обладают двумя устойчивыми состояниями, в которых замыкаются или размыкаются электрические контакты. Включенный по схеме рис. 5.4,а переключатель обеспечивает высокий логический уровень сигнала на входе МК, если пара его контактов разомкнута. В нажатом состоянии контакты замыкаются, и на входе МК формируется напряжение низкого логического уровня.
Идеальный переключатель изменяет состояние контактов с разомкнутого на замкнутое и наоборот моментально, так, что на входе МК переключение между двумя уровнями логических сигналов происходит за время, которое стремится к нулю.
Однако реальные переключатели ведут себя иначе. Так при нажатии клавиши рис. 5.4,а контакты многократно замыкаются и размыкаются, пока не окажутся в установившемся замкнутом состоянии. Это явление называется механическим дребезгом переключателя. Микроконтроллеры работают на частотах в несколько МГц, что остаточно для того, чтобы зафиксировать многократное изменение состояния переключателя во время дребезга. Однако реакция программы управления на каждое переключение во время дребезга было бы ошибкой. Поэтому следует применять специальные методы подавления эффекта механического дребезга. Различают аппаратные и программные способы подавления дребезга контактов. Мы рассмотрим несколько вариантов для каждого из этих способов.
5.5.1. Аппаратная защита от механического дребезга контактов
На рис. 5.10 представлена схема, которая осуществляет защиту от дребезга механических переключателей [Horowitz и Hill, 1989]. Основным элементом этой схемы является триггер Шмитта (74HC14).
Триггер Шмита отличается от других логических элементов, во-первых, тем, что на его входы можно подавать аналоговые сигналы. И если для обычного логического элемента время изменения входного сигнала из состояния 0 в состояние 1 должно составлять всего несколько наносекунд, то для триггера Шмитта это время может быть любым, в том числе несколько десятков или сотен миллисекунд, которые потребуются нам для устранения дребезга контактов. Во-вторых, передаточная характеристика триггера Шмитта обладает гистерезисом: уровень входного напряжения, при котором выход триггера переключается из 0 в 1, превышает уровень напряжения переключения из 1 в 0 примерно на 0,5…0,8 В. Эффект гистерезиса позволяет подавить звон входного сигнала. Незначительные по амплитуде высокочастотные колебания, наложенные на монотонно изменяющуюся постоянную составляющую входного сигнала, не будут приводить к многократному изменению выходного сигнала, поскольку абсолютная величина входного сигнала окажется внутри петли гистерезиса.
Рассмотрим работу схемы подавления дребезга контактов переключателя. При разомкнутых контактах напряжение конденсатора равно VCC, на выходе триггера Шмита формируется низкий логический уровень, поскольку все триггеры Шмитта в интегральном исполнении инвертируют входной сигнал. Если клавишу только что нажали, то конденсатор начинает разряжаться через резистор и замкнутые контакты переключателя. Время его разряда определяется постоянной времени RC. Для приведенных на рис. 5.10,a номиналов постоянная времени равна 47 мс. Напряжение на конденсаторе будет убывать немонотонно, поскольку на интервале дребезга контакты то замкнутся, то разомкнутся. В соответствии с их положением конденсатор то разряжается, то заряжается. Но большая постоянная времени цепей разряда и заряда не позволяет напряжению на конденсаторе измениться во время дребезга столь сильно, чтобы произошло переключение триггера Шмитта. И лишь когда дребезг закончится и произойдет длительное замыкание контактов переключателя, конденсатор разрядится до нуля, и на выходе триггера Шмитта установится высокий логический уровень. При размыкании контактов переключателя процесс будет происходить в обратном порядке. Эффект подавления дребезга в рассмотренной схеме будет наблюдаться только тогда, когда постоянная времени цепей разряда и заряда конденсатора будет сравнима с длительностью самого эффекта механического дребезга. Для маломощных переключателей его длительность измеряется единицами и десятками мс, поэтому в нашем примере номиналы резисторов и конденсатора выбраны правильно.
Если Вы желаете иметь на выходе цепи подавления дребезга инверсную логику, то следует использовать дополнительный инвертор (рис. 5.10,б). Тогда при разомкнутом переключателе на выходе инвертора будет низкий логический уровень, а при замкнутом — высокий.
5.5.2. Программная защита от механического дребезга контактов
Существует несколько методов программной защиты от эффекта дребезга механических контактов. Мы кратко остановимся на двух наиболее часто используемых:
• Прикладная программа проводит мониторинг состояния контакта, опрашивая линию порта и контролируя уровень логического сигнала. Как только программа зафиксировала изменение сигнала, она фиксирует это изменение и формирует задержку 100…200 мс. За это время дребезг закончится, и контакт зафиксируется в установившемся состоянии. Если это новое состояние совпадет с первым зафиксированным изменением, то произошло переключение контакта. В противном случае имела место помеха.
• Прикладная программа также производит мониторинг контакта. После обнаружения первого переключения программа продолжает постоянно опрашивать контакт в течение тех же 100…200 мс. Если к концу интервала опроса состояние не стабилизировалось и постоянно считывается то 0 то 1, то это помехи, а если установилось в одном из состояний, то произошло переключение.
а) При нажатии клавиши на выходе формируется высокий логический уровень
б) При нажатии клавиши на выходе формируется низкий логический уровень
Рис. 5.10. Примеры схем подавления механического дребезга контактов
5.5.3. Пример программной защиты
Для того чтобы продемонстрировать пример реального программного кода для ввода и вывода дискретных управляющих воздействий, предположим, что восемь DIP переключателей подключены к порту PORTB микроконтроллера, а состояние выходов порта PORTC индицируются с использованием схемы двухцветного индикатора. Общая структура микропроцессорной системы нашего примера представлена на рис. 5.11. В примере мы используем аппаратную защиту и программную защиту от дребезга контактов. Программная защита реализуется по второму способу.
Рис. 5.11. Функциональная схема аппаратных средств для примера 5.3.3
/*----------------------------------------------------------------------*/
/*filename: debounced_swith.c */
/*осуществляет опрос 8 переключателей с программной защитой от дребезга */
/*выполняет специальные действия для каждого нажатого переключателя */
/*зажигает зеленый светодиод в разряде активизированного переключателя */