Разработка блок-схемы алгоритма работы устройства и программы для МК

Основную программу будем использовать для определения количества нажатий на кнопку SB0 и вывода данного значения на семисегментные индикаторы.

Для формирования аналогового сигнала и отсчета 15 с будем использовать режим работы сброс таймера при совпадении (СТС). Для работы в режиме СТС используется специальный регистр микроконтроллера — регистр совпадения, в нашем случае это OCR0A. В режиме СТС таймер производит подсчет входных импульсов. Текущее значение таймера из его счетного регистра постоянно сравнивается с содержимым регистра совпадения. Когда содержимое счетного регистра совпадет с содержимым регистра OCR0A, произойдет сброс таймера и вызов соответствующего прерывания. По прерыванию в порт С выводится значение, которое рассчитывается МК по заданным формулам. При частоте тактового генератора 8 МГц в регистр совпадения необходимо записать значение 115, или, представив данное значение в шестнадцатеричной системе счисления, получим 0x73.

В качестве среды разработки программы будем использовать среду CodeVisionAVR, которая представляет собой интегрированная среду разработки программного обеспечения для микроконтроллеров семейства AVR фирмы Atmel.

Имена переменных, используемых в программе, их тип и назначение представлены в таблице 4.1.

Таблица 4.1 — Описание переменной, используемой в программе

Имя переменной Тип переменной Назначение переменной
time unsigned int Количество интервалов дискретизации
msec unsigned int Счетчик милисекунд
sec unsigned char Счетчик секунд
vivod unsigned char Переменная, в которой хранится результат предыдущего запоминания
count unsigned char Счетчик количества нажатий
cifri[] unsigned char Массив цифр для семисегментного индикатора
temp unsigned char Переменная для динамической индикации
i unsigned char Переменная для динамической индикации

Блок-схемы работы основной программы и подпрограмм обработки прерываний изображены на рис. 4.1...4.3.

Рис. 4.1 — Блок-схема подпрограммы обработки прерываний для формирования аналогового сигнала

Рис. 4.2 — Блок-схема подпрограммы обработки прерываний для отсчета 15 с

Рис. 4.2 — Блок-схема основной программы и функции динамической индикации

Текст программы, написанной на языке С, представлен ниже.

/*****************************************************

This program was produced by the

CodeWizardAVR V2.05.0 Professional

Automatic Program Generator

© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project :

Version :

Date : 16.05.2016

Author : NeVaDa

Company :

Comments:

Chip type : ATmega8

Program type : Application

AVR Core Clock frequency: 8,000000 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega8.h>

#include <delay.h>

flash unsigned char cifri[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

unsigned int msec = 0;

unsigned int time;

unsigned char sec;

unsigned char vivod;

unsigned char count;

void din_ind(int chislo)

{

unsigned char temp;

unsigned char i;

for(i = 2; i >= 1; i = i >> 1)

{

temp = chislo % 10;

chislo = chislo / 10;

PORTC = i;

PORTB = ~cifri[temp];

delay_ms(1);

}

}

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

if(msec < 1000)

{

msec++;

}

else

{

msec = 0;

if(sec < 15)

{

sec++;

}

else

{

sec = 0;

vivod = count;

count = 0;

}

}

}

// Timer2 output compare interrupt service routine

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

if(time <= 700)

time++;

else

time = 0;

if(time >= 0 && time <= 40)

{

PORTD = 5*time;

}

else

if(time > 40 && time <= 200)

{

PORTD = 200;

}

else

if(time > 200 && time <= 300)

{

PORTD = -2*(time - 300);

}

else

{

PORTD = 0;

}

}

// Declare your global variables here

void main(void)

{

// Declare your local variables here

// Input/Output Ports initialization

// Port B initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTB=0x80;

DDRB=0x7F;

// Port C initialization

// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out

// State6=T State5=T State4=T State3=T State2=P State1=0 State0=0

PORTC=0x04;

DDRC=0x03;

// Port D initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTD=0x00;

DDRD=0xFF;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

TCCR0=0x00;

TCNT0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 125,000 kHz

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: On

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x0B;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x73;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: 250,000 kHz

// Mode: CTC top=OCR2

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x0F;

TCNT2=0x00;

OCR2=18;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x90;

// USART initialization

// USART disabled

UCSRB=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

// ADC initialization

// ADC disabled

ADCSRA=0x00;

// SPI initialization

// SPI disabled

SPCR=0x00;

// TWI initialization

// TWI disabled

TWCR=0x00;

// Global enable interrupts

#asm("sei")

while (1)

{

if(PINC.2 == 0)

{

delay_us(200);

while(PINC.2 == 0)

{

}

delay_us(200);

count++;

}

din_ind(vivod);

}

}

5. Результаты моделирования работы устройства в программе ISIS пакета proteus

Для моделирования нужно определить тактовую частоту. Для этого необходимо правильно настроить CSKEL Fuse . Значение этих битов определяет источника тактовых сигналов. Загрузим файл прошивки в виртуальный МК путем выбора откомпилированного файла в строке Program file.

Результаты моделирования представлены на рис. 5.1…5.4.

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 5.1 — Устройство сразу после запуска моделирования

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 5.2 — Устройство после троекратного нажатия кнопки SB0 в течении 15 с

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 5.3 — Устройство после двадцатикратного нажатия кнопки SB0 в течении
следующих 15 с

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 5.4 — Генерируемый аналоговый сигнал на экране виртуального осциллографа

Таким образом, результаты моделирования полностью соответствуют техническому заданию.

Разработка печатной платы

Для разработки печатной платы воспользуемся программой ARES пакета PROTEUS. Для этого, прежде всего, нужно проверить наличие посадочных мест и корпусов у всех элементов. Элементы, у которых они отсутствуют, например, светодиоды и кнопки и семисегментный индикатор, заменим на разъемы из библиотеки Connectors, предполагая, что потенциометр и светодиоды будут располагаться не на печатной плате (рис. 6.1).

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.1 — Подготовка схемы в ISIS для экспорта в ARES

На рисунках рис. 6.2…6.4 представлена разведенная печатная плата в разных слоях. Расположение элементов выбиралось вручную, при трассировке использовался авто трассировщик.

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.2 — Все слои платы

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.3 — Слои Тоp Cooper и Silk

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.4 — Слой Bottom Cooper

3-D виды платы представлены на рис. 6.5…6.9.

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.5 — Вид платы сверху

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.6 — Вид платы спереди

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.7 — Вид платы слева

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.8 — Вид платы сзади

Разработка блок-схемы алгоритма работы устройства и программы для МК - student2.ru

Рис. 6.9 — Вид платы справа

ВЫвод

В результате выполнения курсовой работы на основе микроконтроллера ATmega6450 разработано устройство, которое выполняет следующие функции:

Подсчет количества нажатий на кнопку SB0 за каждые 15 с. Работа устройства должна осуществляться в цикле. По истечению текущих 15 с результат подсчета числа нажатий выводится на дисплей (семисегментный или LCD-дисплей) и сохраняется на нем в течении следующих 15 с.

Обеспечивается непрерывное формирование аналогового сигнала заданной формы.

Разработаны принципиальная схема, структурная схемы устройства, алгоритм работы его и, описывающая данный алгоритм, программа на языке С. Также разработана печатная плата устройства.

Библиографический список

1. Белов А.В. Разработка устройств на микроконтроллерах AVR: шагаем от «чайника» до профи / А.В. Белов. — СПб.: Наука и техника, 2013 — 528 с.

2. Евстифеев А.В. Микроконтроллеры AVR семейства Mega. Руководство пользователя/ А.В. Евстифеев. — М.: Издательский дом «Додэка-ХХI», 2007 — 592 с.

3. Лебедев М.Б. CodeVisionAVR: пособие для начинающих / М.Б. Лебедев — М.: Издательский дом «Додэка-ХХI», 2008 — 592 с.

4. Методические указания по оформлению текстовых работ для студентов дневной и заочной форм обучения направления 6.050901 — «Радиотехника» / СевНТУ; сост.

В.Г. Слёзкин. — Севастополь: Изд-во СевНТУ, 2010. — 20 с.

Наши рекомендации