Ðề tài: 8051 và PIC
View Single Post
Old 03-10-2006, 10:19 AM   #4
newuser
Đệ tử 4 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 66
:
Ta biết rằng nhãn LOOP ở đỉa chỉ 0000h và nhãn DELAY ở địa chỉ 0804h, cả hai lệnh CALL và GOTO đều sử dụng đến nội dung các bit PCLATH<4:3>
Vậy thì sau khi thiết lập PCLATH, thực thi xong chương trình DELAY, lệnh GOTO LOOP sẽ được thực thi? Câu trả lời là KHÔNG! Tại sao vậy?
Để lệnh GOTO LOOP hoạt động đúng thì địa chỉ trỏ đến của lệnh này phải là 00h, tuy nhiên do giá trị của PCLATH vẫn là 0000 1000, điều này có nghĩa là lệnh GOTO LOOP sẽ trỏ đến địa chỉ 0800h chứ không phải là 0000h như ta mong muốn!Sửa chữa? Ta có thể Reset giá trị PCLATH trước khi quay trở về từ chương trình con như thế này:
Code:
ORG 0x00
LOOP	MOVLW	HIGH(DELAY)	;W=08H
	MOVWF	PCLATH		;PCLATH=0000 1000B
	CALL	DELAY
	GOTO	LOOP
	.
	.
	.
	ORG 0X0800
ERROR	GOTO	ERROR
	NOP
	NOP
	NOP
DELAY	NOP
	NOP
	CLRF PCLATH
	RETURN
bạn hãy yên tâm là chương trình của bạn sẽ quay về đúng chỗ vì 13 bit PC đã được cất vào ngăn xếp trước đó, khi RETURN, 13 bit này được trả lại cho PC và PCLATH chẳng liên quan gì đến việc này (datasheet có nói đó: Nội dung PCLATH không đổi khi quay trở về từ ngắt và chương trình con.)
Trên đây là phần lược dịch của mình, do trình độ Anh ngữ và chuyên môn hạn hẹp nên có thể có vài từ ngữ chuyên môn không dịch đúng hoặc không hiểu đúng-->dịch sai.Còn rất nhiều những vấn đề khác mong được các bạn viết bài hưởng ứng, để những NEWUSER như mình có dịp học hỏi!

thay đổi nội dung bởi: newuser, 03-10-2006 lúc 10:23 AM.
newuser vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn