題:
是什麼導致微控制器意外復位?
Stephen Collings
2013-09-04 22:29:25 UTC
view on stackexchange narkive permalink

在微處理器控制的系統中,一種特別令人討厭的錯誤是微處理器意外復位。調試此類問題的重要工具是一系列可能的原因。是什麼原因導致微控制器意外復位?

這裡的一些答案可能會有所幫助:http://electronics.stackexchange.com/questions/30430/pic-keeps-resetting-am-i-seeing-side-effects-from-breadboard-use/30449#30449您正在使用微控制器嗎?
我通常使用dsPIC。但是我現在不嘗試調試任何特別的東西,而只是編譯潛在問題的參考列表。
這是一個作業問題嗎?
@dwelch可能適合某個地方的人,但不適合我或我的任何學生。
以下是進入此字段的[必讀](http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.pdf)。
@Vorac必須讀懂Atmel無法承諾保持URL可靠。
[AN042的新URL:AVR硬件設計注意事項](http://ww1.microchip.com/downloads/zh-CN/AppNotes/Atmel-2521-AVR-Hardware-Design-Considerations_ApplicationNote_AVR042.pdf)
五 答案:
Stephen Collings
2013-09-04 22:29:25 UTC
view on stackexchange narkive permalink

在PIC和dsPIC芯片上,我觀察到以下意外復位的原因。

硬件:

  • 復位引腳驅動為低電平或浮空。首先檢查明顯的東西!
  • 將ESD耦合到復位引腳。我已經看到,在同一張桌子上打開完全不相關的設備時會發生這種情況。確保復位引腳上有足夠的電容,可能高達1 uF。
  • ESD耦合到處理器的其他引腳。示波器探頭尤其可以充當天線,將噪聲耦合到芯片中並引起奇數復位。我聽說過“無效的操作碼”重置代碼的報告。
  • 焊點/斷橋不良。可能是處理器上或板上其他地方的電源線丟失或短路。
  • 電源線毛刺/噪聲。可能由許多外部問題引起,包括調節器損壞或上游電源跌落。確保為處理器供電的電源導軌穩定。可能需要在某個地方增加電容,或者直接在處理器上解耦電容。
  • 某些微控制器具有Vcap引腳,該引腳不得連接到VDD,並且必須具有自己的公共電容。未能正確連接此引腳可能會導致無法預料的結果。
  • 將模擬輸入負值驅動到某個特定限制會導致復位,該復位在RCON中報告,如掉電。數字輸入也可能如此。
  • 附近的電源轉換器中很高的dV / dt可能會導致掉電複位。 (請參閱此問題。)我在兩種情況下都看到了這種情況,在一種情況下,我能夠跟踪到電容耦合。 IGBT的開關電流為100-200A,在關閉時,一些反饋電路會看到幾微秒的噪聲,在3.3V處理器上,噪聲從2V上升到8V以上。增加該反饋導軌上的過濾器蓋會使復位停止。可以想像在晶體管上添加一個dV / dt濾波器可能會有類似的效果。

軟件:

  • 看門狗定時器。確保經常清除看門狗定時器,尤其是在代碼執行分支(可能需要很長時間才能執行)(例如EEPROM寫操作)中。通過禁用看門狗以查看問題是否消失來進行測試。
  • 除以零。如果要在代碼中執行 any 除法運算,請確保除數永遠不能等於零。在除法之前添加邊界檢查。不要忘記,這也適用於模運算
  • 堆棧溢出。太多的嵌套函數調用可能會導致系統的堆棧動態內存不足,從而可能導致代碼執行中異常時刻的崩潰。
  • 堆棧下溢。如果使用彙編程序進行編程,則意外執行的RETURN可能比執行CALL的次數多。
  • 不存在的中斷例程。如果啟用了中斷,但未定義中斷例程,則處理器可能會復位。
  • 不存在的陷阱例程。類似於中斷例程,但區別很大,我將其單獨列出。我已經看到了使用dsPIC 30F4013進行隨機復位的兩個獨立項目,其原因已跟踪到一個被調用但未定義的陷阱。當然,現在您有一個問題,為什麼首先要調用陷阱,這可能是很多事情,包括矽錯誤。但是,定義所有陷阱處理程序可能應該是診斷無法解釋的重置的一個好的早期步驟。
  • 函數指針故障。如果函數指針未指向有效位置,則取消引用該指針並調用所指向的函數會導致復位。引起這種情況的一個有趣原因是當我初始化結構時,其連續值分別為NULL(對於函數指針)和-1(對於int)。逗號被打錯了,所以函數指針實際上被初始化為NULL-1。因此,不要僅僅因為它是一個CONST就假定它必須包含一個有效值!
  • 無效/負數組索引。確保對所有數組索引(上限和下限)進行邊界檢查(如果適用)。
  • 在程序存儲器中創建一個大於程序存儲器最大部分的數據數組。甚至可能不會拋出編譯錯誤。請參閱此問題。大概這也適用於其他未定義的行為。

在某些dsPIC上,RCON寄存器存儲指示復位原因的位。這在調試時非常有用。

@reset pin:的浮動復位引腳因虛假復位而聞名。始終通過電阻將其連接至Vcc。
這是一個非常詳盡的清單。我相信我在AVR方面的經驗,即使不是全部,大多數情況也會導致意外的結果或重置。
讓我為彙編語言編程添加另一個-堆棧中不匹配的寄存器PUSH和POP。
還有更多:在硬件下,掉電複位。在軟件下,有軟件重置指令。這兩個都可以在幾個微控制器上使用。
另外,特別是對於正在開發的處理器,芯片本身存在許多可能導致復位的問題。您涵蓋了外部影響,但這些影響也經常在內部發生。諸如EMI / SI,時序違規,佈線/過孔斷開或短路,ESD損壞之類的事情可能會不斷發生。
Atmels XMEGA系列還提供了一個寄存器(STATUS),以指示哪個複位源導致了上次復位。如果重置來自硬件或代碼(例如WDT),這確實有助於縮小範圍。
另一個例子是:靠近電纜放置的移動電話會在弱驅動的線路上感應出驚人數量的電壓。如果您有一條重置線穿過電纜(例如,一塊板可以迫使另一塊板重置),則電纜附近的移動電話可能會觸發重置,例如它收到一個電話。
另一個導致復位的軟件-未對齊的數據訪問。例如如果您有16位PIC,並且嘗試跨字邊界進行16位訪問,則PIC將崩潰/復位。 16位USB PIC經常發生這種情況,因為主機必須打包USB描述符,因此,如果不小心,與描述符進行交互將導致未對齊的訪問。
儘管我的程序是用C編寫的,但我只是遇到了一個PIC16LF1824報告堆棧下溢的問題。事實證明這是由於電源問題所致,當我使能BOR(掉電複位)時,堆棧下溢消失了,取而代之的是BOR。因此,堆棧下溢可能表示電量不足。
我遇到一個問題,嘗試訪問帶有負索引的數組。感謝您提供瞭如此有用的帖子!
user27465
2013-09-07 17:22:54 UTC
view on stackexchange narkive permalink

RESET引腳必須由監視過壓/欠壓並產生足夠長的複位信號的複位電路正確驅動。考慮到這一點,我對不受控制的硬件重置的經驗來自於:

  • 從切換線到RESET引腳/線(使其短)的串擾
  • 地平移/接通/關斷外部高電流負載引起的環路
  • 電源未過濾電壓尖峰,過短而無法激活適當的RESET
  • 微控制器切換外部負載,導致上述情況問題(主要在感應負載上,例如電動機開/關,繼電器或舊燈(浪湧電流)
  • 任何微控制器引腳(最差的振盪器)上的電壓/電流尖峰會導致反向電流並可能切換內部寄存器(與電源線上的電壓尖峰相同)。通常,在與某種工業環境連接時,請務必小心(有關更多信息,請參見: http://www.ichaus.biz/wp1_mcu_interface a>)。必須考慮IO的電平轉換,輸入濾波和軟開關輸出。硬件方面的問題。然後是RESET和振盪器引腳,然後是IO線。 -mm
地上變化只是咬我。就我而言,我的普通網有特定部分承載著約100安培的電流。微控制器被引用到該粗跡線的一側,但是微控制器正在驅動的某些電路被引用到跡線的另一端。跡線僅為3 mOhm,但在100A時足以使微型驅動器與其驅動的外圍設備之間產生300 mV的電壓差。將外圍設備重新路由到與控制器相同的那條走線的同一端,一切都很好。 在目前的情況下,沒有節點之類的東西。
steverino
2014-12-23 11:11:25 UTC
view on stackexchange narkive permalink

我在此列表中未看到的另一種可能性是支持ICSP的設備。如果在電路串行編程模式下觸發的線路上使用的上拉電阻不足,有時可能會隨機進入該模式。如果沒有程序更新發送到指定的串行接收器行,則在很短的間隔後重置。我懷疑如果啟動ICSP並且未發送任何編程數據,內部看門狗計時器會強制重置。這是我犯的一個錯誤,並且花了很多時間查找16F876。

Mark Jensen
2015-03-17 11:27:33 UTC
view on stackexchange narkive permalink

請確保在電路中使用CMOS或TTL邏輯芯片時,它們在Vdd和地之間具有足夠的去耦電容器(通常為0.1 uF)。我在設計中使用的是CD4021,使用時顯然會引起一些尖峰,導致微處理器重新啟動。然後該循環將重複。這也是為什麼在代碼開始時放置一個顯而易見的測試序列(例如使LED閃爍幾次,然後關閉幾次)是個好主意的原因,這樣您就知道微處理器正在工作並正在執行代碼。

efox29
2015-03-17 13:16:07 UTC
view on stackexchange narkive permalink

這是可能會出現的罕見事情之一:

我有一個涉及微控制器的項目,它會偶爾重置自身。長話短說,原來必須啟用或禁用某些選項,否則可能會發生重置。在放棄其他所有內容之後,我才通過閱讀勘誤表才發現了這一點。

現在,我習慣養成閱讀勘誤表的習慣,甚至在決定使用芯片來了解自己所學的內容以及是否可以管理之前,我都會養成這種習慣。不幸的是,畢業後,我真的沒有人要教我一些常見的習慣,所以我在現實世界中的很多學習都是通過失敗和挫折來完成的。

我什至沒有意識到這個問題是古老的,並且已經提供了答案。哎呀。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...