Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Để lập trình cho AVR, chúng ta có thể sử dụng 2 ngôn ngữ cơ bản là C và
ASM(Lập trình Assembly).
Nhìn chung, 2 ngôn ngữ này có những ưu và nhược điểm riêng.
Ngôn ngữ ASM có ưu điểm là gọn nhẹ, giúp người lập trình nắm bắt sâu
hơn về phần cứng. Tuy nhiên lại có nhược điểm là phức tạp, khó triển khai về mặt
thuật toán, không thuận tiện để xây dựng các chương trình lớn.
Ngược lại ngôn ngữ C lại dễ dung, tiện lợi, dễ debug, thuận tiện để xây
dựng các chương trình lớn. Nhưng nhược điểm của ngôn ngữ C là khó giúp người
lập trình hiểu biết sâu về phần cứng, các thanh ghi, tập lệnh của vi điều khiển, hơn
nữa, xét về tốc độ, chương trình viết bằng ngôn ngữ C chạy chậm hơn chương
trình viết bằng ngôn ngữ ASM.
Tùy vào từng bài toán, từng yêu cầu cụ thể mà ta chọn lựa ngôn ngữ lập
trình cho phù hợp.
Có rất nhiều phần mềm lập trình cho AVR, như Code Vision, IAR,
AVRStudio…, trong đó Code Vision là một trong những phần mềm khá nổi tiếng
và phổ biến. ở đây em xin giới thiệu phần mềm
Code Vision để lập trình cho AVR. Với Ngôn Ngữ C cho những ví dụ đơn giản
cho các bạn thực hành:
Các bạn có thể dowload CodeVisionAVR V2.03.4 tại đây:
/>Sau khi cài đặt và khởi động chương trình các ban có giao diện:
Giao diện phần mềm Code Vision
22/4/2011 Trang 1
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Tạo project trong Code Vision :
Để tạo Project mới chọn trên menu: File -> New được như sau:
Chọn Project sau đó click chuột vào OK được cửa sổ hỏi xem có sử dụng
Code Winzard không:
Chọn Yes
22/4/2011 Trang 2
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Chọn Yes được cửa sổ CodeWinzardAVR như sau :
- Sử dụng chíp AVR nào và thạch anh tần số bao nhiêu ta nhập vào tab Chip.
Để khởi tạo cho các cổng IO ta chuyển qua tab Ports.
- Các chân IO của AVR mặc định trạng thái IN, muốn chuyển thành trạng
thái OUT để có thể đưa các mức logic ra ta click chuột vào các nút IN (mầu
trắng) để nó chuyển thành OUT trong các Tab Port.
Sau đó chọn File ->Generate, Save and Exit
22/4/2011 Trang 3
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Sau đó ta save project lại
Ta được như sau :
22/4/2011 Trang 4
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Như vậy là chúng ta đã tạo xong project trong Code Vision.
3. Ví dụ minh họa
Chương trình sau sẽ làm nhấp nháy led, led nối vào port A.
Phân tích:
22/4/2011 Trang 5
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Chương trình trên rất đơn giản, sơ đồ thuật toán của chương trình trên như sau :
Sau khi viết xong chương trình, chúng ta nhấn Shift+F9 để biên dịch. Nếu
chương trình không có lỗi và biên dịch thành công, sẽ có thông báo như sau :
22/4/2011 Trang 6
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Để nạp chương trình các bạn cần cấu hình cho mạch nạp. Vào menu:
Settings -> Programmer được cửa sổ như sau :
Chú ý: (Mạch nạp ta dùng STK 200 do đó các bạn chọn Kanda Systems
STK200+/300). Nhấp OK. Sau đó các bạn chọn trên menu : Projects -> Configure
được cửa sổ như sau:
22/4/2011 Trang 7
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Sau đó bạn chọn Too/ Chip Programmer để nạp cho AVR :
Chúng ta được cửa sổ như sau :
22/4/2011 Trang 8
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Các bạn cấu hình các thông số cần thiết, như chọn thạch anh nội hay ngoại,
cấu hình các fuse bit… rồi nhấn vào Program All để nạp chương trình.
Ví Dụ 2:
22/4/2011 Trang 9
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Em trình bày về nguyên lí lập trình cho led 7 thanh:
Ở ví dụ sau, chúng ta sẽ hiển thị lần lượt các số từ 0 đến 9 lên led 7 thanh.
Sơ đồ mạch :
Led 7 thanh bao gồm 7 thanh a,b,c,d,e,f,g và 1 “thanh” dp, mỗi thanh là một
led. Tùy vào cách nối chung anot hay catot giữa các thanh mà ta có 2 loại anot
chung hoặc catot chung.
Như hình vẽ trên, led 7 thanh có dạng anot chung, muốn thanh nào sáng, chúng
ta chỉ việc cấp điện áp dương vào chân tương ứng, khi đó led tương ứng với thanh
đó sẽ được phân cực thuận và phát sáng.
Ví dụ như hình vẽ trên, để sáng thành hình số 5, ta cần các thanh a,f,g,c,d sáng,
khi đó ta cần cấp mức logic 1 (tương ứng với điện áp 5V) vào các chân tương ứng,
và kết quả là ta được 1 chuỗi số nhị phân 10110110, hay ở dạng mã hex : 0xB6.
Bằng cách tương tự, ta cũng tạo được giá trị (mã) để xuất ra port của vi điều
khiển để led sáng các số từ 0 đến 9. Người ta thường tạo ra 1 bảng mã như vậy
như vậy để tiện sử dụng.
Bảng mã hóa các chữ số
22/4/2011 Trang 10
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Chương trình:
Trong chương trình trên, các câu lệnh cấu hình tương tự như phần trước, chúng
22/4/2011 Trang 11
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
ta chỉ phân tích về thuật toán.
Biến font[] là một mảng số kiểu char, dùng để lưu trữ các mã của các số tương
ứng, ví dụ số 0 sẽ có mã là phần tử đầu tiên của mảng : font[0] hay 0xC0, tương
tự, số 1 sẽ có mã là font[1] hay 0xF9…
Lần lượt chúng ta xuất từng phần tử của mảng font[] ra cổng nối vào led (port
B), khi chạy chương trình, chúng ta sẽ thấy led sáng từ 0 đến 9.
Ví Dụ 3
Giới thiệu với các bạn phần lập trình và thuật toán nhận bít đường đi của
robot đội TNT trong cuộc thi RoBoCon 2009:
Sơ đò mạch Led do đường
Mạch nguyên lý:
22/4/2011 Trang 12
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Mạch layout:
Lập trình dò đường:
/*void kiemtralech(void)
{
if((!R3) || (!R2) || (!R1)) TEMP=1; //lech trai
else if((!L3) || (!L2) || (!L1)) TEMP=2; //lech phai
else if((!L4) || (!R4)) TEMP=3; // dang di dung duong
} */
void kiemtralech(void)
{
if(!R3) ktlechl=1; //lech trai
if(ktlechl==1) if(!R2) ktlechl=2;
if(ktlechl==2) if(!R1) ktlechl=3;
if(ktlechl==3) if(!R2) ktlechl=2;
if(!L3) ktlechr=1; //lech phai
if(ktlechr==1) if(!L2) ktlechr=2;
22/4/2011 Trang 13
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
if(ktlechr==2) if(!L1) ktlechr=3;
if(ktlechr==3) if(!L2) ktlechr=2;
}
//*****************************************************************
*********************************************
unsigned char doc_sensor()
{
tongcambien=0;
if(!L4) tongcambien++;
if(!R4) tongcambien++;
if(!L3) tongcambien++;
if(!R3) tongcambien++;
if(!L2) tongcambien++;
if(!R2) tongcambien++;
if(!L1) tongcambien++;
if(!R1) tongcambien++;
delay_ms(10);
return(tongcambien);
}
22/4/2011 Trang 14
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0;
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
// Start the AD conversion
ADCSRA|=0x40;
if (input_index==0)//Dua ket qua quet sensor vao thanh ghi SENSOR
{
if(adc_data[0]<=adc_level[0]) L1=0;else L1=1;
if(adc_data[1]<=adc_level[1]) L2=0;else L2=1;
if(adc_data[2]<=adc_level[2]) L3=0;else L3=1;
if(adc_data[3]<=adc_level[3]) L4=0;else L4=1;
if(adc_data[4]<=adc_level[4]) R4=0;else R4=1;
if(adc_data[5]<=adc_level[5]) R3=0;else R3=1;
if(adc_data[6]<=adc_level[6]) R2=0;else R2=1;
if(adc_data[7]<=adc_level[7]) R1=0;else R1=1;
};
kiemtralech();
22/4/2011 Trang 15
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
}
/
******************************************************************
*******************************************/
/
******************************************************************
*******************************************/
void sensor(void)
//Dung thanh ghi SENSOR
//Sensor i nhan tuong ung bit thu i la 0, nguoc lai no nhan gia tri 1
{
// ADC Interrupts: On
ADCSRA=0x8E;
// Global enable interrupts
#asm("sei") //nhung' asm
// Select ADC input 0
ADMUX=0;
// Bat dau quet
ADCSRA|=0x40; //bat' dau` cho senser quet'
}
/
******************************************************************
*******************************************/
void xem_tongcambien(void)
22/4/2011 Trang 16
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
{
unsigned char xem,j;
while(1)
{
j=0;
xem=0;
xem=doc_sensor();
lcd_clear();lcd_gotoxy(0,0);lcd_putsf(" TCB:");lcd_putnum(xem);lcd_putsf("
P8thoat");
lcd_gotoxy(0,1);lcd_putsf("Van");lcd_gotoxy(12,1);lcd_putsf("Long");
while(j!=8)
{
if(adc_data[j]<=adc_level[j])
{
lcd_gotoxy(3+j,1);lcd_putsf("*");
} else {lcd_gotoxy(3+j,1);lcd_putsf("-");};
j++;
}
CT08 if(!PINB.4) break;
}
22/4/2011 Trang 17
Lập trình với code vesion AVR SV:Vũ Ngọc Bắc –CĐT4-K52
Chúc các bạn thực hành tôt:
22/4/2011 Trang 18