對於這個問題的疑問,追根究底的還是會回到 為什麼我插出來的 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。
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 的過程,動到了麵包板上面的元件或線路,造成運作的不正常。
記錄與實驗的結論
- Atmega328P Fuses 的出廠設定,應該沒有辦法套用在這些有更動到 Fuses 的裝置上的,系統有機會無法辨識或是運作。
- bootloader start address 設定的旗標值,應該對 USBasp 這個裝置是毫無影響的。
最重要的結論應該是:
~ 可以開始 DIY 一個 USBasp 裝置了 ~
備註資訊
關於 Fuses & Lock 的各個旗標值的解說,還是先參考官方所提供的 Datasheet 文件,我還不熟悉這東西,若是解釋錯誤,誤己就算了,誤了別人那就麻煩大了點 ~
抓不到裝置時,可能出現的訊息:
如果在接 USB 的時候正常,然後下指令會出現這個訊息,應該是麵包版的線路又鬆掉之類的, 應該 ~
D:\>avrdude -v -c USBasp -p atmega328pavrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/Copyright (c) 2007-2009 Joerg WunschSystem wide configuration file is "C:\WinAVR\bin\avrdude.conf"Using Port : lpt1Using Programmer : USBaspavrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
#AVR, #USBasp, #Atmega328P
沒有留言:
張貼留言