PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 03-10-2006, 09:59 AM   #3
newuser
Đệ 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
địa chỉ của nhãn DELAY bây giờ là 0804h và nó sẽ không được chương trình gọi đến dù có lệnh CALL DELAY ở trên. Tại sao thế? Ta xem:
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
Đoạn mã cũ được sửa lại như sau:
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
Lúc này chương trình đã thực sự làm việc đúng như ý muốn?

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


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

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


Múi giờ GMT. Hiện tại là 11:45 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam