Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 70 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
70
Dung lượng
1,82 MB
Nội dung
Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 1 Mở đầu Sau nhiều năm có mặt tại Việt Nam, hiện nay dòng vi điều khiển PIC vẫn thể hiện ưu thế của nó. Từ các ứng dụng nhỏ tới các ứng dụng lớn ta đều có thể chọn loại PIC phù hợp với ứng dụng của mình mà giá thành vẫn phù hợp. Ở Việt Nam hiện nay phát triển các ứng dụng thường sử dụng các trình biên dịch ngôn ngữ C cho vi điều khiển như CSS, Keil C compiler… Bởi vì lí do đơn giản là các hàm, các thư viện mà các trình dịch này cung cấp tương đối đầy đủ và khá dễ sử dụng. Tuy nhiên việc phát triển các trình ứng dụng lớn và mang tính chuyên nghiệp hơn thì các trình dịch này hầu như vẫn chưa mang lại. 1 đặc tính nữa là trình dịch này không phải do chính hãng sản xuất phần cứng Microchip cung cấp do vậy tính mới và tính chuyên nghiệp sẽ không được cao như chính do nhà sản xuất cung cấp. MPLAB là môi trường lập trình tích hợp do chính Microchip cung cấp, đi kèm với nó ngôn ngữ lập trình phù hợp với từng dòng vi điều khiển. Pic16 có ngôn ngữ C16, Pic 18 có ngôn ngữ C18, Pic 30 có C30…Theo tôi thấy các thư viện hàm, các ví dụ ứng dụng do Microchip cung cấp khá đầy đủ và chuyên nghiệp. Hiện nay việc phát triển các ứng dụng trên nền MPLAB ở nước ta vẫn chưa phổ biến. Với mong muốn góp 1 phần nhỏ và rút ngắn thời gian học tập của các bạn mới làm quen với môi trường này. Trong tài liệu này tôi xin giới thiệu những nét chính về ngôn ngữ C18 và các ứng dụng trên dòng Pic18 sử dụng ngôn ngữ này Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 2 Mc lc Phần I: Ngôn Ngữ C18 3 1. Kiểu dữ liệu và các giới hạn 3 2. Sự mở rộng của C18 9 3. #pragma sectiontype 11 4. #Pragma interruptlow và #Pragma interrupt 17 5. #Pragma tmpdata [section-name] 26 6. #pragma varlocate bank variable-name và #pragma varlocate "section- name" variable-name Error! Bookmark not defined. 7. #pragma config 31 8. Processor-Specific Header Files 33 9. Processor-Specific Register Definitions Files 37 Phần II: Lập trình PIC18 bằng MPLAB C18 38 1. Sử dụng MPLAB 38 1.1. Quản lí Project 38 1.2. Các bước tạo ra file.hex 40 1.3. Cửa sổ tiện ích sử dụng trong MPLAB 54 2. Ví dụ lập trình Pic18 bằng C18 55 2.1. I/O cơ bản và delay 56 2.2. RESET 63 2.3. Sleep 70 Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 3 Phần I: Ngôn Ngữ C18 Ngôn ngữ này được xây dựng trên nền ngôn ngữ C cơ sở. Chính vì vậy đối với những ai đã quen câu lệnh lập trình C rồi thì việc nắm bắt và sử dụng nó sẽ trở nên đơn giản hơn rất nhiều. 1. Kiểu dữ liệu và các giới hạn Giống như ngôn ngữ lập trình C cơ sở và các ngôn ngữ lập trình khác kiểu dữ liệu là cơ sở trong lập trình. C18 có các kiểu dữ liệu sau: • Kiểu số nguyên: bảng sau trình bày các kiểu số nguyên ( tên, độ rộng, giới hạn max-min )sử dụng trong C18 Kiểu char là kiểu mặc định trong C18 nếu ta ko khai báo kiểu dữ liệu phía trước. Hình 1.1 Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 4 • Kiểu dấu phảy động C18 hỗ trợ khai báo 2 kiểu dấu phảy động là float và double với chi tiết về độ động, giới hạn min-max ( hình 1.2) Ví dụ: ta khai báo Char var1; // độ rộng 8 bit Float var2 // độ rộng 32bit C18 lưu dữ liệu kiểu endianness Endianness là khái niệm cơ bản trong điện tử mà ta đã làm quen trong cấu trúc máy tính: nó có nghĩa là lưu những byte ít quan trọng nhất ở vùng địa chỉ thấp nhất, và ngược lại những byte quan trọng nhất thì ở vùng cao nhất. Ví dụ: trong trình dịch C18 ta có đoạn mã sau Hình 1.2 Hình 1.3 Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 5 Ta có thể thấy rằng biến l có byte DD thấp nhất thì được lưu vào trong vùng nhớ thấp nhất, byte AA cao nhất thì được lưu vào vùng nhớ cao nhất Các lớp của vùng lưu trữ MPLAB C18 hỗ trợ các lớp lưu trữ chuẩn ANSI như auto, extern, register, static và typedef. Chúng ra nhắc lại 1 chút về các chuẩn lưu trữ này: - Auto: là biến ở trong 1 hàm, tức là nó chỉ xuất hiện trong hàm, khi 1 hàm thực thi xong nó sẽ mất - Extern: là kiểu biến dùng chung cho ở những file khác nhau, tức là biến được khai báo kiểu extern trong file1.* có thể sử dụng trong file2.* khi trong file2.* có lệnh #include<file1.*> Ví dụ: File1.c: extern int x; // biến ‘x’ kiểu extern char c; function(int m) { int var; // biến auto } File2.c #include<file1.*> Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 6 …. x=1234; // sử dụng x mà ko cần khai báo lại - Register: khai báo này sẽ báo cho trình dịch biết biến được sử dụng nhiều và vì thế biến đó được lưu trong thanh ghi với mục đích làm truy cập dữ liệu nhanh. Khai báo này chỉ được sử dụng trong biến formal của hàm và biến auto, nếu khai báo biến extern dạng này thì trình dịch sẽ bỏ qua và coi như không có khai báo register register int x; // khai báo này trình dịch register char c; // sẽ coi như ko có khai báo register function(register unsigned m, register long n) // khai báo sử dụng trong biến formal { register int i; // khai báo sử dụng trong biến auto } - Static: là loại biến được cấp phát tĩnh. Nó khác với biến auto ở chỗ là lifetime (thời gian tồn tại) trong toàn bộ thời gian chạy của chương trình. Nhưng lại khác so với biến extern ở chỗ là nó được cấp phát tĩnh (allocated statically) còn biến extern được cấp phát động (allocated dynamically). Khái niệm cấp phát tĩnh và cấp phát động giống với khái niệm trong cấu trúc máy tính. Tôi xin nói qua để bạn dễ hình dung: Cấp phát tĩnh có nghĩa là biến đó được lưu trong bộ nhớ stack (ko phải bộ nhớ heap) và nó được cấp phát vùng nhớ trong khi biên dịch chương Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 7 trình, tức là biến đó được cấp phát vùng nhớ trước khi chương trình của ta được chạy. Còn ngược lại, cấp phát động thì biến được cấp phát bộ nhớ trong khi thực hiện chương trình. Để trực quan ta xem ví dụ: #include <stdio.h> void func() { static int x = 0; // x i s i n itial i zed only o nce across three calls of f u nc() printf("%d\n", x); // outpu ts the value of x x = x + 1; } int main(int argc, char * const argv[]) { func(); // p rints 0 func(); // p rints 1 func(); // p rints 2 return 0; /* nế u biế n ta khai báo x ko phả i là biế n static thì s ẽ hiể n thị lên màn hình là 0 0 0 chứ ko phả i là 0 1 2 như trên. Chỉ đơ n giả n vậ y thôi. Ta kế t thúc vấ n đề này ở đây*/ } Các bạn muốn chi tiết thêm về các khai báo và ý nghĩa vùng lưu trữ này có thể xem trong các sách lập trình C. Tôi thấy cuốn sách ‘C Programming Language’ của tác giả W.Kernighan & M.Ritchie viết rất hay, các bạn có thể download trên mạng hoặc tại đây. Ngoài các định nghĩa vùng lưu trữ chuẩn ở trên MPLAB còn cung cấp thêm 1 khai báo lưu trữ nữa là overlay. Kiểu này chỉ áp dụng khi trình dịch hoạt động trong chế độ Non-extended và chỉ áp dụng cho biến địa phương (biến auto). Như ở trên tôi trình bày phần biến static, vấn đề gặp phải của biến x là khi gọi lại hàm biến x giữ lại giá trị Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 8 được tính toán (tức là ko khởi tạo lại giá trị =0 khi gọi hàm) nhưng đôi khi ta không muốn điều đó, vì thế biến kiểu overlay chính là giải quyết vấn đề này. Tóm lại biến kiểu overlay là biến cấp phát tĩnh nhưng khi gọi hàm thì nó sẽ được khởi tạo lại. Ta xem ví dụ dưới sẽ hiểu rõ: void f (void) { overlay int x = 5; x++; /* ở đây biế n x đ ư ợ c cấ p p hát tĩnh như biế n x ở ví d ụ trên n hư ng sẽ đư ợ c khở i tạ o lạ i bằ ng 5 khi g ọ i lạ i h àm chứ ko giữ lạ i giá trị . Khá dễ hiể u, chún g ta kế t thúc vấ n đề này ở đây */ } Ta cũng có section ( đoạn dữ liệu lưu ở trong bộ nhớ) có thể khai báo đặc tính kiểu overlay . Tác dụng của khai báo này như thế nào tôi sẽ nhắc lại phía dưới. Đối số của hàm Đối số của hàm trong C18 có thể là lớp auto hoặc static. Mặc định là auto. Nếu là tham số static thì trình dịch phải hoạt động trong chế độ Non-extended Qualifiers vùng lưu trữ MPLAB C18 giới thiệu các qualifier far, near, rom, ram. Phạm vi và vùng nhớ dựa trên Qualifiers theo bảng sau: Rom Ram Far Mọi nơi trong bộ nhớ Mọi nơi trong bộ nhớ dữ liệu (mặc định) Near Trong bộ nhớ chương trình với địa chỉ nhỏ hơn 64k Trong bộ nhớ có thể truy cập Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 9 Ví dụ: Nếu ta khai báo: near ram char var_mta // có nghĩa là biến var-mta lưu trong bộ nhớ ram có thể truy cập được. Tới đây lại xuất hiện khái niệm mới về như thế nào là bộ nhớ có thể cập được và không thể. Để hiểu rõ khái niệm này các bạn có thể đọc trong cuốn PICmicro™ Mid-Range MCU Family Reference Manual. Có thể download tại đây. 2. Sự mở rộng của C18 C18 hỗ trợ các cấu trúc nặc danh bên trong các union. 1 cấu trúc nặc danh có dạng: 1 cấu trúc nặc danh định nghĩa 1 đối tượng không tên. Tên của các thành viên cấu trúc phải được phân biệt từ những tên khác nhau trong phạm vi cấu trúc được khai báo. Các thành viên được sử dụng trực tiếp trong phạm vi đó không có cú pháp truy cập cho các thành viên thông thường Tóm lại: ta có thể hiểu điều này giống như lập trình C thông thường ta có struct lồng vào trong union nhưng sự khác biệt là struct ở đây có thể nặc danh ( tức là ko tên). Việc truy cập tới các biến trong union như cấu trúc C thông thường. Thể hiện ở ví dụ sau: Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 10 Nhúng code assembly vào trong chương trình MPLAB C18 cung cấp trình dịch assembler sử dụng cú pháp giống với trình dịch assembler MPASM. Để sử dụng đoạn mã assem ta phải khai báo như sau: _asm [label:] [<instruction> [arg1[, arg2[, arg3]]]] _endasm Tuy nhiên do là mã assembly nhúng trong C cho nên nó có những điểm khác với trình dịch MPASM và giống với code C: • Các comment phải giống trong C: comment phải sau ‘//’ chứ ko phải là ‘;’ • Ko có mặc định toán hạng mà chúng phải ghi rõ trong lệnh, nếu ko khi dịch chương trình sẽ báo lỗi • Hệ số mặc định là cơ số 10 • Sử dụng các ký hiệu của C. ví dụ: số hexa phải được viết là 0x1234 chứ ko phải là H ‘1234’ như assem thông thường • Sau label có dấu ‘:’ [...]... (VĐK) giúp cho chương trình của chúng ta rẽ nhánh và thực hiện các công việc khác nhau, khi xảy ra ngắt VĐK con trỏ chương trình sẽ trỏ tới địa chỉ của chương trình ngắt tương ứng ( địa chỉ của chương trình ngắt tùy thuộc vào loại ngắt và loại VĐK, khi thực hiện lập trình với VĐK nào thì ta xem datasheet của nó là biết) và thực hiện chương trình ngắt được lưu ở đó, khi thực hiện chương trình ngắt xong nó... thời trong quá trình thực hiện chương trình Ví dụ với chương trình sau: Section kiểu temporary là dùng để lưu lại các biến trung gian trong quá trình tính toán, thực hiên chương trình và các biến tmp_1, tmp_2 trong chương trình là biến kiểu temporary Và section kiểu temporary là section có thể dùng chung giữa các hàm với nhau ( theo thuật ngữ của C18 đó chính là section ki ểu overlay mà tôi trình bày ở... section tôi sẽ nói rõ ở phần dưới : tên của section ( do người lập trình đặt) địa chỉ đầu tiên của section Tất cả thuộc tính, tên, địa chỉ của section có thể có hoặc ko (đặt trong dấu ngoặc vuông), nếu khi lập trình không chỉ rõ (specified) thì Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự trình dịch sẽ tự động làm thay Tôi sẽ trình bày chi tiết từng phần ở dưới Khai báo này sẽ gán đặc... trạng thái chương trình ngắt Tài nguyên có tính vulnerability trong thu ật ngữ của C18 chính là tài nguyên quản lí bởi trình dịch (compiler managed resource) Có nghĩa rằng là các tài nguyên này d ễ bị thay đổi trong khi thực hiện chương trình ngắt làm sai chương trình chính vì thế cần phải quản lí (với ý nghĩa như vậy theo tôi các loại tài nguyên này có thể gọi là tài nguyên được che bởi trình dịch – compiler... counter) { } #pragma tmpdata Trong chương trình ví dụ trên ta thấy 2 chương trình ngắt mức ưu tiên cao dùng chung section tpmdata tên là isr_tmp B ởi vì các chương trình ngắt mức ưu tiên cao ở 1 thời điểm chỉ có thể kích hoạt 1 chương trình Ta tưởng tượng rằng nếu ko có đặc tính này khi ngắt isr1 xảy ra và chương trình phục vụ ngắt của nó đang thực hiện, chương trình isr1() chạy vẫn chưa xong thì ngắt... hiện xong isr2() chương trình quay lại thực hiện isr1() và sử dụng các giá trị trong section ‘isr_tmp’ đã bị thay đổi chương trình isr1() thực hiện không chính xác Vậy với ngắt có mức ưu tiên khác nhau ở trong cùng 1 chương trình mà chương trình ngắt ở mức ưu tiên thấp hơn thì chúng ta phải xử lí như thế nào để đảm bảo chương trình vẫn tận dụng được tài nguyên và chức năng chương trình vẫn được đảm bảo... những tính toán trung gian Giả sử khi đang thực hiện chương trình chính mà xảy ra ngắt mà ta ko tiến hành lưu lại WREG thì chương trình ngắt sẽ thay đổi giá trị trong tài nguyên này Vậy khi thực hiện xong chương trình ngắt Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự mà trở lại thực hiện chương trình main thì khi chương trình main đọc các dữ liệu trong này ra để thực hiện tính toán... thanh ghi WREG, BSR, STATUS, TBLPTR và TABLAT Vì thế trình dịch sẽ tự động lưu các thanh ghi này và cũng chỉ lưu các thanh ghi này Trong chương trình thứ 2, có gọi hàm khác vì thế trình dịch không biết rằng nó đang và sẽ sửa cái gì trong hàm foo Trong thực tế hàm foo có thể là module riêng rẽ Bởi vậy trình dịch lưu tất cả tài nguyên quản lí bởi trình dịch (compiler managed resources) Với cơ chế hoạt... toán tiếp sẽ là những dữ liệu sai Do vậy kết quả cuối cùng là chương trình của chúng ta thực hiện sai Vậy cách giải quyết cho vấn đề này là như thế nào? Ta có thể ngay rằng muốn chương trình ngắt ISR không làm thay đổi giá trị các section tmpdata gốc của chương trình chính thì ta phải có section tmpdata riêng cho nó Mà như tôi đ ã trình bày ở trên khai báo #pragma interrupt sẽ tự động tạo ra section... thái chương trình ngắt) sử dụng [ save-list] Cú pháp: #pragma interrupt isr save=myint, section("mydata") biế n ‘ myint’ và section có tên là’mydata’ // lệ nh này sẽ lư u Ok, câu hỏi đặt ra cho chúng ta là tại sao lại phải lưu trạng thái chương trình ngắt? Và câu hỏi đầu tiên sẽ là trạng thái chương trình ngắt là gì? Trong khoa học máy tính, context đồng nghĩa với trạng thái (state) của chương trình Nhiều . giới hạn Giống như ngôn ngữ lập trình C cơ sở và các ngôn ngữ lập trình khác kiểu dữ liệu là cơ sở trong lập trình. C18 có các kiểu dữ liệu sau: • Kiểu số nguyên: bảng sau trình bày các kiểu. cấp. MPLAB là môi trường lập trình tích hợp do chính Microchip cung cấp, đi kèm với nó ngôn ngữ lập trình phù hợp với từng dòng vi điều khiển. Pic16 có ngôn ngữ C16, Pic 18 có ngôn ngữ C18, Pic 30 có C30…Theo. Học viện kỹ thuật quân sự 3 Phần I: Ngôn Ngữ C18 Ngôn ngữ này được xây dựng trên nền ngôn ngữ C cơ sở. Chính vì vậy đối với những ai đã quen câu lệnh lập trình C rồi thì việc nắm bắt và sử dụng