2015年10月31日 星期六

[合之章] USBasp 根據 firmware 設定檔內的 fuses 設定與 MCU Fuses 搭配的必要性

對於這個問題的疑問,追根究底的還是會回到 為什麼我插出來的 TransistortesterAVR 完全不給點正常反應,是不是除了硬體和韌體之外,這個 Fuses 的調整是必要的?

抱持著這樣的疑問,然後手邊又多出了這個 USBasp 的裝置,可以用來燒錄其它 MCU,應該可以從這當中得到答案吧!

這些實驗的過程,遇到的問題並不會比較少,不過以最後的試完之後,得到的結論,大致上都是因為這些 Fuse 設定數值上的差異,以及原本就已經有燒錄 bootloader 的 MCU 和沒有燒錄的差別,當然,過程裡頭還是會因為一些好奇心發作的關係,又讓要聚焦問題的過程,又擴散開了。 比方,對於已經擁有 bootloader 的 MCU 執行了 -e 這樣一去不回頭的參數


因為後續的實驗,就是手邊有的這四顆 Atmega328p 都會被拿來用,以操作上的差別來區分:

  • 可以被拿來燒錄的
  • 不可以也不打算拿它來燒錄的

※ 因為要確保裡頭的數值,拿來當參考組使用,如果不小心洗掉了,就沒辦法保證數值之間推論的正確性了。

若是以目前和之後打算用它們在哪些功能項目上來分:

  • Arduino UNO R3 板子上本來那顆
  • 目前已經燒錄 USBasp 完成這一顆
  • 被拿來用在溫濕度顯示器上面那顆
  • 最近補買的那一顆,預計要使用在 TransistortesterAVR 上面吧

為了方便記錄和區隔,就在這邊表列一些相關的資訊,方便判斷:

Function ID bootloader
Arduino UNO R3 A Yes
USBasp U Yes
DHT11 & 4x7LED D Yes
new / unused N No

Atmega328P 出廠預設值

Fuse / Lock Default Value
Hight Fuse 0xD9
Low Fuse 0x62
Extended Fuse 0xFF
Lock ??

從這邊開始,表格上面的資訊,就會跟著後續的動作,進行變化記錄。

使用 U 分別對其它三顆進行讀取 fuses & lock 值的動作.

※ 這些資料是為了記錄所進行的再次實驗;所以可以看到,理論上沒用過的那顆 MCU,實際上裡頭的設定值還是和出廠設定不一樣了。

先取得各顆 MCU 內的資料

取得 fuses & lock 的指令

avrdude -v -c USBasp -p atmega328p -U lfuse:r:lfuse.hex:i -U hfuse:r:hfuse.hex:i -U efuse:r:efuse:i -U lock:r :lock.hex:i

對於沒有用過的 MCU 要再額外多個 bitclock 的參數

avrdude -v -c USBasp -p atmega328p -U lfuse:r:lfuse.hex:i -U hfuse:r:hfuse.hex:i -U efuse:r:efuse:i -U lock:r :lock.hex:i -B 10.0
ID Low Fuse Hight Fuse Extended Fuse Lock
A 0xFF 0xDE 0x05 0x3F
U ---- ---- ---- ----
D 0xFF 0xDE 0x05 0x0F
N 0x62 0xDF 0x05 0x3F

1.使用 U 對 N 進行燒錄 USBasp firmware 的動作

只燒錄 firware, 不動 fuses。

make flash
avrdude -v -c usbasp  -p atmega328p -P usb -B 10.0  -U flash:w:main.hex

2.把 U & N 位置互換,記得不能讓 N 對 U 進行任何寫入的動作

記錄 可讀取 或 不可讀取。

燒錄完成後,把 N 換到 USBasp 板子上,作業系統會直接跳出 unknown device 的狀態,這樣應該可以推斷,只有把韌體燒錄上來是沒用的,應該要進一步的修改 fuse 設定。

ID Low Fuse Hight Fuse Extended Fuse Lock device state
N 0x62 0xDD 0x05 0x3F unknow
N 0x62 0xD9 0x05 0x3F unknow

3.重新使用 U 對 N 進行更動 Fuse 的動作

因為確認出已經有不會出現 unknow device 的情況,所以就開始持續進行修正 N 的 Fuse 設定,然後 U & N 位置互換,再下指令確認 N 可以順利讀去 U 的設定值的動作:

ID Low Fuse Hight Fuse Extended Fuse Lock device state
N 0xFF 0xD9 0x05 0x3F got it

系統能抓到 N 之後,稍微使用它來抓看看本來的 U 的內容值:

ID Low Fuse Hight Fuse Extended Fuse Lock
U 0xFF 0xDE 0x05 0x0F

看起來的內容值和 H 是完全一樣的,果然都是透過 A 燒錄過 bootloader 的關係。

※雖然能正常抓取到資料了,不過指令偶爾會失敗

再改些 Hight Fuse 設定值試試 ~

ID Low Fuse Hight Fuse Extended Fuse Lock device state
N 0xFF 0xDD 0x05 0x3F got it
N 0xFF 0xDF 0x05 0x3F got it
N 0xFF 0xDB 0x05 0x3F got it

High Fuse 這兩個用來設定 bootloader 的兩個旗標值的調整測試可以確認,此設定並沒有實際影響到 MCU 的正常運作ㄟ;不過,也很有可能是因為這顆裡頭沒有 bootloader 才會有這樣的狀況。
所以還是要用到 D 這顆來測試並確認一下。

4.使用 U 對 D 進行燒錄 USBasp firmware 的動作

過程沒有出現啥大問題。

5.使用 U 對 D 進行更動 Fuse 的動作

ID Low Fuse Hight Fuse Extended Fuse Lock device state
D 0xFF 0xDE 0x05 0x0F got it
D 0xFF 0xD8 0x05 0x0F got it

再加上上面這兩個旗標資料的測試,應該可以推敲出,不管有沒有 bootloader 或者是實際上在 High Fuse 上面設定的 bootloader 位址的旗標值是多少,似乎都沒有影響到 USBasp 這個韌體的運作。

至於 Extend Fuse 的差異影響,應該也沒有辦法透過 USBasp 的韌體來實驗,因為在 makefile 裡頭,根本連它的蹤影都沒看到。

也應該可以確認,目前 build 出來的 main.hex 這個 hex 韌體檔,其實並不會跟著 fuses 的設定變動而有所影響;因為從頭到尾的記錄都是用同一個 hex 韌體檔來試的。

反而是前天在大略測試的時候,會覺得出問題,應該有不少狀況都是因為在換 MCU 的過程,動到了麵包板上面的元件或線路,造成運作的不正常。

記錄與實驗的結論

  1. Atmega328P Fuses 的出廠設定,應該沒有辦法套用在這些有更動到 Fuses 的裝置上的,系統有機會無法辨識或是運作。
  2. bootloader start address 設定的旗標值,應該對 USBasp 這個裝置是毫無影響的。

最重要的結論應該是:

~ 可以開始 DIY 一個 USBasp 裝置了 ~

備註資訊

關於 Fuses & Lock 的各個旗標值的解說,還是先參考官方所提供的 Datasheet 文件,我還不熟悉這東西,若是解釋錯誤,誤己就算了,誤了別人那就麻煩大了點 ~

抓不到裝置時,可能出現的訊息:

如果在接 USB 的時候正常,然後下指令會出現這個訊息,應該是麵包版的線路又鬆掉之類的, 應該 ~

D:\>avrdude -v -c USBasp -p atmega328p
 
avrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch
 
         System wide configuration file is "C:\WinAVR\bin\avrdude.conf"
 
         Using Port                    : lpt1
         Using Programmer              : USBasp
avrdude: Warning: cannot query manufacturer for device: usb_control_msg: sending control message failed, win error: 連結
到系統的某個裝置失去作用。
 
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
`
D:\>avrdude -v -c USBasp -p atmega328p
 
avrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch
 
         System wide configuration file is "C:\WinAVR\bin\avrdude.conf"
 
         Using Port                    : lpt1
         Using Programmer              : USBasp
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

#AVR, #USBasp, #Atmega328P

沒有留言:

張貼留言