Ch−ơng 5: Nghiên cứu phần lập trình cho vi điều khiển
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.
Hình 63: Giao diện phần mềm nạp ch−ơng trình
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)
{
//Vong lap cho phim bam
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 }
}