สิ่งใดที่ทำให้ไมโครคอนโทรลเลอร์รีเซ็ตโดยไม่คาดคิด


26

ข้อผิดพลาดที่หลากหลายที่น่ารำคาญเป็นพิเศษในระบบที่ควบคุมด้วยไมโครโปรเซสเซอร์คือให้ไมโครโปรเซสเซอร์ทำการรีเซ็ตโดยไม่คาดคิด เครื่องมือสำคัญสำหรับการดีบักปัญหาประเภทนี้คือรายการสาเหตุที่เป็นไปได้ สิ่งใดที่ทำให้ไมโครคอนโทรลเลอร์รีเซ็ตโดยไม่คาดคิด


1
คำตอบบางส่วนที่นี่อาจเป็นประโยชน์: electronics.stackexchange.com/questions/30430/…คุณใช้ไมโครคอนโทรลเลอร์ชนิดใด?
Jon L

ฉันมักจะใช้ dsPIC แต่ตอนนี้ฉันไม่ได้พยายามที่จะแก้ไขปัญหาอะไรโดยเฉพาะเพียงแค่รวบรวมรายการอ้างอิงของปัญหาที่อาจเกิดขึ้น
Stephen Collings

2
นี่เป็นคำถามทำการบ้านหรือไม่
old_timer

1
@dwelch อาจเป็นเพราะใครบางคน แต่ไม่ใช่สำหรับฉันหรือนักเรียนคนใดก็ได้
Stephen Collings

1
@Vorac ดังกล่าวต้องอ่านว่า Atmel ไม่สามารถยอมรับในการรักษา URL ที่เชื่อถือได้
Kaz

คำตอบ:


51

สำหรับชิป PIC และ dsPIC ฉันได้ตรวจสอบสาเหตุของการรีเซ็ตที่ไม่คาดคิดต่อไปนี้

ฮาร์ดแวร์:

  • รีเซ็ตพินขับเคลื่อนต่ำหรือลอย ตรวจสอบสิ่งที่ชัดเจนก่อน!
  • ESD คัปปลิ้งลงในพินรีเซ็ต ฉันเคยเห็นสิ่งนี้เกิดขึ้นเมื่ออุปกรณ์ที่ไม่เกี่ยวข้องถูกเปิดใช้งานบนโต๊ะเดียวกัน ตรวจสอบให้แน่ใจว่ามีความจุเพียงพอบนพินรีเซ็ตซึ่งอาจมากถึง 1 ยูเอฟ
  • ESD ต่อเข้ากับขาอื่นของโปรเซสเซอร์ โดยเฉพาะอย่างยิ่งโพรบขอบเขตสามารถทำหน้าที่เป็นเสาอากาศส่งเสียงรบกวนคู่เข้ากับชิปและทำให้เกิดการรีเซ็ตผิดปกติ ฉันได้ยินรายงานรีเซ็ตรหัส "ไม่ถูกต้อง opcode" แล้ว
  • ข้อต่อประสานที่ไม่ดี / สะพานไม่ต่อเนื่อง อาจสูญเสียพลังงานหรือทำให้รางไฟขาดหายทั้งบนโปรเซสเซอร์หรือที่อื่นบนบอร์ด
  • ข้อผิดพลาดรางไฟ / เสียงรบกวน อาจเกิดจากปัญหาภายนอกจำนวนใด ๆ รวมถึงตัวควบคุมความเสียหายหรือการจุ่มลงในแหล่งจ่ายต้นน้ำ ตรวจสอบให้แน่ใจรางไฟที่ป้อนโปรเซสเซอร์มีเสถียรภาพ อาจต้องใช้หน่วยความจำเพิ่มที่ใดที่หนึ่งหรืออาจแยกแคปโดยตรงบนโปรเซสเซอร์
  • ไมโครคอนโทรลเลอร์บางตัวมีพิน Vcap ซึ่งจะต้องไม่เชื่อมต่อกับ VDD และต้องมีคาปาซิเตอร์เป็นของตัวเอง ความล้มเหลวในการเชื่อมต่อพินนี้อย่างถูกต้องอาจทำให้ได้ผลลัพธ์ที่ไม่คาดคิด
  • ข้อ จำกัด บางประการทำให้การรีเซ็ตที่รายงานใน RCON นั้นเป็นสีน้ำตาลอ่อน เช่นเดียวกันกับอินพุตดิจิตอล
  • dV / dt ที่สูงมากในตัวแปลงพลังงานใกล้เคียงอาจทำให้เกิดการรีเซ็ตเป็นสีน้ำตาล (ดูคำถามนี้) ฉันได้เห็นสิ่งนี้ในสองกรณีและในหนึ่งฉันก็สามารถติดตามมันเพื่อการมีเพศสัมพันธ์แบบ capacitive IGBT กำลังสลับ 100-200 แอมป์และเมื่อปิดวงจรข้อเสนอแนะบางอย่างก็เห็นสัญญาณรบกวนไม่กี่ไมโครวินาทีเริ่มจาก 2V ไปเป็น 8V บนโปรเซสเซอร์ 3.3V การเพิ่มตัวกรองบนรางติชมนั้นทำให้การรีเซ็ตหยุดลง อาจจินตนาการได้ว่าการเพิ่มตัวกรอง dV / dt ข้ามทรานซิสเตอร์อาจมีผลคล้ายกัน

ซอฟต์แวร์:

  • ตัวจับเวลา Watchdog ตรวจสอบให้แน่ใจว่าตัวจับเวลาจ้องจับผิดถูกลบออกบ่อยพอโดยเฉพาะในสาขาของรหัสของคุณที่อาจต้องใช้เวลานานในการดำเนินการเช่น EEPROM เขียน ทดสอบสิ่งนี้โดยการปิดใช้งานสุนัขเฝ้าบ้านเพื่อดูว่าปัญหาหายไปหรือไม่
  • การหารด้วยศูนย์ หากคุณทำการหารใด ๆในรหัสของคุณตรวจสอบให้แน่ใจว่าตัวหารไม่สามารถเท่ากับศูนย์ เพิ่มการตรวจสอบขอบเขตก่อนการแบ่ง อย่าลืมว่าสิ่งนี้ยังใช้กับการดำเนินการแบบโมดูโลด้วย
  • สแต็คล้น การเรียกใช้ฟังก์ชันที่ซ้อนกันมากเกินไปอาจทำให้ระบบมีหน่วยความจำแบบไดนามิกหมดสำหรับสแต็กซึ่งอาจทำให้เกิดปัญหาที่จุดผิดปกติในการเรียกใช้โค้ด
  • กอง Underflow หากคุณกำลังเขียนโปรแกรมในแอสเซมเบลอร์คุณสามารถรัน RETURN ได้มากกว่าที่คุณเรียกใช้ CALLs โดยไม่ตั้งใจ
  • รูทีนการอินเตอร์รัปต์ไม่มีอยู่ หากการอินเตอร์รัปต์ถูกเปิดใช้งาน แต่ไม่ได้กำหนดรูทีนการขัดจังหวะตัวประมวลผลอาจรีเซ็ต
  • รูทีนการดักไม่มีอยู่ คล้ายกับชุดคำสั่งขัดจังหวะ แต่แตกต่างกันพอที่ฉันจะแสดงรายการแยกต่างหาก ฉันเห็นสองโปรเจ็กต์แยกกันโดยใช้ dsPIC 30F4013 ซึ่งรีเซ็ตแบบสุ่มและสาเหตุถูกติดตามไปยังกับดักที่เรียกว่า แต่ไม่ได้กำหนด แน่นอนตอนนี้คุณมีคำถามว่าทำไมกับดักถูกเรียกตั้งแต่แรกซึ่งอาจเป็นจำนวนของสิ่งต่าง ๆ รวมถึงข้อผิดพลาดของซิลิคอน แต่การกำหนดตัวจัดการแทร็บทั้งหมดอาจเป็นขั้นตอนเริ่มต้นที่ดีในการวินิจฉัยการรีเซ็ตที่ไม่ได้อธิบาย
  • ตัวชี้ฟังก์ชันล้มเหลว หากตัวชี้ฟังก์ชั่นไม่ได้ชี้ไปยังตำแหน่งที่ถูกต้องการยกเลิกการเรียกตัวชี้และการเรียกฟังก์ชั่นที่ชี้ไปอาจทำให้เกิดการรีเซ็ตได้ สาเหตุที่น่าขบขันอย่างหนึ่งคือเมื่อฉันเริ่มต้นโครงสร้างด้วยค่าที่ต่อเนื่องของ NULL (สำหรับตัวชี้ฟังก์ชัน) และ -1 (สำหรับ int) เครื่องหมายจุลภาคถูกพิมพ์ผิดดังนั้นตัวชี้ฟังก์ชันจึงเริ่มต้นเป็น NULL-1 ได้จริง ดังนั้นอย่าคิดว่าเพียงเพราะ CONST จะต้องมีค่าที่ถูกต้อง!
  • ดัชนีอาร์เรย์ไม่ถูกต้อง / ลบ ตรวจสอบให้แน่ใจว่าคุณทำการตรวจสอบขอบเขตบนดัชนีอาเรย์ทั้งหมดทั้งในและนอกขอบเขตถ้ามี
  • การสร้างอาร์เรย์ข้อมูลในหน่วยความจำโปรแกรมที่ใหญ่กว่าส่วนที่ใหญ่ที่สุดของหน่วยความจำโปรแกรม สิ่งนี้อาจไม่ได้เกิดข้อผิดพลาดในการรวบรวม
  • การส่งแอดเดรสของโครงสร้างไปยังตัวชี้ไปยังชนิดอื่นการยกเลิกการอ้างอิงตัวชี้นั้นและการใช้ตัวชี้การลงทะเบียนเนื่องจาก LVALUE ในคำสั่งอาจทำให้เกิดความผิดพลาดได้ ดูคำถามนี้ สันนิษฐานว่าสิ่งนี้ยังใช้กับพฤติกรรมที่ไม่ได้กำหนดอื่น ๆ

ใน dsPIC บางตัว RCON register จะเก็บบิตที่ระบุสาเหตุของการรีเซ็ต สิ่งนี้มีประโยชน์มากเมื่อทำการดีบัก


1
@reset pin: หมุดรีเซ็ตแบบลอยตัวนั้นเป็นที่รู้จักสำหรับการรีเซ็ตแบบลวงตา เสมอผูกไว้กับ Vcc ผ่านตัวต้านทาน
jippie

4
นี่คือรายการที่ครบถ้วนสมบูรณ์อย่างไม่น่าเชื่อ ฉันเชื่อในประสบการณ์ของฉันกับ AVR ว่าถ้าไม่ใช่ในสถานการณ์เดียวกันทั้งหมดจะทำให้เกิดผลลัพธ์ที่ไม่คาดคิดหรือรีเซ็ต
HL-SDK

4
ให้ฉันเพิ่มอีกอันสำหรับการเขียนโปรแกรมภาษาแอสเซมเบลอร์ - ทะเบียน PUSH และ POP ที่ไม่ตรงกันจากสแต็ก
Michael Karas

2
อีกสองสามอย่าง: ภายใต้ฮาร์ดแวร์รีเซ็ตเป็นสีน้ำตาล ภายใต้ซอฟต์แวร์คำสั่งรีเซ็ตซอฟต์แวร์ ทั้งสองอย่างนี้มีอยู่ในไมโครคอนโทรลเลอร์หลายตัว
tcrosley

2
อีกหนึ่งรายการ: โทรศัพท์มือถือที่วางไว้ใกล้กับสายเคเบิลอาจทำให้เกิดแรงดันไฟฟ้าที่สำคัญอย่างน่าประหลาดใจในสายที่มีแรงขับน้อย หากคุณมีสายรีเซ็ตผ่านสายเคเบิล (เช่นเพื่อให้บอร์ดหนึ่งสามารถบังคับให้รีเซ็ตอีกสายได้) โทรศัพท์มือถือที่อยู่ใกล้กับสายเคเบิลอาจทำให้เกิดการรีเซ็ตหากมีสายเข้ามา
supercat

7

RESET-pin จะต้องขับเคลื่อนอย่างถูกต้องโดยการตรวจสอบวงจรรีเซ็ตแรงดันสูง / ต่ำและสร้างสัญญาณรีเซ็ตที่ยาวพอ เมื่อนึกถึงประสบการณ์ของฉันในการรีเซ็ตฮาร์ดแวร์ที่ไม่สามารถควบคุมได้นั้นมาจาก:

  • Crosstalk จากการสลับสายไปที่ RESET pin / line (ทำให้สั้น)
  • กราวด์ / การเคลื่อนที่กราวด์ที่เกิดจากการเปิด / ปิดโหลดกระแสสูงภายนอกสูง
  • แรงดันไฟฟ้าที่ไม่ถูกกรองโดยแหล่งจ่ายไฟและสั้นเกินไปที่จะใช้งาน RESET ที่เหมาะสม
  • การสลับโหลดภายนอกโดยไมโครคอนโทรลเลอร์ซึ่งทำให้เกิดปัญหาข้างต้น (ส่วนใหญ่เกี่ยวกับโหลดอุปนัยเช่นมอเตอร์เปิด / ปิด, รีเลย์หรือโคมไฟเก่า (กระแสไหลเข้า)
  • แรงดันไฟฟ้า / กระแสไฟฟ้าที่ขาของไมโครคอนโทรลเลอร์ (ที่แย่ที่สุดคือออสซิลเลเตอร์) อาจทำให้เกิดกระแสย้อนกลับและอาจสลับการลงทะเบียนภายใน (เช่นเดียวกับแรงดันไฟฟ้าแหลมบนสายจ่าย) โดยทั่วไปเมื่อเชื่อมต่อกับสภาพแวดล้อมอุตสาหกรรมต้องใช้ความระมัดระวัง (ดูเพิ่มเติมได้ที่: http://www.ichaus.biz/wp1_mcu_interface ) ต้องพิจารณาถึงการเลื่อนระดับของ IO การกรองอินพุตและเอาต์พุตการสลับแบบนุ่มนวล การทำให้เส้นอุปทานสะอาดมีความสำคัญอันดับแรกที่ด้านฮาร์ดแวร์ จากนั้นรีเซ็ต RESET และ oscillator แล้วตามด้วย IO-lines มม

1
กราวด์แค่ฉันหน่อย ในกรณีของฉันฉันมีส่วนหนึ่งของการถือครองร่วมกันของฉัน ~ 100 แอมป์ ไมโครคอนโทรลเลอร์ถูกอ้างอิงไปยังอีกด้านหนึ่งของการติดตามแบบหนา แต่วงจรไมโครคอนโทรลเลอร์ที่กำลังขับบางตัวถูกอ้างอิงไปที่ปลายอีกด้านหนึ่งของการติดตาม การติดตามมีเพียง 3 mOhm แต่ที่ 100 แอมป์ก็เพียงพอที่จะรับความแตกต่าง 300 mV ระหว่างไมโครและอุปกรณ์ต่อพ่วงที่กำลังขับรถ เปลี่ยนเส้นทางอุปกรณ์ต่อพ่วงให้เป็นจุดสิ้นสุดทั่วไปของการติดตามนั้นเป็นคอนโทรลเลอร์และตอนนี้ทุกอย่างเรียบร้อยแล้ว ไม่มีสิ่งเช่นโหนดที่กระแสเหล่านั้น
สตีเฟ่น Collings

4

ความเป็นไปได้เพิ่มเติมอย่างหนึ่งที่ฉันไม่เห็นในรายการนี้คืออุปกรณ์ที่รองรับ ICSP หากมีการใช้ pull ups ไม่เพียงพอบนบรรทัดที่ทริกเกอร์ในโหมดการเขียนโปรแกรมอนุกรมวงจรบางครั้งก็เป็นไปได้ที่จะเข้าสู่โหมดนั้นแบบสุ่ม สิ่งนี้นำไปสู่การรีเซ็ตช่วงเวลาสั้น ๆ ในภายหลังเมื่อไม่มีการอัปเดตโปรแกรมไปยังสายตัวรับอนุกรมที่กำหนด ฉันสงสัยว่ากำลังจ้องจับผิดตัวจับเวลาจ้องจับผิดภายในจะถูกรีเซ็ตหากเริ่ม ICSP และไม่มีการส่งข้อมูลการเขียนโปรแกรม นี่เป็นความผิดพลาดที่ฉันทำและใช้เวลาในการค้นหากับ 16F876


3

ตรวจสอบให้แน่ใจว่าคุณกำลังใช้ชิปตรรกะ CMOS หรือ TTL ในวงจรของคุณว่ามีตัวเก็บประจุแยกตัวเพียงพอใน Vdd และกราวด์ (ปกติคือ 0.1 ยูเอฟ) ฉันใช้ CD4021 ในการออกแบบและเมื่อมีการใช้งานดูเหมือนว่ามันเป็นสาเหตุที่ขัดขวางบางอย่างที่ทำให้ไมโครโปรเซสเซอร์เริ่มต้นใหม่ จากนั้นวงจรจะทำซ้ำ นี่เป็นเหตุผลที่ควรวางลำดับการทดสอบที่ชัดเจน (เช่นการเปิดและปิด LED สองสามครั้ง) ที่จุดเริ่มต้นของรหัสของคุณเพื่อให้คุณรู้ว่าไมโครโปรเซสเซอร์ทำงานและประมวลผลโค้ด


2

นี่คือหนึ่งในสิ่งที่หายากที่อาจปรากฏขึ้น:

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

ตอนนี้ฉันทำให้มันเป็นนิสัยที่จะอ่าน errata ก่อนที่ฉันจะตัดสินใจใช้ชิปเพื่อรู้ว่าฉันกำลังทำอะไรอยู่และถ้ามันเป็นสิ่งที่ฉันสามารถจัดการได้ น่าเสียดายที่หลังจากสำเร็จการศึกษาฉันไม่ได้มีใครให้ความรู้ฉันเกี่ยวกับการปฏิบัติร่วมกันดังนั้นการเรียนรู้ในโลกแห่งความเป็นจริงของฉันได้ผ่านความล้มเหลวและความยุ่งยาก


ฉันไม่ทราบด้วยซ้ำว่าคำถามนี้เป็นคำถามเก่าและได้รับคำตอบแล้ว อุ่ย
efox29
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.