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 Bài Trong Ngày 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
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,631
:
Send a message via Yahoo 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
Old 01-11-2007, 08:44 AM   #2
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
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ẻ.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-11-2007, 09:32 AM   #3
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Chết chết

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

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2007, 04:13 PM   #4
hanspkt
Đệ tử 3 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 55
:
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?
hanspkt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2007, 04:49 PM   #5
THANDONGDATVIET
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 15
:
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 !
THANDONGDATVIET vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2007, 08:17 PM   #6
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
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.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2007, 10:09 AM   #7
littlephoc
Đệ tử 3 túi
 
Tham gia ngày: Dec 2006
Bài gửi: 60
:
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 ?
littlephoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2007, 03:26 PM   #8
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
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.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-01-2008, 10:59 PM   #9
caonam
Đệ tử 2 túi
 
Tham gia ngày: Aug 2005
Bài gửi: 30
:
Trích:
Nguyên văn bởi bien_van_khat View Post
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`
caonam vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-01-2008, 12:30 PM   #10
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi caonam View Post
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.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 13-04-2009, 08:18 PM   #12
anhtuan133
Nhập môn đệ tử
 
Tham gia ngày: Mar 2006
Bài gửi: 5
:
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.
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.
anhtuan133 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2011, 04:25 PM   #13
ddt06
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Bài gửi: 2
:
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!
ddt06 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-08-2012, 12:37 PM   #14
kidteam
Nhập môn đệ tử
 
Tham gia ngày: Dec 2010
Bài gửi: 3
:
em đang đọc những thứ được viết từ năm 2007
haiz
sinh sau đẻ muộn khổ vậy đó
kidteam vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-08-2012, 10:55 PM   #15
semipower
Đệ tử 5 túi
 
semipower's Avatar
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: Hà Nội, VIE
Bài gửi: 114
:
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.
__________________
Vì sao nên đọc tài liệu tiếng Anh?
http://www.picvietnam.com/forum/showthread.php?t=6819
Nguồn xung các loại: www.semitech.vn
semipower vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lờ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à 09:27 AM.


Đượ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