PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Thanh ghi LATx có tác dụng gì? (http://www.picvietnam.com/forum/showthread.php?t=1666)

falleaf 01-11-2007 07:59 AM

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 (Post 12885)
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:

tinhthanthep 01-11-2007 08:44 AM

Không biết hiểu như thế này có phải không nhỉ?: Thanh ghi latch là thanh ghi chốt. Khi bạn set thanh ghi latch lên thì port tương ứng bị khóa lại. Dù bạn có set hay clear port đó đều ko có tác dụng. Và có thể chốt được từng bit riêng lẻ.

falleaf 01-11-2007 09:32 AM

Chết chết :D

Chờ thêm ý kiến của các đồng chí nhà ta nào

Chúc vui

hanspkt 16-11-2007 04:13 PM

Thanh ghi latch dùng để xuất dữ liệu, còn thanh ghi port dùng để đọc dữ liệu. Có phải như vậy không anh F?

THANDONGDATVIET 16-11-2007 04:49 PM

Tôi cấu hình port là output. Ví dụ 1 port bất kì nào đó. Khi tôi xuất ra giá trị bất kì, ví dụ output_D(0x01) thì giá trị này sẽ được gi vào thanh ghi LATD. Tôi thường sử dụng 1 biến nhớ để ghi nhớ giá trị này để sử dụng cho lần tiếp theo. Tôi muốn hỏi nếu không dùng biến nhớ tạm này thì có thể đọc lại giá trị của thanh ghi LAT như thế nào(tất nhiên là vẫn cấu hình cổng ra). Hi vọng sớm có câu trả lời của mọi người.
Thank !

bien_van_khat 16-11-2007 08:17 PM

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.

littlephoc 19-11-2007 10:09 AM

Như vậy nghĩa là thế này phải không ạ:
- Khi đọc/ghi giá trị output của portB, thì nên dùng LatB vì Latx trong trường hợp này đóng vai trò như 1 buffer.
- Khi đọc một giá trị input từ ngoài vào 1 pin của portB, thì nên đọc giá trị ở thanh ghi PORTB ?

bien_van_khat 19-11-2007 03:26 PM

khi đọc giá trị từ ngoài vào thì bạn bắt buộc phải dùng PORT, vì PORT là cái nơi để giao tiếp với bên ngoài.

khi set bit hoac clear bit tren port (dùng lệnh bsf-bcf hoặc bset-bclr), thì bạn nên dùng LAT

Khi viết chương trình bằng C thì bạn ko cần quan tâm vì trình dịch sẽ lo vụ này dùm bạn.

caonam 11-01-2008 10:59 PM

Trích:

Nguyên văn bởi bien_van_khat (Post 12931)
khi đọc giá trị từ ngoài vào thì bạn bắt buộc phải dùng PORT, vì PORT là cái nơi để giao tiếp với bên ngoài.

khi set bit hoac clear bit tren port (dùng lệnh bsf-bcf hoặc bset-bclr), thì bạn nên dùng LAT

Cái này thì đúng
Trích:

Khi viết chương trình bằng C thì bạn ko cần quan tâm vì trình dịch sẽ lo vụ này dùm bạn.
Cái này còn tùy, tớ đang dùng C30 nhưng nó chả lo cái gì cả! hi`hi`

bien_van_khat 13-01-2008 12:30 PM

Trích:

Nguyên văn bởi caonam (Post 13839)
Cái này còn tùy, tớ đang dùng C30 nhưng nó chả lo cái gì cả! hi`hi`

Dĩ nhiên bạn gán kiểu như
PORTB = 0xcf;
thì rõ ràng trình dịch sẽ dịch nguyên xi ý của bạn.

Nếu nó cung cấp hàm xuất nhập kiểu như của CCS
output_B(0xcf);
lúc đó trình dịch mới lo được dùm bạn được.

footballer 17-03-2008 03:19 PM

Trích:

Nguyên văn bởi bien_van_khat (Post 12885)
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.

anhtuan133 13-04-2009 08:18 PM

Trích:

Nguyên văn bởi bien_van_khat (Post 12885)
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.

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
Đúng vậy. write port bit bằng C30 rất hay gặp trường hợp kô wr được. Đổi thành write latch ra ngay.

ddt06 22-09-2011 04:25 PM

Em viết chương trình điều khiển LCD ở chế độ 4 bít với con pic 16F1939 dùng HI-TECH C, nếu dùng các khai báo POTR như RD1, RD2... thì nó không chạy nhưng nếu dùng LATD1, LATD2... thay thế thì chạy ngon lành. Nhưng em vẫn chưa hiểu rõ nguyên nhân tại sao chỉ làm theo lời khuyên của các anh là: nếu set hoặc clear từng bit riêng lẻ của 1 PORT thì nên dùng LATx! thank!

kidteam 06-08-2012 12:37 PM

em đang đọc những thứ được viết từ năm 2007
haiz
sinh sau đẻ muộn khổ vậy đó
:):):)

semipower 07-08-2012 10:55 PM

Bạn đọc datasheet của pic16f1939 sẽ thấy có 2 thanh ghi PORT và LAT cũng như ý nghĩa của chúng.


Múi giờ GMT. Hiện tại là 05:37 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam