iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
2

某天C大說, 由於Arduino的板子面積太大了, 希望可以找個比較小的chip來縮減硬體自動化治具的電路體積. 他就找了Attiny85 這個閹割版本的Arduino, 希望我們可以協助幫忙把Arduino的程式移植到上面試試看 ....

Attiny85 雖然可以使用Arduino Genoino IDE 進行開發.
but ... 令人崩潰的狀況卻是非常多
/images/emoticon/emoticon17.gif

  • Arduino Genoino IDE 相容於attiny85 開發使用, 但並沒有做相關的容錯檢查. 雖然編譯會過, 但燒錄到Attiny85後就不一定可以使用/images/emoticon/emoticon04.gif

成功的狀態

燒錄完遇到以下三種情況都是代表程式寫的方式不相容於Attiny85的規則

  1. 燒錄後,Attiny85 被認定為DigiUSB bootloader
  2. 燒錄後,Attiny85 被認定成unknown device
  3. 燒錄後, 會出現上面兩種狀況的綜合體, 一直重複在做USB emnueration 的動作
  • 嘗試在Sub function 中使用switch case
void controlSwitch(int state) {
  switch (state) {
    case '0':
      DigiUSB.println(" 00 ");
      //digitalWrite(PortA, LOW);
      break;
    case '1':
      DigiUSB.println(" 01 ");
      //digitalWrite(PortA, HIGH);
      break;
    case '2':
      DigiUSB.println(" 10 ");
      //digitalWrite(PortB, LOW);
      break;
    case '3':
      DigiUSB.println(" 11 ");
      //digitalWrite(PortB, HIGH);
      break;
    default:
      //digitalWrite(PortA, LOW);
      //digitalWrite(PortB, LOW);
      break;
  }
}

編譯及燒錄成功

但卻出現上面狀況三的情況

解法:
必須在Arduino IDE中先做以下宣告跟include Arduino.h 後再編譯就可以避免這個狀況再發生

#pragma chip attiny85
#pragma efuse 0xFF        // default value
#pragma hfuse 0xDF        // default value
#pragma lfuse 0x62        // default value
#include "Arduino.h"

經過不斷失敗後的反覆測試, 歸納出以下可用方案

Arduino Genio IDE

  • DigiUSB.Println/ Print
    • 不能使用空格
    • 字元長度限制
      • 10 個字
  • Switch Case
    • 只能使用4個case
  • for ..loop
    • 不能使用int, 要使用byte
    for ( byte a = 0; a < 10; a++ ) {
            ....
            ...
    }
    

以下做一個簡單的紅綠燈Demo, 證實這chip 真的是可以用. 只是限制就 ....

PC:

  1. 確定有被抓到及名稱有被認對 DigiUSB
  2. 使用DigiUSB monitor 輸入輸出

功能乍看之下是可以正常執行的, 但還是會出現斷字的現象 .... /images/emoticon/emoticon10.gif
Demo video

結論:

  • 生命誠可貴, 時間價更高. 不要貪圖一時方便就... 好好用Arduino 標準版不就好了嗎? 何必找一個挑戰那麼大的chip 來玩
  • 這個chip 是有其他更接近C的控制寫法, 直接控制暫存器的方式. 如果使用那種方式去寫, 就不會遇到這篇遇到的困難. 但那部分筆者就只有查過資料, 而沒有深入去研究

參考資源:
Attiny85 GPIO/ Registry
itronmen 2020 demo code
DigiUSB - Github


下一篇
[Python] Bomb!! Uiautomator x Thread = USB Port 掰掰 (平行控制)
系列文
自動化測試開發的美麗與憂愁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言