
ASVT_7term_LR4
.docxЦель работы: сформировать навыки использования МК для решения задач авторизации.
Задачи: написать программу реализующую задачу авторизации согласно индивидуальному заданию. Запрограммировать МК, отладить работу с использованием средств эмуляции.
Теоретическая часть
Виртуальный Терминал VSM дает возможность Вам использовать клавиатуру и экран вашего персонального компьютера, чтобы посылать и принимать по последовательному асинхронному интерфейсу RS232 данные, поступающие к и от имитируемой микропроцессорной системы. Это особенно полезно при отладке, где Вы можете использовать его, чтобы отобразить отлаживаемые/прослеживаемые сообщения, сформированные программным обеспечением, которое Вы разрабатываете.
Виртуальный терминал имеет следующие характеристики:
• Полный дуплекс — последовательно поступающие данные отображаются, как символы ASCII, в то время как нажатия клавиш передаются так же, как последовательные данные ASCII.
• Простой двухпроводный интерфейс данных: RXD для полученных данных и TXD для передаваемых данных.
• Простой двухпроводный аппаратный интерфейс установления связи: RTS (ready-to-send) — готов к передаче, и CTS (clear-to-send) — очищен для передачи.
• Скорость от 300 до 57 600 бодов.
• 7 или 8 информационных разрядов.
• Четность, нечетность или нет.
• 0, 1 или 2 стоповых бита.
• Процедура установления связи программного обеспечения XON/XOFF в дополнение к аппаратной процедуре установления связи.
• Нормальная или отрицательная полярность сигналов и для RX/TX, и для RTS/CTS.
Использование виртуального терминала
Чтобы подключить терминал к Вашей моделируемой системе:
1. Выберите значок мультиметра на правой панели, выберите Виртуальный Терминал (VIRTUAL TERMINAL) и разместите его на схеме.
2. Подключите выводы RX и TX к передающей и приёмной линиям тестируемой системы. RX — вход, TX — выход.
3. Если Ваша целевая система использует аппаратную процедуру установления связи, подключите выводы RTS и CTS к соответствующим шинам управления потоком. RTS — выход, сигнализирующий, что виртуальный терминал готов принять данные, а CTS — вход, на котором должен быть высокий уровень (или он должен висеть в воздухе), чтобы виртуальный терминал начал передачу.
4. Отредактируйте настройки виртуального терминала: скорость в бодах, длину слова, четность, управление потоком данных и полярности сигналов.
5. Запустите моделирование обычным способом. Терминал отобразит входящие данные, как только получит их; чтобы посылать символы в систему, удостоверьтесь, что фокус сейчас на окне терминала, а затем напечатайте требуемый текст на клавиатуре персонального компьютера.
6. Как только начнется моделирование, дальнейшие функциональные возможности будут доступны в контекстном меню, которое появится при клике правой кнопкой мыши на окне терминала. Это меню дает возможность Вам приостановить дисплей, и копировать и вставлять текст в буфер обмена и из него.
Практическая часть
Синтезирована следующая схема:
Рисунок 1 – Заданная схема
Код программы, реализующий работу заданной схемы:
#include <avr/io.h>
#include <stddef.h>
#include <util/delay.h>
#define LCD_Goto(x,y) LCD_WriteCom(((((y)& 1)*0x40)+((x)& 7))|128)
void LCD_WriteData(unsigned char data)
{
PORTB |= (1<<2);
PORTC = data;
PORTB |= (1<<4);
_delay_ms(40);
PORTB &= (~(1<<4));
}
void LCD_WriteCom(unsigned char command)
{
PORTB &= (~(1<<2));
PORTC = command;
PORTB |= (1<<4);
_delay_ms(2);
PORTB &= (~(1<<4));
_delay_ms(40);
}
void LCD_WriteString(char *string)
{
while(*string != NULL)
{
LCD_WriteData(*string);
string++;
}
}
void LCD_Init(void )
{
DDRB = 0xff;
DDRC = 0xff;
DDRB |= (1<<2)|(1<<4);
_delay_ms(40);
LCD_WriteCom(0x38);
LCD_WriteCom(0x0f);
_delay_ms(2);
LCD_WriteCom(0x06);
}
void USART_Init( void )
{
UBRRH = 0;
UBRRL = 51;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
unsigned char USART_GetChar(void)
{
while((UCSRA & (1<<RXC)) == 0);
return UDR;
}
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}
void USART_Send_String(char *string)
{
while(*string != NULL)
{
while(!(UCSRA & (1<<UDRE)));
UDR = *string;
string++;
}
}
void USART_Get_String(char *string)
{
int i = 0;
char tmp;
while (i < 10)
{
tmp = USART_GetChar();
USART_SendChar(tmp);
if (tmp != '\r' && tmp != '\b')
{
*string = tmp;
string++;
i++;
}
else if( tmp == '\b'){}
else
break;
}
}
void USART_Get_String_password(char *string)
{
int i = 0;
char tmp;
while (i < 10)
{
tmp = USART_GetChar();
if (tmp != '\r' && tmp != '\b')
{
USART_SendChar('*');
*string = tmp;
string++;
i++;
}
else if( tmp == '\b'){}
else
{
USART_SendChar(tmp);
break;
}
}
}
void error()
{
USART_Send_String("Error");
LCD_Goto(0, 0);
LCD_WriteString("Error");
_delay_ms(1000000);
LCD_WriteCom(0x1);
USART_SendChar('\r');
}
enter()
{
USART_Send_String("Success");
LCD_Goto(0,0);
LCD_WriteString("Success");
_delay_ms(1000000);
LCD_WriteCom(0x1);
USART_SendChar('\r');
}
int stringCmp(char *string1, char *string2)
{
for (int i=0; i<6; i++)
{
if (string1[i] != string2[i])
{
return 1;
}
}
return 0;
}
int main( void )
{
char login_def [10];
char password_def [10];
char login [10];
char password [10];
char Operation[1];
LCD_Init();
USART_Init();
DDRB = 0xff;
PORTB = 0xf0;
DDRA = 0x03;
while(1)
{
Label:
USART_Send_String("0 - registration\r1 - authorization\r");
USART_Get_String(Operation);
if (Operation[0] == '0')
{
USART_Send_String("Login: ");
USART_Get_String(login_def);
USART_SendChar('\r');
USART_Send_String("Password: ");
USART_Get_String(password_def);
USART_SendChar('\r');
USART_Send_String("Try again password: ");
USART_Get_String(password_def);
USART_SendChar('\r');
USART_Send_String("Registration Success\r");
USART_SendChar('\r');
}
else if (Operation[0]== '1')
{
USART_Send_String("Login: ");
USART_Get_String(login);
int error_login= stringCmp(login_def, login);
if (error_login==0)
{
USART_Send_String("Password: ");
USART_Get_String_password(password);
int error_password = stringCmp(password_def, password);
if (error_password == 0)
{
enter();
goto Label;
}
else
{
error();
goto Label;
}
}
else
{
error();
goto Label;
}
return 0;
}
}
}
На рисунке 2 показан результат работы первой схемы, введенные буквы инвертируют свой регистр на ЖК-дисплее, другие символы отображаются прочерком.
Рисунок 3 – Результат работы первой схемы
Вывод: в ходе выполнения данной лабораторной работы были сформированы практические навыки программирования и отладки работы микроконтроллеров. Изучение типовой периферии МК.