我買了一顆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。
成功後,你應該看到LED閃爍。
內部頻率也可改成8 MHz,請將Tools - Boards改成ATtiny85 (internal 8 MHz clock),然後執行Tools - Burn Bootloader,但其實並沒有定義bootloader的路徑與檔案,所以這個動作將會修改fuse,改變內部頻率。
參考資料:
- Arduino官方文件,Using an Arduino as an AVR ISP (In-System Programmer),From Arduino to a Microcontroller on a Breadboard。
- Open Electronics的Arduino ISP (In System Programming) and stand-alone circuits,提到如何修改boards.txt新增板子。
- Flashgamer的Using your Arduino as an ISP,碰到晶片型號不同的問題(328-P與328P-PU)、碰到stk500_recv(): programmer is not responding的問題。
- Cooper Maa的把 Arduino 當成一個 AVR ISP(In-System Programmer) 使用(1)、把 Arduino 當成一個 AVR ISP(In-System Programmer) 使用(2)、使用 Arduino 燒錄 ATtiny。
- High-Low Tech的Programming an ATtiny w/ Arduino 1.0。
- t r o n i x s t u f f的Using an ATtiny as an Arduino。
- ToasterBotics的Programming the ATTiny85, Arduino Style。
- GROBO: DIY Arduino - 將Bootloader寫進ATMega晶片!(3)。
- Boarduino, Solderless Breadboard Arduino Clone。
- AVRDUDE。
昨天有玩一下這顆ATtiny85,
ReplyDelete有2個問題,
1.改震盪頻率程式延遲函數是不是也要一起改?
2.沒有TX.RX不就不能使用藍芽傳輸?
http://openhardwarebrasil.org/climaduino/arduino-tiny-0100-0015.zip
Delete這裡有跟Arduino Uno一樣支援ATtiny85 16Mhz,
還有支援其他ATtiny系列MCU.
1.改震盪頻率程式延遲函數是不是也要一起改?
Delete照理說不用,Arduino程式庫應該包好了,我們不必擔心。
2.沒有TX.RX不就不能使用藍芽傳輸?
可以試試SoftwareSerial程式庫,透過軟體使用兩支腳位模擬TX與RX。
不過,關於軟體模擬序列介面,我的經驗通常都不太好。
謝謝提供資訊,關於ATtiny85的板子,
Delete也可搜尋關鍵字「Digispark 與 Digistump」和「Paperduino Tiny」,找出其他板子。
葉大您好:
ReplyDelete請問繞入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
上傳到板子時發生問題。可行建議請見
> 繞入Bootloader時候Arduino板子上的ATMEGA328P需要拔除嗎?
Delete不行。
就是要讓arduino板子(atmega328p)成為ISP燒錄器。
> stk500_getsync()
此種錯誤的原因,非常多,
請參閱 http://yehnan.blogspot.tw/2014/10/arduinostk500getsync-not-in-sync.html
葉大您好:
Delete嗯,可能我順序搞錯,在照葉大另一篇在重新燒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可以直接丟過去使用的說。
我沒用attiny了,無法回答你。
DeleteServo程式庫需要16 bit timer,attiny沒有;
所以需要別的特製的程式庫。
網路上有人成功(attiny + 伺服馬達),我沒試過。
16bit!?可是85不是8bit的嗎?我試看看,謝葉大。
Delete這裡的16 bit指的是timer,不是微控制器的。
Delete請問,已經燒好Bootloader,有辦法把開發板上的328P拿起來,插燒好Bootloader的328P,燒sketch嗎??
ReplyDelete如果328P是DIP形式,如本文第一張圖,可自己翹起,
Delete參考 https://www.youtube.com/watch?v=Hi5CsIsq28M
小心弄歪、弄壞針腳。
如果是SMD,那就難了。
謝謝葉大解惑
Delete328P-PU(DIP)跟328P-AU(SMD) 中斷TIMER的設定一樣嗎??
ReplyDelete只是封裝形式不同,功能應相同。
Delete老師,想請教您,我的程式燒到ATtiny85的時候,是一切正常,但是燒錄到ATtiny44上面,程式也修改好相對應於44的腳位號碼,可是程式就是不正常?或者是否跟Bootloader有關呢?
ReplyDelete