Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпус_1 / mk51 / Книги / ПРОЕКТ_ МПС.doc
Скачиваний:
194
Добавлен:
11.05.2015
Размер:
2 Мб
Скачать
☆

Version : от 17 до 120 Гц

Date : 10.11.2008

Author : Шарапов А.В.

Company : ПрЭ

Comments: курсовой проект

Chip type : ATmega16

Program type : Application

Clock frequency : 1,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

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

#include <mega16.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x1B ;PORTA

#endasm

#include <lcd.h>

#include <stdio.h>

flash char Decode2Rus[255-192+1]= {

0X41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,

0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,

0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,

0xAC,0xE2,0xAD,0xAE,0xAD,0xAF,0xB0,0xB1,

0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,

0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,

0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,

0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7

};

#define _ALTERNATE_PUTCHAR_

void putchar(char c)

{

if(c>=192) lcd_putchar(Decode2Rus[c-192]); else lcd_putchar(c);

}

// Declare your global variables here

unsigned int period=20000;

unsigned int f=500;

char lcd_buffer[33];// Буфер в ОЗУ для LCD-дисплея

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// Place your code here

TCCR1B=0; //останов таймера

period=TCNT1L+256*TCNT1H;

TCNT1H=0;//обнуление таймера

TCNT1L=0;

TCCR1B=0x02;//запуск измерения нового периода

f=(100000000/period+5)/10;

sprintf(lcd_buffer," power circuit frequency %u.%uHz",f/10,f%10);// Подготовка строки для LCD-дисплея

lcd_gotoxy(1,0);// Вывод строки со второй позиции в 1 строке

lcd_puts(lcd_buffer);

}

void main(void)

{

// Declare your local variables here

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 1000,000 kHz

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x02;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// INT1: Off

// INT2: Off

GICR|=0x40;

MCUCR=0x02;

MCUCSR=0x00;

GIFR=0x40;

// LCD module initialization

lcd_init(16);

// Global enable interrupts

#asm("sei")

while (1)

{

// Place your code here

};}

Моделирование работы устройства с помощью VMLAB

Ниже приведен файл проекта для симулятора. Для моделирования работы измерителя частоты сети к входу INT0 подключается генератор прямоугольных импульсов, период которого можно задавать программно. К порту РА подключен LCD-дисплей (две строки по 16 символов).

; файл z10_vm.prj

.MICRO "ATmega16"

.TOOLCHAIN "GENERIC"

.TARGET "z.hex"

.COFF "z.cof"

.SOURCE "z__.c"

.CLOCK 8meg

.POWER VDD = 5 VSS = 0

;V[inst_name] node VSS PULSE(v_initial v_final t_delay t_rise ;t_fall t_width ;t_period)

V1 PD2 VSS PULSE(0 5 0 0 0 5m 21m)

;X[inst_name] LCD(chars lines oscil_freq) RS RW E D7 D6 D5 D4 D3 D2 D1D0

Xdisp LCD(16 2 250K) PA0 PA1 PA2 PA7 PA6 PA5 PA4 nc3 nc2 nc1 nc0

Цель моделирования (рис.12) – проверка работоспособности выбранного алгоритма и оценка времени, которое микроконтроллер затрачивает на обработку информации. При проведении эксперимента раскрываем рабочие окна: Peripherals (окно периферийных устройств, чтобы пронаблюдать значение таймера Т1), I/O Ports (окно портов ввода/вывода, чтобы увидеть подачу импульсов на линию PD2), Control Panel (экран жидкокристаллического индикатора).

При моделировании подключался файл Z10.hex, сформированный при трансляции программы, подготовленной на языке Си (страницы 58-60 настоящего пособия), с выводом информации на русском языке (частота сети 47.6 Гц).

Рисунок 12 – Рабочие окна симулятора VMLAB

В окне Code (текст программы на языке Си) ставим точки останова перед открывающей и закрывающей скобкой подпрограммы прерывания и, проведя цикл измерения частоты (для этого дважды нажимаем зеленую кнопку светофора), определяем по данным окна Messages время выполнения подпрограммы прерывания. Оно составило 3,81 мс, что говорит о работоспособности выбранного алгоритма определения частоты. Практически каждый период сетевого напряжения обновляется значение рассчитываемой частоты.

В окне Program Memory можно увидеть машинные коды выполняемых команд и соответствующие им команды на языке ассемблера микроконтроллера. Можно реализовать пошаговое выполнение команд, нажимая кнопочку правее светофора.

Соседние файлы в папке Книги