ฮาร์ดแวร์ XOR สำหรับหมุดเอาต์พุตบนไมโครคอนโทรลเลอร์ AVR

คุณรู้หรือไม่ว่าชิป AVR จำนวนมากมีตัวเลือกฮาร์ดแวร์หรือ (XOR) ชนิดหนึ่งเมื่อเกี่ยวข้องกับระดับตรรกะของพินเอาท์พุท? หากคุณดูในแผ่นข้อมูล (ภาพด้านบนเป็นภาพหน้าจอจากแผ่นข้อมูล Attiny13) คุณจะพบส่วนในการสลับพิน ปรากฎว่าหากคุณตั้งค่าพอร์ตเป็นเอาต์พุตการเขียนตรรกะหนึ่งไปยังการลงทะเบียน PIN ที่สอดคล้องกันจะสลับระดับตรรกะของสิ่งนั้นออกมา นี่เป็นเรื่องง่ายที่จะละเลยถ้าคุณเขียนใน C แต่ฉันได้เรียนรู้ภาษาแอสเซมเบลอร์และพบว่าสิ่งนี้มีประโยชน์มาก อ่านต่อหลังจากหยุดพักแล้วฉันจะบอกคุณว่าฉันจะเกิดอะไรขึ้นกับข้อมูลนี้และสิ่งที่ดีสำหรับ

ก่อนอื่นให้พูดถึงว่าทำไมสิ่งนี้ไม่สำคัญมากหากคุณกำลังเขียนรหัส C โดยทั่วไปหากคุณต้องการสลับพินเอาต์พุตบางอย่างคุณจะเพิ่งเขียนหนึ่งซับที่ xor’s ด้วย bitmask:

1
portb ^ = 0xff;

นี่คือการจดชวเลข C เล็กน้อย (เรียนรู้เพิ่มเติมเกี่ยวกับชุดกวดวิชาของฉัน) ที่ดำเนินการ XOR บนระดับเอาต์พุตปัจจุบันและเขียนผลลัพธ์กลับไปที่พอร์ต แต่สิ่งเดียวกันสามารถทำได้ในฮาร์ดแวร์โดยการเขียน Bitmask ไปยัง PINB Register:

1
PINB = 0xFF;

คุณไม่สนใจจริงๆเพราะมันเป็นเพียงหนึ่งบรรทัดของรหัส ในความเป็นจริงมันน่าจะง่ายกว่าที่ XOR PORTB เพราะมันมีความหมายมากกว่าแนวคิดมากขึ้น แต่คอมไพเลอร์อาจจบลงด้วยการใช้วัฏจักรมากกว่าถ้าคุณเขียนลงทะเบียน PIN

ฉันเกิดขึ้นกับคุณสมบัตินี้เพราะฉันกระพริบตา LED เป็นวิธีการเรียนรู้ประกอบ ฉันมีรหัสนี้ในรูทีนบริการขัดจังหวะ:

1
2
3
4
ldi myreg, 0xff
ใน Intreg, Portb
Eor Intreg, Myreg
ออก PORTB, intreg

มันโหลด bitmask ลงในหนึ่งการลงทะเบียนโหลดในตรรกะปัจจุบันจาก portb ไปยังการลงทะเบียนอื่นให้ทำ xor ของทั้งสองและเขียนผลลัพธ์กลับไปที่ portb สิ่งนี้ใช้เวลาสี่รอบและต้องการการลงทะเบียนสองครั้ง การสลับบิตเป็นผลการดำเนินงานพื้นฐานที่ฉันรู้สึกประหลาดใจที่ไม่มีคำสั่งถึง xor bits โดยตรงดังนั้นฉันจึงเริ่มค้นหารอบ ๆ ฉันเจอบทความสั้น ๆ นี้ที่ AVR Freaks ซึ่งไขว้ฉันในคุณสมบัติ Toggle Bit Toggle ตอนนี้ฉันสามารถลดรหัสแอสเซมเบลอร์ของฉันได้ดังนี้:

1
2
LDI Intreg2, 0xFF; ชั่วคราวใช้ Intreg2 เป็นหน้ากากเล็กน้อย
ออก PINB, Intreg2; การเขียนไปยัง Pinb EfficediVley ทำแบบพิเศษหรือบนพอร์ต

ส่งผลให้เกิดการสลับผลแบบเดียวกัน แต่ใช้เวลาเพียงสองรอบและต้องใช้การลงทะเบียนเพียงครั้งเดียวเท่านั้น

สิ่งที่ฉันพบว่าน่าสนใจมากมายคือไม่ว่าฉันจะใช้ชิป AVR มากแค่ไหนไม่มีการขาดแคลนความประหลาดใจที่รออยู่ในแผ่นข้อมูล

Leave a Reply

Your email address will not be published. Required fields are marked *