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 Sấy nông sản (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 Sấy nông sản (Trang 81 - 88)