PDA

View Full Version : cho mình hỏi về vượt quá lệnh CALL / Return ??


unisa
31-10-2010, 10:51 AM
Chả là mình đang làm đồ án có giao tiếp với LCD, mình dùng các câu lệnh sau để giao tiếp LCD cho dễ quản lý

TXT_REPASS
ADDWF PCL,1
DT"Retype PASSWORD:",0

TXT_PASS
ADDWF PCL,1
DT"Type PASSWORD: ",0

TXT_WRONGPASS
ADDWF PCL,1
DT"Login failed ! ",0

TXT_TIMES
ADDWF PCL,1
DT"You have 4 times",0

TXT_RIGHTPASS
ADDWF PCL,1
DT"Login successful",0

TXT_1UNCLOCK
ADDWF PCL,1
DT"[1] Unlock ",0

TXT_2CHANGEPASS
ADDWF PCL,1
DT"[2] Change Pass ",0

TXT_Unlocking
ADDWF PCL,1
DT" Unlocking ! ",0

TXT_LOCKED
ADDWF PCL,1
DT"System Locked ! ",0

TXT_DONTMATH
ADDWF PCL,1
DT"Pass donnot math",0


Tuy nhiên, khi mình sử dụng thì call những dòng đầu tốt (VD call TXT_PASS ...) nhưng khi call những dòng cuối TXT_LOCKED ... thì dịch tốt nhưng khi chạy mô phỏng, Proteus báo lỗi:

Stack overflow executing CALL instuction
Stack underflow executing RETURN instruction

mình nghĩ là do lệnh CALL những dòng dưới vượt quá giới hạn, theo datasheet
CALL k với 0< k < 2047
Mình đang vướng ở đây chưa biết giải quyết làm sao, mình làm rất nhiều câu thông báo hiển thị trên LCD nhưng mới được mấy cau đã báo lỗi thế này. Mong các bạn hướng dẫn cách giải quyết giúp mình với.
Thanks mọi người nhiều nha :o

unisa
31-10-2010, 12:07 PM
Sau khi ngâm kíu mình biết lỗi trên do 1 trong những nguyên nhân:
dùng lệnh CALL mà không có RETURN, lệnh call lồng lệnh call quá 8 lận sẽ vượt quá Stack của PIC16. Tuy nhiên ở đây mình dùng kỹ thuật tra bảng và lệnh trả về là RETLW, luôn có lệnh trả về Return sau lệnh call thì làm sao mà lỗi. Mà lỗi tại sao lại mỗi phần dưới trong khi phần trên không bị.