Der ATtiny85 liefert 8 KB Flash, 512 Bytes SRAM und sechs nutzbare GPIO-Pins in einem 8-Pin-Gehäuse, was ihn praktisch für kostenbewusste Designs macht, bei denen der Board-Platz begrenzt ist und ein voll ausgestatteter Mikrocontroller übertrieben wäre. Er läuft auf 1,8-5,5 V, verfügt über einen 10-Bit-ADC mit vier Kanälen und unterstützt softwaregesteuerte serielle Kommunikation über seine Universal Serial Interface. Im Folgenden gehe ich die Pinout-Struktur, die interne Architektur, den Programmierworkflow und die entscheidenden Kompromisse durch, wenn man tatsächlich damit baut.
Wichtige Erkenntnisse:
- Sechs GPIO-Pins teilen sich ADC-, PWM- und serielle Funktionen; Eine sorgfältige Pin-Zuweisung verhindert Ressourcenkonflikte in realen Layouts.
- Der RESET-Pin kann über Sicherungen als GPIO neu konfiguriert werden, aber dadurch ist man an Hochspannungsprogrammierung gebunden - planen Sie Ihre Debug- und Produktionsabläufe, bevor Sie sich festlegen.
- USI erfordert manuelles Bit-Banging für I²C und SPI; Es funktioniert für Peripheriegeräte mit niedriger Geschwindigkeit, erhöht aber die Firmware-Komplexität im Vergleich zu Hardware-Peripheriegeräten.
- Die ADC-Stabilität hängt von der Qualität der Stromversorgung und der Erdung ab; der ADC Noise Reduction Schlafmodus verbessert die Ergebnisse messbar, wenn Basisrauschen vorhanden ist.
- GPIO-Pins erzeugen/senken laut Datenblatt maximal 40 mA, aber anhaltender Betrieb über 20 mA pro Pin beschleunigt die Verschlechterung - Spannungen werden extern immer hochströmte Lasten gepuffert.
Technische Spezifikationen
| Parameter | Wert |
|---|---|
| CPU | 8-Bit-AVR RISC |
| Betriebsspannung | 1,8-5,5 V |
| Flash-Speicher | 8 KB |
| SRAM | 512 Bytes |
| EEPROM | 512 Bytes |
| GPIO-Pins | 6 |
| ADC | 10-Bit, 4 Kanäle |
| Timer | Zwei 8-Bit- |
| Taktfrequenz | Bis zu 20 MHz (extern), 8 MHz (interne RC, Standard) |
| Pakete | PDIP-8, SOIC-8, TSSOP-8, QFN/MLF-20 |
| Temperaturbereich | -40 bis +125 °C |
| Serielle Schnittstelle | USI (softwarekonfigurierbar für SPI oder I²C) |
| Brownout-Erkennung | Ja |
| Wachhund-Timer | Ja |

Pin-Konfiguration
| Pin | Hauptfunktion | Alternative Funktionen |
|---|---|---|
| 1 | PB5 (RESET) | PCINT5, ADC0, dW (debugWIRE) |
| 2 | PB3 | PCINT3, XTAL1, CLKI, ADC3 |
| 3 | PB4 | PCINT4, XTAL2, CLKO, ADC2 |
| 4 | GND | Boden |
| 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 | Stromversorgung |

Jeder GPIO-Pin multiplext mindestens drei Funktionen. Aus Erfahrung besteht der häufigste Konflikt zwischen SPI-Programmierung (die PB0, PB1, PB2 verwendet) und Anwendungsperipheriegeräten auf denselben Pins. Wenn Ihre Anwendungsschaltung diese Pins stark belastet oder in einem festen Zustand hält, kann ISP-Programmierung gelegentlich ausfallen. Das Hinzufügen von Serienwiderständen (220-470 Ω) zwischen dem ATtiny85 und externen Komponenten auf den SPI-Leitungen ermöglicht es dem Programmierer, die Anwendungsschaltung während der Uploads zu überschreiben.
Pin 1 steht standardmäßig auf RESET mit einem internen Pull-up. Wenn man es über die RSTDISBL-Sicherung als GPIO (PB5) konfiguriert, erhält man einen zusätzlichen I/O-Pin, aber man verliert die Möglichkeit, über den Standard-ISP neu zu programmieren. Hochspannungsparallele Programmierung (HVPP) ist dann erforderlich, was einen spezialisierten Programmierer erfordert und die Produktionsabläufe komplexer macht. Ich habe gesehen, wie Teams RESET deaktiviert haben, um den sechsten Pin zu erhalten, nur um spät im Projekt festzustellen, dass Feldupdates unpraktisch werden.
Blockdiagramm und interne Architektur

Der ATtiny85 verwendet eine Harvard-Architektur mit separatem 8-KB-Flash für Programmspeicherung und 512 Byte SRAM für Laufzeitdaten. Die Flash-Ausdauer ist mit 10.000 Schreib-/Löschzyklen pro Seite angegeben; EEPROM ist mit 100.000 Zyklen bewertet. Wenn Ihre Anwendung häufig Kalibrierungsdaten oder Protokolle schreibt, erreichen Sie die EEPROM-Grenzen schneller als erwartet - Schreibvorgänge über mehrere Adressen verteilt oder für Daten mit hoher Zyklenzahl auf externen Speicher umsteigen.
Zwei 8-Bit-Timer (Timer0 und Timer1) erzeugen PWM, zählen externe Ereignisse und lösen Interrupts aus. Timer0 ist einfacher und wird typischerweise für grundlegende PWM- oder Verzögerungsfunktionen verwendet. Timer1 enthält einen PLL-Modus, der Hochfrequenz-PWM erzeugen kann (bis zu 64 MHz auf PB1/PB4 mit 5 V Versorgung), was für Anwendungen wie IR-Trägererzeugung oder Hochfrequenzdimmung nützlich ist.
Der Watchdog-Timer kann den Chip zurücksetzen, wenn die Firmware hängt, funktioniert aber auch als Energiespar-Intervall-Timer im Schlafmodus. In einem batteriebetriebenen Design nutzten wir den Watchdog, um den ATtiny85 alle 8 Sekunden zu wecken, einen Sensor zu messen und wieder in den Schlafzustand zu versetzen - was zu einem durchschnittlichen Stromverbrauch unter 10 μA führte.
Stromversorgung und Uhrkonfiguration
Der ATtiny85 wird mit Sicherungen ausgeliefert, die für den internen 8-MHz-RC-Oszillator geteilt durch 8 sind, was eine tatsächliche 1-MHz-Taktfrequenz ergibt. Dieser konservative Standard funktioniert über den gesamten Spannungsbereich, lässt aber die Leistung auf dem Table. Für 5-V-Betrieb ist die Neukonfiguration von Sicherungen so, dass der interne Oszillator mit vollen 8 MHz betrieben wird, unkompliziert und erfordert keine externen Komponenten.
Wenn man eine präzise Abstimmung benötigt - zum Beispiel für ein UART mit Standard-Baudenraten oder einen Frequenzzähler - ist die ±10%ige Werkskalibrierung des internen Oszillators nicht präzise genug. Ein externer 16-MHz- oder 20-MHz-Quarz verbessert die Genauigkeit auf ±50 ppm, fügt jedoch zwei Kondensatoren hinzu und belegt PB3/PB4. Dieser Kompromiss lohnt sich bei kommunikationsintensiven Anwendungen, ist aber schmerzlich, wenn man bereits auf Pins beschränkt ist.
Die Brown-out-Erkennung (BOD) verhindert, dass die CPU ungültige Anweisungen ausführt, wenn die Versorgungsspannung absinkt. Das Aktivieren von BOD bei 2,7 V oder 4,3 V fügt etwa 20-25 μA zum Schlafstrom hinzu. Bei Batteriedesigns, die auf den Untermikroampere-Schlaf abzielen, müssen Sie möglicherweise das BOD deaktivieren und Niederspannungsbedingungen in der Firmware bewältigen - wobei Sie das Risiko gelegentlicher Störungen beim Ausschalten einnehmen.
GPIO-Eigenschaften und Lastgrenzen
Jeder GPIO-Pin kann laut Microchip-Datenblatt bis zu maximal 40 mA erzeugen oder senken, aber das ist eine destruktive Grenze, keine Betriebsspezifikation. Der empfohlene Dauerstrom pro Pin beträgt 20 mA, und der Gesamtstrom über alle Pins sollte unter 200 mA bleiben, um interne Erdungsabprall- und Verriegelungsrisiken zu vermeiden.
Eine LED direkt von einem GPIO zu steuern ist bei Hobbyprojekten üblich, aber Vorwärtsspannung und Strom erfordern sorgfältige Überlegung. Eine Standard-rote LED mit 2 V Vorwärtsabsatz bei 20 mA an einer 5-V-Versorgung benötigt einen Widerstand von mindestens 150 Ω. Ich habe Platinen debuggt, bei denen jemand 47 Ω "weil die LED zu schwach war" verwendet hat - es funktionierte ein paar Stunden, dann fiel der GPIO dauerhaft aus.
Für Lasten über 20 mA - Motoren, Relais, Magnetventile oder sogar leistungsstarke LEDs - verwenden Sie ein externes MOSFET oder BJT. Ein 2N7002 N-Kanal-MOSFET kostet nur wenige Cent und schaltet hunderte Milliampere sauber mit einem 10-kΩ-Gate-Widerstand. Der Versuch, GPIO-Pins parallel zu verlegen, um die Stromkapazität zu erhöhen, funktioniert nicht zuverlässig; Geringe Unterschiede in der Pin-Impedanz führen zu ungleichmäßiger Stromverteilung und potenzieller Schäden.
ADC-Betrieb und Lärmmanagement
Der 10-Bit-ADC wandelt 0-VCC (oder eine interne Referenz von 1,1 V oder 2,56 V) in Werte von 0 bis 1023 um. Die Auflösung beträgt 10 Bits, aber die effektive Bitanzahl (ENOB) in einer verrauschten Umgebung kann auf 8 oder sogar 7 Bits sinken, wenn man das Netzteilrauschen nicht berücksichtigt.
Drei Dinge verbessern meiner Erfahrung nach die ADC-Stabilität:
- Entkopplung der Kondensatoren in der Nähe des Chips. Eine 100 nF Keramik und ein 10 μF Elektrolytkondensator in Parallel, die innerhalb von 5 mm von VCC- und GND-Pins entfernt sind, unterbinden hochfrequentes Schaltrauschen.
- ADC Noise Reduction Sleep Mode. Das Anhalten der CPU während der Umrüstung eliminiert das digitale Schaltrauschen im Inneren des Chips. Der Unterschied ist messbar: Ich habe gesehen, dass die Rauschböden von ±8 LSB auf ±2 LSB allein durch Aktivierung dieses Modus gefallen sind.
- Separate analoge Erdung oder Sternerde. Wenn der ADC einen Rückweg mit PWM-betriebenen Lasten teilt, bringt der Erdstrom vom PWM Rauschen in ADC-Messungen. Eine dedizierte Erdungsleitung zurück zum Netzteil für die ADC-Referenz verbessert die Ergebnisse deutlich.
Der ADC unterstützt außerdem einen differentiellen Eingangsmodus mit optionalem Gain (1×, 8×, 20×, 32×) bei bestimmten Pin-Paaren. Das wird in Tutorials selten dokumentiert, funktioniert aber gut für kleine Differentialsignale wie Thermoelement- oder Dehnungsstreifenbrücken. Die Verstärkung geht auf Kosten eines reduzierten Eingangsbereichs und eines erhöhten Versatzfehlers, daher wird die Kalibrierung entscheidend.
Serielle Kommunikation über USI
Die Universal Serial Interface (USI) ist ein minimaler Hardware-Block, der bei seriellen Protokollen hilft, aber den Großteil der Arbeit der Firmware überlässt. Es beinhaltet ein Shift-Register, einen Zähler und eine grundlegende Taktgenerierung - genug, um I²C oder SPI bei niedrigen bis mittleren Geschwindigkeiten zu bitbangen.
Wenn USI gut funktioniert:
- Kommunikation mit einem einzelnen I²C-Sensor bei 100 kHz.
- Antrieb eines SPI-Displays oder DAC, bei dem der ATtiny85 immer der Master ist.
- Prototyping oder Low-Volume-Designs, bei denen die Firmware-Komplexität akzeptabel ist.
Wenn USI zum Problem wird:
- Multimaster-I²C- oder Clock-Stretching-Szenarien; die USI bearbeitet diese nicht automatisch.
- Hochgeschwindigkeits-SPI über 1 MHz; Das Timing wird ohne dedizierte Hardware schwierig.
- Anwendungen, bei denen man auch UART benötigt - es gibt keine UART-Hardware, also bit-bangt man auch die, was CPU-Zyklen verbraucht und das Timing erschwert.
Ich habe USI-basierte I²C-Bibliotheken wie TinyWireM erfolgreich mit Sensoren wie dem BMP280 und SSD1306 OLED verwendet. Aber ich habe auch stundenlang einen Fall debuggt, bei dem ein I²C-Gerät SCL niedrig gehalten hat (Taktdehnung), und die Bibliothek es nicht erkannt hat, wodurch die Firmware hängen geblieben ist. Die Lektion: Test den USI-Code früh mit deinen tatsächlichen Peripheriegeräten, nicht auf der Bank unter idealen Bedingungen.
Programmierung des ATtiny85 mit Arduino-IDE

Die Programmierung des ATtiny85 über die Arduino-IDE erfordert das Hinzufügen einer Drittanbieter-Board-Definition, wie zum Beispiel den ATTinyCore von Spence Konde oder das ältere ATTINY-Paket von David Mellis. Diese Kerne ordnen Arduino-Funktionen wie 'digitalWrite()' und 'analogRead()' auf die ATtiny85-Hardware ab.
Verkabelung für ISP-Programmierung:
| ATtiny85 Pin | ISP Programmer Signal |
|---|---|
| 1 (RESET) | RESET |
| 5 (PB0) | MOSI |
| 6 (PB1) | MISO |
| 7 (PB2) | SCK |
| 8 (VCC) | +5V (oder Zielspannung) |
| 4 (GND) | GND |
Du kannst ein dediziertes USBtinyISP, USBasp oder ein beliebiges Arduino-Board verwenden, das als "Arduino als ISP" konfiguriert ist. Wenn du einen Arduino als Internetanbieter verwendest, setze einen 10 μF-Kondensator zwischen RESET und GND auf den Arduino, um ein Reset beim Hochladen zu verhindern.
Board-Einstellungen sind wichtig:
- Wählen Sie die richtige Taktfrequenz (1 MHz, 8 MHz intern oder 16 MHz extern).
- Wählen Sie einmal "Bootloader brennen", um die Sicherungseinstellungen zu schreiben - dieser Schritt installiert keinen Bootloader (der ATtiny85 verwendet keinen), aber er konfiguriert die Sicherungen an Ihre gewählte Taktfrequenz.
- Nach Einstellung der Sicherungen werden Skizzen über "Skizze > Upload Using Programmer" hochgeladen oder der Programmierer als Standard in den Einstellungen gesetzt.
Arduino-PIN-Nummern stimmen nicht direkt mit physischen Pins überein. Zum Beispiel entspricht der digitale Pin 0 des Arduino PB0 (physischer Pin 5), und der digitale Pin 2 des Arduino ist PB2 (physischer Pin 7). Überprüfe die Kerndokumentation oder das Pinout-Diagramm vor dem Verkabeln.
Minimaler Arbeitskreis

Ein minimaler Stromkreis benötigt nur:
- VCC (Pin 8) angeschlossen an eine 3,3-V- oder 5-V-Versorgung.
- GND (Pin 4) mit Masse verbunden.
- Ein 100 nF keramischer Kondensator zwischen VCC und GND, nahe am IC platziert.
- Optional ein 10 kΩ Pull-up-Widerstand auf RESET (Pin 1), wenn die Versorgung laut ist - wobei der interne Pull-up meist ausreicht.
Eine LED mit einem strombegrenzenden Widerstand (220-470 Ω für 5 V, mindestens 150 Ω für 3,3 V), die an PB0 (Pin 5) angeschlossen ist, liefert visuelles Feedback. Der interne 8-MHz-RC-Oszillator läuft standardmäßig, sodass kein externer Quarz erforderlich ist.
Dieses Setup funktioniert zuverlässig für Blink-Tests, PWM-Experimente und die anfängliche Firmware-Entwicklung. Für Produktions- oder rauschempfindliche Anwendungen wird ein 10 μF Bulk-Kondensator parallel zur 100 nF Keramik hinzugefügt, um den transienten Strombedarf zu bewältigen.
Häufige Probleme und praktische Lösungen
| Problem | Ursache | Lösung |
|---|---|---|
| ISP-Upload schlägt fehl bei "Gerätesignatur-Fehlanpassung" | Falscher Chip in der IDE ausgewählt oder Sicherungen auf externen Takt ohne vorhandenen Quarz gesetzt | Überprüfen Sie die Auswahl des Boards; Wenn die Sicherungen falsch sind, verbinden Sie ein externes Taktsignal an PB3 oder verwenden Sie HVPP zur Wiederherstellung |
| ADC-Messungen driften oder springen zufällig | Stromversorgungsrauschen, fehlender Entkopplungskondensator oder schlechte Erdung | Fügen Sie 100 nF + 10 μF Entkopplung nahe VCC/GND hinzu; ADC-Rauschunterdrückungsmodus aktivieren; getrennte analoge und digitale Erdungswege |
| I²C/SPI-Kommunikation fällt intermittierend aus | USI-Timing falsch, Taktfrequenzfehler oder fehlende externe Klimmzüge (I²C) | Überprüfen Sie die Uhrenauswahl und die Sicherungseinstellungen doppelt; 4,7 kΩ Klimmzüge zu SDA/SCL für I²C hinzufügen; Busgeschwindigkeit in der Firmware reduzieren |
| GPIO-Pin reagiert nach stundenlangem Betrieb nicht mehr | Stift über die Stromgrenze hinaus getrieben oder einem Spannungsspitzen ausgesetzt | Überprüfen Sie die LED-Widerstandswerte; Hochstromlasten mit MOSFET zu puffern; Übergangsschutz (Diode oder TVS) hinzufügen, wenn der Pin an externe Kabel angeschlossen wird |
| Der Code läuft mit falscher Geschwindigkeit oder das Timing stimmt nicht | Die Taktsicherungseinstellungen stimmen nicht mit der Arduino-IDE-Platinenauswahl überein | Burn-Bootloader (setzt Sicherungen) nach Änderung der Takteinstellung; Überprüfen Sie die tatsächliche Taktfrequenz mit einem Scope oder Logikanalysator |
Wenn die RESET-Sicherung versehentlich deaktiviert wird:
Wenn du die RSTDISBL-Sicherung einstellst und den ISP-Zugang verlierst, funktionieren Standardprogrammierer nicht. Du brauchst einen Hochspannungs-Parallelprogrammierer (HVPP) wie den AVR Dragon (eingestellt, aber gebraucht erhältlich) oder Open-Source-Designs, die auf Arduino basieren. Dies legt 12 V auf den RESET-Pin an, während bestimmte Pins in definierten Zuständen gehalten werden, was den Chip unabhängig von den Sicherungseinstellungen in den Programmmodus zwingt. Es ist wiederherstellbar, aber nervig und zeitaufwendig.
Wann man den ATtiny85 benutzt (und wann nicht)
Gute Passung:
- Einfache Steuerungsaufgaben: LED-Treiber, Sensorleser, kleine Displays.
- Platzbegrenzte Designs, bei denen ein 8-poliges Gehäuse Brettfläche spart.
- Akkubetriebene Anwendungen, die den Schlafmodus nutzen (bis zu ~0,1 μA beim Ausschalten mit ausgeschaltetem Wachhund).
- Kostenempfindliche Designs, bei denen jeder Cent pro Einheit im Volumen zählt.
Schlechte Passform:
- Anwendungen, die mehrere serielle Peripheriegeräte gleichzeitig benötigen (UART + SPI + I²C) - die Firmware-Komplexität explodiert.
- Anforderungen an Hochgeschwindigkeitskommunikation oder enges Timing - begrenzt durch USI und Einzelthread-Ausführung.
- Projekte, bei denen die Entwicklungsgeschwindigkeit wichtiger ist als die Kosten; Der Wechsel zu einem ATmega328P oder STM32 bringt dir Hardware-UART, SPI, I²C und weniger Kopfschmerzen.
Ich habe den ATtiny85 erfolgreich in LED-Beleuchtungscontrollern, Batteriemonitoren und IR-Fernbedienungen verwendet. Aber ich habe es auch mitten im Projekt aufgegeben, als die Anforderungen auf einen UART-Debug-Port und SPI-Flash-Logging ausgeweitet wurden - Dinge, die auf einem größeren Chip trivial sind, aber beim ATtiny85 schmerzhaft sind.
Fazit
Der ATtiny85 bleibt relevant für Designs, bei denen Größe, Kosten und Leistung die Hauptbeschränkungen sind und die Funktionalität innerhalb seiner klar definierten Grenzen bleibt. Seine sechs GPIO-Pins mit gemeinsamen Funktionen erfordern eine sorgfältige Pinzuweisung, und das softwaregesteuerte USI erfordert mehr Firmware-Aufwand als Hardware-Peripheriegeräte. Die ADC-Leistung hängt stark vom Design der Stromversorgung ab, und GPIO-Stromgrenzen sind real - überschreiten Sie sie, fallen die Pins dauerhaft aus.
Das Verständnis der Sicherungseinstellungen, Reset-Pin-Kompromisse und ISP-Programmierungs-Workflows vor einer Entwurfsentscheidung verhindert kostspielige Überraschungen in der späten Phase. Für die richtige Anwendung bietet der ATtiny85 zuverlässige Steuerung bei minimalem Platzabdruck. Für alles Komplexere solltest du bewerten, ob die Firmware-Last und die Hardware-Einschränkungen die Kosteneinsparungen überwiegen.