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.

small_chip 24-10-2012 09:39 PM

1 Attachment(s)
em thấy anh bien_van_khat giải thích khá rõ ! nhưng khi nhìn sơ đồ khối trong datasheet vẫn còn chỗ em chưa hiểu lắm
(em đang dùng dsPIC30F4011), cụ thể là:
1/-cứ sau mỗi lệnh write TRIS thì có 1 cạnh xuống ở ngỏ CLK khối TRIS latch D-flipflop ? khối D-flipflop dịch mỗi lần
1 bit mà chỉ có kích cạnh lúc write thì làm sao dịch hết các bit của databus ?
2/-Tri-state hoạt động khi ngỏ enable ở mức 1 vậy bit dich ra ở ngỏ Q của TRIS latch D-flipflop phải là 1 .Trong khi đó
để config 1 pin là ngỏ ra thì mình phải config bit TRIS tương ứng là 0. Vậy có gì mâu thuẫn k ?
Sơ đồ khối IO em có gửi kèm theo ! Mong mọi người chỉ giáo !!!

agames2013 17-10-2013 12:02 PM

Mejores ideas para juegos friv Juego que tendrá su juego Superior
Deja una respuesta

Ambos pueden entretenernos y educarnos . Ellos pueden ser una gran forma de escapismo y también nos proporciona una salida de socializar con personas de ideas afines . Para aumentar su tiempo de juegos friv de la consola , lea este artículo juegos de friv

No todos los juegos friv funcionan en todos los equipos , así que tome el tiempo de revisar los sitios web que dicen que si su sistema puede ejecutar el juegos friv o no. Primero se descarga , entonces esta página única que pasa por algunas pruebas para ver si cumple con los requisitos de juegos friv. Si usted no quiere que descargar nada , ten en cuenta de que las cosas siempre pueden ser eliminados después de que se adquiera el material clave .

Al jugar videojuegos friv durante largos períodos de tiempo, asegúrese de tomar un tramo romper cada quince minutos. Los movimientos repetitivos que participan en los juegos friv puede ser estresante para tu cuerpo. Para prevenir los calambres musculares y posibles coágulos de sangre , usted tiene que estirar los músculos . Hacer esto mantendrá su salud.

Parar y estirar los músculos cuando estás jugando juegos friv de video 4 veces por hora. Gaming alienta movimientos repetitivos por lo que necesita para moverse periódicamente para evitar sentirse atrapado en su lugar. Estirar evitará dolores musculares y ayudar a evitar la formación de coágulos sanguíneos. Esta es la única manera de estar sano y jugar juegos friv de video .

Pasar algún tiempo con sus hijos y jugar con ellos que ambos tienen diversión con . Mnay niños les encantan los juegos friv de video. También pueden aprender mucho de ellos . Además de mejorar sus habilidades motoras , los videojuegos friv también pueden enseñar a un niño de matemáticas o lectura.

Muchos juegos friv en línea usan un “libre – to-play ” o modelo ” freemium ” , en el que los jugadores pueden trabajar duro para ganar premios o comprar actualizaciones en una ” tienda en efectivo ” con dinero real. Asegúrese de examinar cuidadosamente estas ofertas antes de participar . En una nota , no pueden mejorar su experiencia de juegos friv mucho. O bien, puede ahorrar mucho tiempo .

Dar seria consideración a la edad en que se le permita a sus hijos a jugar a los juegos friv calificados M. mayoría de las consolas pueden ser manipuladas para evitar de ser capaz de jugar a juegos friv con contenido para adultos, aunque esto puede ser mucho más complicado en los ordenadores personales . Sus hijos son su responsabilidad , por lo que tienen que aprender a mantener a salvo cuando son juegos friv de azar.

Consolas pueden ofrecer una experiencia de juegos friv mucho más seguro para sus hijos que los PC puedan. Consolas darle un mejor control sobre el contenido y la seguridad , ya que muchos niños pueden fácilmente pasar rápidamente por el control parental en el ordenador


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