МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
ІНСТИТУТ КОМП’ЮТЕРНИХ ТЕХНОЛОГІЙ, АВТОМАТИКИ ТА МЕТРОЛОГІЇ
КАФЕДРА ”ЗАХИСТ ІНФОРМАЦІЇ”
Звіт
до лабораторної роботи № 4
з курсу: "Мікропроцесори в системах технічного захисту інформації"
на тему: “ Побудова охоронних систем з GSM-сигналізацією на AVR-мікроконтролерах”
Варіант – 5
Мета роботи: Ознайомитись з принципами побудови охоронних систем з GSM-сигналізацією і їх програмно-апаратною реалізацією на AVR-мікроконтролерах. Отримати навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR.
Текст завдання:
Домашня підготовка до роботи:
1. Вивчити теоретичний матеріал.
2. Вивчити основні властивості мікроконтролера AT90S2313, принципи побудови GSM сигналізацій та функціонування GSM-модемів необхідні для виконання лабораторної роботи.
3. Підготовити програму функціонування GSM-сигналізації згідно індивідуального завдання в Табл.
Виконання в лабораторії:
1. Створити проект в CodeVisionAVR, ввести свою програму, провести її компіляцію.
2. Відкрити файл LR_4.dsn в програмі Proteus, внести зміни у схему відповідно до свого індивідуального завдання, підключити до МК отриманий в CodeVisionAVR hex-файл.
3. Запустити режим симуляції схеми та перевірити правильність функціонування GSM- сигналізації у всіх режимах роботи: постановка і зняття з охорони, спрацювання охоронних давачів.
№
Тактова частота, МГц
Тз1, с
F1, Гц
Тз2, с
F2, Гц
Тип шлейфу 1
Тип шлейфу 2
Виводи для підключення шлейфу No 1
Виводи для підключення шлейфу No 2
Вивід МК для підключення світлодіода
Вивід МК для підключення кнопки
17
10
10
1,5
40
15
НЗ
НЗ
PD2
PB2
PB3
PB5
Лістинг програми одержаної в AVR Studio та необхідні розрахунки:
Файл gsm.h
// Бібліотечні файли
#include <90S2313.h>
#include <delay.h>
#include <stdio.h>
#include <sleep.h>
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Константи
// Службові символи для обміну даними з GSM-модемом
#define ASCII_CR 0x0D
#define ASCII_LF 0x0A
#define ASCII_CTRL_Z 0x1A
// Константи ініціалізації таймерів та UART
// Період мигання світлодіоду з частотою 2 Гц таймером Т1 в режимі порівняння DIV = 256
// TimerT1_2Hz = (F * T/DIV) - 1
#define TimerT1_2Hz 19530
// Період мигання світлодіоду з частотою 10 Гц DIV = 256
#define TimerT1_11Hz 3905
// Швидкість передачі даних 9600 Бод
#define BAUD_RATE_9600 64
// Регістри вводу-виводу МК AT90S2313
// Модуль UART
// Регістр статусу USR
#define RXC 7
#define TXC 6
#define UDRE 5
// Регістр управління UСR
#define RXCIE 7
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
// Таймери
// Регістр управління TCCR0 таймера Т0
#define CS02 2
#define CS01 1
#define CS00 0
// Регістр управління TCCR1A таймера Т1
#define COM1A1 7
#define COM1A0 6
// Регістр управління TCCR1B таймера Т1
#define CTC1 3
#define CS12 2
#define CS11 1
#define CS10 0
// Регістр дозволу переривань від таймерів TIMSK
#define TOIE1 7
#define OCIE1A 6
#define TOIE0 1
// Підключення охоронних шлейфів
#define SCHLEIF_1_PORT PORTD
#define SCHLEIF_1_DDR DDRD
#define SCHLEIF_1_PIN PIND
#define SCHLEIF_1_NC 5
#define SCHLEIF_2_PORT PORTB
#define SCHLEIF_2_DDR DDRB
#define SCHLEIF_2_PIN PINB
#define SCHLEIF_2_NO 5
// Підключення світлодіода
#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED_PIN PINB
#define LED 3
// Підключення секретної кнопки постановки/зняття з охорони
#define SW_PORT PORTB
#define SW_DDR DDRB
#define SW_PIN PINB
#define SW 6
// Час постановки на охорону в секундах
#define T_ALARM_ON 3
// Час зняття з охорони в секундах
#define T_ALARM_OFF 3
// Стан GSM-сигналізації: STATE_OFF - виключена, STATE_ON - включена
#define STATE_OFF 0
#define STATE_ON 1
// Стан шлейфу: NO_ALARM- немає спрацювання, ALARM - є спрацювання, NO_ACTIVE - шлейф не контролюється
#define NO_ALARM 0
#define ALARM 1
#define NO_ACTIVE 2
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// Тип даних користувача
typedef unsigned char byte;
// Типи SMS-повідомлень
enum SMS_Type{Security_On, Security_Off, Alarm_Schleif_1, Alarm_Schleif_2};
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// Глобальні змінні
// Поточний стан GSM-сигналізації
volatile byte State = STATE_OFF;
// Стан шлейфу 1 з нормально розімкненими контактами
byte Schleif1_NC_Status = NO_ALARM;
// Стан шлейфу 2 з нормально замкненими контактами
byte Schleif2_NO_Status = NO_ALARM;
// Номер адміністратора у форматі 0хх1234567
byte AdminNumber[10] = {'0', '6', '7', '1', '2', '3', '4', '5', '6', '7'};
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
void Pin_Init(void);
void SMS_Send(char* cmd, byte type);
Файл my_lab_4.c
#include <gsm.h>
//////////////////////////////////////////////////////////////////
// П/п обробки перерривання від таймера Т0, яка здійснює опитування секретної кнопки
interrupt [7] void Timer0_Ovf(void)
{
byte temp;
// Прочитати стан секретної кнопки
temp = SW_PIN;
temp = (temp & (1<<SW)) && 1;
if (State == STATE_OFF)
{
if (temp == 0)
State = STATE_ON;
}
else
{
if (temp == 1)
State = STATE_OFF;
}
};
// Якщо охорона виключена
// Якщо кнопка натиснута -
// включити охорону
// Якщо охорона включена
// Якщо кнопка ненатиснута -
// виключити охорону
//////////////////////////////////////////////////////////////////
void main(void)
{
byte LFCount, Responce, temp;
// Масив для відправки АТ-команд
byte CMD[25];
//////////////////////////////////////////////////////////////////////////////////
// Ініціалізація МК
// Налаштування виводів МК
Pin_Init();
// Задати швидкість передачі 9600 Бод
UBRR = BAUD_RATE_9600;
// Дозволити прийом і передачу даних: 8 біт, 1 стоп-біт, 1 старт-біт.
UCR = (1<<RXEN) | (1<<TXEN);
// Дозволити перехід в режим пониженого енергоспоживання
sleep_enable();
//////////////////////////////////////////////////////////////////////////////////
// Ініціалізація GSM-модему
// Затримка 4 секунди для переходу GSM-модему в робочий режим
delay_ms(4000);
// Послати команду АТЕ0 - відключення еха
CMD[0] = 'A';
CMD[1] = 'T';
CMD[2] = 'E',
CMD[3] = '0';
CMD[4] = ASCII_CR;
CMD[5] = 0;
// Відіслати команду
puts(CMD);
// Прийом відповіді
//LFCount = 0;
//while(1)
//{
//Responce = getchar();
//if(Responce == ASCII_LF)
//LFCount++;
// Отримати символ
// Якщо це символ нового рядку
//if(LFCount == 2) // Якщо отримано два LF -
//break; // прийом відповіді завершено
//};
// Послати команду АТ+СMGS=1 - задати текстовий режим відправлення SMS
CMD[0] = 'A';
CMD[1] = 'T';
CMD[2] = '+';
CMD[3] = 'C';
CMD[4] = 'M';
CMD[5] = 'G';
CMD[6] = 'F';
CMD[7] = '=';
CMD[8] = '1';
CMD[9] = ASCII_CR;
CMD[10] = 0;
// Відіслати команду
puts(CMD);
// Прийом відповіді
//LFCount = 0;
//while(1)
//{
//Responce = getchar();
//if(Responce == ASCII_LF) // Якщо це символ нового рядку
//LFCount++;
//if(LFCount == 2) // Якщо отримано два LF -
//break; // прийом відповіді завершено
//};
///////////////////////////////////////////////////////////////////////////////
// Ініціалізації охоронної сигналізації
SecurityInit:
// Стан - охорона виключена
State = STATE_OFF;
// Стан шлейфів - не було спрацювань
Schleif1_NC_Status = NO_ALARM;
Schleif2_NO_Status = NO_ALARM;
// Опитування секретної кнопки з періодом 0.1 с.
// Дозволити переривання від таймера Т0 по переповненню
TIMSK = (1<<TOIE0);
// Коефіцієнт ділення - 1024. Період опитування = 1024 * 256/4000000 = 0.06 с.
TCCR0 = (1<<CS02) | (1<<CS00);
// Дозволити переривання
#asm("sei");
///////////////////////////////////////////////////////////////////////////////
// Очікування переходу в режим охорони
while(1)
{
idle();
if(State == STATE_ON)
break;
};
///////////////////////////////////////////////////////////////////////////////
// Режим охорони активований
// Зупинити таймер Т0
TCCR0 = 0;
// Затримка Т1 для виходу з об'єкту
for(temp = 0; temp < T_ALARM_ON; temp++)
delay_ms(1000);
// Відіслати SMS-повідомлення Security_On
SMS_Send(CMD, Security_On);
delay_ms(10);
// Мигати світлодіодом з частотою F1
OCR1 = TimerT1_2Hz;
TCCR1A = (1<<COM1A0);
TCCR1B = (1<<CS12) | (1<<CTC1);
// Стан виводу РВ3 інвертується
// Режим порівняння з обнуленням, DIV = 256
// Опитувати кнопку з частотою 15 Гц
TCCR0 = (1<<CS02) | (1<<CS00);
// DIV = 1024
///////////////////////////////////////////////////////////////////////////////
// Режим охорони
while(1)
{
idle();
// Перейти в режим пониженого енергоспоживання Idle
if(State == STATE_OFF)
{
TCCR0 = 0;
SMS_Send(CMD, Security_Off);
TCCR1B = 0;
TCCR1A = 0;
LED_PORT.LED = 0;
delay_ms(3000);
LED_PORT.LED = 1;
// Якщо охорона була відключена
// Зупинити таймер Т0
// Відправити SMS-повідомлення Security_Off
// Зупинити таймер Т1
// Включити світлодіод
// Затримка 3 секунди
// Виключити світлодіод
break;
// Вийти з режиму охорони
}
else
// Якщо охорона включена
{
// Опитати охоронний шлейф 1
temp = SCHLEIF_1_PIN;
temp = (temp & (1<<SCHLEIF_1_NC)) && 1;
// Якщо є спрацювання шлейфу 1 і шлейф контролюється
if((temp == 1) && (Schleif1_NC_Status == NO_ALARM))
Schleif1_NC_Status = ALARM;
// Встановити статус тривога
if(Schleif1_NC_Status == NO_ACTIVE)
{
if(temp == 0)
Schleif1_NC_Status = NO_ALARM;
}
// Якщо шлейф неконтролюється
// і шлейф відновився
// почати його контролювати
// Опитати охоронний шлейф 2
temp = SCHLEIF_2_PIN;
temp = (temp & (1<<SCHLEIF_2_NO)) && 1;
// Якщо є спрацювання шлейфу 2 і шлейф контролюється
if((temp == 1) && (Schleif2_NO_Status == NO_ALARM))
Schleif2_NO_Status = ALARM;
// Встановити статус тривога
if(Schleif2_NO_Status == NO_ACTIVE)
{
if(temp == 0)
Schleif2_NO_Status = NO_ALARM;
}
// Якщо шлейф неконтролюється
// і шлейф відновився
// почати його контролювати
// Якщо є спрацювання хоча б 1-го шлейфу
if((Schleif1_NC_Status == ALARM) || (Schleif2_NO_Status == ALARM))
{
OCR1 = TimerT1_11Hz;
// Мигати світлодіодом з частотою F2
TCNT1 = 0;
// Зупитини опитування кнопки і шлейфів
TCCR0 = 0;
for(temp = 0; temp < T_ALARM_OFF; temp++) // Затримка Т2 для виключення охорони
delay_ms(1000);
temp = SW_PIN;
temp = (temp & (1<<SW)) && 1;
// Перевірити стан кнопки
if(temp == 0)
// Якщо охорону не встигли відключити
{
if(Schleif1_NC_Status == ALARM)
// Якщо спрацював перший шлейф
{
SMS_Send(CMD, Alarm_Schleif_1); // Відправити SMS-повідомлення Schleif 1
delay_ms(10);
Schleif1_NC_Status = NO_ACTIVE; // Спрацювавший шлейф не контролюється
}
if(Schleif2_NO_Status == ALARM) // Якщо спрацював другий шлейф
{
SMS_Send(CMD, Alarm_Schleif_2);// Відправити SMS-повідомлення Schleif 2
delay_ms(10);
Schleif2_NO_Status = NO_ACTIVE;// Спрацювавший шлейф не контролюється
}
delay_ms(4000);
// Затримка для відновлення шлейфів
TCCR0 = (1<<CS02) | (1<<CS00); // Продовжити опитування кнопки і шлейфів
}
else
// Якщо охорону встигли відключити
{
State = STATE_OFF;
// Перейти в неактивний режим
TCCR0 = 0;
// Зупитини опитування кнопки і шлейфів
SMS_Send(CMD, Security_Off); // Відправити SMS-повідомлення Security_Off
delay_ms(10);
TCCR1B = 0;
// Виключити блимання світлодіодом
TCCR1A = 0;
LED_PORT.LED = 0;
delay_ms(3000);
LED_PORT.LED = 1;
break;
// Включити світлоідод на 3 сек
// Виключити світлодіод
// Вийти з режиму охорони
}
}
}
};
goto SecurityInit;
// Перейти до ініціалізації охоронної системи
};
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// Функція ініціалізації виводів мікроконтролера
void Pin_Init(void)
{
SCHLEIF_1_PORT.SCHLEIF_1_NC = 0;
// Шлейф 1 - вхід
SCHLEIF_1_DDR.SCHLEIF_1_NC = 0;
SCHLEIF_2_PORT.SCHLEIF_2_NO = 0; // Шлейф 2 - вхід
SCHLEIF_2_DDR.SCHLEIF_2_NO = 0;
LED_PORT.LED = 1; // Світлодіод - вихід, виключений
LED_DDR.LED = 1;
SW_PORT.SW = 1; // Кнопка - вхід, внутрішній резистор
SW_DDR.SW = 0;
};
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// Функція відправлення SMS-повідомлення
// Вхідні параметри:
// cmd - масив для запису АТ-команди;
// type - тип повідомлення.
void SMS_Send(char* cmd, byte type)
{
byte Responce;
// Заборонити переривання
#asm("cli")
// Задаємо команду відправлення SMS-повідомлення AT+CMGS=номер
cmd[0] = 'A';
cmd[1] = 'T';
cmd[2] = '+';
cmd[3] = 'C';
cmd[4] = 'M';
cmd[5] = 'G';
cmd[6] = 'S';
cmd[7] = '=';
cmd[8] = AdminNumber[0];
cmd[9] = AdminNumber[1];
cmd[10] = AdminNumber[2];
cmd[11] = AdminNumber[3];
cmd[12] = AdminNumber[4];
cmd[13] = AdminNumber[5];
cmd[14] = AdminNumber[6];
cmd[15] = AdminNumber[7];
cmd[16] = AdminNumber[8];
cmd[17] = AdminNumber[9];
cmd[18] = ASCII_CR;
cmd[19] = 0;
// Відправляємо команду в GSM-модем
puts(cmd);
// Очікуємо від GSM-модему запрошення > на ввід тексту
//while(1)
//{
//Responce = getchar();
// Прийняти символ
//if(Responce == '>') // Якщо це символ > - запрошення отримано, вийти з циклу
//break;
//};
//Responce = getchar();
// Прийняти від GSM-модему символ пробілу після >
// Задати текст SMS-повідомлення
if((type == Alarm_Schleif_1) || (type == Alarm_Schleif_2)) // Якщо спрацював шлейф
{
cmd[0] = 'S';
cmd[1] = 'l';
cmd[2] = 'e';
cmd[3] = 'i';
cmd[4] = 'f';
cmd[5] = ' ';
if(type == Alarm_Schleif_1)
cmd[6] = '1';
else
cmd[6] = '2';
//Якщо спрацював перший шлейф -
//повідомлення Schleif 1
//Якщо спрацював другий шлейф -
//повідомлення Schleif 2
cmd[7] = ASCII_CTRL_Z;
cmd[8] = ASCII_CR;
cmd[9] = 0;
}
else if((type==Security_On) || (type==Security_Off)) // Якщо поставлено/знято з охорони
{
cmd[0] = 'S';
cmd[1] = 'e';
cmd[2] = 'c',
cmd[3] = 'u';
cmd[4] = 'r';
cmd[5] = 'i';
cmd[6] = 't';
cmd[7] = 'y';
cmd[8] = ' ';
cmd[9] = 'O';
if(type == Security_On)
{
cmd[10] = 'n';
cmd[11] = ASCII_CTRL_Z;
cmd[12] = ASCII_CR;
cmd[13] = 0;
}
else
{
cmd[10] = 'f';
cmd[11] = 'f';
cmd[12] = ASCII_CTRL_Z;
cmd[13] = ASCII_CR;
cmd[14] = 0;
}
}
// Відправити текст повідомлення
puts(cmd);
// Затримка для отримання відповіді від GSM-модему
delay_ms(100);
// Дозволити переривання
#asm("sei")
};
//////////////////////////////////////////////////////////////////////////////////////
Схема симуляції в Proteus:
Висновок:
Під час виконання даної лабораторної роботи ми ознайомились з принципами побудови GSM-сигналізації на AVR-мікроконтролерах. GSM-системи, оскільки вони ідеально підходять для охорони будь-яких віддалених об’єктів. GSM-сигналізація представляє собою певний блок (контролер), до якого підключаються охоронні давачі та GSM-модем. Принцип дії GSM-сигналізації полягає в отриманні і обробці контролером даних з встановлених на об’єкті давачів і у випадку спрацювання давача активується GSM-модем, який передає тривожні SMS-повідомлення, або ініціює дзвінок на телефон адміністратора, а також виконує наперед запрограмований алгоритм протидії (включення звукової та світлової сигналізації і т. п.). Адміністратором може виступати будь-яка особа, яка має стільниковий або стаціонарний телефонний апарат..
Також виконуючи дану роботу ми ознайомились з принципами роботи універсального асинхронного приймача/передавача UART, керуванням GSM-модемом за допомогою AT-команд та отримали навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR.