![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ... |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
PIC Bang chủ
|
Bài 3: Ngắt (tt)
3) Điểm thứ ba, các lớp ngắt:
Bạn thấy rằng, trong hình, rõ ràng có 2 lớp ngắt. Lớp thứ nhất nằm bên tay trái ngoài cùng, lớp thứ hai nằm ở giữa hình. Lớp thứ ba chỉ có một cổng AND nên chúng ta không kể tới làm gì. Lớp thứ nhất được gọi là lớp ngắt ngoại vi. Thực chất lớp này vì có quá nhiều nguồn ngắt, và các nguồn ngắt này đều là một số chuẩn giao tiếp, hoặc chức năng đặc biệt của PIC, cho nên người ta phân ra làm lớp ngắt ngoại vi. Để các ngắt ngoại vi hoạt động, trước tiên chúng ta phải cho phép ngắt ngoại vi, tức là bật bit PIE lên. Còn cụ thể muốn cho ngắt ngoại vi nào hoạt động, thì chúng ta bật ngắt đó lên. Trên sơ đồ các bạn cũng thấy rõ thông qua các cổng AND và OR. Lớp thứ hai tạm gọi là lớp ngắt phổ thông. Khi muốn dùng các nguồn ngắt phổ thông, chúng ta chỉ việc bật các bit IE của nguồn ngắt này. Tất nhiên, cuối cùng, chúng ta phải bật ngắt toàn cục GIE thì ngắt mới được phép xảy ra (kể cả ngắt ngoại vi và ngắt phổ thông. Khi đó, PIE được coi là một nguồn ngắt phổ thông. Điều này cũng giống như khi bạn chạy xe trên bờ ruộng, một hàng rào dài chạy dọc theo con đường, chính là ngắt toàn cục GIE. Lớp bên ngoài thứ hai là lớp ngắt phổ thông, bao gồm luôn cả ngắt ngoại vi PIE. Và ngoài cùng là các hàng rào thuộc lớp ngắt ngoại vi. Nếu các bạn bật các nguồn ngắt, mà không bật ngắt toàn cục GIE thì cho dù ngắt có xảy ra, thì chương trình vẫn không dừng để thực hiện ngắt, giống như con bò có thể lao qua hàng rào ngoài cùng đã được mở, nhưng vẫn còn hàng rào trong cùng. Như vậy, các bạn đã hiểu một cách tổng quan về hoạt động ngắt của PIC, những nguyên tắc phải bật hay tắt ngắt. Điểm lưu ý cuối cùng, đó là tôi muốn giới thiệu với các bạn rằng, chữ ký hiệu trong bảng, là tên các bit liên quan đến việc bật tắt ngắt. VD: bit PIE, INTE.. nằm trong thanh ghi INTCON (ngắt phổ thông), các bit quy định ngắt ngoại vi nằm trong các thanh ghi PIR và PIE. Vectơ ngắt của PIC: Như lần trước đã giới thiệu, vectơ ngắt của PIC nằm ở vị trí 0x0004 các bạn xem lại hình sau: Khác với khi bạn bị té ruộng, bạn té xuống ngay tại chỗ bạn bị húc, đối với vi điều khiển, khi xảy ra interrupt, nó sẽ nhảy về một địa chỉ cố định, và thực hiện công việc tại đó. Sau khi thực hiện xong, nó sẽ quay trở về vị trí mà từ đó nó đã thoát ra. Vị trí cố định mà nó sẽ nhảy về khi xảy ra ngắt là vị trí 0x0004. Chương trình ngắt: Lại quay về thí dụ té ruộng, có lẽ tôi thích cái thí dụ này vì nó có thể giúp bạn hình dung mọi thứ. Bây giờ các bạn hãy chia giai đoạn từ khi bị bò húc, té xuống ruộng, rồi bạn chửi đổng lên, rồi bạn lồm cồm bò lên. Vậy cho dù bạn bị bò húc, hay bị vấp ổ gà, thì chỉ có giai đoạn bạn chửi đổng lên là khác nhau, còn lại, giai đoạn bạn té xuống ruộng là té xuống ruộng, và sau đó thì bạn cũng bò lên. Vậy ngắt cũng giống thế, khi nhảy vào ngắt, bạn sẽ có một giai đoạn cần phải nhảy vào ngắt, và một giai đoạn nhảy ra khỏi ngắt, còn bên trong ngắt đó các bạn làm cái gì là nội dung cần thực hiện của từng nguồn ngắt. Tôi cung cấp ra đây đoạn chương trình ngắt chuẩn, từ nay về sau, các bạn chỉ cần copy đoạn chương trình này và sử dụng: Code:
;=================================================================== ORG 0x0000 GOTO MAIN ORG 0x0004 GOTO INTERRUPT ORG 0x0005 MAIN ; đây là phần chương trình chính của các bạn ;=================================================================== INTERRUPT RETFIE ;=================================================================== ; Các chương trình con được viết ở đây ;=================================================================== GOTO $ END ;=================================================================== Khởi tạo và kết thúc ngắt: Tôi cung cấp dưới đây đoạn chương trình khởi tạo và kết thúc ngắt đầy đủ cho PIC, từ nay về sau, khi muốn sử dụng ngắt, các bạn chỉ cần copy và paste đoạn code này lại, hoàn toàn không cần sửa chữa gì và cứ thế sử dụng. Tôi sẽ dành cho các bạn đặt câu hỏi về phần này để từ các câu hỏi, có thể giải thích rõ hơn vì sao chúng ta lại viết như vậy, từng điểm một. Nếu không, tôi không thể có thời gian để viết tất cả mọi vấn đề về ngắt ra đây được. Code:
;============================================================================================
INTERRUPT
;-------------------------------------------
;Doan ma bat buoc de vao ngat
;-------------------------------------------
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
SWAPF STATUS, W
CLRF STATUS ; force bank 0 for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS )
; STATUS = 0
MOVF PCLATH, W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR, W
MOVWF FSR_SV ; FSR_SV = FSR
; 10 cycles from interrupt to here!
;-----------------------------------
;Doan chuong trinh ngat
;-----------------------------------
; cac ban se viet chuong trinh ngat o day
;--------------------------------------------------
;Doan ma bat buoc de ket thuc ngat
;--------------------------------------------------
MOVF FSR_SV, W
MOVWF FSR ; FSR = FSR_SV
MOVF PCH_SV, W
MOVWF PCLATH ; PCLATH = PCH_SV
SWAPF STAT_SV, W
MOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )
SWAPF W_SAVE, F
SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)
BSF INTCON, GIE
RETFIE
;====================================================================================================
Phần thứ nhất là phần bắt đầu vào ngắt, đây là đoạn chương trình bắt buộc, tất nhiên không hoàn toàn nghiêm ngặt như vậy, vì thực tế nhiều khi bạn không dùng đến tất cả các lệnh này, nhưng vì mục đích cung cấp các khái niệm cơ sở, và công cụ làm việc đầy đủ, tôi cung cấp cho bạn chương trình ngắt chi tiết. Phần thứ hai là phần chương trình ngắt của bạn. Khi xảy ra ngắt, bạn muốn làm cái gì, thì bạn bắt đầu viết từ phần này trở đi. Phần thứ ba là phần kết thúc ngắt, bạn cứ viết nguyên bản như vậy không cần sửa đổi. Tạm thời, sẽ không có các phân tích chi tiết giống như các bài học trước, các bạn có thể tự tìm hiểu thêm, nếu không, có thể đặt câu hỏi, và chúng ta sẽ từ từ tìm hiểu rõ hơn về ngắt của PIC. Thời gian tới đây, có lẽ tôi hơi bận, cho nên tôi không thể viết bài liên tục được, mong rằng các bạn cố gắng tìm hiểu và học tốt PIC. Đến giai đoạn này, các bạn đã có thể dùng con PIC, giống như một con 89C51 thông thường. Và các bạn thấy đấy, thực sự PIC chỉ cần 1 ngày để học. Chúng ta vừa học xong 3 bài học cơ bản nhất của một con vi điều khiển: Điều khiển port, viết hàm delay và viết chương trình ngắt. Phần thứ tư của bài viết chương trình ngắt, sẽ đi chi tiết vào các ngắt và giải thích rõ nghĩa từng ngắt. Nhưng thiết nghĩ, tôi nên kết hợp bài học này ở đây, và kết hợp phần thứ tư vào bài học sau: Nút bấm và các ngõ vào của PIC. Tài liệu tham khảo: http://www.microchip.com/stellent/id...pnote=en011006
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
#2 |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2005
Bài gửi: 19
: |
Code:
;============================================================================================
INTERRUPT
;-------------------------------------------
;Doan ma bat buoc de vao ngat
;-------------------------------------------
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
SWAPF STATUS, W
CLRF STATUS ; force bank 0 for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS )
; STATUS = 0
MOVF PCLATH, W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR, W
MOVWF FSR_SV ; FSR_SV = FSR
; 10 cycles from interrupt to here!
;-----------------------------------
;Doan chuong trinh ngat
;-----------------------------------
; cac ban se viet chuong trinh ngat o day
;--------------------------------------------------
;Doan ma bat buoc de ket thuc ngat
;--------------------------------------------------
MOVF FSR_SV, W
MOVWF FSR ; FSR = FSR_SV
MOVF PCH_SV, W
MOVWF PCLATH ; PCLATH = PCH_SV
SWAPF STAT_SV, W
MOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )
SWAPF W_SAVE, F
SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)
BSF INTCON, GIE
RETFIE
;====================================================================================================
còn nữa : CLRF STATUS thì chưa chắc STATUS = 0 ! vì trong STATUS có một số bit không chịu tác động - giá trị của chúng không đổi ? em mới học, mong bác chỉ rõ hơn. |
|
|
|
|
|
#3 |
|
Đệ tử 2 túi
Tham gia ngày: Jun 2005
Bài gửi: 33
: |
Mình muốn biết thêm về W reg (Work register)? Chưa thấy Falleaf nói rõ về thanh ghi này.
__________________
I'm beginner.
|
|
|
|
|
|
#4 |
|
PIC Bang chủ
|
Z,
1) Ngắt có nhiều tác vụ, có thể bị tràn stack, hoặc dùng nhiều ngắt cùng lúc, làm động tác này, khóa cứng tất cả luôn. 2) Đã có lệnh SWAPF trước đó để lưu lại giá trị thanh STATUS rồi, chú ý. T, Dạo này mình hơi bạn, chưa thể viết bài được, hẹn đầu tháng 7 viết tiếp. Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
#5 | |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2005
Bài gửi: 19
: |
Trích:
|
|
|
|
|
|
|
#6 |
|
Đệ tử 2 túi
Tham gia ngày: Jun 2005
Bài gửi: 33
: |
Mình hỏi thêm về không gian địa chỉ của PIC. Giới hạn mở rộng bộ nhớ của PIC (mấy loại thường dùng ấy, 16F... và 18F...) là bao nhiêu? Nếu như mình cần mở rộng đến 10MB bộ nhớ có được không nhỉ?
To Falleaf: Xin lôĩ vì đã quấy rầy khi cậu đang bận. Mình sẽ đợi đến lúc cậu rảnh. Chúc cậu thành công.
__________________
I'm beginner.
|
|
|
|
|
|
#7 |
|
PIC Bang chủ
|
Chưa thể trả lời chi tiết lúc này, nhưng việc lắp thêm được bao nhiêu dung lượng nhớ, phụ thuộc vào chuẩn giao tiếp với ROM, RAM ngoài.
Để đơn giản, tôi lấy thí dụ một con ROM có 2 bit địa chỉ để enable nó. Như vậy, trên mạch, nếu bạn dùng 1 đường nối, bạn chỉ có thể nối tối đa 4 con ROM ngoài. Như vậy, điều này giới hạn số lượng ROM, RAM được nối vào PIC. Điều thứ hai, khi truy cập bằng các chuẩn giao tiếp như I2C, SPI, tùy thuộc vào bạn sử dụng giao tiếp với bao nhiêu bit địa chỉ, thì bạn sẽ có số lượng giới hạn bấy nhiêu thiết bị có thể kết nối với PIC. Hiện nay, một số PIC hỗ trợ 2 cổng I2C, và thêm mấy cổng SPI.. nếu bạn có đủ can đảm dùng hết số cổng này cho việc kết nối vào ROM, thì đúng là tôi cũng chịu thua luôn. Con số 10MB tôi chưa bao giờ tính toán thử khả năng tối đa của nó, nhưng theo ước tính sơ bộ thì là không thể. Nhưng nếu bạn làm cách này, bạn thiết lập chuẩn giao tiếp, và kết nối với các con Flash, thì bạn thích kết nối đến bao nhiêu cũng được. Bởi vì theo tôi biết, con Flash lớn nhất hiện nay có dung lượng 1GB. Bạn có bao giờ mở cái USB key của bạn ra chưa? Thực ra trong đó là một con Flash. Đáng tiếc, tôi chưa bao giờ thử kết nối với nó, nên không biết trả lời bạn cách nào. Các con ROM thông dụng 512Kbit. Bạn có thể tìm trên www.microchip.com Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
#8 |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2005
Bài gửi: 19
: |
có điều này chưa hiểu, mong các bác chỉ giáo :
trong MPLAB, để khai báo biến có rất nhiều cách theo các derectives của nó : RES, EQU... với EQU có thể khai báo hằng, biến thanh ghi nhưng với một cấu trúc như vậy thì khi nào biết được nó là thanh ghi, khi nào nó là một hằng ? |
|
|
|
|
|
#9 |
|
Đệ tử 2 túi
Tham gia ngày: Jun 2005
Bài gửi: 33
: |
Tôi đã làm mạch chạy theo hướng dẫn. Tôi dùng thạch anh 10Mhz. Xin hỏi nếu tôi muốn PIC chạy tốc độ < 10Mhz (8 MHz chẳng hạn) mà ko thay thạch anh có được không? Làm thế nào?
Thank.
__________________
I'm beginner.
|
|
|
|
|
|
#10 |
|
Nhập môn đệ tử
Tham gia ngày: Nov 2011
Bài gửi: 1
: |
Code:
;============================================================================================
INTERRUPT
;-------------------------------------------
;Doan ma bat buoc de vao ngat
;-------------------------------------------
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
SWAPF STATUS, W
CLRF STATUS ; force bank 0 for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS )
; STATUS = 0
MOVF PCLATH, W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR, W
MOVWF FSR_SV ; FSR_SV = FSR
; 10 cycles from interrupt to here!
;-----------------------------------
;Doan chuong trinh ngat
;-----------------------------------
; cac ban se viet chuong trinh ngat o day
;--------------------------------------------------
;Doan ma bat buoc de ket thuc ngat
;--------------------------------------------------
MOVF FSR_SV, W
MOVWF FSR ; FSR = FSR_SV
MOVF PCH_SV, W
MOVWF PCLATH ; PCLATH = PCH_SV
SWAPF STAT_SV, W
MOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )
SWAPF W_SAVE, F
SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)
BSF INTCON, GIE
RETFIE
;====================================================================================================
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W giả sử các biến W_SAVE,STAT_SV,PCH_SV được khai báo ở bank0 (địa chỉ từ 0X20 đến 0x7F), khi chương trình chính đang làm việc ở bank 2 thì xảy ra ngắt vậy thì câu lệnh trên không thực hiện đúng do biến W_SAVE được lưu ở bank0, các anh giải thik giúp em chỗ này với ạ |
|
|
|
![]() |
|
|
Similar Threads
|
||||
| Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
| Các bạn mới học PIC lưu ý luồng này (Upd. 16/10/2005) | falleaf | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 4 | 10-10-2005 06:23 PM |
| Các bạn mới học PIC lưu ý luồng này (Upd. 16/10/2005) | falleaf | PIC - Thiết kế và Ứng dụng | 4 | 10-10-2005 06:23 PM |
| Các bạn mới học PIC lưu ý luồng này (Upd. 16/10/2005) | falleaf | Chương trình dịch & các công cụ mô phỏng | 0 | 24-05-2005 12:52 AM |
| Các bạn mới học PIC lưu ý luồng này (Upd. 16/10/2005) | falleaf | MPASM | 0 | 24-05-2005 12:52 AM |
| Các bạn mới học PIC lưu ý luồng này (Upd. 16/10/2005) | falleaf | dsPIC - Bộ điều khiển tín hiệu số 16-bit | 0 | 24-05-2005 12:52 AM |