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à 000
0 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!