PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

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

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 01-11-2007, 07:59 AM   #1
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,638
Thanks: 192
Thanked 5,910 Times in 915 Posts
Send a message via Yahoo to falleaf Send a message via Skype™ to falleaf
Thanh ghi LATx có tác dụng gì?

Một câu hỏi hơi thừa, nhưng cần thiết, bạn nào trả lời câu hỏi này một cách rõ ràng, cụ thể, dễ hiểu được nhỉ?

Không chơi kiểu xem trong manual hay datasheet đâu nhé, chúng ta đang cần giải thích rõ nghĩa nó và làm cho người học dễ hiểu.

Chúc vui

Trích:
Nguyên văn bởi bien_van_khat View Post
He he, bác F nhà ta có câu hỏi chua nhỉ.

Trước tiên, LATx Khác PORTx chỗ nào?
Nếu xem sơ đồ khối của một chân IO của PIC16F và PIC18F, bỏ qua hết các chức năng đặc biệt của chân đó, chúng ta có thể thấy bọn này khá là giống nhau. Chỉ khác nhau ở chỗ chân IO của PIC18 có thêm 1 đường RD LAT (read latch).
* Dựa vào sơ đồ khối có thể thấy Write PORTx hoàn toàn tương đương Write LATx
* Tuy nhiên Read PORTx hoàn toàn khác Read LATx. đọc PORTx là đọc giá trị từ các chân của PIC.
Đọc LATx là đọc giá trị từ đầu ra của các TRIGGER D trong cái mạch này. Cái đầu ra này lại phải qua 1 bộ đệm 3 trạng thái mới tới được chân của con PIC, bộ đệm 3 trạng thái này lại được điều khiển bởi TRISx.

OK, vậy tại sao lại phải cần LATx?
Nguyên nhân nằm ở 2 lệnh bsf, bcf hoặc bset, bclr. Đây là các lệnh thuộc loại Read-Modify-Write (RMW). Tức là khi thực thi lệnh này, CPU đọc giá trị thanh ghi, set/clear bit, sau đó ghi trở lại vào thanh ghi.

Vấn đề sẽ phát sinh nếu bạn dùng các lệnh này với các PORT. Xét đoạn code như sau:
Code:
bsf PORTB, 0
bsf PORTB, 1
Nếu khi thực thi lệnh 2, vì một lý do nào đó RB0 chưa thể lên đến mức 1 (có thể do điện dung của mạch bên ngoài quá lớn), lúc CPU đọc giá trị PORTB, RB0 = 0, CPU set RB1 = 1, sau đó ghi trở lại PORTB, kết quả là RB0 ko được set.

Giải quyết vụ này như thế nào?
Khi cần set, clear 1 bit trên PORT, bạn nên sử dụng thanh ghi LATx thay vì thanh ghi PORTx. Giá trị của LATx ko bị ảnh hưởng bởi mạch ngoài nên sẽ ko xảy ra trường hợp tuơng tự như trên.
Tài liệu tham khảo:

thay đổi nội dung bởi: falleaf, 19-11-2007 lúc 10:13 AM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
The Following 6 Users Say Thank You to falleaf For This Useful Post:
dung h (28-10-2009), hmanh_bka (23-09-2013), Máu Lạnh (24-10-2011), nguyenutc (16-02-2012), pic.starter (15-11-2010), tientuu_k22004 (03-03-2010)
 

Ðiều Chỉnh
Xếp Bài

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


Múi giờ GMT. Hiện tại là 03:17 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