- •Техническое задание
- •Реферат
- •Перечень условных обозначений, единиц и терминов
- •Введение
- •1 Структурная организация
- •2 Алгоритмы обработки и управления
- •3 Выбор элементной базы
- •3.1 Выбор омк
- •4 Принципиальная электрическая схема
- •5 Программное обеспечение
- •6 Алгоритм тестирования
- •7 Тестовый пример
- •8 Инструкция по эксплуатации контроллера
- •Заключение
- •Список использованных источников
- •Приложение а
- •Приложение б
- •Приложение в
Заключение
В ходе выполнения курсового проекта был разработан алгоритм работы, структура и принципиальная схема устройства, предназначенного для приема данных с заданной скоростью, индицируемой на светодиодах, обработки данных, вывода результата. Система осуществляет ввод двоично-десятичных данных в последовательном формате, преобразует их в двоичный код, выбирает максимальный элемент среди них и выводит его в параллельном формате в два приемника по прерыванию.
Программа была написана в среде разработки CodeVisionAVR C Compiler на языке С и отлажена с помощью пакета Proteus Version 7 Professional.
ОМК работает на частоте 8 МГц, требуемый объем ПЗУ – 2252 байт, объем ОЗУ – 59 байт, время работы подпрограммы инициализации ОМК – 0,796 мс, подпрограммы выбора скорости последовательного канала – 5,5 мкс, подпрограмма считывания одного значения из последовательного канала – 45м мкс, подпрограмма обработки массива и нахождения максимума – не более 46,072 мс, подпрограмма вывода результата в параллельный порт – 769 мкс.
Список использованных источников
Иоффе, В. Г. Структурная организация однокристальных микроконтро-ллеров [Текст]/ В. Г. Иоффе. – Самара: Издательство СГАУ, 2011. – 65с.
Иоффе, В. Г. Методические указания к курсовому проектированию по дисциплине «Микропроцессорные средства систем автоматизации» [Текст]/ В. Г. Иоффе. – Самара: Издательство СГАУ, 2012. – 21с.
Преимущества CodeVisionAVR C Compiler [Электронный ресурс]. – http://cxem.net/software/codevisionavr.php
Достоинства среды Proteus 7 Professional [Электронный ресурс]. – http://www.gaw.ru/html.cgi/txt/soft/avr/Proteus.htm
Микроконтроллеры семейства AVR [Электронный ресурс]. – http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/start.htm
Отладка МПУ [Электронный ресурс]. – http://dfe.petrsu.ru/koi/posob/microcpu/proekt1.html
Тестирование ПЗУ [Электронный ресурс]. – http://iit.my1.ru/load/0-0-0-98-20
Приложение а
Принципиальная схема представлена на рисунке 18.
Рисунок 18 – Принципиальная схема
Приложение б
Таблица 2 – Спецификация элементов
Номер микросхемы |
Тип |
Количество |
Описание |
U1 |
ATmega8 |
1 |
Однокристальный микроконтроллер |
D1-D5 |
Led-Blue |
5 |
Светодиод |
C1 |
|
1 |
Конденсатор |
R1-R8 |
|
1 |
Резистор |
Приложение в
Листинг программы с комментариями.
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
unsigned char max[2];
bit input_finished = 0;
unsigned char i = 0;
unsigned char j = 0;
volatile unsigned char mode = 0;
char uart_data[16][3];
// Обработчик прерывания от INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
GICR|=0x00; // запрет прерываний от внешних источников
DDRD=0xFF;
UCSRB=0x90;
PORTB = max[0]; //вывод данных на порт
switch (mode) {
case 1: PORTB.6 = 1; break;
case 2: PORTB.5 = 1; break;
case 3: PORTB.4 = 1; break;
case 4: PORTB.3 = 1; break;
case 5: PORTB.2 = 1; break;
};
PORTD = max[1];
PORTB.7 = 1;
delay_ms(1000);
PORTB.1 = 0;
PORTB.0 = 0;
PORTB.7 = 0;
PORTD=0xFF;
DDRD=0x00;
UCSRB=0x98;
GICR|=0xC0;
GIFR=0xC0;
}
// Обработчик прерывания от INT1
interrupt [EXT_INT1] void ext_int1_isr(void)
{
GICR|=0x00; // запрет прерываний от внешних источников
DDRD=0xFF;
UCSRB=0x90;
PORTB = max[0]; //вывод данных на порт
switch (mode) {
case 1: PORTB.6 = 1; break;
case 2: PORTB.5 = 1; break;
case 3: PORTB.4 = 1; break;
case 4: PORTB.3 = 1; break;
case 5: PORTB.2 = 1; break;
};
PORTD = max[1];
delay_ms(1000);
PORTB.1 = 0;
PORTB.0 = 0;
PORTB.7 = 0;
PORTD=0xFF;
DDRD=0x00;
UCSRB=0x98;
GICR|=0xC0;
GIFR=0xC0;
}
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
// Обработка прерывания от последовательного канала
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
if (++rx_counter == 0)
{
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
#endif
rx_buffer_overflow=1;
}
}
// Запись данных с порта в массив
uart_data[i][j]=data;
j++;
if(j>2)
{
j=0;
i++;
if(i<=15) printf(".\rВведите %dй элемент ", i+1);
};
if(i>15)
{
i=0;
input_finished = 1;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
void main(void)
{
volatile unsigned int tmp = 0;
volatile unsigned char mult = 100;
volatile unsigned int maxim = 0;
// инициализация параллельных портов
PORTB=0x00;
DDRB=0xFF;
PORTC = 0x00;
DDRC=0b00100000;
PORTD=0xFF;
DDRD=0x00;
// инициализация прерываний
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;
// Инициализация USART
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
#asm("sei")
while (1)
{
// опрос порта С, настройка скорости работы USART
if(mode == 0) {
switch(PINC) {
case 0b01000001: UBRRH=0x01; UBRRL=0xA0; PORTB.5 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.6 = 1; mode = 1; break; //19200 б/с
case 0b01000010: UBRRL=0xCF; PORTB.6 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.5 = 1; mode = 2; break; //9600 б/с
case 0b01000100: UBRRL=0x67; PORTB.5 = 0; PORTB.6 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.4 = 1; mode = 3; break; //4800 б/с
case 0b01001000: UBRRL=0x33; PORTB.5 = 0; PORTB.4 = 0; PORTB.6 = 0; PORTB.2 = 0; PORTB.3 = 1; mode = 4; break; //2400 б/с
case 0b01010000: UBRRL=0x19; PORTB.5 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.6 = 0; PORTB.2 = 1; mode = 5; break; //1200 б/с
};
if(mode != 0) {
printf("Если вы видите символы на русском языке,\rто скорость терминала равна заданной скорости USART ОМК.\rНачался ввод данных. Возможно введение только трехзначных чисел.\rВведите 1й элемент ");
};
};
if(input_finished == 1) { //ввод даных завершен
printf("\rВвод завершен. Обработка начата.");
for(i = 0;i<16;i++) {
for(j = 0;j<3;j++) { //приведение к двоичному виду
tmp = tmp+ mult*(uart_data[i][j] - 0x30);
mult = mult/10;
};
maxim = max[0]*256+max[1];
if(tmp>maxim) { //сравнение с уже имеющимся максимальным
max[1] = tmp; // замена текущего максимального
tmp = tmp >> 8;
max[0] = tmp;
};
tmp = 0;
mult = 100;
};
printf("\rОбработка завершена. Ожидается прерывание.\r");
input_finished = 0;
};
}
}
