|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
01-01-2006, 12:24 PM | #7 |
Nhập môn đệ tử
Tham gia ngày: Dec 2005
Bài gửi: 7
: |
Vài kinh nghiệm
- Với những người đã quen Asm51 vào trong build option chọn số mạch định là Decimal như vậy tất cả các số mặc định sẽ là dạng số ai cập thường ví dụ 500 chứ kô cần viết d'500' - Cái warning: Register in operand not in bank 0. Ensure that bank bits are correct. không phải sợ chỉ cần check xem đúng bank chưa. Có ý kiến về đoạn mã sau của bác fall: Code:
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 ) 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! 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 Lệnh BSF cuối cùng không cần thiết vì khi retfie lệnh này đã set GIE lên rồi. Trong trường hợp trong ngắt không sử dụng Indirect thì có thể không cần lưu FSR. Trong trường hợp chương trình chỉ nằm trong 2K có thể không cần lưu PCLATCH. Với các ứng dụng đơn giản và các dòng PIC như 16F88, 16F877 có common RAM chỉ thế này là đủ: Code:
;;------------------------------------------------|------------------------------------------------- ;Template PushSFR - Lưu lại các thanh ghi trước khi vào ngắt ;Sumary ;; Vì Pic không hỗ trợ lệnh Push, Pop nên cần phải viết mã lưu lại các thanh ghi trước khi ;; vào ngắt. Các thanh ghi cần lưu lại là STATUS, W còn PCLATCH được tự động lưu vào Stack ;; ;/Sumary PushSFR MACRO movwf bSaveW ;; Lưu W vào thanh ghi tạm swapf STATUS,W ;; Đổi chỗ STATUS nible và đặt nó vào W movwf bSaveStatus ;; Lưu giá trị Status trong W và thanh ghi tạm ENDM ;/Template ;;------------------------------------------------|------------------------------------------------- ;Template PopSFR - Phục hồi các thanh ghi trước khi vào ngắt ;Sumary ;; Vì Pic không hỗ trợ lệnh Push, Pop nên cần phải viết mã lưu lại các thanh ghi trước khi ;; vào ngắt. Các thanh ghi cần lưu lại là STATUS, W. ;; Nếu viết chương trình dùng nhiều hơn 1 bank cần lưu lại PCLATCH. ;; Nếu trong ngắt có sử dụng indirect access cần lưu FSR ;/Sumary PopSFR MACRO swapf bSaveStatus,W ;; Đổi chỗ nible trong bSaveStatus và lưu vào W movwf STATUS ;; Ghi lại giá trị từ W vào STATUS swapf bSaveW,F swapf bSaveW,W ;; Ta đùng SWAP vì nó không ảnh hưởng đến Status.Z ENDM ;/Template ;;------------------------------------------------|------------------------------------------------- ;Template IntService - Phục vụ ngắt (Code: ISR) ;Sumary ;; Pic chỉ có một Vectơ ngắt duy nhất ở địa chỉ 0x0004. Tất cả các ngắt đều nhảy đến đây. ;; Khi xảy ra ngắt thời gian đến khi nhảy địa chỉ 0x0004 (Interrupt Latency) là 3-4 chu kỳ máy ;; (3 với các ngắt trong (sinh từ nội bộ chip), 3.75 với các ngắt từ ngoài) ;; Vì chung một nguồn ngắt nên khi vào chương trình phải kiểm tra tất cả các cờ ngắt xem nguyên ;; nhân gây ra ngắt là từ đâu. Nếu do các nguyền nhân không mong muốn thì triệu gọi Macro ;; UnexpectedISR để xử lý. ;; Để dễ dàng đọc các phục vụ từng ngắt sẽ được viết dưới dạng các Macro để dễ dàng sửa chữa. ;; Phục vụ ngắt này sẽ được chèn vào vecto ngắt bắt đầu từ địa chỉ 0x0004 ;/Sumary IntService MACRO PushSFR ;; Gọi Macro lưu lại các thông số hệ thống clrf STATUS ;; Chọn Bank0 btfsc PIR1,TMR1IF ;; Nguồn ngắt là Timer1? goto T1_ISR ;; Ok! Triệu gọi phục vụ ngắt Timer1 goto Unexpected_ISR ;; No! Ngắt là do nguồn khác (không mong muốn) T1_ISR ;; Routine when the Timer1 overflows Timer1ISR ;; Gọi Macro xử lý ngắt Timer1 goto End_ISR Unexpected_ISR ;; UnexpectedISR ;; Gọi Macro xử lý ngắt từ nguồn khác End_ISR PopSFR ;; Gọi Macro phục hồi các thông số hệ thống retfie ;; Trở về và cho phép Interrup tiếp theo ENDM ;/Template ;/Template thay đổi nội dung bởi: qmk, 03-01-2006 lúc 07:49 PM. |
|
|