2008年12月16日 星期二

MCU -- ATmega64的怪問題

話說最近在用AVR開發系統

遇到了一些很不可思議的問題

到目前還是無解的狀態

提供給大家參考看看~~~





1. Reset 的不穩定



ATmega64大概是我目前用到過reset最不正常的MCU

或許是因為內部架構太複雜的關係

也或許是我還沒把硬體與軟體完全搞懂的關係

總覺得好像哪裡怪怪的



從一開始用M64

就發現它在reset時有時候會成功

有時又reset不起來!!



由reset信號去觀察

發現reset信號很穩定

因為有用reset IC的緣故

所以0電位有確實拉到0

石英晶體也有起振

但系統就是沒有reset起來



用mkII去reset也OK

獨獨Power_ON reset就是很不順

不曉得是哪裡出了問題??!!



(赫然發現, Arduino所有版本都有用reset key, 難不成是因為這個問題??)





2. EEPROM 之"隨它高興"存取



這是最詭異的問題

抓了整整一天還沒抓到問題



WinAVR有內建eeprom的函式

一個是eeprom_read_word();

另一個是eeprom_write_word();



使用write再用Studio把資料read回來

OK~~~

確定資料都有順利填入



可是一用了read功能

災難就來了

read 0~7的值OK (該Byte的儲存值是0x00~0x07)

read 8~F的值系統就當掉!!! (該Byte的儲存值是0x08~0x0F)

而且不管換到哪一個位址都一樣

這是相當詭異的!!

而且匪夷所思!!!



連老闆也愛莫能助

只說可能是編譯器版本的問題

用免費的開發工具就是有這樣的缺點

Orz........





ps.

剛剛找到一個解決方案

還沒試過

明天來試一下看看

http://lysoft.g4soft.net/article.asp?id=46



ps2.

上面的方案確定可行

不過建議在函式的最後要加上sei();



因為系統所有的中斷資源都被關掉了

如果不恢復

很多動作都會不正常唷~~~



比較快的解決方法是

直接呼叫原來eeprom.h的內建函式

只是呼叫前加上cli();

呼叫後加上sei();

這樣就不會出問題了~~~

(2008/12/17 更新)

4 則留言:

  1. 有沒有可能看門狗在搞怪??



    我之前也是看門狗沒用好,reset有點問題!!



    給你參考看看!!

    回覆刪除
    回覆
    1. 可能性不大
      因為沒有啟動看門狗....

      (或者他自己會偷偷啟動??)

      刪除
  2. 使用的AVR為8515



    之前也沒啟動...預設是關閉的(沒錯的話)!!!~



    誰知道就是有問題,最後FUSES給他再改一次就好了。(WDT &C8515都取消)



    就可以了!!參考看看@@~

    回覆刪除
    回覆
    1. 我有都取消了
      一開始設定fuse就有確認過了
      謝啦~~

      我想他的怪問題還是在硬體上
      等我搞清楚再說囉~~

      刪除