![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример программной защиты
Для того чтобы продемонстрировать пример реального программного кода для ввода и вывода дискретных управляющих воздействий, предположим, что восемь DIP переключателей подключены к порту PORTB микроконтроллера, а состояние выходов порта PORTC индицируются с использованием схемы двухцветного индикатора. Общая структура микропроцессорной системы нашего примера представлена на рис. 5.11. В примере мы используем аппаратную защиту и программную защиту от дребезга контактов. Программная защита реализуется по второму способу.
Рис. 5.11. Функциональная схема аппаратных средств для примера 5.3.3
/*----------------------------------------------------------------------*/ /*filename: debounced_swith.c */ /*осуществляет опрос 8 переключателей с программной защитой от дребезга */ /*выполняет специальные действия для каждого нажатого переключателя */ /*зажигает зеленый светодиод в разряде активизированного переключателя */ /*----------------------------------------------------------------------*/ /*подключаемые файлы*/ #include < 912b32.h>
/*используемые функции*/ int process_valid_input(unsigned char input_value); //управление //процессом опроса в реальном времени void initialize_ports(void); //инициализация портов void timer_init(void); //инициализация таймера
//глобальные переменные int keep_going=1; //переменная цикла unsigned char old_PORTB= 0xff; //предыдущее значение порта PORTB unsigned char new_PORTB; //новое значение порта PORTB
void main{void) { initialize_ports(); timer_init(); while(keep_going) { new_PORTB=PORTB; //читать порт PORTB if (new_PORTB! = old_PORTB) { //выполнять, если значение порта изменилось swith(new_PORTB) { case 0xFE: //переключатель PB0 if (process_valid_input(new_PORTB)) //процедура //антидребезга { //выполнять действия, связанные : //с нажатием клавиши PB0 : PORTC = 0х01; //зажечь зеленый в разряде PB0 keep_going = 1; } break; case 0xFD: // переключатель PB01 if (process_valid_input(new_PORTB)) // процедура // антидребезга { //выполнять действия, связанные : //с нажатием клавиши PB1 PORTC = 0х02; //зажечь зеленый в разряде PB1 keep_going = 1; } break; case 0x7F: // переключатель PB7 if (process_valid_input(new_PORTB)) // процедура //антидребезга { //выполнять действия, связанные : //с нажатием клавиши PB7 PORTC = 0х80; //зажечь зеленый в разряде PB7 keep_going = 1; } break; default: ; //аll other cases } //окончание распозвания, какая клавиша нажата (switch(new_PORTB)) } //окончание обработки нажатой клавиши (if new_PORTB) old_PORTB = new_PORTB; //обновить PORTB } //окончание (while(keep_going)) } //окончание (main)
/*-----------------------------------------------------------------*/ /* Функция void initialize_ports устанавливает режим работы портов */ /*-----------------------------------------------------------------*/ void initialize_ports(void) { DDRC=0xff; //порт PORTC на вывод PORTC=0x00; //выходы порта PORTC в 0, зажгутся красные светодиоды DDRB=0x00; //порт PORTB на ввод }
/*--------------------------------------------------------------------*/ /* process_valid_input: проверка стабильности PORTB в течение периода */ /* переполнения таймера */ /*--------------------------------------------------------------------*/ int process_valid_input(unsigned char portx) { int valid_input; //флаг результата опроса порта int int_value; //время входа в процедуру valid_input = TRUE; //установить флаг int_value = TCNT; //читать текущий момент времени while (int_value! = TCNT) //повторять пока значения времени снова не //сравняются { if (portx==PORTB) //порт PORTB остается стабильным valid_input = TRUE; else //порт PORTB изменил состояние valid_input = FALSE; if (! valid_input) //если порт изменил состояние, то выйти //из цикла break; } return valid_input; }
/*------------------------------------------------------------------------*/ /* Функция timer_init инициализирует таймер. Частота системной шины равна */ /*8*МГц */ /*------------------------------------------------------------------------*/ void timer_init(void) { TMSK1 = 0х00; //запретить прерывания TMSK2 = 0х02; //частота тактировании 2 МГц TSCR = 0х80; //разрешить работу модуля таймера } /*-------------------------------------------------------------------------*/
|