Tài liệu Cách lập trình trên codevisionavr và một số ví dụ

  • Số trang: 18 |
  • Loại file: DOC |
  • Lượt xem: 219 |
  • Lượt tải: 0
tailieuonline

Đã đăng 39907 tài liệu

Mô tả:

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: 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 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 Sau đó ta save project lại Ta được như sau : 22/4/2011 Trang 4 SV:Vũ Ngọc Bắc –CĐT4-K52 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 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 SV:Vũ Ngọc Bắc –CĐT4-K52 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(" P8thoat"); TCB:");lcd_putnum(xem);lcd_putsf(" 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 Chúc các bạn thực hành tôt: 22/4/2011 Trang 18 SV:Vũ Ngọc Bắc –CĐT4-K52
- Xem thêm -