AVR รีจิสเตอร์และพอร์ตจำเป็นต้องเริ่มต้นเป็นศูนย์หรือไม่


9

ระหว่างรูทีนการเริ่มต้นของรหัสของฉันฉันใช้เพื่อทำสิ่งต่าง ๆ เช่น:

clr    r0  ; will always stay zero

และ:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

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

คำตอบ:


6

พอร์ต I / O ของ AVR ถูกตั้งค่าเป็น INPUT / Tri-State / Hi-Z (DDRx = 0x00) เมื่อรีเซ็ต ไมโครคอนโทรลเลอร์ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) มีพฤติกรรมนี้ มันเป็นสถานะที่ปลอดภัยที่สุดสำหรับหมุดที่จะอยู่ดังนั้นใช่คุณสามารถพึ่งพาพอร์ตที่จะตั้งค่าโดยอัตโนมัติเป็นอินพุต

ข้อความที่ตัดตอนมาจาก ATmega16 บางส่วนแสดงให้เห็นว่า:

ป้อนคำอธิบายรูปภาพที่นี่

หมุดของพอร์ต C จะระบุเป็นสามเท่าเมื่อสภาพการรีเซ็ตใช้งานได้แม้ว่านาฬิกาจะไม่ทำงาน


1
ตรงนี้เป็นสิ่งที่ฉันได้รับการมองหา :)
สเตฟานพอล Noack

เท่าที่ฉันจำได้ว่าถ้าคุณปล่อยอินพุตลอยตัวคุณจะได้รับสัญญาณรบกวนแบบสุ่มดังนั้นสถานะเริ่มต้นอาจเป็นศูนย์ได้ แต่ก็อาจไม่เป็นศูนย์หลังจากรอบนาฬิกาแรก
miceuz

@miceuz จุดคือไม่ให้มีผลในสถานะที่ไม่รู้จัก พวกเขาอาจมีผลกระทบที่ไม่พึงประสงค์ในวงจรภายนอกที่เชื่อมต่อกับไมโครคอนโทรลเลอร์
m.Alin

1
@miceuz คุณกำลังอ้างถึงการลงทะเบียนพอร์ตใช่ไหม? สิ่งเหล่านี้มี N / A เป็นสถานะเริ่มต้นของพวกเขา (ซึ่งสมเหตุสมผลเนื่องจากพวกเขาเพียงสะท้อนสิ่งที่ใช้กับพิน) แต่ฉันอ้างถึงการลงทะเบียนข้อมูลทิศทาง ฉันแค่อยากจะแน่ใจว่าฉันไม่ได้ตั้งใจตั้งพอร์ตเป็นเอาท์พุทอาจขัดแย้งกับแรงดันไฟฟ้าที่ใช้กับพิน
Stefan Paul Noack

โอ้ใช่จริงๆขอโทษสำหรับเสียง ..
miceuz

4
  • การเริ่มต้นพอร์ตเป็นความคิดที่ดีเสมอโดยไม่คำนึงถึงสิ่งที่แผ่นข้อมูลพูด

  • หากแผ่นข้อมูลบอกว่าไม่มีอะไรแสดงว่าเป็นความคิดที่สำคัญอย่างยิ่ง


คุณจะต้องกำหนดเนื้อหาข้อมูลพอร์ตหากคุณสนใจว่าจะเกิดอะไรขึ้นเมื่อโปรแกรมของคุณทำงาน

หากคุณไม่สนใจผลลัพธ์ที่ได้คุณไม่จำเป็นต้องตั้งค่าบิตข้อมูลพอร์ต :-)

หากผู้ผลิตพูดอย่างชัดเจนในแผ่นข้อมูลที่บิตข้อมูลพอร์ตถูกตั้งค่าหรือล้างข้อมูลแล้วพวกเขาอาจจะเป็น แต่มันก็ยังคงเป็นความคิดที่ดีจริงๆที่จะเริ่มต้นพวกเขาเองต่อไป "เงื่อนไขขอบเขต" เป็นสิ่งที่ผิดพลาดมากที่สุด - เช่นจุดเริ่มต้นของลูป, จุดสิ้นสุดของลูป, การวนบัฟเฟอร์บัฟเฟอร์แบบวงกลมจุดกลม, ... การเริ่มต้นตัวประมวลผลเทียบเท่าฮาร์ดแวร์ ในโลกแห่งความจริงที่มีเสียงรบกวนและความบกพร่องและผู้คนที่อยู่ในนั้นการรับผิดชอบต่อโปรแกรมของคุณจะทำให้คุณประสบความสำเร็จมากที่สุดเท่าที่จะทำได้ การเริ่มต้นพอร์ตเป็นส่วนที่ง่ายของสิ่งนี้


เห็นด้วยอย่างเต็มที่ ฉันเพิ่งคิดว่าแทนที่จะรีเซ็ตฮาร์ดแวร์อาจมีการข้ามไปยังการเริ่มต้นของโปรแกรมหรือ - สิ่งที่เกิดขึ้นกับฉันเมื่อไม่นานมานี้เมื่อการกระโดดทางอ้อมผิดพลาด - ตัวนับโปรแกรมเพิ่งล้นและถึง 0x0000 อีกครั้ง ใครจะรู้ว่าพอร์ตจะอยู่ในสถานะใดหลังจากนั้น ...
Stefan Paul Noack

1

รีจิสเตอร์หรือ SRAM ไม่ได้รับการเตรียมใช้งานเมื่อรีเซ็ตมีเพียงอุปกรณ์ต่อพ่วงบางตัวเท่านั้น คุณควรเริ่มต้นสิ่งที่คุณใช้


คุณรู้จักหรือมีลิงค์ไปยังส่วนที่หายไปซึ่งอุปกรณ์ต่อพ่วงนี้ใช้กับอะไร ฉันพบ 'ค่าเริ่มต้น' สำหรับบางอย่างเช่นUCSRCในแผ่นข้อมูล แล้วพอร์ต I / O โดยเฉพาะทิศทางข้อมูลล่ะ
Stefan Paul Noack

2
พอร์ต I / O ถูกตั้งค่าเป็นอินพุต ทุกอย่างอยู่ในแผ่นข้อมูล
Leon Heller

@ LeonHeller โอ้ขอบคุณตอนนี้ฉันเห็นมัน ที่นั่นในคำอธิบายการลงทะเบียน ฉันพลาดอย่างนั้น ...
สเตฟานพอลแนค

@ noah1989, Leon ถูกต้องค่าเริ่มต้นสำหรับการลงทะเบียนอุปกรณ์ต่อพ่วงมักจะระบุไว้ด้านล่างการสร้างภาพข้อมูลของการลงทะเบียน (หรือสิ่งที่ภาพที่มีชื่อของแต่ละบิตเรียกว่า :))
avakar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.