เราใช้ไมโครคอนโทรลเลอร์ ATmega48 / 88/168/328 เป็นเวลาหลายปีในผลิตภัณฑ์ของเรา ขณะนี้เราได้พิจารณาเปลี่ยนจากตัวแปร A และ PA เป็นตัวแปร PB ใหม่ (เพราะเราจะต้องใช้พินเสริมตัวจับเวลาและ UART ในผลิตภัณฑ์ใหม่เนื่องจากราคาถูกกว่าและเนื่องจากดูเหมือนว่าตัวแปรเก่าจะถูกยกเลิก) ดังนั้นเราจึงเปลี่ยน ATmega328A เป็น ATmega328PB มันดูเหมือนว่าจะไปยุ่งเหยิงมากมักจะหลังจากที่หยุดชะงักอำนาจ ปัญหาดังกล่าวไม่เคยเกิดขึ้นกับตัวแปรรุ่นเก่า
การขัดจังหวะพลังงานอย่างสม่ำเสมอเป็นเรื่องปกติสำหรับ usecase ของผลิตภัณฑ์ของเรา เราใช้แหล่งจ่ายไฟแบบสวิตช์ (เช่นนี้ ) ตั้งไว้ที่ 5V และมีตัวเก็บประจุในช่วง 220µF บน Vm ของ ATmega เพื่อให้ SRAM มีชีวิตอยู่เพื่อการหยุดชะงักของพลังงานในช่วงหลายนาทีเพื่อเก็บสถานะภายในซึ่งไม่ใช่ภารกิจ สำคัญ แต่เพิ่มประสบการณ์ผู้ใช้อย่างมากด้วยการพร้อมใช้งานทันทีเมื่อรีสตาร์ท (สถานะเหล่านี้เปลี่ยนบ่อยพอที่จะทำให้ EEPROM ไม่เหมาะสม) สิ่งนี้ได้ผลเสมอ
อย่างไรก็ตามด้วย ATmega328PB ใหม่หลังจากการขัดจังหวะพลังงานชิปจะถูกรีเซ็ตโดยไม่มีเงื่อนไขการรีเซ็ตใน MCUSR และดูเหมือนว่านาฬิกาจะยุ่งเหยิง
- เครื่องตรวจจับสีน้ำตาลถูกตั้งค่าต่อฟิวส์ เราลองทุกระดับที่มีอยู่ข้อผิดพลาดเกิดขึ้นกับพวกเขาทั้งหมด
- เราใช้ภายนอก 20 MHz ตั้งค่าต่อฟิวส์ได้อย่างถูกต้อง
- เราลองใช้ 3 ชิปที่แตกต่างกันดังนั้นจึงไม่ใช่การบัดกรีเดียวหรือความล้มเหลวของฮาร์ดแวร์อื่น ๆ
หลังจากที่เกิดข้อผิดพลาดนาฬิกามักจะตั้งค่าความเร็วที่ช้าลง 2.5x เพื่อระบุว่า mcu นั้นถูกโอเวอร์คล็อกโดย 8 MHz ภายในออสซิลเลเตอร์ อย่างไรก็ตามบางครั้งการชะลอตัวอยู่ที่ประมาณ 6x ซึ่งหมายความว่ามันไม่สามารถเป็นข้อบกพร่องของซอฟต์แวร์ที่เปลี่ยนตัวแบ่งสัญญาณนาฬิกาได้เนื่องจากฉันไม่สามารถตั้งค่าฟิวส์จากซอฟต์แวร์ได้และตัวแบ่งสัญญาณนาฬิกาไม่สามารถแบ่งนาฬิกาได้ 2.5 หรือ 6
ดังนั้นผู้ต้องสงสัยคนแรกของฉันคือฟิวส์ฟิวส์ตรวจสอบความล้มเหลวใหม่ อย่างไรก็ตามไม่ว่าจะเปิดหรือปิดก็ตามพฤติกรรมจะยังคงเหมือนเดิม
ในการแยกแยะลักษณะเฉพาะของซอฟต์แวร์ฉันเขียนโปรแกรมทดสอบอย่างง่ายตั้งแต่เริ่มต้นซึ่งไม่ทำอะไรเลยนอกจากสลับสัญญาณที่มี 100 Hz จากตัวจับเวลาขัดจังหวะและระบุด้วย LED หลังจากเริ่มการทำงานใหม่ทุกครั้งซึ่งมีการเปิดใช้งานเงื่อนไขการรีเซ็ต ส่วนที่เหลือของฮาร์ดแวร์ก็ถูกลบออกมีเพียง mcu และตัวควบคุมเท่านั้นที่มี (และไฟแสดงสถานะที่มีตัวต้านทานแบบอนุกรม)
ผลที่ได้
ประมาณ 2/3 ของเวลาไม่มีอะไรน่าสนใจเกิดขึ้น หลังจากไฟดับ mcu จะทำงานต่อทั้งไฟแสดงสถานะรีเซ็ตเป็นสีน้ำตาลและไฟแสดงการเปิด / ปิดเครื่องสว่างขึ้น
(บนภาพสีแดงคือเข็มสลับและสีน้ำเงินคือ VCC ในภาพนี้หลอดไฟ 2.7 V มองเห็นได้ชัดเจนฉันทำการทดสอบแบบเดียวกันกับการตั้งค่าสีน้ำตาลอื่น ๆ ผลลัพธ์เหมือนกันทุกประการ ดังนั้นฉันจะละเว้นภาพเหล่านั้น)
ประมาณ 1/3 ของเวลาข้อผิดพลาดดังกล่าวเกิดขึ้นและเมื่อพลังงานกลับมาอีกครั้งไม่มีตัวบ่งชี้การรีเซ็ตสีน้ำตาลหมดและไฟแสดงการรีเซ็ตเมื่อเปิดเครื่องจะสว่างขึ้น! เอาท์พุทจะแตกต่างกันราวกับว่า MCU ถูกฟ้องด้วยนาฬิกาแปลก ๆ มันไม่วุ่นวาย แต่มันยังคงติตต่อกับความถี่เท่าเดิม
ที่น่าสนใจในสถานการณ์เช่นนี้เครื่องตรวจจับสีน้ำตาลดูเหมือนว่าจะไม่ทำงานอย่างสมบูรณ์เพราะหลังจากการขัดจังหวะพลังงานครั้งต่อไป (ซึ่งบางครั้งนาฬิกาที่ถูกต้องถูกเรียกคืนบางครั้งก็ไม่ทำงาน) จะเห็นได้อย่างชัดเจนว่า ผ่านระดับออกแล้ว ในสถานการณ์เช่นนี้บางครั้งนาฬิกาก็จะเร็วขึ้นและบางครั้งมันก็จะช้าลง:
ระหว่างการทดสอบเหล่านี้ฉันใช้ 16K CK / 14CK + 4.1 ms สำหรับความล่าช้าในการเริ่มต้นระบบ (แต่ความล่าช้า 65 ms ไม่ได้ช่วยแก้ปัญหา)
นี่คือรูปภาพที่ซูมเข้าซึ่งคุณสามารถเห็นได้อย่างชัดเจนว่า VCC ถึงสถานะเสถียรที่ 5 V ในเวลาไม่เกิน 2 ms:
ในภาพด้านบน mcu เริ่มต้นอย่างถูกต้อง
ที่น่าสนใจเมื่อมันไม่แรงดันไฟฟ้าเพิ่มขึ้นถึง 5 โวลต์ที่เสถียรแม้เร็ว (ดูเหมือนว่าหลายส่วนของ mcu ไม่เปิดดังนั้นจึงดึงกระแสน้อยลงในช่วงเริ่มต้น)
ด้านล่างนี้เป็นภาพจากจุดเริ่มต้นที่ไม่สำเร็จ:
โปรดทราบว่าซอฟต์แวร์จะเริ่มทำงานหลังจากเกิน 85 ms หลังจากแรงดันไฟฟ้าคงที่แทนที่จะเป็น 10.5 ms ที่ต้องการเป็นอย่างอื่น ฟิวส์สำหรับความล่าช้าในการเริ่มต้นยังคงเหมือนเดิม 16K CK / 14CK + 4.1 ms
สิ่งที่น่าสนใจที่จะต้องทราบก็คือหลังจากที่อุปทานถูกปิด VCC มีเสถียรภาพที่ประมาณ 1.1 ถึง 1.2 โวลต์ (เก่าตัวแปร ATmega328A ลดลงไปประมาณ 0.6 - 0.7 V) มันเก็บไว้หลายนาที ถ้าฉันรอนานพอ (ตามคำสั่งครึ่งชั่วโมงหรือมากกว่านั้น) mcu จะเริ่มต้นอย่างถูกต้องเสมอ! ดังนั้นดูเหมือนว่าปัญหาคือมี 1.1 โวลต์รอบ ๆ ซึ่งตามแผ่นข้อมูลไม่รับประกันว่าจะเพียงพอสำหรับการเปิดเครื่องใหม่ แต่ควรจะเพียงพอสำหรับการรีเซ็ตเป็นสีน้ำตาล!
ยกเว้นสถานการณ์เหล่านี้เครื่องตรวจจับน้ำตาลออกทำงานได้ดี มันสามารถมองเห็นได้ในภาพแรก (สัญญาณเอาต์พุตจะหยุดลงเมื่อถึง bodlevel และแรงดันตกช้าลงเนื่องจากชิ้นส่วนของ mcu ปิดตัวลง) ฉันทำการทดสอบเมื่อฉันลด VCC ให้ต่ำกว่าระดับ bodlevel เล็กน้อยและปล่อยให้มันไต่กลับมาอีกครั้ง mcu จะเริ่มต้นใหม่อย่างถูกต้องภายใต้เงื่อนไขดังกล่าวโดยมีเพียงไฟแสดงสถานะรีเซ็ตสีน้ำตาลหมดที่ติดสว่าง
ฉันพลาดอะไรบางอย่างที่ชัดเจนหรือ ATmega328PB มีข้อบกพร่องร้ายแรงในตัวตรวจจับสีน้ำตาลหรือไม่
แก้ไข:
ที่น่าสนใจปัญหาข้างต้นเกิดขึ้นเฉพาะเมื่อฉันขัดจังหวะอุปทานก่อนที่ผู้ควบคุม ถ้าฉันขัดจังหวะหลังจากควบคุม (หรือใช้แหล่งจ่ายไฟในห้องปฏิบัติการ) ปัญหาจะไม่เกิดขึ้น ราวกับว่ารูปร่างของแรงดันไฟฟ้าที่เพิ่มขึ้นทำให้เกิดปัญหา อย่างไรก็ตามอย่างที่คุณเห็นจากภาพสุดท้ายแรงดันไฟฟ้าเพิ่มขึ้นค่อนข้างดีและเสถียรอย่างรวดเร็ว
แก้ไข 2
ฉันลองใช้กับ 16 MHz แทน 20 MHz แต่ปัญหาเดียวกันที่แน่นอนเกิดขึ้น