|
Tài trợ cho PIC Vietnam |
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 |
03-10-2006, 09:59 AM | #3 |
Đệ tử 4 túi
Tham gia ngày: Feb 2006
Bài gửi: 66
: |
uhm...không có bạn nào hưởng ứng chủ đề này ah??? Trong quyển My first project (không rõ tác giả) dành hẵn một phần nói về PCLATH và một số lỗi có thể gặp với PCLATH, ở đây mình xin lược dịch lại để các bạn mới học tham khảo.
trước tiên, các bạn hãy nhớ bộ đếm chương trình PC sử dụng giá trị có trong hai thanh ghi PCL và PCH. Trong đó PCH sẽ được tham chiếu giá trị từ PCLATH (Program Counter Latch High). Nếu chương trình bạn viết vượt quá 2K của bộ nhớ chương trình, có thể sẽ xuất hiện thông báo sau khi biên dịch chương trình: "Message...>Crossing page boundary-ensure page bits are set" thông báo trên xuất hiện nếu bạn CALL hay GOTO một Subroutine nằm ở những trang chương trình khác nhau và sẽ có thể vượt quá khả năng trỏ đến của bộ đếm chương trình (mã lệnh của hai lệnh trên có 11 bit dùng định địa chỉ trỏ đến tương ứng với 2048 địa chỉ nhảy khác nhau).Nếu thanh ghi PCLATH không được thiết lập đúng, chương trình của bạn sẽ không thể hoạt động đúng như là bạn nghĩ. bạn xem đoạn mã ví dụ sau: Code:
ORG 0x00 LOOP CALL DELAY GOTO LOOP . . . ORG 0X0800 ERROR GOTO ERROR NOP NOP NOP DELAY NOP NOP RETURN 0804h=0000 1000 0000 0100b như vậy ta cần ít nhất là 12 bit cho thông tin địa chỉ: 1000 0000 0100 tuy nhiên trong mã lệnh của lệnh CALL thì chỉ có không gian 11 bit dùng định địa chỉ mà thôi (10 0xxx xxxx xxxx), như thế địa chỉ 0804h trở thành 0004h do bị khuyết mất bit có nghĩa lớn nhất và thông tin địa chỉ 0004h được dùng cho lệnh CALL. Thế là PCLATH bắt đầu có lý do để mà tồn tại! Câu hỏi đặt ra vậy làm cách nào để đoạn mã trên làm việc? Tất cả những gì bạn cần làm là thiết lập PCLATH cho đúng với trang chương trình (Chi tiết về cách thiết lập bạn tham khảo datasheet nhé). Có nhiều cách và đây là một trong số những cách đó, sử dụng chỉ lệnh ASM cho phép lấy 8 bit cao của địa chỉ ROM: Code:
MOVLW HIGH(DELAY) ;W=08H MOVWF PCLATH ;PCLATH=0000 1000B 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 RETURN thay đổi nội dung bởi: newuser, 03-10-2006 lúc 10:49 AM. |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
sách về 8051 | 111985 | Trao đổi ngoài luồng | 0 | 28-11-2006 08:26 AM |
8051 | thanhcong138 | Trao đổi ngoài luồng | 2 | 17-09-2006 12:25 AM |
chút xíu về 8051 | levan8421 | Trao đổi ngoài luồng | 2 | 11-07-2006 11:12 PM |