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 độ khi sấy nông sản dạng hat (Trang 82 - 90)

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 }

}

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

Tải bản đầy đủ (DOC)

(96 trang)
w