View Single Post
Old 25-08-2007, 10:03 AM   #213
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 101
:
Trích:
Nguyên văn bởi hieulongan039 View Post
cho minh hỏi tí, khi mình sử dụng các lệnh CALL hoặc GOTO mà nó vượt quá bank thanh ghi mình đang làm việc thì mình xử lí thế nào. còn nữa cho mình hòi thêm trong thanh ghi status co bit IRP và 2 bit RP1: RP2 để chon bank thank ghi, bit IRP = 1, chọn bank 2,3; =0 chọn bank 0,1, vậy nếu mình chi sử dụng IRP ko để chọn 1 lượt 2 bank thì co phải tiện hơn ko, lúc đó đỡ mất công chọn mỗi lần 1 bank khi sử dụng RP1, RP0 (ko bit đúng ko?). Mình đã đọc ở diển đàn rùi về call và goto và đọc trong datasheet nữa nhung chưa hiểu mình nhờ các cao thủ PIC chỉ giúp.
thanks
Bạn phải hỏi là "Khi sử dụng các lệnh CALL và GOTO mà nó vượt quá page mà mình đang làm việc thì phải xử lý thế nào" mới đúng.

Mình trả lời luôn: Bạn dùng lệnh LCALL và LGOTO. Tuy nhiên sau khi gọi như vậy, đến khi return thì nó sẽ quay về không đúng vị trí đã gọi nó. Vì vậy sẽ phải làm như sau:

Code:
lcall {Label1}          ; gọi đến nhãn Label 1 đặt ở page khác (page nào cũng được)
pagesel $               ; trở về đúng page đang làm việc

lgoto    {label2}      ; vì là goto nên không cần pagesel nữa
Ý thứ 2 bạn hỏi về bit IRP, mình xin trả lời: bit IRP sử dụng để chọn bank 0,1 hoặc bank 2,3. Tuy nhiên chỉ khi sử dụng nó trong chế độ địa chỉ gián tiếp (thao tác với thanh ghi FSR và INDF) thì mới truy xuất được hết các byte RAM trong cả 2 bank. Còn nếu sử dụng chế độ địa chỉ trực tiếp thì vẫn phải dùng 2 bit RP0,, RP1 để truy xuất các byte RAM trong từng bank.
Jerry vẫn chưa có mặt trong diễn đàn