Configuration des broches, schéma bloc et programmation de l’ATtiny85

Publié novembre 05, 2026

L’ATtiny85 délivre 8 Ko de mémoire Flash, 512 octets de SRAM et six broches GPIO utilisables dans un boîtier 8 broches, ce qui le rend pratique pour les conceptions sensibles au coût où l’espace de la carte est limité et où un microcontrôleur complet serait excessif. Il fonctionne en 1,8-5,5 V, inclut un ADC 10 bits avec quatre canaux, et supporte la communication série pilotée par logiciel via son interface série universelle. Ci-dessous, je vais passer en revue son brochage, son architecture interne, son flux de travail de programmation, ainsi que les compromis qui comptent lorsque vous construisez réellement avec lui.

Points clés :

  • Six broches GPIO partagent les fonctions ADC, PWM et série ; une attribution soigneuse des broches évite les conflits de ressources dans les mises en page réelles.
  • La broche RESET peut être reconfigurée en GPIO via des fusibles, mais cela vous enferme dans une programmation haute tension - planifiez vos flux de travail de débogage et de production avant de faire un commit.
  • L’USI nécessite le frappage manuel des bits pour I²C et SPI ; Il fonctionne pour les périphériques à faible vitesse mais ajoute de la complexité du firmware par rapport aux périphériques matériels.
  • La stabilité du ADC dépend de la qualité de l’alimentation et de la mise à la terre ; le mode veille ADC Noise Reduction améliore de manière mesurable les résultats lorsque le bruit de base est présent.
  • Les broches GPIO atteignent un maximum absolu de 40 mA selon la fiche technique, mais un fonctionnement soutenu au-dessus de 20 mA par broche accélère la dégradation - toujours tampon les charges à fort courant en externe.

Spécifications techniques

Paramètre Valeur
CPU AVR RISC 8 bits
Tension de fonctionnement 1,8-5,5 V
Mémoire Flash 8 Ko
SRAM 512 octets
EEPROM 512 octets
Broches GPIO 6
ADC 10 bits, 4 canaux
Minuteurs Deux 8 bits
Fréquence d’horloge Jusqu’à 20 MHz (externe), 8 MHz (RC interne, par défaut)
Packages PDIP-8, SOIC-8, TSSOP-8, QFN/MLF-20
Plage de température -40 à +125 °C
Interface série USI (configurable logiciellement pour SPI ou I²C)
Détection de panne de tension Oui
Chronomètre de garde Oui

Figure 1. ATtiny85 PDIP-8 package

Configuration des broches

Pin Fonction principale Fonctions alternatives
1 PB5 (REDÉMARRAGE) PCINT5, ADC0, dW (debugWIRE)
2 PB3 PCINT3, XTAL1, CLKI, ADC3
3 PB4 PCINT4, XTAL2, CLKO, ADC2
4 GND Terrain
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 Alimentation électrique

Figure 2. ATtiny85 pinout diagram with alternate function labels

Chaque broche GPIO multiplexe au moins trois fonctions. D’après mon expérience, le conflit le plus courant concerne la programmation SPI (qui utilise PB0, PB1, PB2) et les périphériques d’application sur ces mêmes broches. Si votre circuit d’application charge fortement ces broches ou les maintient dans un état fixe, la programmation du FAI peut échouer de façon intermittente. L’ajout de résistances en série (220-470 Ω) entre l’ATtiny85 et les composants externes sur les lignes SPI permet au programmeur de prendre le dessus sur le circuit de l’application lors des téléchargements.

La broche 1 passe par défaut à RESET avec une traction interne. Le configurer en GPIO (PB5) via le fusible RSTDISBL vous donne une broche d’E/S supplémentaire, mais vous perdez la possibilité de reprogrammer via le FAI standard. La programmation parallèle haute tension (HVPP) est alors requise, ce qui nécessite un programmeur spécialisé et ajoute de la complexité aux flux de travail de production. J’ai vu des équipes désactiver RESET pour obtenir cette sixième broche, pour découvrir tard dans le projet que les mises à jour sur le terrain deviennent impraticables.

Diagramme bloc et architecture interne

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

L’ATtiny85 utilise une architecture Harvard avec une mémoire flash séparée de 8 Ko pour le stockage des programmes et une SRAM de 512 octets pour les données d’exécution. L’endurance de la flash est évaluée à 10 000 cycles d’écriture/effacement par page ; L’EEPROM est évaluée à 100 000 cycles. Si votre application écrit fréquemment des données d’étalonnage ou des journaux, vous atteindrez les limites de l’EEPROM plus rapidement que prévu - répartirez les écritures sur plusieurs adresses ou basculez vers un stockage externe pour des données à haut nombre de cycles.

Deux minuteurs 8 bits (Timer0 et Timer1) génèrent des PWM, comptent les événements externes et déclenchent les interruptions. Timer0 est plus simple et généralement utilisé pour des fonctions PWM ou de délai de base. Timer1 inclut un mode PLL capable de générer des PWM haute fréquence (jusqu’à 64 MHz sur PB1/PB4 avec alimentation 5 V), utile pour des applications telles que la génération de porteuses IR ou la variation haute fréquence.

Le timer watchdog peut réinitialiser la puce si le firmware se bloque, mais il fonctionne aussi comme un minuteur à intervalles de faible consommation en mode veille. Dans un design alimenté par batterie, nous avons utilisé le watchdog pour réveiller l’ATtiny85 toutes les 8 secondes, mesurer un capteur, puis revenir en veille - ce qui a entraîné une consommation moyenne de courant inférieure à 10 μA.

Alimentation et configuration de l’horloge

L’ATtiny85 est livré avec des fusibles réglés pour l’oscillateur RC interne de 8 MHz divisé par 8, donnant une fréquence réelle de 1 MHz. Ce défaut conservateur fonctionne sur toute la plage de tension mais laisse la performance en laisse la carte de côté. Pour un fonctionnement 5 V, reconfigurer les fusibles pour faire fonctionner l’oscillateur interne à 8 MHz est simple et ne nécessite pas de composants externes.

Quand vous avez besoin d’un timing précis - par exemple, pour un UART à des débits de bauds standards ou un compteur de fréquences - l’étalonnage interne de ±10 % d’usine de l’oscillateur n’est pas assez précis. Un cristal externe à 16 MHz ou 20 MHz améliore la précision à ±50 ppm mais ajoute deux condensateurs et occupe PB3/PB4. Ce compromis vaut le coup pour des applications axées sur la communication, mais c’est pénible si vous êtes déjà limité par les broches.

La détection de coupure de tension (BOD) empêche le processeur d’exécuter des instructions invalides lorsque la tension d’alimentation diminue. Activer la DBO à 2,7 V ou 4,3 V ajoute environ 20 à 25 μA au courant de veille. Pour les conceptions de batteries ciblant le sommeil sub-microampère, il peut être nécessaire de désactiver la DBO et de gérer des conditions de basse tension dans le firmware - en acceptant le risque de bugs occasionnels lors de l’arrêt.

Caractéristiques GPIO et limites de charge

Chaque broche GPIO peut fournir ou absorber jusqu’à 40 mA maximum absolu selon la fiche technique de Microchip, mais c’est une limite destructrice, pas une spécification opérationnelle. Le courant continu recommandé par broche est de 20 mA, et le courant total sur toutes les broches devrait rester en dessous de 200 mA pour éviter le rebond interne à la masse et le risque de verrouillage.

Alimenter une LED directement depuis un GPIO est courant dans les projets de loisir, mais la tension et le courant direct nécessitent une attention particulière. Une LED rouge standard avec une chute directe de 2 V à 20 mA sur une alimentation 5 V nécessite au minimum une résistance de 150 Ω. J’ai débogé des cartes où quelqu’un utilisait 47 Ω « parce que la LED était trop faible » - ça a fonctionné pendant quelques heures, puis le GPIO a lâché définitivement.

Pour des charges supérieures à 20 mA - moteurs, relais, solénoïdes ou même LED puissantes - utilisez un MOSFET externe ou un BJT. Un MOSFET N-canal 2N7002 coûte des centimes et commute proprement des centaines de milliampères avec une résistance de grille de 10 kΩ. Essayer de mettre en parallèle les broches GPIO pour augmenter la capacité de courant ne fonctionne pas de manière fiable ; de légères différences d’impédance de broche provoquent un partage de courant inégal et des dommages potentiels.

Fonctionnement ADC et gestion du bruit

L’ADC 10 bits convertit 0-VCC (ou une référence interne de 1,1 V ou 2,56 V) en valeurs de 0 à 1023. La résolution est de 10 bits, mais le nombre effectif de bits (ENOB) dans un environnement bruyant peut tomber à 8 voire 7 bits si vous ne prenez pas en charge le bruit de l’alimentation.

Trois choses améliorent la stabilité de l’ADC selon mon expérience :

  1. Condensateurs de découplage proches de la puce. Un cylindre céramique de 100 nF et un électrolytique de 10 μF en parallèle, placés à moins de 5 mm des broches VCC et GND, coupent le bruit de commutation à haute fréquence.
  2. Mode veille ADC Noise Reduction. Arrêter le processeur lors de la conversion élimine le bruit de commutation numérique à l’intérieur de la puce. La différence est mesurable : j’ai vu des planchers sonores passer de ±8 LSB à ±2 LSB simplement en activant ce mode.
  3. Mise à la terre analogique ou en étoile séparée. Si le CAA partage un chemin de retour avec des charges alimentées par PWM, le courant de masse provenant du PWM injecte du bruit dans les mesures du PWM. Faire passer une piste de masse dédiée vers l’alimentation pour la référence ADC améliore nettement les résultats.

L’ADC prend également en charge le mode d’entrée différentiel avec un gain optionnel (1×, 8×, 20×, 32×) sur certaines paires de broches. Cela est rarement documenté dans les tutoriels mais fonctionne bien pour de petits signaux différentiels comme les ponts thermocouples ou jauges de contrainte. Le gain se fait au prix d’une plage d’entrée réduite et d’une erreur de décalage accrue, rendant l’étalonnage critique.

Communication en série via l’USI

L’Interface Série Universelle (USI) est un bloc matériel minimal qui assiste avec les protocoles série mais laisse la majeure partie du travail au firmware. Il comprend un registre de décalage, un compteur et une génération d’horloge basique - suffisante pour faire un bit-bang de l’I²C ou du SPI à des vitesses faibles à modérées.

Quand l’USI fonctionne bien :

  • Communiquer avec un seul capteur I²C à 100 kHz.
  • Piloter un écran SPI ou DAC où l’ATtiny85 est toujours le maître.
  • Prototypage ou conceptions à faible volume où la complexité du firmware est acceptable.

Quand l’USI devient un problème :

  • Scénarios multi-maîtres I²C ou étirements d’horloge ; l’USI ne gère pas ces problèmes automatiquement.
  • SPI haute vitesse au-dessus de 1 MHz ; Le timing devient difficile sans matériel dédié.
  • Applications où vous avez aussi besoin de l’UART - il n’y a pas de matériel UART, donc vous allez aussi le faire en bit-bang, ce qui consomme des cycles CPU et complique le timing.

J’ai utilisé avec succès des bibliothèques I²C basées sur USI comme TinyWireM avec des capteurs tels que le BMP280 et SSD1306 OLED. Mais j’ai aussi passé des heures à déboguer un cas où un appareil I²C maintenait SCL bas (étirement de l’horloge), et la bibliothèque ne l’a pas détecté, ce qui a fait planter le firmware. La leçon : testez le code USI contre vos périphériques réels tôt, pas sur le banc dans des conditions idéales.

Programmation de l’ATtiny85 avec l’IDE Arduino

Figure 4. Arduino as ISP wiring diagram for ATtiny85 programming

Programmer l’ATtiny85 via l’IDE Arduino nécessite d’ajouter une définition de carte tierce, comme l’ATTinyCore de Spence Konde ou l’ancien package attiny de David Mellis. Ces cœurs associent des fonctions Arduino comme 'digitalWrite()' et 'analogRead()' au matériel ATtiny85.

Câblage pour la programmation du FAI :

Épingle ATtiny85 Signal du programmeur ISP
1 (RESET) RESET
5 (PB0) MOSI
6 (PB1) MISO
7 (PB2) SCK
8 (VCC) +5V (ou tension cible)
4 (GND) GND

Vous pouvez utiliser un fournisseur USBtinyISP dédié, USBasp, ou n’importe quelle carte Arduino configurée comme « Arduino en tant que FAI ». Si vous utilisez un Arduino comme fournisseur d’accès Internet, placez un condensateur de 10 μF entre RESET et GND sur l’Arduino pour éviter qu’il ne se réinitialise lors de l’upload.

Les réglages de la carte comptent :

  • Sélectionner la fréquence d’horloge correcte (1 MHz, 8 MHz en interne ou 16 MHz en externe).
  • Choisissez « Burn Bootloader » une fois pour écrire les réglages du fusible - cette étape n’installe pas de bootloader (l’ATtiny85 n’en utilise pas), mais elle configure les fusibles pour correspondre à l’horloge sélectionnée.
  • Après avoir configuré les fusibles, téléchargez les croquis via « Sketch > Uploader Using Programmer » ou définissez le programmeur par défaut dans les préférences.

Les numéros PIN Arduino ne correspondent pas directement aux codes PIN physiques. Par exemple, la broche numérique 0 d’Arduino correspond à PB0 (broche physique 5), et la broche numérique 2 d’Arduino est PB2 (broche physique 7). Vérifiez la documentation du noyau ou le schéma de brochage avant de câbler.

Circuit minimal fonctionnel

Figure 5. Minimal ATtiny85 schematic with LED and decoupling capacitor

Un circuit minimal n’a besoin que de :

  • VCC (broche 8) connectée à une alimentation 3,3 V ou 5 V.
  • GND (broche 4) connecté à la terre.
  • Un condensateur céramique de 100 nF entre VCC et GND, placé près du CI.
  • En option, une résistance de tirage de 10 kΩ sur RESET (broche 1) si votre alimentation est bruyante - bien que la traction interne suffise généralement.

Une LED avec une résistance limiteuse de courant (220-470 Ω pour 5 V, 150 Ω minimum pour 3,3 V) connectée à PB0 (broche 5) fournit un retour visuel. L’oscillateur RC interne à 8 MHz fonctionne par défaut, donc aucun cristal externe n’est nécessaire.

Cette configuration fonctionne de manière fiable pour les tests blink, les expériences PWM et le développement initial du firmware. Pour la production ou les applications sensibles au bruit, ajoutez un condensateur en vrac de 10 μF en parallèle avec la céramique de 100 nF pour gérer les besoins de courant transitoire.

Problèmes courants et solutions pratiques

Problème Cause profonde Solution
Échec du téléchargement par le FAI avec « disparition de signature de l’appareil » Mauvaise puce sélectionnée dans l’IDE, ou fusibles réglés sur horloge externe sans cristal présent Vérifier la sélection du conseil ; si les fusibles sont erronés, connectez un signal d’horloge externe à PB3 ou utilisez HVPP pour récupérer
Les relevés de l’ADC dérivent ou sautent de façon aléatoire Bruit d’alimentation, condensateur de découplage manquant, ou mauvaise mise à la terre Ajouter 100 nF + 10 μF de découplage près de VCC/GND ; activer le mode de réduction du bruit ADC ; Chemins de sol analogiques et numériques séparés
La communication I²C/SPI échoue de façon intermittente Synchronisation USI incorrecte, désaccord de vitesse d’horloge, ou tractions externes manquantes (I²C) Vérifiez deux fois la sélection de l’horloge et les réglages du fusible ; ajouter des tractions de 4,7 kΩ à SDA/SCL pour I²C ; Réduire la vitesse du bus dans le firmware
La broche GPIO cesse de répondre après des heures de fonctionnement Broche actionnée au-delà de la limite de courant, ou exposée à un pic de tension Vérifiez les valeurs des résistances LED ; tampon les charges à fort courant avec MOSFET ; ajouter une protection contre les transitoires (diode ou TVS) si la broche est connectée à des câbles externes
Le code s’exécute à une mauvaise vitesse ou le timing est décalé Les réglages du fusible d’horloge ne correspondent pas à la sélection de la carte IDE Arduino Démarrer le bootloader (régler les fusibles) après avoir changé le réglage d’horloge ; vérifier la fréquence d’horloge réelle avec une oscillette ou un analyseur logique

Lorsque le fusible RESET est accidentellement désactivé :

Si vous réglez le fusible RSTDISBL et perdez l’accès au FAI, les programmeurs standards ne fonctionneront pas. Il faut un programmeur parallèle haute tension (HVPP) comme l’AVR Dragon (abandonné mais disponible d’occasion) ou des conceptions open source basées sur Arduino. Cela applique 12 V à la broche RESET tout en maintenant des broches spécifiques dans des états définis, ce qui force la puce en mode programmation indépendamment des réglages du fusible. C’est récupérable, mais agaçant et chronophage.

Quand utiliser l’ATtiny85 (et quand ne pas le faire)

Bonne coupe :

  • Tâches de contrôle simples : pilotes LED, lecteurs de capteurs, petits écrans.
  • Conceptions limitées en espace où un boîtier 8 broches économise de la surface de carte.
  • Applications alimentées par batterie utilisant les modes veille (jusqu’à ~0,1 μA en arrêt avec watchdog désactivé).
  • Des conceptions sensibles au coût où chaque centime par unité compte en volume.

Mauvaise adéquation :

  • Applications nécessitant plusieurs périphériques série simultanément (UART + SPI + I²C) - la complexité du firmware explose.
  • Communication à haute vitesse ou exigences de calage serrées - limitées par l’USI et l’exécution en mode simple thread.
  • Projets où la rapidité de développement compte plus que le coût ; passer à un ATmega328P ou STM32 vous apporte des UART, SPI, I²C matériels, et moins de soucis.

J’ai utilisé l’ATtiny85 avec succès sur des contrôleurs d’éclairage LED, des moniteurs de batterie et des récepteurs à distance IR. Mais je l’ai aussi abandonné en plein projet lorsque les exigences se sont élargies pour inclure un port de débogage UART et un journal flash SPI - des choses triviales sur une puce plus grande mais fastidieuses sur l’ATtiny85.

Conclusion

L’ATtiny85 reste pertinent pour les conceptions où la taille, le coût et la puissance sont les principales contraintes et où la fonctionnalité reste dans ses limites bien définies. Ses six broches GPIO avec des fonctions partagées nécessitent une assignation minutieuse des broches, et l’USI piloté par logiciel demande plus d’efforts de firmware que les périphériques matériels. Les performances de l’ADC dépendent fortement de la conception de l’alimentation, et les limites de courant GPIO sont réelles - si elles les dépassent, les broches tombent en panne définitivement.

Comprendre les réglages des fusibles, les compromis de broche RESET et les flux de travail de programmation du fournisseur Internet avant de s’engager dans une conception évite des surprises coûteuses en phase avancée. Pour la bonne application, l’ATtiny85 offre un contrôle fiable dans une empreinte minimale. Pour des situations plus complexes, évaluez si la charge du firmware et les contraintes matérielles l’emportent sur les économies de coûts.