1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Tutorial n doc

19 271 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 191,98 KB

Nội dung

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 1/19 Tutorial n o 02.01 Gửi đến: Đoàn Hiệp, www.picvietnam.com Nội dung: Chương trình hợp ngữ hiển thị LED với dsPIC MICROSOFT WORD Tóm tắt: Hướng dẫn viết chương trình hợp ngữ hiển thị LED cho dsPIC: Khung cơ bản của một chương trình hợp ngữ cho dsPIC, một số lệnh và thao tác cơ bản. 1. Giới thiệu Thông qua các ví dụ về hiển thị LED, bộ khung cơ bản của chương trình hợp ngữ cho dsPIC cùng với một số lệnh và thao tác cơ bản của dsPIC được phân tích. Khung cơ bản sẽ giới thiệu các phần như: thông tin cơ bản, lệnh gộp (include), đặt cấu hình cho chip, khai báo hằng số, khai báo điểm bắt đầu chương trình, chương trình con, chương trình xử lý ngắt. Các lệnh được giới thiệu (không đầy đủ) thuộc các nhóm: lệnh sao chép dữ liệu, lệnh số học, lệnh luận lý, lệnh dịch/xoay, lệnh thao tác bit, lệnh so sánh, lệnh chuyển điều khiển. Thao tác truy xuất cổng, cài đặt và kích hoạt bộ định thời (timer), cũng như các thao tác thiết lập ngăn xếp (stack) sẽ được đề cập. Ngoài ra, một số kiểu định vị cũng sẽ được nói đến. 2. Các quy ước trong tài liệu Mô tả Biểu thị Ví dụ Font Palatino Linotype: In nghiêng Tài liệu tham khảo dsPIC30F/33F Programmer’s Reference Manual Viết hoa chữ đầu Chọn một menu chọn Project Wizard Đặt trong dấu nháy kép Một tên trường trong cửa sổ hay hộp thoại “Save project before build” Một nút nhấn Nhấn Next In đậm Một nhãn Chọn nhãn Power Văn bản giữa các dấu ngoặc nhọn < > Một phím trên bàn phím Nhấn <Enter>, <F1> Font Courier: Courier thường Mã nguồn mov #0x8010, W0 Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 2/19 Từ khóa blcr, bra Tên tập tin, đường dẫn D:\Microchip\ Tùy chọn ở dòng lệnh pic30-as –-version 3. Các ví dụ về LED Trước khi bắt đầu theo dõi các ví dụ, bạn hãy chép các tập tin nguồn đã được đính kèm vào một thư mục nào đó mà bạn sẽ dùng để tạo ra project “Vidu2”. 3.1. Ví dụ 2-1 Bạn hãy làm theo các bước như trong tutorial 1 để tạo một project có tên là “Vidu2”, bạn thêm vào project tập tin nguồn “Vidu2-1.s” (được đính kèm) và kịch bản liên kết “p30f4012.gld”. Sau khi hoàn tất việc tạo project, cửa sổ cây quản lý tập tin của project hẳn sẽ trông giống như hình minh họa dưới đây. Hình 3.1: Cây quản lý tập tin của project Vidu2 Vì đây là tutorial thứ hai nên các ví dụ được đặt tên bắt đầu bằng “Vidu2”, nhưng “Vidu2-1.s” thực chất là “Vidu.s” đã được giới thiệu trong tutorial 1. Trong ví dụ này, một chương trình đơn giản sẽ thực hiện việc làm nhấp nháy một LED nối vào chân RD0 của dsPIC. Tôi giả thiết rằng bạn biết cách nối một LED vào chân RD0 của dsPIC trên mạch thử nghiệm của bạn, một khi bạn đọc tài liệu này (tất nhiên các chân nguồn và chân MCLR cần phải được kết nối thích hợp, chương trình ví dụ sẽ sử dụng bộ dao động nội của dsPIC, do đó không cần có mạch tạo dao động để cấp xung clock ở bên ngoài). Để tiện theo dõi, chương trình nguồn “Vidu2-1.s” được liệt kê dưới đây, với một số phần chú thích được cắt bỏ cho thuận tiện. Liệt kê mã nguồn “Vidu2-1.s”: 1 .equ __30F4012, 1 2 .include "p30fxxxx.inc" 3 config __FOSC, CSW_FSCM_OFF & FRC_PLL4 4 config __FWDT, WDT_OFF 5 config __FBORPOR, MCLR_EN & PBOR_OFF Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 3/19 6 config __FGS, CODE_PROT_OFF ;--------------------------------------------------------------- ;Cac hang so (gia tri tuc thoi) cua chuong trinh 7 .equiv LED, 0 ;LED noi vao RD0 ;--------------------------------------------------------------- ;Cac khai bao toan cuc 8 .global __reset ;Khai bao nhan bat dau chuong trinh (bat buoc) 9 .global __T1Interrupt ;Khai bao toan cuc c/t xu ly ngat Timer 1 ;--------------------------------------------------------------- ;Doan ma trong vung nho chuong trinh 10 .text ;Bat dau doan ma chuong trinh __reset: 11 mov #__SP_init, W15 ;Khoi tao con tro ngan xep (stack) 12 mov #__SPLIM_init, W0 13 mov W0, SPLIM ;Khoi tao thanh ghi gioi han con tro (stack) 14 nop ;Can mot lenh NOP sau khi ghi vao SPLIM 15 clr W0 ;Xoa thanh ghi lam viec W0 16 mov W0, W14 ;Xoa cac thanh ghi W1 den W14 17 repeat #12 18 mov W0,[++W14] ;Dia chi cua cac thanh ghi: 0x0002 - 0x001C 19 clr W14 ;--------------------------------------------------------------- 20 rcall Init_PORTS ;Khoi tao cac cong I/O 21 rcall Init_TMR1 ;Khoi tao cho TMR1 (tran moi 0,5 giay) main_loop: 22 nop 23 nop 24 bra main_loop ;Vong lap chinh, khong lam gi ca, chi cho ngat ;--------------------------------------------------------------- ;Chuong trinh con khoi tao TMR1 ;TMR1 duoc khoi tao de tran sau moi 0,5 giay tai muc xung 5 Mips ; (fcy = 5 MHz) ;--------------------------------------------------------------- Init_TMR1: 25 clr TMR1 26 mov #0x9894, W0 ;TMR1 tran moi 0,5 giay 27 mov W0, PR1 ;Dat nguong tran vao PR1 28 bclr IFS0, #T1IF ;Xoa co ngat cua TMR1 29 mov #0x8020, W0 ;TMR1 dung fcy lam clock, prescale la 1:64, 30 mov W0, T1CON ;va khoi dong TMR1 31 bset IEC0, #T1IE ;cho phep ngat khi TMR1 tran 32 return ;--------------------------------------------------------------- ;Chuong trinh con khoi tao cac cong I/O, de noi voi LED ;--------------------------------------------------------------- Init_PORTS: 33 clr LATD ;Xoa thanh ghi chot cho cong D 34 mov #0xFFFE, W0 ;LED noi vao cong D, chan RD0 35 mov W0, TRISD 36 return ;--------------------------------------------------------------- Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 4/19 ;Trinh phuc vu ngat cho TMR1 ;Moi 0,5 giay ngat nay duoc thuc thi. No se lat trang thai (toggle) ;cua LED noi vao chan RD0 ;--------------------------------------------------------------- __T1Interrupt: ;Ten nay da duoc dinh nghia truoc trong tap tin ;lien ket 37 bclr IFS0, #T1IF ;Xoa co ngat 38 btg PORTD, #LED ;Lat trang thai LED 39 retfie ;Tro ve tu ngat ;--------------------------------------------------------------- 40 .end ;Ket thuc phan ma trong tap tin nay Ở đây các dòng lệnh được đánh số để thuận tiện cho việc giải thích, và các con số này không nên xuất hiện trong chương trình thực của bạn (hay nói cách khác, bạn không nên đánh số giống như vậy trong chương trình của bạn). Trước khi thực sự viết bất kỳ một dòng lệnh nào, bạn nên dành thời gian mô tả các thông tin về chương trình trong phần khung thông tin ở đầu tập tin nguồn. Các chương trình ví dụ ở đây chỉ là mẫu rút gọn, mẫu chính thức sẽ được chúng tôi cung cấp sau khi đã chuẩn hóa xong. Dòng 1 và 2 sẽ thực hiện việc gộp tập tin tương ứng với chip được định nghĩa vào tập tin nguồn. Bạn có thể chỉ dùng một lệnh .inc để gộp tập tin “p30f4012.inc” dành cho dsPIC đang được dùng, ở đây chỉ đơn giản là giới thiệu một cách khác để gộp tập tin vào tập tin nguồn. Tập tin gộp (include) chứa các định nghĩa của các thanh ghi, các bit trong các thanh ghi, và các hằng số khác được sử dụng trong chương trình, chẳng hạn như các fuse trong các word cấu hình. Như bạn sẽ thấy dọc theo chiều dài của chương trình, các dẫn hướng (directive) của ASM30 thường bắt đầu bằng một dấu chấm, khác với đa số các dẫn hướng của MPASM (dành cho các dòng PIC 8-bit). Dòng 3 đến dòng 6 đặt các word cấu hình cho chip. Chúng ta xét một lệnh đặt cấu hình tiêu biểu dưới đây. config __FOSC, CSW_FSCM_OFF & FRC_PLL4 config là một macro được định nghĩa sẵn trong tập tin gộp, dùng để đặt giá trị cho các từ cấu hình một cách thuận tiện. Sau đó chúng ta dùng tên của word cấu hình, rồi đến dấu phẩy, sau đó là các bit hay các nhóm bit được tập hợp lại thông qua phép toán logic AND. Các hằng số này được định nghĩa trong tập tin gộp, như đã nói. Nếu bạn cảm thấy khó khăn trong việc nhớ các hằng số này, có một cách đơn giản hơn (được chính hãng Microchip khuyên dùng) là mở tập tin gộp của chip đang được dùng (ở đây là “p30f4012.inc”) và chép các lệnh đặt cấu hình mà bạn mong muốn vào tập tin nguồn của bạn. Các lệnh đặt cấu hình hợp lệ đã được tạo ra sẵn trong tập tin gộp, bạn chỉ cần chép vào và gỡ bỏ chú thích (uncomment). Như vậy lệnh đặt cấu hình ở trên tắt các chức năng chuyển xung clock (Clock Switching) Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 5/19 và giám sát sự cố clock (Fail-Safe Clock Monitor), đồng thời cấu hình chip dùng bộ dao động nội tốc độ cao (FRC) với PLLx4 được kích hoạt. Dòng 7 là một ví dụ về cách khai báo hằng dùng chỉ dẫn .equiv. Điểm khác biệt giữa .equiv và .equ là .equiv sẽ đưa ra thông báo lỗi nếu hằng số đã được định nghĩa trước đó, trong khi .equ sẽ định nghĩa lại hằng số và không báo lỗi. Dòng 8 và 9 là các khai báo toàn cục cho các đoạn chương trình xử lý reset và ngắt timer 1. Cần lưu ý là khai báo cho đoạn chương trình xử lý reset là bắt buộc, vì nó dùng để định nghĩa điểm bắt đầu chương trình (là nơi mà bộ xử lý sẽ nhảy đến thực thi sau khi thoát khỏi trạng thái reset). Các tên như __reset, __T1Interrupt đã được định nghĩa sẵn trong tập tin liên kết (ở đây là “p30f4012.gld”). Bạn chú ý là các tên này được bắt đầu bằng hai dấu gạch dưới (underscore) liên tiếp (để tương thích với trình biên dịch C). __reset là nhãn bắt đầu chương trình chính, còn __T1Interrupt là nhãn của chương trình xử lý ngắt timer 1. (Thực tế thì bạn vẫn có thể dùng tên khác cho các phần này, nhưng bạn sẽ phải mô tả nó trong tập tin kịch bản liên kết, mà tôi sẽ không đề cập đến trong tutorial này. Do đó, tạm thời chúng ta xem như đây là những tên bắt buộc phải dùng để đảm bảo chương trình hoạt động như dự định). Chương trình chính gồm các lệnh từ dòng 10 đến dòng 24. Tại dòng 10 là một khai báo bắt đầu một đoạn mã thuộc bộ nhớ chương trình, .text là một đoạn đã được định nghĩa trước đối với trình hợp dịch ASM30. Tương tự, bạn sẽ dùng .bss cho đoạn chứa các dữ liệu không khởi tạo giá trị và .data cho đoạn chứa các dữ liệu được khởi tạo giá trị. Ngoài ra, còn có những đoạn được định nghĩa sẵn cho các vùng nhớ X, Y, EEPROM, ., bạn tham khảo thêm trong tài liệu hướng dẫn online của ASM30, hoặc tài liệu MPLAB ASM30, MPLAB LINK30, and Utilities User’s Guide (DS51317). Chương trình chính của chúng ta thực sự bắt đầu ở dòng 11. Từ dòng 11 đến dòng 14 là các lệnh khởi tạo ngăn xếp (stack), với các hằng số __SP_init và __SPLIM_init được ASM30 xác định khi biên dịch, dựa vào thông tin về chip được dùng. Thanh ghi W15 mặc định là con trỏ ngăn xếp, do đó bạn không nên sử dụng thanh ghi này, mặc dù nó là một thanh ghi đa dụng. Các lệnh được sử dụng ở đây là mov và nop. mov là lệnh sao chép dữ liệu, một lệnh không thể thiếu trong bất kỳ tập lệnh của vi điều khiển nào. Quy tắc viết của lệnh là từ khóa mov, sau đó là toán hạng nguồn, dấu phẩy rồi đến toán hạng đích. dsPIC hỗ trợ 8 lệnh sao chép dữ liệu 16-bit, 1 lệnh sao chép dữ liệu 8-bit (định vị tức thời), và 2 lệnh sao chép dữ liệu 32-bit (định vị thanh ghi). Với dữ liệu 16-bit, dsPIC hỗ trợ sao chép dữ liệu giữa các thanh ghi làm việc Wn và các thanh ghi chức năng, và sao chép dùng định vị tức thời và định vị thanh ghi. Bạn tham khảo tài liệu dsPIC30F/33F Programmer’s Reference Manual (DS70157) để có thông tin đầy đủ về tập lệnh của dsPIC. Bạn chắc hẳn có thể đoán ra nop là lệnh không làm gì cả (chỉ khiến bộ xử lý tiêu tốn một chu kỳ máy). Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 6/19 Các dòng 15 đến 19 dùng để xóa các thanh ghi làm việc W0 đến W14. Tất nhiên chúng ta có thể dùng 15 lệnh clr Wn, với n=0-14, để thực hiện việc đó. Tuy nhiên, ở đây tôi giới thiệu đôi chút kỹ thuật định vị gián tiếp thanh ghi và lệnh lặp phần cứng repeat. Các dòng 15 và 16 hẳn không có gì khó hiểu đối với bạn, dùng để xóa thanh ghi W0 và W14. Bạn có thể dùng lệnh clr hay lệnh mov để xóa các thanh ghi này. Lệnh clr chỉ có một toán hạng, đó là toán hạng đích. Tiếp theo, hãy để ý rằng các thanh ghi Wn cũng là các thanh ghi chức năng, có địa chỉ liên tiếp nhau và bắt đầu từ 0x0000. Do đó, có thể lợi dụng thanh ghi W14 làm con trỏ đến vùng địa chỉ này, và thông qua lệnh lặp để xóa 13 thanh ghi còn lại. Con trỏ W14 hiện đang trỏ đến địa chỉ 0x0000 (vì vừa được xóa), do đó cần được cập nhật trước khi sử dụng, và chúng ta dùng toán tử tăng trước (preincrement) như trong tập tin nguồn đã thể hiện. Lệnh repeat cho phép bạn thực hiện lặp lại lệnh ngay sau nó một số lần được quy định bởi một hằng số (như trong ví dụ này) hay bởi một thanh ghi làm việc Wn. Cụ thể thì chúng ta mô tả giá trị hằng số bằng số lần cần lặp trừ đi 1. Do vậy, lệnh repeat #12 sẽ lặp lại 13 lần lệnh ngay sau nó (ở đây là mov W0,[++W14]). Lệnh repeat cho phép lặp tối đa 16384 lần, nếu bạn dùng một thanh ghi Wn thì chỉ có 14 bit thấp nhất của Wn được quan tâm. Vì bộ nhớ dữ liệu của dsPIC cho phép truy xuất cả byte lẫn word, do đó Microchip đã đánh địa chỉ bộ nhớ dữ liệu của dsPIC theo byte. Như vậy, toán tử tăng trước ++ trong lệnh mov ở dòng 18 sẽ khiến thanh ghi con trỏ W14 tăng 2 sau mỗi lần lặp (để trỏ đến word kế tiếp). Sau cùng, vì W14 đã có giá trị khác 0, lệnh clr W14 ở dòng 19 hoàn tất việc xóa các thanh ghi làm việc W0 đến W14. Ở các dòng 20 và 21, chúng ta gọi các chương trình con để khởi tạo các cổng xuất nhập và timer 1. Lệnh gọi chương trình con tương đối rcall cho phép gọi các chương trình con nằm trong phạm vi -32768 đến +32767 từ lệnh so với lệnh kế tiếp (vì khi thực thi lệnh này thì thanh ghi đếm lệnh PC đã chỉ đến lệnh kế tiếp). Nếu chương trình con nằm ngoài phạm vi này thì cần phải dùng lệnh call, cho phép gọi bất kỳ chương trình con nào trong phạm vi không gian địa chỉ 24-bit của dsPIC. Dòng 22 đến dòng 24 là vòng lặp chính, với 2 lệnh nop và một lệnh rẽ nhánh không điều kiện bra. Lệnh bra cũng có tầm địa chỉ tương tự như lệnh rcall đã nói ở trên. Vì các thao tác cập nhật ngõ ra được thực hiện trong chương trình xử lý ngắt timer 1, do đó chương trình sẽ không có việc gì để thực thi. Chương trình con khởi tạo timer 1 gồm các lệnh từ dòng 25 đến 32. Ngoài các lệnh đã gặp, ở đây chúng ta thấy có 2 lệnh mới dùng để thao tác bit là bset và bclr. Hai lệnh này có toán hạng đầu là thanh ghi bị tác động, và toán hạng kế tiếp là chỉ số của bit bị tác động. Chỉ số của bit chỉ có thể được mô tả bằng một hằng số. Dòng lệnh 25 xóa số đếm của timer 1 (chứa trong thanh ghi TMR1) trước khi khởi động bộ đếm, do đó chúng ta sẽ không đếm thiếu trong chu kỳ đầu tiên vì dữ liệu không xác định đang có trong TMR1. Hai dòng lệnh 26 và 27 đặt ngưỡng tràn tương ứng với 0,5 giây ở tần số thực thi lệnh là 5 MHz (tức là chip có clock bằng 20 MHz). Ở dòng 28, Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 7/19 chúng ta xóa cờ ngắt của timer 1, bằng cách xóa (clear) bit T1IF của thanh ghi IFS0. Chế độ làm việc của timer 1 được thiết lập trong thanh ghi T1CON, gồm các thông tin về nguồn clock, prescaler (bộ chia trước), chế độ timer/counter, bật/tắt timer. Các thông tin này được đặt vào thanh ghi T1CON bằng các dòng lệnh 29 và 30. Dòng lệnh 31 cho phép timer 1 tạo ra ngắt khi tràn bằng cách đặt (set) bit T1IE trong thanh ghi IEC0. Và chương trình con luôn luôn cần một lệnh trở về, return, ở đây được đặt tại dòng 32. Bạn hãy đọc phần tương ứng trong datasheet của dsPIC được dùng để có thông tin chi tiết về các chế độ làm việc của timer 1. Từ dòng 33 đến 36, chúng ta có một chương trình con khởi tạo các cổng xuất/nhập (vào/ra). Vì chương trình ví dụ này chỉ sử dụng chân RD0 làm ngõ ra, do đó các chân khác của cổng (port) D được đặt ở trạng thái ngõ vào (Microchip khuyến cáo là các chân không sử dụng nên đặt là ngõ vào, và nối đến VDD hay GND, tránh để các ngõ vào trôi trạng thái một cách tự do). Các lệnh trong chương trình con này đã tự giải thích trong phần chú thích, và khá quen thuộc, do đó tôi không giải thích ở đây nữa. Chương trình xử lý (phục vụ) ngắt timer 1 gồm các dòng lệnh từ 37 đến 39. Bạn chú ý là tên __T1Interrupt đã được định nghĩa trước trong kịch bản liên kết, do đó bạn phải dùng đúng tên này làm nhãn cho phần chương trình mà bạn muốn dùng để xử lý ngắt timer 1. Dòng 37 dùng để xóa cờ ngắt, như bạn đã từng thấy ở dòng 28 trong chương trình con khởi tạo timer 1. Việc xóa cờ ngắt được yêu cầu thực hiện bằng phần mềm, theo như datasheet, và nên được thực thi ngay khi bước vào chương trình xử lý ngắt. Sau khi xóa cờ ngắt, chúng ta sẽ thực hiện công việc tiếp theo là lật trạng thái của ngõ ra RD0. Tương tự như dòng PIC cao cấp PIC18, dsPIC cung cấp một lệnh lật trạng thái bit là btg, như được minh họa ở dòng lệnh 38. Thay vì dùng lệnh btg PORTD, 0 để lật trạng thái RD0, chúng ta dùng hằng số LED được khai báo ở phần đầu chương trình, mà hiệu quả của nó thì hẳn bạn đã nắm rõ, khi bạn quyết định dùng dsPIC và đọc tài liệu này. Các chương trình xử lý ngắt cần có một lệnh trở về khác so với lệnh trở về từ chương trình con, do đó dòng 39 dùng lệnh retfie để trở về chương trình bị ngắt, sau khi đã xử lý xong ngắt. Cuối cùng, tập tin nguồn hợp ngữ cho dsPIC được yêu cầu phải có một dẫn hướng .end cho biết đã kết thúc khối chương trình (program block), mà chúng ta đặt ở dòng 40. Phù! Như vậy là chương trình nháy LED của chúng ta đã viết xong. Bạn hãy thử xem chương trình biên dịch có thành công hay không, hãy tìm các lỗi được thông báo để sửa lại. Nếu chương trình đã được biên dịch thành công thì bạn hãy thử bằng phần cứng với các thông số như trên, nếu bạn muốn mô phỏng bằng MPLAB SIM thì hãy chỉnh lại bộ chia trước và ngưỡng tràn của timer 1 cho thật nhỏ để tránh mất thời gian ngồi chờ máy tính mô phỏng các hoạt động lặp lại của chip hàng triệu lần trước khi chân RD0 đổi trạng thái. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 8/19 Trước khi chuyển sang ví dụ kế tiếp, bạn có thể luyện tập thêm bằng cách thử điều chỉnh chương trình theo các hướng: điều chỉnh ngưỡng tràn để LED sẽ nhấp nháy đúng 1 Hz (với mã hiện tại thì LED sẽ nhấp nháy ở 1,6 Hz, vì tần số thực thi lệnh của chip sẽ là 8 MHz với bộ dao động nội 8 MHz và PLLx4 được kích hoạt), dùng thêm một LED khác nối vào RD1 (theo cùng cách như bạn đã nối LED vào RD0) và làm cho 2 LED nhấp nháy ngược nhau. 3.2. Ví dụ 2-2 Để sử dụng tập tin nguồn “Vidu2-2.s” (được đính kèm), bạn có thể tạo ra một project mới, hay có thể dùng lại project “Vidu2” bằng cách làm theo hướng dẫn dưới đây (tôi thường làm theo cách này để không phải tạo ra quá nhiều project). Trước hết, trong cửa sổ quản lý tập tin của project, bạn nhấp nút chuột phải vào tên tập tin nguồn “Vidu2-1.s” để làm xuất hiện một mênu gọi lên (pop-up) như hình 3.2 đã minh họa. Sau đó bạn chọn lệnh Remove để xóa tập tin nguồn đó ra khỏi danh sách các tập tin nguồn của project (bạn yên tâm là tập tin nguồn của bạn vẫn không bị xóa). Hình 3.2: Thao tác loại bỏ tập tin nguồn ra khỏi danh sách Tiếp đến bạn sẽ thêm tập tin nguồn mới vào project, bằng cách nhấp nút chuột phải vào đầu mục “Source Files” trong cửa sổ quản lý tập tin đó, và chọn lệnh Add Files ., như được minh họa trong hình 3.3. Đến đây thì bạn sẽ gặp một hộp thoại cho phép bạn thêm các tập tin nguồn .s vào project, bạn hãy chọn tập tin nguồn “Vidu2-2.s”. Đến đây thì bạn có thể sẽ thắc mắc: Vậy tập tin .hex được tạo ra sẽ có tên gì, nếu tôi cứ thay đổi tên tập tin nguồn, hay project của tôi có nhiều tập tin nguồn? Tập tin đầu ra của project sẽ mang tên của project (ở đây project là “Vidu2”, do đó tên tập tin .hex là “Vidu2.hex”), không phụ thuộc vào tên của các tập tin nguồn. Điều này cần xác định rõ ràng, vì bạn sẽ cần tập tin .hex này để thử chương trình của mình trên phần cứng. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 9/19 Hình 3.3: Thao tác thêm tập tin nguồn vào danh sách Trong ví dụ 2-2, chúng ta sẽ thực hiện bài toán hiệp sĩ đi tuần (KnightRider), di chuyển điểm sáng qua lại một số LED với tốc độ là 1 giây mỗi lần dịch chuyển. Cổng E của dsPIC được sử dụng để điều khiển LED, cụ thể là các chân RE0 đến RE5 (dsPIC30F4012 chỉ đưa ra các chân RE0 đến RE5, và RE8, mà chúng ta thường dùng các chân liên tiếp nhau trong loại bài toán này để đơn giản hóa phần viết chương trình). Tương tự như trong ví dụ trước, mã nguồn chương trình được liệt kê dưới đây để tiện theo dõi. Sơ đồ mạch phần cứng để thử nghiệm được thể hiện trong hình 3.4. Phần nằm trong khung nét đứt chỉ cần thiết khi bạn dùng thạch anh ngoài, các chân nối nguồn Vdd và Vss không được thể hiện ở đây, nhưng bạn phải đảm bảo đã nối hết các chân đó vào các mức điện áp thích hợp. Hình 3.4: Mạch thử nghiệm cho bài toán hiệp sĩ đi tuần Liệt kê mã nguồn “Vidu2-2.s”: 1 .equ __30F4012, 1 2 .include "p30fxxxx.inc" 3 config __FOSC, CSW_FSCM_OFF & FRC_PLL4 4 config __FWDT, WDT_OFF 5 config __FBORPOR, MCLR_EN & PBOR_OFF 6 config __FGS, CODE_PROT_OFF CLKIN/OSC1 9 RC15/CLKO/OSC2 10 MCLR 1 RB0/CN2/VREF+/AN0/EMUD3 2 RB1/CN3/VREF-/AN1/EMUC3 3 RB2/CN4/SS1/AN2 4 RB3/CN5/INDX/AN3 5 RB4/CN6/IC7/QEA/AN4 6 RB5/CN7/IC8/QEB/AN5 7 RC13/CN1/U1ATX/T2CK/SOSCI/EMUD 11 RC14/CN0/U1ARX/T1CK/SOSCO/EMUC 12 EMUC2/OC1/IC1/INT1/RD0 15 EMUD2/OC2/IC2/INT2/RD1 14 RE0/PWM1L 26 RE1/PWM1H 25 RE2/PWM2L 24 RE3/PWM2H 23 RE4/PWM3L 22 RE5/PWM3H 21 FLTA/INT0/RE8 16 RF2/SDA/SDI1/U1RX/EMUC/PGC 18 RF3/SCL/SDO1/U1TX/EMUD/PGD 17 AVDD 28 AVSS 27 U1 DSPIC30F4012DIP 2 3 4 5 6 7 8 1 RP1 1k Vdd X1 8MHz C1 33pF C2 33pF Vdd R1 33k Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT02.01 Ngày: 5/3/2006 Trang: 10/19 ;---------------------------------------------------------------------- ;Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh) 7 .equiv LED_PORT, PORTE ;LED noi vao cong E 8 .equiv LED_TRIS, TRISE ;Thanh ghi trang thai cua port xuat LED 9 .equiv LED_LAT, LATE ;Thanh ghi chot cua port xuat LED ;---------------------------------------------------------------------- ;Cac khai bao toan cuc: 10 .global __reset ;Khai bao nhan bat dau chuong trinh (bat buoc) 11 .global __T1Interrupt ;Khai bao toan cuc chuong trinh xu ly ngat Timer 1 ;---------------------------------------------------------------------- ;Doan ma trong vung nho chuong trinh 12 .text ;Bat dau doan ma chuong trinh __reset: 13 mov #__SP_init, W15 ;Khoi tao con tro ngan xep (stack) 14 mov #__SPLIM_init, W0 15 mov W0, SPLIM ;Khoi tao thanh ghi gioi han con tro ngan xep (stack) 16 nop ;Can mot lenh NOP sau khi ghi vao SPLIM 17 clr W0 ;Xoa thanh ghi lam viec W0 18 mov W0, W14 ;Xoa cac thanh ghi W1 den W14 19 repeat #12 20 mov W0,[++W14] ;Dia chi cua cac thanh ghi: 0x0002 - 0x001C 21 clr W14 ;---------------------------------------------------------------------- 22 rcall Init_TMR1 ;Khoi tao cho TMR1 (tran moi 1 giay) 23 rcall Init_PORTS ;Khoi tao cac cong I/O 24 mov #0x0001, W1 ;W1 la co chi huong, '1' la dich trai, '0' la ;dich phai, khoi dong la dich trai 25 mov #0x0001, W2 ;bat dau tu bit 0, dich trai 26 mov W2, LED_LAT ;hien thi ra cac LED main_loop: 27 nop 28 nop 29 bra main_loop ;Vong lap chinh, khong lam gi ca, chi cho ngat ;;--------------------------------------------------------------------- ;Chuong trinh con khoi tao TMR1 ;TMR1 duoc khoi tao de tran sau moi 1 giay tai muc xung 8 Mips (fcy = 8 MHz) ;---------------------------------------------------------------------- Init_TMR1: 30 clr TMR1 31 mov #0x7A12, W0 ;TMR1 tran moi 1 giay 32 mov W0, PR1 ;Dat nguong tran vao PR1 33 bclr IFS0, #T1IF ;Xoa co ngat cua TMR1 34 mov #0x8030, W0 ;TMR dung fcy lam clock, prescale la 1:256, 35 mov W0, T1CON ;va khoi dong TMR1 36 bset IEC0, #T1IE ;cho phep ngat khi TMR1 tran 37 return ;---------------------------------------------------------------------- ;Chuong trinh con khoi tao cac cong I/O, de noi voi LED ;---------------------------------------------------------------------- Init_PORTS: 38 clr LED_LAT ;Xoa thanh ghi chot cong xuat LED [...]... chương trình xử lý ngắt sẽ trở về chương trình chính Người báo cáo: Nguy n Quang Nam Tài liệu: Ngày: 5/3/2006 Trang: TUT02.01 16/19 Tương tự như vậy, b n có thể dễ dàng hiểu được cách hoạt động của đo n chương trình thực hi n dịch phải từ dòng 57 đ n 63 Và d n hướng end tại dòng 64 lu n lu n c n thiết đối với một tập tin ngu n hợp lệ Tất nhi n b n có thể dùng ngay một thanh ghi Wn n o đó để dùng làm... lệnh thao tác bit, lệnh so sánh, lệnh chuy n điều khi n Cách thiết lập và sử dụng cổng vào/ra, cũng như bộ định thời đã được n i đ n Các kiểu định vị thanh ghi, định vị tức thời, cũng như định vị gi n tiếp thanh ghi cũng được đề cập Tôi cũng xin đề nghị là khi b n lập trình cho vi điều khi n, b n n n có s n các tài liệu tham khảo trong tay (với dsPIC và dùng hợp ngữ thì b n n n có s n trong tay các tài. .. bi n đếm n y để kiểm tra xem có c n đổi hướng dịch hay không ở dòng 51 dsPIC cung cấp các lệnh tăng (inc) hoặc giảm (dec) giá trị của các thanh ghi n i chung hay các thanh ghi Wn Ngoài ra, c n có các lệnh tăng/giảm từng 2 đ n vị là inc2 và dec2, chấp nh n các to n hạng giống như lệnh inc hoặc dec Ở dòng 51 (cũng như ở dòng 58), chúng ta thấy có lệnh rẽ nhánh có điều ki n bra NZ, left_s (hay bra NZ,... chỉ ngay sau bảng dữ liệu, thay vì là địa chỉ cuối bảng dữ liệu, tại dòng 51 N u con trỏ nhỏ h n địa chỉ n y, chúng ta không c n đưa con trỏ về đầu bảng, ngược lại, chúng ta đặt lại giá trị cho con trỏ để n chỉ đ n đầu bảng dữ liệu, như dòng 52 đã minh họa Sau khi ho n tất các nhiệm vụ, chương trình xử lý ngắt sẽ trở về chương trình bị ngắt (ở đây là chương trình chính) với dòng 53 Dòng 54 đóng lại... cửa sổ nh n vào không gian bộ nhớ chương trình được mở ra, cho phép chúng ta dùng một trong những thanh ghi Wn làm con trỏ đ n bảng dữ liệu và truy xuất bằng kiểu định vị gi n tiếp thanh ghi như chúng ta v n làm với các dữ liệu 16-bit trong RAM Các bước chu n bị cho việc sử dụng PSV được minh họa bằng các dòng 27 đ n 30 Trước hết, chúng ta c n đặt (set) bit PSV trong thanh ghi CORCON, như dòng 27 Sau... tr n các thanh ghi Wn và các thanh ghi chức n ng, và có thể dịch tối đa 15 bit trong một l n dịch (một l n nữa, chỉ thực hi n dịch nhiều bit tr n các thanh ghi Wn) Như b n có thể thấy, trong ví dụ n y, việc thực hi n nhiệm vụ của chương trình được giải quyết một cách trực quan, bám sát hi n tượng Tuy nhi n, cách giải quyết n y Người báo cáo: Nguy n Quang Nam Tài liệu: Ngày: 5/3/2006 Trang: TUT02.01... một lệnh thuộc nhóm lệnh rẽ nhánh có điều ki n dsPIC cung cấp khá nhiều các lệnh rẽ nhánh có điều ki n (20 lệnh), giúp người lập trình dễ dàng h n trong việc thể hi n các thuật to n Vì chúng ta thực hi n giảm bi n đếm trước, n n dù đã đếm đ n 0, chúng ta v n thực hi n dịch trái sau khi đã đặt lại cờ chỉ hướng dịch và bi n đếm (bằng các lệnh ở dòng 52 và 53) Sau khi thực hi n dịch trái bằng các dòng 54... s n trong bảng, chúng ta chỉ c n truy xuất bằng một lệnh sao chép dữ liệu dùng kiểu định vị gi n tiếp thanh ghi (dòng 49), sau đó xuất ra ngõ ra (dòng 50) Con trỏ đã được cập nhật ngay trong lệnh truy xuất dữ liệu ở dòng 49 Chúng ta chỉ c n c n kiểm tra xem đã xuất hết bảng dữ liệu hay chưa bằng cách kiểm tra con trỏ so với vị trí cuối bảng Vì con trỏ được cập nhật sau khi truy xuất dữ liệu, n n chúng... ở dòng 32 chúng ta có một lệnh số học hơi đặc biệt, có 3 to n hạng Lệnh n y sẽ cộng to n hạng thứ nhất với to n hạng thứ hai (là một hằng số lưu trong 5-bit, nghĩa là phải nhỏ h n 32), sau đó lưu kết quả vào to n hạng thứ ba Bây giờ chúng ta hãy xem chương trình xử lý ngắt của chúng ta ra sao với cách dùng kỹ thuật bảng n y Dòng 48 h n là không c n phải giải thích n a Vì dữ liệu xuất đã được chu n bị... v n giữ hướng dịch trái, và sẽ thực hi n thao tác dịch trái và sau đó trở về chương trình chính bằng đo n lệnh tiếp theo, từ dòng 47 đ n dòng 50 Ngược lại (bit 5 bằng ‘1’), chúng ta sẽ phải đổi hướng thành dịch phải, do đó sẽ thực thi lệnh nhảy đ n đo n chương trình dịch phải Ở đo n lệnh vừa rồi, chúng ta gặp một lệnh nhảy không điều ki n khác là lệnh goto Lệnh goto có thể nhảy đ n bất kỳ địa chỉ n o . tin ngu n. Điều n y c n xác định rõ ràng, vì b n sẽ c n tập tin .hex n y để thử chương trình của mình tr n ph n cứng. Người báo cáo: Nguy n Quang Nam Tài. b n (hay n i cách khác, b n không n n đánh số giống như vậy trong chương trình của b n) . Trước khi thực sự viết bất kỳ một dòng lệnh n o, b n n n dành

Ngày đăng: 20/12/2013, 22:16

HÌNH ẢNH LIÊN QUAN

bản sẽ giới thiệu các phần như: thông tin cơ bản, lệnh gộp (include), đặt cấu hình cho chip, khai báo hằng số, khai báo điểm bắt đầu chương trình, chương trình con, chươ ng  trình xử lý ngắt - Tài liệu Tutorial n doc
b ản sẽ giới thiệu các phần như: thông tin cơ bản, lệnh gộp (include), đặt cấu hình cho chip, khai báo hằng số, khai báo điểm bắt đầu chương trình, chương trình con, chươ ng trình xử lý ngắt (Trang 1)
Tutorial no 02.01 - Tài liệu Tutorial n doc
utorial no 02.01 (Trang 1)
3. Các ví dụ về LED - Tài liệu Tutorial n doc
3. Các ví dụ về LED (Trang 2)
Hình 3.1: Cây quản lý tập tin của project Vidu2 - Tài liệu Tutorial n doc
Hình 3.1 Cây quản lý tập tin của project Vidu2 (Trang 2)
Dòng 3 đến dòng 6 đặt các word cấu hình cho chip. Chúng ta xét một lệnh đặt cấu hình tiêu biểu dưới đây - Tài liệu Tutorial n doc
ng 3 đến dòng 6 đặt các word cấu hình cho chip. Chúng ta xét một lệnh đặt cấu hình tiêu biểu dưới đây (Trang 4)
Hình 3.2: Thao tác loại bỏ tập tin nguồn ra khỏi danh sách - Tài liệu Tutorial n doc
Hình 3.2 Thao tác loại bỏ tập tin nguồn ra khỏi danh sách (Trang 8)
Hình 3.4: Mạch thử nghiệm cho bài toán hiệp sĩ đi tuần - Tài liệu Tutorial n doc
Hình 3.4 Mạch thử nghiệm cho bài toán hiệp sĩ đi tuần (Trang 9)
Hình 3.3: Thao tác thêm tập tin nguồn vào danh sách - Tài liệu Tutorial n doc
Hình 3.3 Thao tác thêm tập tin nguồn vào danh sách (Trang 9)

TỪ KHÓA LIÊN QUAN

w