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à ASMLập trình Assembly.. Nhưng nhược điểm của ngôn ngữ C là k
Trang 1Lậ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:
http://www.mediafire.com/?ny7sti7gb481upl
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
Trang 2Tạ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
Trang 3Lậ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
Trang 4Sau đó ta save project lại
Ta được như sau :
Trang 5Lậ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:
Trang 6Chươ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 :
Trang 7Lậ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:
Trang 8
Sau đó bạn chọn Too/ Chip Programmer để nạp cho AVR :
Chúng ta được cửa sổ như sau :
Trang 9Lậ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:
Trang 10Em 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ố
Trang 11Lậ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
Trang 12ta 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ý:
Trang 13Lậ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;
Trang 14if(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);
}
Trang 15
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();
Trang 16/
******************************************************************
*******************************************/
/
******************************************************************
*******************************************/
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)
Trang 17Lậ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;
}
Trang 18Chúc các bạn thực hành tôt: