View Single Post
Old 17-03-2008, 03:19 PM   #11
footballer
Đệ tử 1 túi
 
Tham gia ngày: Dec 2007
Bài gửi: 16
:
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.
Bác bien_van_khat trả lời vấn đề này rõ ràng quá.
Em thấy nếu cấu hình port làm cổng ra, thì đệm 3 trạng thái ngăn giữa latch và chân port sẽ mở, lúc đó lệnh ghi vào port hay ghi vào latch thì đều sẽ có tác dụng lên chân port.
Nếu cấu hình port làm cổng vào thì đệm 3 trạng thái ngăn giữa latch và chân port sẽ khóa, lúc đó lệnh ghi vào port hay ghi vào latch thì đều chỉ có tác dụng lên latch, mà không có tác dụng lên chân port.
Nếu cấu hình port làm cổng vào thì lệnh đọc latch sẽ khác với lệnh đọc chân port.
Nhưng nếu cấu hình port làm cổng ra thì lệnh đọc latch và lệnh đọc chân port sẽ có tác dụng như nhau.
footballer vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn