YOMEDIA
ADSENSE
Ngôn ngữ lập trình Matlap
138
lượt xem 41
download
lượt xem 41
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Tham khảo tài liệu 'ngôn ngữ lập trình matlap', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Ngôn ngữ lập trình Matlap
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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ươn g đ ố 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 1
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự Mục lục Ph ầ n I: Ngôn Ng ữ C18 ........................................................................................................................ 3 Ki ể u d ữ li ệ u và các gi ớ i h ạ n ................................................................................................. 3 1. S ự m ở r ộ ng c ủ a C18 ................................................................................................................. 9 2. #pragma s ectiontype ............................................................................................................... 11 3. #Pragma interruptlow và #Pragma interrupt ............................................................. 17 4. #Pragma tmpdata [se ction - name] .................................................................................... 26 5. 6. #pragma varloc ate bank variable - name và #pragma varlocate "section - name" variable - name ........................................................................Error! Bookmark not defined. #pragma conf ig ........................................................................................................................ 31 7. Processor - Specif ic Header Files ....................................................................................... 33 8. Processor-Specific Register Definitions Files ............................................................................. 37 9. Ph ầ n II: L ậ p trình PI C18 b ằ ng MPLAB C18 .................................................................... 38 S ử d ụ ng MPLAB ...................................................................................................................... 38 1. Qu ả n lí Project ................................................................................................................. 38 1.1. Các bư ớ c t ạ o ra f ile.he x ............................................................................................... 40 1.2. C ử a s ổ ti ệ n ích s ử d ụ ng tro ng MPLAB .................................................................. 54 1.3. Ví d ụ l ậ p trình Pic18 b ằ ng C18 ........................................................................................ 55 2. I/O cơ b ả n và delay ........................................................................................................ 56 2.1. RES ET ................................................................................................................................. 63 2.2. Sleep ..................................................................................................................................... 70 2.3. 2
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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 C 18 Hình 1.1 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. 3
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự • 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) 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.3 4
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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 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 5
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự …. 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 6
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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 qu an ta xem ví d ụ : #include void func() { static int x = 0; // x is initialized only once across three calls of func() printf("%d\n", x); // outputs the value of x x = x + 1; } int main(int argc, char * const argv[]) { func(); // prints 0 func(); // prints 1 func(); // prints 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 ị 7
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự đư ợ 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 kh i 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 phát tĩnh như biến x ở ví dụ trên như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úng 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 M ọ i nơi trong b ộ nh ớ d ữ Far M ọ i nơi trong b ộ nh ớ li ệ u (m ặ c đ ị nh) Trong b ộ nh ớ chương tr ình v ớ i đ ị a Trong b ộ nh ớ có th ể truy Near ch ỉ nh ỏ hơn 64k cập 8
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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: 9
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 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:] [ [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 ‘:’ 10
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự • Cú pháp đ ị nh đ ị a ch ỉ theo ch ỉ s ố không đư ợ c h ỗ tr ợ ở đây ( ngh ĩa là không đư ợ c dùng []) mà ph ả i ch ỉ rõ bi t truy c ậ p. Ví d ụ như assem thư ờ ng ta vi ế t CLRF[2] nhưng gi ờ ph ả i vi ế t CLRF 2,0 Cú pháp và t ấ t c ả các lu ậ t nhúng code assem trong code C v ừ a trình bày ở trên đư ợ c th ể hi ệ n ở ví d ụ sau: _asm /* User assembly code */ MOVLW 10 // Move decimal 10 to count MOVWF count, 0 /* Loop until count is 0 */ start: DECFSZ count, 1, 0 GOTO done BRA start done: _endasm 3. #pragma sectiontype Cú pháp: # pragma udata [attribute-list] [section-name [=address]] # pragma idata | [attribute-list] [section-name [=address]] # pragma romdata [ overlay ] [ s e c t i o n - n a m e [ = a d d r e s s ] ] | # pragma code [ overlay ] [ s e c t i o n - n a m e [ = a d d r e s s ] ] | Trong đó: : là thu ộc tính của section tôi sẽ nói r õ ở phần d ư ới [attribute-list] : tên c ủa section ( do ng ư ời lập tr ình đ ặt) section-name đ ịa chỉ đầu ti ên c ủa section [=address]: 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ì 11
- 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 tha y. 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 tính và đ ị a ch ỉ cho section (đo ạ n). Trong ph ầ n này tôi xin đư ợ c gi ữ nguyên thu ậ t ng ữ section (ch ỉ vì lí do d ị ch sang ‘đo ạ n’ nghe hơi chu ố i). 1 section là 1 ph ầ n c ủ a ứ ng d ụ ng đ ặ t t ạ i đ ị a ch ỉ b ộ nh ớ nào đó. 1 section có th ể ch ứ a code ho ặ c data và có th ể đư ợ c đ ặ t trong b ộ nh ớ chương tr ình ho ặ c b ộ nh ớ d ữ li ệ u. Có 2 ki ể u section cho m ỗ i ki ể u b ộ nh ớ : • B ộ nh ớ chương tr ình - code : ch ứ a các l ệ nh có th ể th ự c thi - romdata : ch ứ a các bi ế n và h ằ ng ( các bi ế n đư ợ c khai báo v ớ i qualifier rom ) • B ộ nh ớ d ữ li ệ u - udata : ch ứ a các bi ế n user c ấ p phát t ĩnh, ko đ ư ợ c kh ở i t ạ o - idata : ch ứ a các bi ế n user c ấ p phát t ĩnh v à đư ợ c kh ở i t ạ o 1 section absolute là section có đ ị a ch ỉ rõ ràng thông qua khai báo =address . 1 section assigned đư ợ c gán là section đ ặ c trưng v ớ i khai báo SECTION 1 section unassigned không ph ả i là section absolute và assigned Nghe có v ẻ khó hi ể u. Ví d ụ sau th ể hi ệ n các đ ố i tư ợ ng đư ợ c đ ặ t trong b ộ nh ớ như th ế nào đ ể b ạ n có th ể hi ể u đư ợ c s ự khác nhau c ủ a cá c đo ạ n d ữ li ệ u : 12
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự rom int ri; // rõ ràng biến ri phải được lưu trong vùng nhớ rom. Cụ thể romdata //vì nó ko phải là code có thể chạy. tương tự ta có bảng dưới rom char rc = 'A'; int ui; char uc; int ii = 0; char ic = 'A'; void foobar (void) { static rom int foobar_ri; static rom char foobar_rc = 'Z'; ... } void foo (void) { static int foo_ui; static char foo_uc; ... } void bar (void) { static int bar_ii = 5; static char bar_ic = 'Z'; ... } V ớ i đo ạ n chương tr ình trên thì các bi ế n đư ợ c lưu trong b ộ nh ớ như th ế nào. Ta có b ả ng các đ ố i tư ợ ng (các bi ế n, bi ế n hàm..) đư ợ c lưu tr ữ trong b ộ nh ớ tương ứ ng: Đ ố i tư ợ ng Vùng nh ớ Đ ố i tư ợ ng Vùng nh ớ ri romdata ui udata rc romdata uc udata roobar_ri romdata foo_ui udata roobar_rc romdata foo_uc udata 13
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự ii idata bar_ic idata ic idata foo code bar_ii idata bar code T ớ i đây ta có th ể hi ể u đư ợ c các ki ể u b ộ nh ớ c ủ a Pic18 mà ta có th ể ch ủ đ ộ ng lưu tr ữ d ữ li ệ u vào trong đó qua các khai báo như trên. Khá là m ệ t khi ta ph ả i n ắ m ch ắ c đư ợ c nh ữ ng đi ề u này, v ớ i nh ữ ng chương tr ình nh ỏ đôi khi đi ề u đó là không c ầ n thi ế t nhưng th ự c hi ệ n nh ữ ng project l ớ n thì đi ề u đó là c ầ n thi ế t và nh ấ t là n ắ m đư ợ c nh ữ ng đi ề u này m ớ i hi ể u đư ợ c các đo ạ n mã g ố c mà Microchip cung c ấ p cho chúng ta vì th ế m ớ i s ử d ụ ng đư ợ c t ố t. OK, let’s go… • Các section m ặ c đ ị nh ở trên ph ầ n khai báo #pragma tôi có nói tên section có th ể ko đư ợ c khai báo b ở i ngư ờ i l ậ p trình. N ế u đi ề u đó x ả y ra trình d ị ch s ẽ t ự đ ộ ng đ ặ t tên cho section ph ụ thu ộ c vào đó là ki ể u section nào theo b ả ng sau: Ki ể u section Tên m ặ c đ ị nh code .code_ filename romdata .romdata_ filename udata .udata_ filename idata .idata_ filename filename : là tên file c ủ a ta Ví d ụ : n ế u tên file chương tr ình c ủ a ta là first_pro và ki ể u section là code thì đo ạ n m ặ c đinh s ẽ có tên là .code_first_pro 14
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự • Thu ộ c tính (attribute) c ủ a section Thu ộ c tính c ủ a section g ồ m có access và overlay access : báo cho trình d ị ch bi ế t r ằ ng section đư ợ c đ ặ t trong vùng có th ể truy c ậ p c ủ a b ộ nh ớ d ữ li ệ u ( xem chi ti ế t v ề như th ế nào là b ộ nh ớ có th ể truy c ậ p trong PIC 18C MCU Family Reference Manual ). Bi ế n đ ặ t trong access section ph ả i đư ợ c khai báo v ớ i t ừ khóa near . Ví d ụ : #pragma udata access my_access /* all accesses to these will be unbanked */ near unsigned char av1, av2; overlay: là thu ộ c tính cho phép section khác đư ợ c đ ặ t t ạ i cùng đ ị a ch ỉ v ậ t lí . Thu ộ c tính này có th ể s ử d ụ ng cùng v ớ i thu ộ c tính access . Có 4 đi ề u ki ệ n ph ả i th ỏ a mãn đ ể có th ể overlay: 1. M ỗ i section ph ả i đư ợ c đ ặ t trong file ngu ồ n khác nhau 2. C ả 2 section ph ả i có tên gi ố ng nhau 3. N ế u đo ạ n 1 đư ợ c khai báo có thu ộ c tính access thì đo ạ n 2 c ũng ph ả i khai báo thu ộ c tính này 4. N ế u gán đ ị a ch ỉ tuy ệ t đ ố i cho 1 section, thì section còn l ạ i c ũng ph ả i gán đ ị a ch ỉ tuy ệ t đ ố i đó Ví d ụ : f il e1 . c: #pragma code overlay my_overlay_scn=0x1000 void f (void) { ... 15
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự } f il e2 . c: #pragma code overlay my_overlay_scn=0x1000 void g (void) { ... } Ho ặ c nó c ũng s ử d ụ ng cho nhi ề u bi ế n mà ko bao gi ờ đư ợ c kích ho ạ t đ ồ ng th ờ i: f il e1 . c: #pragma udata overlay my_overlay_data=0x1fc /* 2 bytes will be located at 0x1fc and 0x1fe */ int int_var1, int_var2; f il e2 . c: #pragma udata overlay my_overlay_data=0x1fc /* 4 bytes will be located at 0x1fc */ long long_var; Đ ể có thêm thông tin v ề đi ề u khi ể n section overlay b ạ n có th ể xem thêm trong MPA S M™ As s em b l er , MP LI N K™ O b jec t L i nk e r , MP LI B™ O b j ec t L ibr ar i an Us er 's G u id e (DS33014) . (nhưng th ự c s ự là khá khoai) • address c ủ a section đ ị a ch ỉ đư ợ c gán s ẽ là nơi lưu tr ữ đo ạ n mã. #pragma code my_code=0x2000 /* đo ạ n mã này s ẽ đư ợ c lưu ở đ ị a ch ỉ 0x 2000 cho t ớ i khi g ặ p ti ề n x ử lí bên dư ớ i ……………………… */ #pragma code 16
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự 4. #Pragma interruptlow và #Pragma interrupt Ng ắ t là 1 ph ầ n quan tr ọ ng trong vi đi ề u khi ể n (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ó s ẽ tr ở l ạ i th ự c hi ệ n chương tr ình main() t ạ i đ ị a ch ỉ lúc nó d ừ ng l ạ i ( đ ị a ch ỉ này đư ợ c lưu trong stack) . V ậ y ta s ẽ xem xét cách khai báo , khai báo m ứ c ưu và th ự c hi ệ n chương tr ình ng ắ t trong C18 như th ế nào, go on…. start Địa chỉ Địa chỉ xảy vector ngắt ra ngắt kết thúc ngắt end Lưu đồ thực hiện ngắt #Pragma interrupt fname : khai báo hàm ph ụ c v ụ ng ắ t m ứ c ưu tiên cao (high - priority ISR) 17
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự #Pragma interruptlow fname : khai báo chương tr ình ph ụ c v ụ ng ắ t m ứ c ưu tiên th ấ p(low - priority ISR) • Cú pháp khai báo : # pragma interrupt [ t m p - s e c t i on - n a me ] [ save= sa v e - f un c t i o n - n a m e l i st ] [ nosave= n o s a v e - l i s t ] # pragma interruptlow | fu n c t i o n - n a m e [ t m p - s e ct i o n - n a me ] [ save= sa v e l i s t ][ nosave= n os a v e - l is t ] Trong đó: : là tên hàm ph ụ c v ụ ng ắ t function - name tên section trong đó ch ứ a các bi ế n ki ể u [ tmp - section - name ]: temporary c ủ a ISR [ sav e= s a v e - li s t ] : S ử d ụ ng đ ể lưu các bi ế n, các section. Trong đó là danh sách các bi ế n, các section đư ợ c lưu. s a ve - l i s t [ nosav e= no s a v e - l i s t ] : s ử d ụ ng đ ể ch ỉ r ằ ng compiler ko c ầ n lưu các bi ế n, các section. là danh sách các bi ế n, các section ko c ầ n n o sa v e - l is t lưu Ta s ẽ tìm hi ể u d ầ n d ầ n chi ti ế t t ừ ng đ ố i tư ợ ng ở phía dư ớ i. V ớ i k hai báo này trình d ị ch s ẽ t ạ o ra bi ế n ki ể u temporary (th ế nào là bi ế n, section ki ể u temporaty tôi s ẽ ch ỉ rõ phía d ư ớ i ) trong udata section có tên là fname_tmp . Ví d ụ : void foo(void); ... #pragma interrupt foo void foo(void) { /* perform interrupt function here */ 18
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự } V ớ i chương tr ình này các bi ế n giành cho chương tr ình ng ắ t s ẽ đư ợ c đ ặ t ở trong udata section có tên là foo_tmp . • Vector ng ắ t MPLAB C18 ko t ự đ ộ ng đ ặ t ISR t ạ i vector ng ắ t. Thông thư ờ ng là dùng l ệ nh Goto đ ặ t t ạ i vector ng ắ t đ ể g ọ i ISR. Ví d ụ : #include void low_isr(void); // khai báo chương trình phục vụ ngắt void high_isr(void); // như chương trình bình thường /* Giả sử ta làm việc với loai Pic18 mà loại ngắt có địa chỉ vector ngắt là 0x18. Như tôi đã nói ở phần trên, vector ngắt này tùy vào loại ngắt và loại VĐK, vì thế khi làm việc với VĐK nào bạn tra trong datasheet */ #pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm GOTO low_isr _endasm } #pragma code /* trả lại code section mặc định */ #pragma interruptlow low_isr void low_isr (void) { /* ... */ } /* Giả sử ta làm việc với loai Pic18 mà loại ngắt có địa chỉ vector ngắt là 0x08 */ #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code /* trả lại code section mặc định */ 19
- Nguyễn Văn Hùng Hung.rocket42@gmail.com Học viện kỹ thuật quân sự #pragma interrupt high_isr void high_isr (void) { /* ... */ } Như tôi đ ã nói ở trên bi ế n, section ki ể u temporary (nh ấ t th ờ i) t ứ c là nó ch ỉ xu ấ t hi ệ n nh ấ t 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 ở trên). 20
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn