Các công cụ lập trình cho vi điều khiển họ AVR

Một phần của tài liệu Ứng dụng vi điều khiển để điều khiển nhiệt độ khí sấy nông sản dạng hạt (Trang 81 - 88)

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]); (adsbygoogle = window.adsbygoogle || []).push({});

}

// 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

// 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 }

}

Một phần của tài liệu Ứng dụng vi điều khiển để điều khiển nhiệt độ khí sấy nông sản dạng hạt (Trang 81 - 88)