Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример программной защиты






 

Для того чтобы продемонстрировать пример реального программного кода для ввода и вывода дискретных управляющих воздействий, предположим, что восемь 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; //разрешить работу модуля таймера

}

/*-------------------------------------------------------------------------*/

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.