Top Banner
AUTO.NLU For more details and questions, contact me: [email protected] CÙNG HC AVR AVR3– LP TRÌNH C CHO AVR: NGT VÀ TIMER/COUNTER Thothun: tài liu này thuc quyn shu ca tác gi, bn có thtdo tham kho tài liu nhưng không được phép sdng để in thành sách báo, đăng lên các din đàn hay website, nhưng bn có thdùng đường link http://www.dieukhientudong.net để hướng ti tài liu. Liên htác giqua email: [email protected] . I. Bn sđi đến đâu. Đây là th3 trong lot bài cùng hc AVR. Nếu bài 1 và bài 2 gii thiu mt cách chung nht vAVR thì ktbài 3 tôi sgii thiu lp trình điu khin peripheral (thiết bngoi vi hay các chc năng mrng tích hp sn trên các chip AVR). Do là các thiết bngoi vi mrng nên không phi tt ccác chip AVR đều có tt ccác thiết bnày, ví dchip AVR AT90S2313, AT90S8515 không có bchuyn đổi Analog-Digital (ADC) và giao tiếp TWI (I 2 C)…Tuy nhiên, các chip thuc dòng Mega có khá nhiu thiết bngoi vi phc vcho các ng dng đo lường, điu khin…Chúng ta stiếp tc sdng chip Atmega8 để kho sát, trong quá trình kho sát, nếu có skhác bit gia Atmega8 và các chip mi hơn (như Atmega16, Atmega32, Atmega64, Atmega128…) tôi snói rõ để bn rõ. Mt skhác bit ln gia AVR3 so vi các bài viết trước là tôi shướng dn lp trình bng C mà cthlà bng AVR-GCC (được tích hp trong WinAVR). Các bn xem phn II để biết rõ hơn. Sau bài này, tôi hy vng bn s: - Cài đặt và sdng WinAVR, Programmer Notepad. - Hiu được mt shàm cơ bn trong thư vin avr-libc. - Hiu vINTERRUPT (ngt), cách sdng ngt bng C và cASM. - Ci tiến ví dtrong bài 2 bng Interrupt. II. WinAVR. Ti sao C: như tôi đã trình bày các bài hc trước, khi bn đã hiu vAVR, để thc hin các ng dng, bn có thkhông nht thiết phi luôn lp trình bng ASM. Ngôn ngcp cao như C sgiúp cho bn xây dng các ng dng nhanh chóng và ddàng hơn, tuy nhiên không vì thế bn “quên” ASM, lp trình bng C kết hp ASM là gii pháp hay nht. Mt chú ý là chúng ta chsdng C để đơn gin hóa lp trình tính toán, cu trúc điu khin…lp trình C cho AVR không có nghĩa là bn không cn biết cu trúc và cách thc hot động ca chip!!! Ti sao WinAVR: WinAVR (đọc là Whenever: theo tác gica WinAVR) là mt bphn mm mã ngun mbao gm các công ccho dòng vi điu khin AVR . WinAVR chy trên nn hđiu hành Windows, nó bao gm các công csau: - Trình biên dch avr-gcc, GNU GCC là trình biên dch C, C++ phát trin bi cng đồng mã ngun mGNU, avr-gcc phát trin riêng cho AVR. - Chương trình np chip avrdude. - Chương trình debugger avr-gdb.
10

CÙNG HỌC AVR - TaiLieu.VN

Feb 01, 2023

Download

Documents

Khang Minh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

CÙNG HỌC AVR AVR3– LẬP TRÌNH C CHO AVR: NGẮT VÀ TIMER/COUNTER

Thoả thuận: tài liệu này thuộc quyền sở hữu của tác giả, bạn có thể tự do tham khảo tài liệu nhưng không được phép sử dụng để in thành sách báo, đăng lên các diễn đàn hay website, nhưng bạn có thể dùng đường link http://www.dieukhientudong.net để hướng tới tài liệu. Liên hệ tác giả qua email: [email protected].

I. Bạn sẽ đi đến đâu. Đây là thứ 3 trong loạt bài cùng học AVR. Nếu bài 1 và bài 2 giới thiệu một cách chung nhất

về AVR thì kể từ bài 3 tôi sẽ giới thiệu lập trình điều khiển peripheral (thiết bị ngoại vi hay các chức năng mở rộng tích hợp sẵn trên các chip AVR). Do là các thiết bị ngoại vi mở rộng nên không phải tất cả các chip AVR đều có tất cả các thiết bị này, ví dụ chip AVR AT90S2313, AT90S8515 không có bộ chuyển đổi Analog-Digital (ADC) và giao tiếp TWI (I2C)…Tuy nhiên, các chip thuộc dòng Mega có khá nhiều thiết bị ngoại vi phục vụ cho các ứng dụng đo lường, điều khiển…Chúng ta sẽ tiếp tục sử dụng chip Atmega8 để khảo sát, trong quá trình khảo sát, nếu có sự khác biệt giữa Atmega8 và các chip mới hơn (như Atmega16, Atmega32, Atmega64, Atmega128…) tôi sẽ nói rõ để bạn rõ.

Một sự khác biệt lớn giữa AVR3 so với các bài viết trước là tôi sẽ hướng dẫn lập trình bằng C mà cụ thể là bằng AVR-GCC (được tích hợp trong WinAVR). Các bạn xem phần II để biết rõ hơn.

Sau bài này, tôi hy vọng bạn sẽ: - Cài đặt và sử dụng WinAVR, Programmer Notepad. - Hiểu được một số hàm cơ bản trong thư viện avr-libc. - Hiểu về INTERRUPT (ngắt), cách sử dụng ngắt bằng C và cả ASM. - Cải tiến ví dụ trong bài 2 bằng Interrupt.

II. WinAVR. Tại sao C: như tôi đã trình bày ở các bài học trước, khi bạn đã hiểu về AVR, để thực hiện

các ứng dụng, bạn có thể không nhất thiết phải luôn lập trình bằng ASM. Ngôn ngữ cấp cao như C sẽ giúp cho bạn xây dựng các ứng dụng nhanh chóng và dễ dàng hơn, tuy nhiên không vì thế mà bạn “quên” ASM, lập trình bằng C kết hợp ASM là giải pháp hay nhất. Một chú ý là chúng ta chỉ sử dụng C để đơn giản hóa lập trình tính toán, cấu trúc điều khiển…lập trình C cho AVR không có nghĩa là bạn không cần biết cấu trúc và cách thức hoạt động của chip!!!

Tại sao WinAVR: WinAVR (đọc là Whenever: theo tác giả của WinAVR) là một bộ phần mềm mã nguồn mở bao gồm các công cụ cho dòng vi điều khiển AVR . WinAVR chạy trên nền hệ điều hành Windows, nó bao gồm các công cụ sau:

- Trình biên dịch avr-gcc, GNU GCC là trình biên dịch C, C++ phát triển bởi cộng đồng mã nguồn mở GNU, avr-gcc phát triển riêng cho AVR.

- Chương trình nạp chip avrdude. - Chương trình debugger avr-gdb.

Page 2: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

- Programmer Notepad: trình biên tập code hỗ trợ nhiều ngôn ngữ như C, C++, CSS, HTML, Java,…

- MFile: tiện ích tạo các file Makefile dùng trong quá trình biên dịch code… Cốt lõi của WinAVR là trình biên dịch GNU GCC và thư viện avr-libc, đây là bộ công cụ

lập trình C miễn phí hoàn chỉnh duy nhất cho AVR. Có thể nói bộ công cụ này góp phần không nhỏ giúp cho chip AVR ngày càng trở nên phổ biến. WinAVR liên tục được cập nhật và hoàn thiện bởi rất nhiều người, nguồn tài liệu và chương trình mẫu viết bằng công cụ này là rất lớn…Đây là những lí do chính khiến tôi chọn WinAVR để giới thiệu với bạn.

Download và cài đặt: có 2 cách để bạn cài đặt bộ công cụ C cho AVR, cách thứ nhất, bạn download từng phần gồm binutils, gnu-gcc, avr-libc, và avrdude…rồi cài đặt (cách này thường được sử dụng trên hệ điều hành Linux…tôi sẽ giới thiệu trong 1 tài liệu khác) và cách thứ 2 là dùng WinAVR (dành cho windows). Bạn có thể download trực tiếp phiên bản mới nhất tại website chính thức của WinAVR: http://winavr.sourceforge.net/index.html. Quá trình cài đặt tương đối dễ dàng vì bạn có thể chỉ cần làm theo các lựa chọn mặc định. Sau khi cài đặt WinAVR vào máy (tôi giả sử thư mục cài đặt của bạn là C:\WinAVR) bạn sẽ có đầy đủ bộ công cụ từ IDE (Integrated Development Environment) để biên tập code, trình biên dịch, linker, chương trình nạp chip, tiện ích tạo Makefile…

Programmer Notepad (pn): Programmer Notpad là phần mềm môi trường phát triển tích hợp (IDE) miễn phí cho việc lập trình các ngôn ngữ như C, C++, CSS, HTML, Java,…Tuy giao diện của pn khá đơn giản nhưng đây là công cụ rất hoàn hảo và được tích hợp sẵn trong WinAVR, avr-gcc lugin được tích hợp sẵn trong pn cho WinAVR nên chúng ta có thể biên dịch code, download chương trình vào chip trực tiếp với pn. (có thể tham khảo thêm về pn tại website http://www.pnotepad.org/ ) (hey, bạn có thể viết code cho avr-gcc bằng AVRStudio, Eclipse IDE hay ngay cả với Windows Notepad…makes sense).

MFile: để biên dịch 1 chương trình bằng trình biên dịch gnu gcc, bạn cần 1 file tên là Makefile không có phần mở rộng, file này chứa thông tin cần thiết như thông tin về trình biên dịch, target (là các chip AVR trong trường hợp của chúng ta), trình nạp chip…MFile là tiện ích giúp chúng ta tạo các Makefile nhanh chóng và chinh xác. MFile được tích hợp sẵn trong WinAVR. III. Khởi động cùng Programmer Notepad (pn).

Sau khi cài đặt WinAVR, trên desktop của bạn có thể sẽ xuất hiện 2 icon của pn và MFile như trong hình 1.

Hình 1

Phần này chúng ta tìm hiểu cách viết một chương trình C trong pn thông qua 1 ví dụ đơn giản. Từ Desktop, hãy khởi động pn, lần đầu chạy pn bạn sẽ thấy giao diện của chương trình như trong hình 2.

Page 3: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Hình 2: giao diện pn.

Trước hết chúng ta hãy cài đặt thêm một số tính năng vào pn bao gồm chức năng tạo ra file coff (dùng mô phỏng với AVR Studio Simulator) và chức năng vừa biên dịch vừa nạp chip. Từ menu chính của pn, chọn menu “Tool > Option”, bạn sẽ thấy hộp thoại Option xuất hiện, hãy chọn mục Tool trong hộp thoại Option rồi nhấn button “Add” như trong hình 3.

Vùng Project File Editor

Kết quả biên dịch

Page 4: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Hình 3: Option cho pn.

Trong hộp thoại “New Tool Properties” hãy đặt các thông số như trong hình 4:

Hình 4: Add chức năng tạo file COFF cho pn.

Page 5: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Lặp lại các bước trên để add thêm chức năng vừa biên dịch vừa đổ chương trình vào pn (xem hình 5).

Hình 5: Add chức năng Make và Program cho pn.

Nhấn “OK” để kết thúc cài đặt, click vào menu Tools bạn sẽ thấy có 2 lệnh mới được add vào, chúng ta sẽ sử dụng chúng sau này.

Hình 6: Tools menu.

Khi add các chức năng mới vào pn, bạn chú ý 2 mục là command và parameters, command thì luôn là “make” vì đây chính là lệnh “đa năng” khi làm việc với trình biên dịch gnu-gcc.

Page 6: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Parameters là các thông số gởi kèm với lệnh make, như vậy khi bạn click vào 1 dòng lệnh mới tạo ra, pn sẽ yêu cầu trình dịch gcc thực hiện lệnh make với thông số mà bạn đã tạo.

Chúng ta đã sẵn sàng để viết ví dụ đầu tiên bằng WinAVR. Từ pn, chọn menu “File>New>Project” , bạn chọn nơi lưu Project của bạn (ví dụ C:\WinAVR\My Project) và hãy đặt tên cho Project của bạn là AVR1-gcc vì chúng ta sẽ viết lại ví dụ cho bài AVR1 bằng C.

Hãy type đoạn code sau vào của sổ “new” (phần bên phải trong pn)

//code 1 //file: main.c //Description: AVR1 by GCC, "Cung hoc AVR" Series #include <avr/io.h> #include <util/delay.h> unsigned char val=1; int main(void){ DDRB=0xFF; //set PORTB as output lines while(1){ PORTB=val; _delay_loop_2(65000); val*=2; if (!val) val=1; } return 0; }

Chọn “File>save” để lưu đoạn code trên thành 1 file có tên là main.c Trong vùng “Project” (phần bên trái), click phải vào Project “AVR1-gcc” rồi chọn “Add

Files”, hãy add file “main.c” vào Project của bạn. Hãy thử biên dịch Project của bạn bằng cách chọn menu “Tools>[WinAVR] Make All”,

quan sát vùng thông báo biên dịch (nằm ở phía dưới) bạn sẽ thấy thông báo như sau:

Nghĩa là có lỗi trong quá trình biên dịch, quá trình biên dịch thất bại vì “No rule to make

target ‘all’.” Lỗi này do Project của chúng ta không có file Makefile. Hãy tạo 1 file Makefile bằng tiện ích MFile.

Từ Desktop, chạy chương trình MFile, giao diện của MFile rất đơn giản như trong hình 7 (chú ý: chúng ta có thể thêm bớt các cài đặt cho MFile bằng cách chỉnh sửa file mfile.tcl trong thư mục cài đặt của WinAVR).

Page 7: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Hình 7: chương trình tiện ích MFile

Hãy chọn menu “Makefile>Main file name”, một hộp thoại nhỏ xuất hiện, điền tên file chính trong Project của bạn (trong trường hợp của chúng ta ở đây là “main”), nhấn “OK”. Tiếp tục chọn “Makefile > MCU type > ATmega > atmega8”. Đối với Project ví dụ này, chỉ cần set 2 tham số tên file và loại chip như trên là đủ, bạn chọn “File>save as” và lưu Makefile vào chung thư mục chứa Project (C:\WinAVR\My Project trong trường hợp của tôi). Bạn đã có thể tắt chương trình MFile.

Trở lại pn, chọn menu “Tools>[WinAVR] Make All” lần nữa để biên dịch, lần này bạn sẽ thấy thông báo cuối cùng là “>Process Exit code: 0”, biên dịch thành công. Vào thư mục chứa Project bạn sẽ thấy 1 file “main.hex” được tạo ra. Để thử nghiệm chức năng tạo file COFF mà bạn đã add vào pn, chọn “Tools > [WinAVR] Make COFF”, quay lại thư mục chứa Project bạn sẽ thấy 1 file mới “main.cof” được tạo.

Hãy tìm và copy file “AVR1.DSN” (file của phần mềm Proteus) trong bài học AVR1 vào thư mục Project của bạn, chạy AVR1.DSN với Proteus, đổi file program cho chip atmega8 thành main.hex (xem lại bài AVR1 nếu bạn quên cách thực hiện). Chạy mô phỏng để kiểm tra kết quả, nếu kết quả tương tự như trong AVR1, bạn đã thành công (<congrat ^.^). Lưu Project của bạn.

Như thế tôi đã giới thiệu cách hoạt động cùng với pn và MFile lập trình C cho AVR, phần tiếp theo chúng ta tìm hiểu một số điểm cơ bản về C cho AVR thông qua việc giải thích ví dụ trên.

Page 8: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

IV. C cho AVR. Tôi không có ý định nói về ngôn ngữ C ở đây nhưng chỉ giới thiệu một cách cơ bản nhất về

cách viết chương trình cho AVR bằng C. Để có thể hiểu và viết những chương trình phức tạp hơn, bạn cần tự trang bị kiến thức về C, tài liệu này sẽ không giúp bạn phần đó. Tuy nhiên, nếu bạn chưa tùng lập trình bằng C thì bạn cũng yên tâm đọc tài liệu này, vì ích ra tôi sẽ giải thích những gì tôi viết.

Một chương trình C cho AVR thường bao gồm các thành phần như: chú thích (comments), biểu thức (expressions), câu lệnh (statements), khối (blocks), toán tử, cấu trúc điều khiển (Flow controls), hàm (functions)…

Chú thích (comments): có 2 cách để tạo phần chú thích trong C là chú thích từng dòng bằng 2 dấu “//” như trong dòng đầu của đoạn ví dụ “//day la chu thich, khong duoc bien dich” hoặc chú thích block bằng cách kẹp block cần chú thích vào giữa /* ….*/ ví dụ:

/* Ban co the type bat ky chu thich nao trong block nay Ngay ca khi ban xuong dong Phan chu thich thuong co mau chu la green */ Tiền xử lí (preprocessor): là một tiện ích của ngôn ngữ C, các preprocessor được trình biên

dịch xử lí trước tất cả các phần khác, các preprocessor có chức năng tương tự các Directive trong ASM cho AVR.Các preprocessor được bắt đầu bằng dấu “#”, trong số các preprocessors trong ngôn ngữ C có hai preprocessors được sử dụng phổ biến nhất là #include và #define. Preprocessor #include chỉ định 1 file được đính kèm trong quá trình biên dịch (tương đương .INCLUDE trong ASM) và #define để định nghĩa 1 chuổi thay thế hoặc 1 macro. Xem các ví dụ sau:

#include <avr/io.h> :đính kèm nội dung file io.h trong lúc biên dịch (file io.h nằm trong thư mục con avr của thư mục include trong thư mục cài đặt của WinAVR).

#define max (a,b) ((a)>(b)? (a): (b)) : định nghĩa một macro tìm số lớn nhất trong 2 số a và b, trong chương trình nếu bạn gọi x=max(2,3) thì kết quả thu được x=3.

Biểu thức (Expressions): là 1 phần của các câu lệnh, biểu thức có thể bao gồm biến, toán tử, gọi hàm…, biểu thức trả về 1 giá trị đơn. Biểu thức không phải là 1 câu lệnh hoàn chỉnh. Ví dụ: PORTB=val.

Câu lệnh (Statement): thường là 1 dòng lệnh hoàn chỉnh, có thể bao gồm các keywords, biểu thức và các câu lệnh khác và được kết thúc bằng dấu “;”. Ví dụ: unsigned char val=1; val*=2; …là các câu lệnh.

Khối (Blocks): là sự kết hợp của nhiều câu lệnh để thực hiện chung 1 nhiệm vụ nào đó, khối được bao bởi 2 dấu mở khối “{“ và đóng khối “}”: ví dụ 1 khối:

while(1){ PORTB=val; _delay_loop_2(65000); val*=2; if (!val) val=1; }

Page 9: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Toán tử (Operators): là những ký hiệu báo cho trình biên dịch các nhiệm vụ cần thực hiện, các bảng bên dưới tóm tắt các toán tử C dùng cho lập trình AVR:

Bảng 1 các toán tử đại số: dùng thực hiện các phép toán đại số quen thuộc, trong đó đáng chú ý là các toán tử “++” (tăng thêm 1) và “--“ (bớt đi 1), chú ý phân biệt y=x++ và y=++x, ví dụ ta có x=3 trong khi y=x++ nghĩa là gán x cho y rồi sau đó tăng x thêm 1, điều này không ảnh hưởng đến y (cuối cùng y=3, x=4) trong khi y=++x nghĩa là tăng x trước rồi mới gán cho y (cuối cùng y=x=4), tương tự cho các trường hợp của toán tử “--“ .

Bảng 2 Toán tử truy cập và kích thức : toán tử [] thường được sử dụng khi bạn dùng mảng trong

lúc lập trình, phần tử thứ của mảng sẽ được truy xuất thông qua [i], chú ý mảng trong C bắt đầu từ 0.

Page 10: CÙNG HỌC AVR - TaiLieu.VN

AUTO.NLU

For more details and questions, contact me: [email protected]

Bảng 3 Toán tử Logic và quan hệ: thực hiện các phép so sánh và logic, thường được dùng làm điều kiện trong các cấu trúc điều khiển, chú ý toán tử so sánh bằng “==”, toán tử này khác với toán tử gán “=”, trong khi y = x nghĩa là lấy giá trị của x gán cho y thì (y== x) nghĩa là “nếu y bằng x”.

Bảng 4 Toán tử thao tác Bit (Bitwise operator): là các toán tử thực hiện trên từng bit nhị phân của

các con số, các toán tử dịch trái “<<” và “>>” rất thường được sử dụng khi sử lí số.

Bảng 5 các toán tử khác :là 1 số toán tử đặc biệt rất hay sử dụng nhưng chúng ta thường không để

ý vì vai trò của chúng rất dễ nhận thấy. Đặc biệt chú ý toán tử “?:” là 1 toán tử rất đặc biệt của C so với các ngôn ngữ lập trình khác, “?:” là toán tử 3 ngôi duy nhất có thể dùng thay thế cho cấu trúc “if” đơn giản.