這周的作業(yè)是
閱讀一款微處理器的說明
制作電路板并編寫程序使其運(yùn)行
第一輪嘗試: 自己制作 ISP
ISP 是為 AVR 芯片制作的編程器,這里有詳細(xì)的 DIY ISP 教程。
依著教程畫葫蘆:
Get Make
解壓固件,命令行進(jìn)入解壓后的目錄
用編輯器打開 Makefile
-
將模式由 "avrisp2" 改為 "usbtiny"
也就是找到以下代碼,將注釋轉(zhuǎn)移到 “avrisp2”那一行,然后保存文件
AVRDUDE = avrdude -c usbtiny -p $(DEVICE) # edit this line for your programmer
AVRDUDE = avrdude -c avrisp2 -P usb -p $(DEVICE) # edit this line for your programmer
```
-
命令行進(jìn)入固件目錄,輸入命令
make clean
如果正常,將返回結(jié)果
rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s
但是這時(shí)出現(xiàn)了錯(cuò)誤:
kidults-NMB:fabISP_mac.0.8.2_firmware kidult$ make hex
avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o
make: avr-gcc: No such file or directory
make: *** [usbdrv/usbdrv.o] Error 1
```
好吧,忘記插我的 FabISP 到電腦了……插好后再試,ok 的:

-
下一步,需要設(shè)置 fuse,讓板子能使用外部的 clock :輸入命令
make fuse
又出現(xiàn)了錯(cuò)誤:
avrdude -c usbtiny -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: Error: Could not find USBtiny device (0x1781/0xc9f) avrdude done. Thank you. make: *** [fuse] Error 1
查了一圈 google,搞不明白為什么。似乎是 GCC 編譯問題,或者是我的板子有問題。第一輪嘗試以失敗告終。
第二輪嘗試: 使用現(xiàn)成的 USBtinyISP
首先,下載 hello.ftdi.44.echo.c, hello.ftdi.44.echo.c.make 。然后將板子連接到 USBtinyISP:
此處需要吐槽一下 New MacBook,只有一個(gè) typeC 接口,一開始 USBtinyISP 接上去燈不亮,以為是我的 typeC 轉(zhuǎn)接口壞了。試了大半個(gè)晚上后放棄。第二天試了一下連在另一臺 MacBook Pro 上,USBtinyISP 的燈又亮了。插回到 New MacBook,依然不亮,懷疑是不是數(shù)據(jù)線壞了,又折騰半個(gè)晚上。偶然間又發(fā)現(xiàn),充滿電再插 USBtinyISP 會(huì)亮……所以問題可能出在 typeC 轉(zhuǎn)接口對 USB 供電不足……
折騰兩三個(gè)晚上,終于到下一步。命令行進(jìn)入前面下載好的兩個(gè)文件的目錄,輸入命令:
make -f hello.ftdi.44.echo.c.make
Make 成功了。然后是 sudo make -f hello.ftdi.44.echo.c.make program-usbtiny-fuses
又出現(xiàn)錯(cuò)誤提示:
avr-objcopy -O ihex hello.ftdi.44.echo.out hello.ftdi.44.echo.c.hex;\
avr-size --mcu=attiny44 --format=avr hello.ftdi.44.echo.out
AVR Memory Usage
----------------
Device: attiny44
Program: 758 bytes (18.5% Full)
(.text + .data + .bootloader)
Data: 64 bytes (25.0% Full)
(.data + .bss + .noinit)
avrdude -p t44 -P usb -c usbtiny -U lfuse:w:0x5E:m
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
make: *** [program-usbtiny-fuses] Error 1
又開始到處 Google。查看了一下 fuse 的含義 :
What are the fuses?
There are 3 bytes of permanent storage in the chip called 'fuse low byte', 'fuse high byte' and 'fuse extended byte'. These bytes are called fuses and can be reprogrammed as many times as you want and determines the behaviour of the chip. To do that, their value is not erased when the chip is powered off or reprogrammed.
Each microchip has its own definition for the values that must have the fuses.
將錯(cuò)誤信息復(fù)制到 Google,找到了之前的fab note。里面讓安裝FTDI 芯片的驅(qū)動(dòng)。然并卵,安裝好驅(qū)動(dòng)依然是錯(cuò)誤提示。
肯定是板子出問題了。需要去實(shí)驗(yàn)室重新刻板子和焊電路。但是實(shí)驗(yàn)室擴(kuò)建裝修中,一眨眼幾個(gè)星期就過去了………………
第三輪嘗試
終于盼到實(shí)驗(yàn)室重新開放,在空氣質(zhì)量500的房間中刻板子,然后搜刮了元器件回家打算自己焊。好不容易把東西湊齊,開工后發(fā)現(xiàn)焊錫太粗太劣質(zhì),根本沒法焊。重新買了焊錫線,開工后崩潰地發(fā)現(xiàn),電烙鐵沒有買配焊臺的,調(diào)不了溫度,焊槍溫度太高,很容易把板子上面的銅面焊焦了。可好的板子都用完了,還是沒有重新作出電路板來。
等到周末,又去到實(shí)驗(yàn)室老老實(shí)實(shí)刻板子,焊元件。
電路板完成后,連上 USBtinyISP,終于 fuse 成功:
下一步
make -f hello.ftdi.44.echo.c.make program-usbtiny
現(xiàn)在,可以將程序燒錄到板子上了。
照著教程下載 term.py,輸入命令 python term.py /dev/ttyUSB0 115200
,繼續(xù)是熟悉的錯(cuò)誤提示:
Traceback (most recent call last):
File "term.py", line 89, in <module>
ser = serial.Serial(port,speed)
File "/Library/Python/2.7/site-packages/serial/serialutil.py", line 180, in __init__
self.open()
File "/Library/Python/2.7/site-packages/serial/serialposix.py", line 294, in open
raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'
已經(jīng)處在崩潰邊緣,實(shí)驗(yàn)室的小伙伴提醒我用 Arduino 去燒程序。于是振作著繼續(xù)嘗試:
-
添加板子
打開 Arduino 的設(shè)置,在 "Additional Boards Manager URLs:" 里填上
然后找到菜單里的 “Tools > Board” ,打開 boards manager 。滾到列表底部,可以看到 “ATtiny”.
安裝,然后關(guān)閉 boards manager。
-
設(shè)置
設(shè)置 board:"ATtiny", Processor:"ATtiny44", Clock:"20 MHz", Port:"USB"
-
修改程序
Load Arduino 自帶的 Blink example, 把 13 號引腳改為 7:
Burn Bootloader
-
成功了!
一周的作業(yè)用了快兩個(gè)月才完成…………
參考資料
- Programming an ATtiny w/ Arduino 1.6 (or 1.0)
- Use an Arduino as a FTDI Programmer
- classmate's note1
- classmate's note2
- classmate's note3
- classmate's note4