Разработка прикладной программы
Последовательность шагов по разработке и отладке программы может быть следующей (проект формируем в папке z10):
1. Создаем новый проект выбирая:
File→New→Select Project
2. Выбираем использование CodeWizardAVR:
Use the CodeWizard?→Yes
3. В окнах CodeWizardAVR фиксируем тип МК и рабочую частоту:
Chip→Chip: ATmega16→Clock: 8MHz
4. Конфигурируем LCD-дисплей: LCD→PORTA→16
5. Конфигурируем Timer1: Timers→Timer1→
Clock Value: 1000kHz→Interrupt off: Timer1 Overflow→Val: 0xFFFF
6. Настраиваем прерывания: External IRQ→INT0 Enabled→Rising Edge
7. Генерируем файлы C source, C project и CodeWizardAVR project выбирая:
File|Generate, Save and Exit→
Create new directory: C:\cvavr\z10→
Save: z10.c→Save: z10.prj →Save: z10.cwp
8. Редактируем код C source (основная творческая часть по реализации алгоритма)
9. Смотрим или модифицируем конфигурацию проекта выбирая Project→Configure→After Make→Program the Chip
10. Компилируем программу выбирая:
Project→Make
11. Автоматически программируем ATmega16 на STK500:
Apply power→Information→Program.
Ниже приведен текст программы на языке Си. Для обеспечения возможности выводить на LCD-дисплей русские буквы в программу добавлена таблица кодов и функция void putchar(char c). Большую часть времени МК находится в цикле основной программы.
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7 beta 5 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Измеритель частоты сети
Version : от 17 до 99 Гц
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
};}
Дата добавления: 2016-01-09; просмотров: 753;