ATtiny85 腳位配置、方塊圖與程式設計

已發佈 11月 05, 2026

ATtiny85 提供 8 鍵快閃記憶體、512 位元組 SRAM 及六個可用 GPIO 腳位,適合硬體空間有限且功能完整的微控制器過於昂貴設計。它運行於 1.8-5.5 V 電壓,包含一個 10 位元的四通道 ADC,並透過其通用序列介面支援軟體驅動的序列通訊。以下我將介紹它的腳位配置、內部架構、程式設計流程,以及實際使用時重要的取捨。

重點摘要:

  • 六個 GPIO 腳位共享 ADC、PWM 及串列功能;謹慎的腳位分配可防止真實佈局中的資源衝突。
  • RESET 腳位可透過保險絲重新配置為 GPIO,但此舉會將你鎖定在高壓程式設計中 - - 在提交前請先規劃除錯與生產工作流程。
  • USI 要求 I²C 與 SPI 手動位元敲擊;它適用於低速周邊設備,但相較硬體周邊會增加韌體複雜度。
  • ADC穩定性取決於電源品質與接地;ADC 降噪睡眠模式在基線噪音存在時,能明顯改善結果。
  • 根據資料手冊,GPIO 腳位的源/匯最大值為 40 mA,但持續運作超過 20 mA 會加速劣化 - - 必須在外部緩衝高電流負載。

技術規格

參數 價值
中央處理器 8位元 AVR RISC
操作電壓 1.8-5.5 V
快閃記憶體 8 KB
SRAM 512 位元組
EEPROM 512 位元組
GPIO 腳 6
ADC 10位元,4頻道
計時器 兩個 8 位元
時脈速度 最高可達 20 MHz(外接)、8 MHz(內置 RC,預設)
套件 PDIP-8、SOIC-8、TSSOP-8、QFN/MLF-20
溫度範圍 -40 至 +125 °C
串列介面 USI(可軟體配置 SPI 或 I²C)
電壓下降偵測 是的
看門狗計時器 是的

Figure 1. ATtiny85 PDIP-8 package

腳位配置

釘 主要功能 替代功能
1 PB5(重置) PCINT5、ADC0、dW(debugWIRE)
2 PB3 PCINT3、XTAL1、CLKI、ADC3
3 PB4 PCINT4、XTAL2、CLKO、ADC2
4 GND 地面
5 PB0 MOSI、DI、SDA、AIN0、oc0A、AREF、PCINT0
6 PB1 MISO、DO、AIN1、OC0B、OC1A、PCINT1
7 PB2 SCK、USCK、SCL、ADC1、T0、INT0、PCINT2
8 VCC 電源供應

Figure 2. ATtiny85 pinout diagram with alternate function labels

每個 GPIO 腳位至少會多工三個功能。根據經驗,最常見的衝突發生在SPI程式設計(使用PB0、PB1、PB2)與相同腳位上的應用程式周邊設備之間。如果你的應用電路對這些腳位負載過重或保持固定狀態,ISP 程式設計可能會間歇性失敗。在 ATtiny85 與 SPI 線路的外部元件之間加入串聯電阻(220-470 Ω),讓程式設計師在上傳時能覆蓋應用電路。

腳位 1 預設為 RESET 並內建上拉。透過 RSTDISBL 保險絲設定為 GPIO(PB5)會多一個 I/O 腳位,但你就失去了透過標準 ISP 重新編程的能力。接著需要高壓平行程式設計(HVPP),這需要專業的程式設計師,並增加生產工作流程的複雜性。我看過團隊為了取得第六個腳位而關閉 RESET 後期,卻發現現場更新變得不切實際。

方塊圖與內部架構

Figure 3. ATtiny85 simplified block diagram showing CPU, memory, timers, ADC, and I/O ports

ATtiny85 採用哈佛架構,分別使用 8 KB 快閃記憶體儲存程式,以及 512 位元組的 SRAM 執行時資料。Flash 耐久度每頁可完成 10,000 次寫入/擦除循環;EEPROM 的額定頻率為 100,000 次。如果你的應用程式經常寫入校正資料或日誌,你會比預期更快達到 EEPROM 限制 - - 例如分散寫入多個位址,或切換到外部儲存裝置以取得高週期數的資料。

兩個 8 位元計時器(Timer0 和 Timer1)產生 PWM、計數外部事件並觸發中斷。Timer0 較為簡單,通常用於基本的 PWM 或延遲功能。Timer1 包含一種 PLL 模式,可產生高頻 PWM(在 5V 供電下,PB1/PB4 最高可達 64 MHz),適用於紅外線載波產生或高頻調光等應用。

看門狗計時器可以在韌體當機時重置晶片,但在睡眠模式下也能作為低功耗間隔計時器運作。在一個電池供電設計中,我們利用看門狗每8秒喚醒ATtiny85,測量感測器後再進入睡眠 - - 導致平均電流消耗低於10 μA。

電源供應器與時脈配置

ATtiny85 配備內部 8 MHz RC 振盪器除以 8 的保險絲,實際時脈為 1 MHz。這種保守的預設在整個電壓範圍內有效,但性能卻是問題所在。對於5V運作,重新配置保險絲使內部振盪器以全8 MHz運作相當直接,且不需要外部元件。

當你需要精確的時序 - - 例如標準波特率的UART或頻率計數器 - - 內部振盪器的±10%工廠校正不夠精確。外接 16 MHz 或 20 MHz 晶體可提升精度至 ±50 ppm,但需增加兩個電容,佔用 PB3/PB4。這種取捨對於通訊密集的應用來說是值得的,但如果你已經腳本受限,這會很痛苦。

電壓下降偵測(BOD)防止 CPU 在供電電壓下降時執行無效指令。啟用 2.7 V 或 4.3 V 的 BOD 會為睡眠電流增加約 20-25 μA。針對亞微安培睡眠的電池設計,可能需要關閉 BOD 並在韌體中處理低電壓狀況 - - 同時接受關機時偶爾出現故障的風險。

GPIO 特性與負載限制

根據Microchip的數據表,每個GPIO腳位的絕對最大電流可達40 mA,但這是破壞性的限制,並非操作規格。建議每個腳位的連續電流為20 mA,所有腳位的總電流應保持在200 mA以下,以避免內部接地反彈及鎖存風險。

在業餘專案中,直接從 GPIO 驅動 LED 很常見,但正向電壓和電流需要仔細考慮。標準紅光燈在5V電源上,2 V正向降為20 mA,最低電阻需150 Ω。我曾除錯過有人用 47 Ω,因為「LED 太暗」 - - 它運作了幾個小時,然後 GPIO 永久失效。

對於超過 20 mA 的負載 - - 馬達、繼電器、電磁閥,甚至高功率 LED - - 可使用外接 MOSFET 或 BJT。一個 2N7002 N 通道 MOSFET 價格低廉,且使用 10 kΩ 閘極電阻即可乾淨切換數百毫安。嘗試並聯 GPIO 腳位以增加電流容量並不可靠;腳位阻抗的細微差異會導致電流共享不均,並可能造成損害。

ADC 操作與噪音管理

10位元 ADC 將 0-VCC(或內部 1.1 V 或 2.56 V 參考)轉換為 0 到 1023 的值。解析度是 10 位元,但在嘈雜環境中,有效位元數(ENOB)如果不處理電源雜訊,可能會降到 8 甚至 7 位元。

以我的經驗,有三件事能提升ADC穩定性:

  1. 將解耦電容器靠近晶片。 一顆100 nF陶瓷與10 μF電解電容並聯,置於距VCC和GND腳位5毫米內,可減少高頻切換雜訊。
  2. ADC 降噪睡眠模式。 在轉換過程中停止 CPU 可消除晶片內的數位切換雜訊。差異是可以測量的:我看過光是啟用這個模式,噪音底就從±8 LSB降到±2 LSB。
  3. 分別進行類比接地或星形接地。 如果 ADC 與 PWM 驅動負載共用回傳路徑,PWM 的接地電流會將雜訊注入 ADC 測量中。將專用的接地線線回電源供應器作為 ADC 參考,效果會明顯改善。

ADC 也支援差分輸入模式,並在某些針腳對上選擇增益(1×、8×、20×、32×)。這在教學中很少被記錄,但對於像熱電偶或應變計橋這類小型差動訊號效果很好。增益會以輸入範圍縮短和偏移誤差為代價,因此校正變得至關重要。

透過USI進行串行通訊

通用序列介面(USI)是一個最小限度的硬體區塊,協助序列協定,但大部分工作仍交由韌體處理。它包含移位暫存器、計數器及基本時鐘產生功能 - - 足以在低至中速速度下實現位元爆 I²C 或 SPI。

當USI運作良好時:

  • 與單一 I²C 感測器在 100 kHz 通訊。
  • 驅動 SPI 顯示器或 DAC,ATtiny85 始終是主控。
  • 在韌體複雜度可接受的情況下,進行原型或低量設計。

當USI成為問題時:

  • 多主控 I²C 或時脈拉伸情境;USI 不會自動處理這些。
  • 1 MHz以上的高速SPI;沒有專用硬體,時機掌握會很困難。
  • 需要 UART 的應用 - - 因為沒有 UART 硬體,所以你也會用 bit-bang 方式,消耗 CPU 週期並增加時序。

我曾成功使用基於 USI 的 I²C 函式庫,如 TinyWireM,搭配 BMP280 和 SSD1306 OLED 等感測器。但我也花了好幾個小時除錯一個案例,I²C 裝置將 SCL 保持低(時脈拉伸),但函式庫沒偵測到,導致韌體當機。教訓是:早期就用你的周邊設備測試 USI 程式碼,而不是在理想條件下的工作台上。

用 Arduino IDE 編程 ATtiny85

Figure 4. Arduino as ISP wiring diagram for ATtiny85 programming

透過 Arduino IDE 編寫 ATtiny85 需要新增第三方板子定義,例如 Spence Konde 的 ATTinyCore 或 David Mellis 較舊的 attiny 套件。這些核心將 Arduino 函式如「digitalWrite()」和「analogRead()」對應到 ATtiny85 硬體。

ISP 程式的接線:

ATtiny85 圖釘 ISP 程式設計師訊號
1(重置) 重置
5 (PB0) MOSI
6(PB1) MISO
7(PB2) SCK
8(VCC) +5V(或目標電壓)
4(GND) GND

你可以用專用的 USBtinyISP、USBasp,或任何設定為「Arduino 作為 ISP」的 Arduino 板。如果使用 Arduino 作為 ISP,請在 ARDUINO 的 RESET 和 GND 之間放置一個 10 μF 電容,以防止上傳時重置。

主板設定很重要:

  • 選擇正確的時脈速度(內部1 MHz、8 MHz,外部16 MHz)。
  • 選擇一次「燒毀開機載入程式」來寫入保險絲設定 - - 此步驟不會安裝開機載入程式(ATtiny85 不使用),但會將保險絲設定為與你選擇的時鐘相匹配。
  • 設定保險絲後,透過「Sketch > Upload Using Programmer」上傳草圖,或在偏好設定中將程式設計師設為預設。

Arduino 的腳位號碼和實體腳位不直接對應。例如,Arduino 數位腳位 0 對應於 PB0(物理腳位 5),而 Arduino 數位腳位 2 則是 PB2(物理腳位 7)。接線前請先查看核心文件或腳位圖。

極簡工作電路

Figure 5. Minimal ATtiny85 schematic with LED and decoupling capacitor

一個最小的電路只需:

  • VCC(腳位8)接到 3.3 V 或 5 V 電源。
  • GND(腳位4)接地。
  • 一個 100 nF 陶瓷電容器,位於 VCC 與 GND 之間,靠近 IC。
  • 若電源有雜訊,則可選擇在 RESET 上(腳位 1)加裝 10 kΩ 上拉電阻 - - 但內部上拉通常已足夠。

連接PB0(腳位5)的LED帶有限流電阻(5 V時220-470 Ω,3.3 V最低150 Ω),可提供視覺回饋。內建的 8 MHz RC 振盪器預設運作,因此不需要外部晶體。

這種配置在閃爍測試、PWM 實驗和初期韌體開發中都很可靠。對於生產或對噪音敏感的應用,建議在100 nF陶瓷元件旁並聯一個10 μF的體積電容器,以處理瞬態電流需求。

常見問題與實際解決方法

問題 根本原因 解答
ISP 上傳失敗,顯示「裝置簽章不匹配」 IDE 選錯晶片,或保險絲設為外部時脈但沒有晶體 確認董事會選擇;如果保險絲故障,請將外部時鐘訊號接到 PB3 或使用 HVPP 來恢復
ADC 讀數隨機漂移或跳躍 電源供應器噪音、缺失的解耦電容器,或接地不良 在 VCC/GND 附近加上 100 nF + 10 μF 的解耦;啟用 ADC 降噪模式;分開的類比與數位接地路徑
I²C/SPI 通訊間歇性失敗 USI 時序錯誤、時脈不匹配或外部上拉器缺失(I²C) 請再次檢查時鐘選擇與保險絲設定;為 I²C 在 SDA/SCL 中增加 4.7 kΩ 上拉;在韌體中降低匯流排速度
GPIO 腳位運行數小時後停止回應 針腳被驅動超過電流限制,或暴露於電壓尖峰 檢查LED電阻值;以MOSFET緩衝高電流負載;如果針腳連接外部線材,請加裝瞬態保護(二極體或TVS)
程式碼運行速度錯誤或時序不對 時脈保險絲設定與 Arduino IDE 主板選擇不符 更改時脈設定後燒毀開機載入程式(設定保險絲);用示波器或邏輯分析儀驗證實際時脈頻率

當RESET 保險絲意外被停用時:

如果你設定了 RSTDISBL 保險絲卻失去 ISP 存取權,標準程式程式就無法運作。你需要像 AVR Dragon(已停產但二手)這類高壓並列燒錄器(HVPP)或基於 Arduino 的開源設計。此系統在保持特定腳位於定義狀態時,對 RESET 腳位施加 12 V,無論保險絲設定如何,晶片都會進入程式設計模式。雖然可以恢復,但很煩人又耗時。

何時使用 ATtiny85(何時不該使用)

合身度好:

  • 簡單的控制任務:LED 驅動器、感測器讀取器、小型顯示器。
  • 空間受限設計,8腳封裝可節省電路板面積。
  • 利用休眠模式的電池供電應用(關閉看門狗時,電壓降至 ~0.1 μA)。
  • 成本敏感設計,每單位每一分錢在大量生產中都很重要。

不合身:

  • 需要同時使用多個序列周邊設備(UART + SPI + I²C)的應用 - - 韌體複雜度會爆炸性增加。
  • 高速通訊或嚴格時序要求 - - 受限於 USI 與單執行緒執行。
  • 開發速度比成本更重要的專案;換成 ATmega328P 或 STM32 會讓你有硬體 UART、SPI、I²C,且減少麻煩。

我成功使用 ATtiny85 在 LED 燈光控制器、電池監控器和紅外線遙控器上。但我也曾在專案中途放棄過,因為需求擴展到需要 UART 除錯埠和 SPI 快閃記錄 - - 這些在大晶片上很簡單,但在 ATtiny85 上卻很麻煩。

結論

ATtiny85 對於以體積、成本與功率為主要限制,且功能必須維持在其明確限制內的設計中仍然具有相關性。其六個 GPIO 腳位與共享功能需要謹慎的腳位分配,軟體驅動的 USI 比硬體周邊裝置需要更多韌體運算。ADC效能高度依賴電源設計,GPIO電流限制是真實存在的 - - 超過此限制後腳位將永久失效。

在決定設計前,了解保險絲設定、RESET 腳位的取捨,以及 ISP 的程式設計流程,可以避免後期出現昂貴的意外狀況。針對特定應用,ATtiny85 能以極小的體積提供可靠的控制。對於較複雜的系統,請評估韌體負擔與硬體限制是否超過成本節省。