2017-01-09 28 views
1

我使用的是ATmega128的微型,並擁有所有我的腳inits設置爲輸出,並在我的代碼主要部分設置爲低:ATmega128的輸出閃爍在啓動時

PORTB=0x00; 
DDRB=0xFF; 

但是在啓動時,輸出相關PORTB.0在瞬間高速跳動(我已經在範圍內捕捉到了它),而其他輸出似乎也是如此。看起來好像它變成LOW-HIGH-LOW。我已經做了一些讀取,可能是由於三態在啓動期間輸出開關引起的,所以我在引腳進入之前將PUD寄存器設置爲1,然後在沒有運氣的情況下回到0。有沒有人有任何其他想法在啓動期間保持輸出關閉?它並不總是會發生,這是什麼讓我難住。

+0

你有偏置電阻嗎? –

+0

至少爲配置輸出之前寫入端口數據做好了準備。 –

+0

這幾乎肯定是一個硬件問題,而不是軟件問題,您應該將其發佈在http://electronics.stackexchange.com/上。 GPIO在復位時爲高阻抗輸入,並且通過示波器測量的電平取決於連接到引腳的電路。如果這是一個問題,並且在啓動時需要一個特定的級別,請使用上拉或下拉電阻 - 即該電平必須外部置位,因爲輸入不會驅動它 - 它是浮動的。 – Clifford

回答

4

最根本的問題是硬件問題 - GPIO缺少一個下拉電阻,因此它在處於復位默認高阻抗輸入狀態時處於浮動狀態。

在軟件中可以做的最好的事情是在復位後立即儘快初始化GPIO。要做到這一點在CodeVisionAVR您需要在項目中使用自定義的startup.asm作爲CoadeVisionAVR手工編譯的部分4.18描述:

enter image description here ...

在哪裏,我建議你初始化PORTB DDRB及以下:

   LDI R16, 0x00  
      OUT PORTB, R16 
      LDI R16, 0xFF  
      OUT DDRB, R16 

緊接在步驟2之前,即前四條指令。如果繼電器是機械繼電器,GPIO將保持懸空的時間可能會太短,以免繼電器發生反應。固態繼電器可能仍然存在問題。任何脈衝的長度可能取決於電源上升時間;如果速度緩慢,你可能會獲得更長的脈搏。

+0

我這樣做,一切似乎都很好。我其實自己昨晚做了這件事,沒有時間在這裏回顧一下,但這是有效的。再次感謝所有的幫助! –

+0

@wgdvs:酷;我的回答使用了您目前僅在評論中提供的信息;如果你能更新這個問題,它會使它對SO社區更加連貫和有用。 – Clifford

+0

會做。實際上它有所幫助,但將它連接到一個循環儀上,我仍然每80次嘗試一次就會遇到這個問題......我告訴我的老闆,真正唯一的解決辦法是將該引腳下拉到GND。他同意並批准了這一改變。它不應該影響我們的任何產品,因爲該引腳在所有情況下只控制這一個繼電器。 –