PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 01-01-2006, 12:24 PM   #7
qmk
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
Đoạn mã trên lưu lại các giá trị STATUS, W, FSR, PCH (PCLATCH).
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.
qmk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:20 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam