2. Chơng trình lập trình
2.1. Các công cụ lập trình cho vi điều khiển họ AVR
Từ khi tung ra thị trờng dòng vi điều khiển họ AVR, công ty Atmel cũng cho ra đời trình dịch AVR - Assembler, phục vụ cho vi điều khiển loại này. AVR - Assembler hỗ trợ việc viết chơng trình bằng ngôn ngữ assembly, biên dịch nó sang file.hex; nhng để có thể sử dụng đợc công cụ này thì ngời lập trình phải rất am hiểu về cấu trúc của AVR. Tuy nhiên AVR cũng hỗ trợ ngôn ngữ C, vì vậy các công ty ứng dụng AVR thờng tạo ra công cụ riêng của mình dựa trên ngôn ngữ C. Các hàm trong ngôn ngữ C đợc viết dựa trên khối các lệnh assembly. Khi sử dụng ngôn ngữ C, công việc lập trình trở nên đơn giản hơn và
timer1_compa_isr(void) + Set bit PD4. + Trễ 100us. + Xoá bit PD4 + Cấm timer 1 hoạt động Thoát
ngời lập trình không cần phải quan tâm nhiều đến cấu trúc phần cứng của chíp. Trong thiết kế này chúng tôi sử dụng công cụ lập trình Code Vision AVR C Compiler Evaluation của công ty Pavel Haiduc - HP InfoTech s.r.l. Công cụ này hỗ trợ cả lập trình C và Assembly:
Hình 62: Giao diện phần mềm lập trình Code Vision AVR
Sau khi biên dịch chơng trình sang file.hex, sử dụng phần mềm nạp ch- ơng trình vào chíp tơng thích với mạch nạp đã đợc thiết kế. Chúng tôi sử dụng phần mềm Pony Prog2000 của công ty LancOS.
Hình 63: Giao diện phần mềm nạp chơng trình
2.2 Phần chơng trình
/***************************************************** This program was produced by the
CodeWizardAVR V1.24.6 Standard Automatic Program Generator
â Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
e-mail:office@hpinfotech.com Project : Dieu khien nhiet do khi say Version : 2.0
Date : 12/19/2005
Author : Nhom Vu Quang Duy + Nguyen Xuan Tai Company : Dai hoc Nong Nghiep I Ha Noi
Comments:
Chip type : ATmega8535L Program type : Application Clock frequency : 8.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 128
#include <mega8535.h>
// Alphanumeric LCD Module functions #asm
.equ __lcd_port=0x15 ;PORTC #endasm
#include <lcd.h> #include <stdlib.h> #include <delay.h>
flash char *data[]={"t dat ","t lo"}; #pragma warn-
eeprom char tdat=50; #pragma warn+ char str[3]; int thdk=1200;
int un1,yn1,un,yn,tick=0; //Chuong trinh quet ban phim char quet(void)
{
//Vong lap cho phim bam #asm
LOOP: sbis $10,2 rjmp LOOP #endasm //Gia tri tra ve return PINB&0x03; }
//Chuong trinh hien thi du lieu void display(void)
{ lcd_clear(); //Xoa LCD
lcd_putsf(data[0]); //Hien thi dong chu "t dat" itoa(tdat,str);//Chuyen so nguyen sang xau lcd_puts(str);//Hien thi xau
lcd_gotoxy(0,1);//Hien thi nhiet do dat. lcd_putsf(data[1]);
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) {
// Place your code here
char a; //Luu phim bam #asm("cli")
lcd_clear();// Xoa LCD
while(1){
lcd_gotoxy(2,1);//nhay xuong dong 1 cot 2 a=quet();//cho phim bam
if(a==0x02)//Neu la phim tang tdat++;
if(a==0x01) //Neu la phim giam tdat--;
if(a==0) //Neu la phim OK {
display(); //Hien thi du lieu. break; //Thoat khoi vong lap. }
itoa(tdat,str);//Chuyen nhiet do sang dang xau lcd_puts(str);//Hien thi nhiet do
delay_ms(50);//Tre 50ms } GIFR|=0x40; #asm("sei") }
interrupt [ADC_INT] void adc_isr(void) {
int tlo;
// Doc ket qua chuyen doi va tinh nhiet do thuc tlo=ADCW*0.099;
un1=tdat-tlo;//Tinh sai so
//Bo dieu khien tich phan voi Ti=2.244 yn1=0.2228*un1+0.2228*un+yn; un=un1; yn=yn1; if(yn1>1250) thdk=1200; else if(yn1<0) thdk=-1; else thdk=yn1; lcd_gotoxy(5,1); itoa(tlo,str); lcd_puts(str); }
// Timer 0 output compare interrupt service routine interrupt [TIM2_COMP] void timer2_comp_isr(void) {
// Place your code here if(tick++==100) {
ADCSRA|=0x40;// }
//TIFR|=0x02; }
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
// Place your code here //Set bit kich xung dieu khien #asm sbi $12,4 #endasm delay_us(100); #asm cbi $12,4 #endasm
TCCR1B=0x00;//Cam bo dinh thoi 1 hoat dong }
// Analog Comparator interrupt service routine interrupt [ANA_COMP] void ana_comp_isr(void) {
// Place your code here //xoa bit kich xung dieu khien
TCNT1=thdk;//nap tin hieu dieu khien vao thanh ghi bo dinh thoi 1 TCCR1B=0x0A;//Bat dau cho bo dinh thoi 1 hoat dong o tan so 125kHz if(ACSR&0x03==0x03) //Chuyen suon len thanh suon xuong
ACSR&=0xFE; //neu dang la suon len va nguoc lai else ACSR|=0x03;
ACSR|=0x10; //Ghi gia tri 1 vao co ACI de xoa co. }
// Declare your global variables here void main(void)
{
// Declare your local variables here // Input/Output Ports initialization // Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
PORTA=0x00; DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T PORTD=0x00;
DDRD=0x10;
// Khoi tao bo dinh thoi timer0
// Nguon xung nhip: Xung nhip he thong // Gia tri xung nhip: 125.000 kHz
// Che do: CTC top=OCR0 TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00; //ung voi 1ms // Khoi tao bo dinh thoi 1
// Nguon xung nhip: xung nhip he thong // Tan so xung nhip: Off
// Che do: CTC top=OCR1A // Dau ra so sanh 1A: Cam // Dau ra so sanh 1B: Cam // Triet nhieu: Cam
// Du dau dau vao tren suon xuong // Ngat tran bo dinh thoi: Off // Ngat du dau vao: Off // Ngat so sanh A: On // Ngat so sanh B: Off
TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00;
OCR1AH=0x04;//4E2 la gia tri ung voi 10ms OCR1AL=0xE2;
OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00;
TCCR2=0x0C; TCNT2=0x00; OCR2=0x7D;
// External Interrupt(s) initialization // INT0: On
// INT0 Mode: Rising Edge // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x03; MCUCSR=0x00; GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x90;
// Khoi tao so sanh tuong tu // So sanh tuong tu: On // Ngat tren suon len
// So sanh tuong tu bat du boi bo dinh thoi 1: Off ACSR=0x0B;
SFIOR=0x00; // Khoi tao ADC
// Tan so xung nhip ADC : 125.000 kHz // Dien ap tham chieu ADC: AREF pin // Che do chuyen doi cao: Off
ADMUX=0x00; ADCSRA=0x8E;
// Khoi tao module LCD lcd_init(8);
// Global enable interrupts #asm("sei")
display(); while (1) {
// Place your code here }
}