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; nh−ng để 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à 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:
timer1_compa_isr(void) + Set bit PD4. + Trễ 100us. + Xoá bit PD4 + Cấm timer 1 hoạt động Thoát
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -82-
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.
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -83-
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)
{
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46 ... -84- #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
lcd_putsf(data[0]); //Hien thi dong chu "t dat" 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") }
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -85-
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) { tick=0; 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 }
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -86-
// 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
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 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
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -87-
// 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 TCCR1A=0x00; 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;
Báo cáo tốt nghiệp Nguyễn Xuân Tài – Tự động hoá 46
... -88-
// 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
// Nguon kich de bat dau chuyen doi: 0ff ADMUX=0x00;
ADCSRA=0x8E;
// Khoi tao module LCD lcd_init(8);
// Global enable interrupts #asm("sei")
display(); while (1) {
// Place your code here }
}