จะเกิดอะไรขึ้นเมื่อข้อมูลถูกเขียนไปยัง LATCH


9

นี่คือสิ่งที่ฉันพบในแผ่นข้อมูล PIC16F1947:

การอ่านการลงทะเบียน PORTB จะอ่านสถานะของหมุดในขณะที่การเขียนลงไปจะเป็นการเขียนไปยังสลัก PORT การดำเนินการเขียนทั้งหมดเป็นการดำเนินการอ่าน - แก้ไข - เขียน ดังนั้นการเขียนไปยังพอร์ตหมายความว่าอ่านพอร์ตของหมุดแล้วค่านี้จะถูกปรับเปลี่ยนแล้วเขียนไปยัง PORT data latch (LATB)

ฉันเป็นนักพัฒนาเฟิร์มแวร์และพื้นหลังของฉันคือวิทยาศาสตร์คอมพิวเตอร์ ฉันยังคงพยายามทำความเข้าใจเกี่ยวกับอุปกรณ์อิเล็กทรอนิกส์และตรรกะในระดับฮาร์ดแวร์ ฉันมีความรู้พื้นฐานเท่านั้น

ดังนั้นฉันต้องการที่จะเข้าใจว่าเกิดอะไรขึ้นเมื่อมีการเขียนข้อมูลลงในระดับฮาร์ดแวร์

ขอบคุณ.

คำตอบ:


19

Latch เป็นหน่วยความจำชนิดหนึ่งบิต

ลองใช้รูปภาพในคู่มือ:

การใช้งานพอร์ต I / O ทั่วไป

เมื่อคุณเขียนบิตในพิน I / O คุณกำลังเก็บบิตนี้จาก Data Bus ไปยัง Data Register ( D-FlipFlop ) ถ้า TRISx ของบิตนี้เป็น 0 ดังนั้นข้อมูลจาก Q ของ Data Register จะอยู่ใน I / O pin เขียนใน LATx หรือ PORTx เหมือนกัน ดูด้านล่างในสีแดง:

การดำเนินการพอร์ต I / O ทั่วไปเขียน

ในทางตรงกันข้ามการอ่านจาก LATx นั้นแตกต่างจากการอ่านจาก PORTx

เมื่อคุณอ่านจาก LATx คุณกำลังอ่านสิ่งที่อยู่ใน Data Register ( D-FlipFlop ) ดูภาพด้านล่างเป็นสีเขียว:

การใช้งานพอร์ต I / O ทั่วไปอ่าน LATx

และเมื่อคุณอ่านจาก PORTx คุณกำลังอ่านค่าพิน I / O จริง ดูด้านล่างเป็นสีน้ำเงิน:

การใช้งานพอร์ต I / O ทั่วไปอ่าน PORTx

PIC ใช้การดำเนินการอ่าน - แก้ไข - เขียนเพื่อเขียนและอาจเป็นปัญหาดังนั้นพวกเขาจึงใช้ shadow register นี้เพื่อหลีกเลี่ยง


1
+1 สำหรับการเชื่อมโยงไปยังสถานที่อธิบายถึงปัญหา (อ่าน - แก้ไข - เขียน) [ techref.massmind.org/techref/readmodwrite.htm]อย่างชัดเจน(และวิธีแก้ไข)
davidcary

1
ว้าวคำอธิบายที่ดี
abdullah kahraman

ลิงก์ทั้งสองไปยังปัญหา read-mod-write เสียหาย
Randomblue

@ Randomblue ฉันใส่ลิงค์อื่นเข้าไป ปัญหาของลิงค์อื่นคือตัวอักษร ']' ในตอนท้าย เพียงลบออกในที่อยู่เบราว์เซอร์ของคุณ
Daniel Grillo

6

เพื่อหลีกเลี่ยงปัญหาอ่าน - แก้ไข - เขียนคุณควรเขียนพอร์ตทั้งหมดแทนที่จะตั้งค่าหรือรีเซ็ตแต่ละบิตในพอร์ต ปัญหา RMW อาจส่งผลให้ไม่ได้ตั้งค่าบิตหรือเอาต์พุตอื่นกำลังสูงโดยเฉพาะหากพินเอาท์พุทมีการจัดหาหรือจมกระแสจำนวนมาก

โดยทั่วไปจะใช้ "shadow register" ตั้งค่าหรือรีเซ็ตบิตในนั้นและส่งออกไปยังพอร์ตเพื่อหลีกเลี่ยงปัญหา RMW

ปัญหาถูกหลีกเลี่ยงด้วย 18F PICs โดยการใช้สลักแยกต่างหากบิตแต่ละตัวที่สามารถตั้งค่าและรีเซ็ตได้โดยไม่ต้องรับโทษ


แต่ฉันเดาว่าฉันไม่จำเป็นต้องเขียนไปที่สลักลงทะเบียนเนื่องจากการเขียนลงทะเบียนพอร์ตเดิมจะเขียนถึงสลักใช่ไหม?
Donotalo

@ Donotalo คุณพูดถูก คุณสามารถเขียนลงทะเบียนพอร์ตได้เช่นกัน ไม่เป็นไร.
Daniel Grillo

@ Donotalo: เป็นไปได้ที่จะเขียนลงทะเบียนพอร์ต แต่ฉันขอแนะนำเป็นเรื่องของนิสัยการเขียนลงทะเบียน LATx ในโปรเซสเซอร์เหล่านั้นที่มีพวกเขาและเกี่ยวกับการลงทะเบียน PORTx เป็นแบบอ่านอย่างเดียว ร้านค้า "blind" ไปยังการลงทะเบียน PORTx (เช่น PORTB = 0x42;) จะทำงานไม่แตกต่างจากที่หนึ่งไปที่ LATBx และการอ่าน - แก้ไข - เขียนลงทะเบียน PORTx (เช่น PORTB | = 0x02;) จะมีผลซึ่งจะ ไม่ว่าจะเป็น LATx หรือแตกต่างกันในลักษณะที่เป็นไปได้มากที่สุดที่ไม่พึงประสงค์ BTW บางส่วนของไมโครชิพ pre- รุ่นต่อมาเสนอ LATx; ฉันไม่รู้ว่าทำไม Microchip ใช้เวลาเป็นปี ๆ
supercat

+1 สำหรับการกล่าวถึงว่าชิป PIC18F (aka "PIC คำสั่งแบบ 16 บิต) มีการลงทะเบียน LAT ในขณะที่ชิป PIC16F (aka" PIC คำสั่ง 14 บิต ") จำเป็นต้องจำลองการลงทะเบียน LAT ในซอฟต์แวร์ (" shadow register ")
davidcary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.