Fab Academy 第八周:嵌入式編程

課堂筆記

微處理器/微控制器

  • 內存: registers, SRAM(靜態存儲器), DRAM(動態隨機存取記憶體), EEPROM(只讀存儲器), FLASH(快閃記憶體), fuse
  • 外設: A/D(模擬數字轉換 Analog to Digital), comparator, D/A, timer/counter/PWM(脈寬調製), USART(串列通信), USB
  • word size: 8, 16, 32, 64
  • 晶元家族: 8051, PIC, MSP, AVR (我們用到的), ARMSTM32mbed, PSoCxCOREPropeller
  • 供應商: Octopart, Digi-Key, Mouser, Newark, Farnell, SparkFun, Adafruit
  • 時鐘
    • 種類:
      • RC (10%, 1% calibrated 校準)
      • ceramic 陶瓷 (0.5%)
      • quartz 石英 (50 ppm)
    • PLL 鎖相環
    • instruction cycles 指令周期
    • overclocking 超頻

開發

  • in-system development (載入程序到處理器)
    • ISP: 用來跟編程器交互的程序
    • 引導程序(bootloader): Arduino, DFU, Micronucleus
    • JTAG 主控器, PDI 並行數據介面
    • ICE
  • 編程器
    • ISP:FabISP,avrdude
    • JTAG, PDI:Atmel-ICE
  • 彙編語言: hex file, instruction set, opcodes, mnemonics, directives, expressions, avr-as, gavrasm
  • C 語言 (Arduino 底層語言): 需要用編譯器將 C 語言代碼轉成十六進位代碼(hex codes)
    • AVR 依據 GCC (the GNU Compiler Collection) 而設計. AVR Libc 提供 C 語言和 AVR 通信的庫
    • OS X 請用 CrossPack for AVR
    • 在課程中,我們使用 GCC 將 C 語言代碼編譯成 AVR 可以讀懂的十六進位代碼
  • IDE
    • 寫程序, 編譯, 載入到處理器
    • Atmel Studio, Eclipse, AVR, CodeBender
  • Interpreters(一般都很慢): Python, BASIC, FORTH, AVRSH, Javascript(Espruino, Tessel, iop.io)

主機通訊

  • 有一些與串口通訊的庫,比如 python 的 pyserial
  • FTDI: 提供 USB 與其他模塊的通信連接(包括模塊、線纜、集成電路等)

板子

  • AVR

    • Atmel AVR系列是一種基於改進的哈佛結構、8位~32位精簡指令集(RISC)的微控制器

    • Arduino: 開發板 + C 語言庫 + IDE + 燒錄程序 + 頭文件

    • XMEGA: AVR 較新的系列

      • features
      • toolchain: CrossPack for OS X
  • ARM

    • ARM 是主流的手機處理器架構
    • STM32
    • Rasberry Pi

    • BeagleBone

    • PandaBoard

    • Snappy

  • PSoC: 晶元上的可編程系統 (windows only)

實踐作業:刻板焊接燒程序

這周的作業是

閱讀一款微處理器的說明

製作電路板並編寫程序使其運行

第一輪嘗試: 自己製作 ISP

ISP 是為 AVR 晶元製作的編程器,這裡有詳細的 DIY ISP 教程。

依著教程畫葫蘆:

  • 下載安裝 Crosspack AVR
  • Get Make
  • 下載固件 FabISP Firmware for MacOS 10.8.2
  • 解壓固件,命令行進入解壓後的目錄
  • 用編輯器打開 Makefile
  • 將模式由 "avrisp2" 改為 "usbtiny"

    也就是找到以下代碼,將注釋轉移到 「avrisp2」那一行,然後保存文件

    #AVRDUDE = avrdude -c usbtiny -p $(DEVICE) # edit this line for your programmerAVRDUDE = avrdude -c avrisp2 -P usb -p $(DEVICE) # edit this line for your programmer

  • 命令行進入固件目錄,輸入命令

    make clean

    如果正常,將返回結果

    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

    但是這時出現了錯誤:

    kidults-NMB:fabISP_mac.0.8.2_firmware kidult$ make hexavr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.omake: avr-gcc: No such file or directorymake: *** [usbdrv/usbdrv.o] Error 1

    好吧,忘記插我的 FabISP 到電腦了……插好後再試,ok 的:

  • 下一步,需要設置 fuse,讓板子能使用外部的 clock :輸入命令

    make fuse

    又出現了錯誤:

    avrdude -c usbtiny -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:mavrdude: Error: Could not find USBtiny device (0x1781/0xc9f)avrdude done. Thank you.make: *** [fuse] Error 1

    查了一圈 google,搞不明白為什麼。似乎是 GCC 編譯問題,或者是我的板子有問題。第一輪嘗試以失敗告終。

第二輪嘗試: 使用現成的 USBtinyISP

首先,下載 hello.ftdi.44.echo.c, hello.ftdi.44.echo.c.make 。然後將板子連接到 USBtinyISP:

此處需要吐槽一下 New MacBook,只有一個 typeC 介面,一開始 USBtinyISP 接上去燈不亮,以為是我的 typeC 轉介面壞了。試了大半個晚上後放棄。第二天試了一下連在另一台 MacBook Pro 上,USBtinyISP 的燈又亮了。插回到 New MacBook,依然不亮,懷疑是不是數據線壞了,又折騰半個晚上。偶然間又發現,充滿電再插 USBtinyISP 會亮……所以問題可能出在 typeC 轉介面對 USB 供電不足……

折騰兩三個晚上,終於到下一步。命令行進入前面下載好的兩個文件的目錄,輸入命令:

make -f hello.ftdi.44.echo.c.make

Make 成功了。然後是

sudo make -f hello.ftdi.44.echo.c.make program-usbtiny-fuses

又出現錯誤提示:

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.outAVR Memory Usage----------------Device: attiny44Program: 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:mavrdude: 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.

將錯誤信息複製到 Google,找到了之前的fab note。裡面讓安裝FTDI 晶元的驅動。然並卵,安裝好驅動依然是錯誤提示。

肯定是板子出問題了。需要去實驗室重新刻板子和焊電路。但是實驗室擴建裝修中,一眨眼幾個星期就過去了………………

第三輪嘗試

終於盼到實驗室重新開放,在空氣質量500的房間中刻板子,然後搜颳了元器件回家打算自己焊。好不容易把東西湊齊,開工後發現焊錫太粗太劣質,根本沒法焊。重新買了焊錫線,開工後崩潰地發現,電烙鐵沒有買配焊台的,調不了溫度,焊槍溫度太高,很容易把板子上面的銅面焊焦了。可好的板子都用完了,還是沒有重新作出電路板來。

等到周末,又去到實驗室老老實實刻板子,焊元件。

電路板完成後,連上 USBtinyISP,終於 fuse 成功:

下一步

make -f hello.ftdi.44.echo.c.make program-usbtiny

現在,可以將程序燒錄到板子上了。

照著教程下載 term.py,輸入命令

python term.py /dev/ttyUSB0 115200

繼續是熟悉的錯誤提示:

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

已經處在崩潰邊緣,實驗室的小夥伴提醒我用 Arduino 去燒程序。於是振作著繼續嘗試:

  1. 添加板子

    打開 Arduino 的設置,在 "Additional Boards Manager URLs:" 里填上


    raw.githubusercontent.comdamellisattiny_index.json

    然後找到菜單里的 「Tools > Board」 ,打開 boards manager 。滾到列表底部,可以看到 「ATtiny」.

    安裝,然後關閉 boards manager。

  2. 設置

    設置 board:"ATtiny", Processor:"ATtiny44", Clock:"20 MHz", Port:"USB"

  3. 修改程序

    Load Arduino 自帶的 Blink example, 把 13 號引腳改為 7:

  4. Burn Bootloader

  5. 成功了!

參考資料

  • Programming an ATtiny w/ Arduino 1.6 (or 1.0)
  • Use an Arduino as a FTDI Programmer
  • classmates note1,note2,note3,note4

課程資源

  • Fab Academy 2016 課表
  • Week8 課程視頻
  • Week8 課程大綱
  • 我的英文筆記 Gitbook
  • 公眾號文章列表

專欄文章

  • Fab Academy 第一周:怎樣在一周內建好自己的網站

  • Fab Academy 第二周:CAD

  • Fab Academy 第三周:機器切割

  • Fab Academy 第四周:製作電路板

  • Fab Academy 第五周:3D 掃描和列印

  • Fab Academy 第六周:電路設計基礎
  • Fab Academy 第七周:數控機器

推薦閱讀:

餵奶這麼重要的事,當然是要...
續航30公里 摺疊便攜 小米發布米家電動滑板車
盤點 Google 十大智能硬體,你期待的是爆款還是未來科技 | 年度特稿
「永遠無需充電」的充電寶,麒麟臂就是發電機!

TAG:嵌入式开发 | 智能硬件 | 创客 |