2013/02/03

將Arduino Uno當做一台ISP線上燒錄器,燒錄sketch到麵包板上的ATtiny85-20PU晶片

我買了一顆ATtiny85-20PU晶片,裡頭空空的沒有任何sketch。但我有一塊Arduino Uno R3板子,它可化身成一台ISP燒錄器;把ATtiny85-20PU放上麵包板,再接上一些電子元件與線材後,便可從主機電腦透過Arduino Uno R3板、將sketch燒錄到麵包板的ATtiny85-20PU晶片裡。

我的板子是Arduino Uno R3,Arduino軟體開發環境是1.0.3 Windows版,燒錄對象是ATtiny85

本篇介紹的內容,應該也可套用到其他Arduino板子與其他型號的AVR晶片,但我也沒試過,所以此篇內容皆以我的環境為準。(我另一篇是燒錄到ATmega328P-PU。)

若不清楚ISP是什麼意思,若想知道ATtiny85-20PU的PU之意,請參考我寫的:Arduino與AVR微控制器相關詞彙

底下是我的板子Arduino Uno R3,其微控制器晶片是ATmega328P-PU,屬於PDIP封裝。(另有SMD版本。)


首先,要讓Uno板變成一台ISP燒錄器。很簡單,請開啟Arduino軟體開發環境,然後選File - Examples - ArduinoISP,將這支sketch,Upload(上傳、燒錄)進Uno板,如此即可,ArduinoISP這支sketch的功能就是讓Arduino板子變成一台ISP燒錄器。

Arduino軟體開發環境裡支援的板子,其AVR微控制器晶片皆為ATmega系列,所以我們需先讓它支援ATtiny系列。到這裡下載讓Arduino支援ATtiny的檔案(適用於Arduino軟體開發環境1.0.1版與1.0.3版,1.0.2版不行),解壓縮可得到attiny-master目錄,裡面的attiny目錄才是我們要的,含有子目錄variants與boards.txt檔。

然後以Arduino軟體開發環境的File - Preferences的Sketchbook location:查出sketchbook目錄的路徑,將解壓縮後的attiny整個目錄(不是attiny-master目錄),搬移到sketchbook目錄裡的hardware子目錄裡(若無此目錄請自行建立)。

然後重新啟動Arduino軟體開發目錄,應該就能在Tools - Board裡看到新增的ATtiny系列了。


下圖是單獨的ATtiny85-20PU晶片。


接下來,我們想要燒錄sketch到麵包板的ATtiny85-20PU晶片裡,底下是ATtiny85晶片的腳位功能對照,對照這張圖進行接線。


Arduino板的5V與GND接到麵包板。

ATtiny85-20PU的腳位8(VCC)接到5V。
ATtiny85-20PU的腳位4(GND)接地。

然後根據ArduinoISP這支sketch定義的ISP腳位接線,

Arduino Uno板腳位10,接ATtiny85-20PU的腳位1(RESET)。
Arduino Uno板腳位11,接ATtiny85-20PU的腳位5(MOSI)。
Arduino Uno板腳位12,接ATtiny85-20PU的腳位6(MISO)。
Arduino Uno板腳位13,接ATtiny85-20PU的腳位7(SCK)。

另外,因為我將燒錄Blink範例sketch,所以:
ATtiny85-20PU的腳位3(將會對應到Arduino的數位腳位4)串接220 ohm電阻後接LED長腳,LED短腳接地。




如此便完成硬體線路了。

Arduino Uno板以USB線連接主機電腦後,開啟Arduino軟體開發環境,先做一些設定:
  • 設定Tools - Board選為ATtiny85 (internal 1 MHz clock)。這個設定的意思是「被燒錄的對象」。ATtiny85預設使用內部頻率1 MHz。
  • 設定Tools-Serial Port。這是Uno板連接到電腦的序列埠號。
  • 設定Tools - Programmer,選為Arduino as ISP
然後執行File - Upload Using Programmer,便可將sketch透過Arduino Uno板(扮演一台ISP線上燒錄器),燒錄到麵包板上的ATtiny85-20PU晶片裡。

成功後,你應該看到LED閃爍。

內部頻率也可改成8 MHz,請將Tools - Boards改成ATtiny85 (internal 8 MHz clock),然後執行Tools - Burn Bootloader,但其實並沒有定義bootloader的路徑與檔案,所以這個動作將會修改fuse,改變內部頻率。



參考資料:

16 comments:

  1. 昨天有玩一下這顆ATtiny85,
    有2個問題,
    1.改震盪頻率程式延遲函數是不是也要一起改?
    2.沒有TX.RX不就不能使用藍芽傳輸?

    ReplyDelete
    Replies
    1. http://openhardwarebrasil.org/climaduino/arduino-tiny-0100-0015.zip
      這裡有跟Arduino Uno一樣支援ATtiny85 16Mhz,
      還有支援其他ATtiny系列MCU.

      Delete
    2. 1.改震盪頻率程式延遲函數是不是也要一起改?
      照理說不用,Arduino程式庫應該包好了,我們不必擔心。

      2.沒有TX.RX不就不能使用藍芽傳輸?
      可以試試SoftwareSerial程式庫,透過軟體使用兩支腳位模擬TX與RX。
      不過,關於軟體模擬序列介面,我的經驗通常都不太好。

      Delete
    3. 謝謝提供資訊,關於ATtiny85的板子,
      也可搜尋關鍵字「Digispark 與 Digistump」和「Paperduino Tiny」,找出其他板子。

      Delete
  2. 葉大您好:
    請問繞入Bootloader時候Arduino板子上的ATMEGA328P需要拔除嗎?!
    因為我照這篇接線燒BOOtloader到Attiny85沒有燒成功,
    然後Arduino的ATMEGA328P好像不能用了,線路都拔除剩下原本的Arduino後
    sketch上傳不上去。
    Arduino:1.6.13 (Windows 7), 開發板:"Arduino/Genuino Uno"

    草稿碼使用了 4,380 bytes (13%) 的程式儲存空間。上限為 32,256 bytes。
    全域變數使用了 481 bytes (23%) 的動態記憶體,剩餘 1,567 bytes 給區域變數。上限為 2,048 bytes 。
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x46
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x46
    上傳到板子時發生問題。可行建議請見



    ReplyDelete
    Replies
    1. > 繞入Bootloader時候Arduino板子上的ATMEGA328P需要拔除嗎?
      不行。
      就是要讓arduino板子(atmega328p)成為ISP燒錄器。

      > stk500_getsync()
      此種錯誤的原因,非常多,
      請參閱 http://yehnan.blogspot.tw/2014/10/arduinostk500getsync-not-in-sync.html

      Delete
    2. 葉大您好:
      嗯,可能我順序搞錯,在照葉大另一篇在重新燒atmega328p的Bootloader就可以了,不過Attiny85的伺服馬達編譯好像不能直接用原本的#include 去編譯,
      Arduino:1.6.13 (Windows 7), 開發板:"ATtiny25/45/85, ATtiny85, Internal 8 MHz"

      E:\Arduino\libraries\Servo\src\avr\Servo.cpp: In function 'void __vector_3()':

      E:\Arduino\libraries\Servo\src\avr\Servo.cpp:82:44: error: cannot convert 'volatile uint8_t* {aka volatile unsigned char*}' to 'volatile uint16_t* {aka volatile unsigned int*}' for argument '2' to 'void handle_interrupts(timer16_Sequence_t, volatile uint16_t*, volatile uint16_t*)'

      handle_interrupts(_timer1, &TCNT1, &OCR1A);

      ^
      E:\Arduino\libraries\Servo\src\avr\Servo.cpp: In function 'void initISR(timer16_Sequence_t)':

      E:\Arduino\libraries\Servo\src\avr\Servo.cpp:129:5: error: 'TCCR1B' was not declared in this scope

      TCCR1B = _BV(CS11); // set prescaler of 8

      ^
      E:\Arduino\libraries\Servo\src\avr\Servo.cpp:136:5: error: 'TIFR1' was not declared in this scope

      TIFR1 |= _BV(OCF1A); // clear any pending interrupts;

      ^
      E:\Arduino\libraries\Servo\src\avr\Servo.cpp:137:5: error: 'TIMSK1' was not declared in this scope

      TIMSK1 |= _BV(OCIE1A) ; // enable the output compare interrupt

      ^

      exit status 1
      開發板 ATtiny25/45/85 編譯錯誤。

      有找到Servo8Bit的#include 是可以編譯sketch了,但是上傳過去Attiny85後就都沒反應,可是PWM跟ADC顯示LED都正常,以為Servo可以直接丟過去使用的說。

      Delete
    3. 我沒用attiny了,無法回答你。

      Servo程式庫需要16 bit timer,attiny沒有;
      所以需要別的特製的程式庫。

      網路上有人成功(attiny + 伺服馬達),我沒試過。

      Delete
    4. 16bit!?可是85不是8bit的嗎?我試看看,謝葉大。

      Delete
    5. 這裡的16 bit指的是timer,不是微控制器的。

      Delete
  3. 請問,已經燒好Bootloader,有辦法把開發板上的328P拿起來,插燒好Bootloader的328P,燒sketch嗎??

    ReplyDelete
    Replies
    1. 如果328P是DIP形式,如本文第一張圖,可自己翹起,
      參考 https://www.youtube.com/watch?v=Hi5CsIsq28M

      小心弄歪、弄壞針腳。

      如果是SMD,那就難了。

      Delete
    2. 謝謝葉大解惑

      Delete
  4. 328P-PU(DIP)跟328P-AU(SMD) 中斷TIMER的設定一樣嗎??

    ReplyDelete
    Replies
    1. 只是封裝形式不同,功能應相同。

      Delete
  5. 老師,想請教您,我的程式燒到ATtiny85的時候,是一切正常,但是燒錄到ATtiny44上面,程式也修改好相對應於44的腳位號碼,可是程式就是不正常?或者是否跟Bootloader有關呢?

    ReplyDelete