El ATtiny85 ofrece 8 KB de Flash, 512 bytes de SRAM y seis pines GPIO utilizables en un paquete de 8 pines, lo que lo hace práctico para diseños sensibles a costes donde el espacio de la placa es limitado y un microcontrolador completo sería excesivo. Funciona en 1,8-5,5 V, incluye un ADC de 10 bits con cuatro canales y soporta comunicación serial basada en software a través de su Interfaz Universal Serial. A continuación explicaré su pinado, arquitectura interna, flujo de trabajo de programación y los sacrificios que importan cuando realmente construyes con él.
Puntos clave:
- Seis pines GPIO comparten funciones ADC, PWM y seriales; una asignación cuidadosa de pines evita conflictos de recursos en los diseños reales.
- El pin RESET puede reconfigurarse como GPIO mediante fusibles, pero hacerlo te atará a la programación de alto voltaje: planifica tus flujos de depuración y producción antes de hacer el compromiso.
- USI requiere golpeado manual de bits para I²C y SPI; Funciona para periféricos de baja velocidad pero añade complejidad al firmware en comparación con los periféricos de hardware.
- La estabilidad del ADC depende de la calidad de la fuente de alimentación y la conexión a tierra; el modo de suspensión ADC Noise Reduction mejora de forma medible los resultados cuando hay ruido base.
- Pines GPIO fuente/sumidero máximo absoluto de 40 mA según la hoja de datos, pero un funcionamiento sostenido por encima de 20 mA por pin acelera la degradación - siempre amortiguar las cargas de alta corriente externamente.
Especificaciones técnicas
| Parámetro | Valor |
|---|---|
| CPU | AVR RISC de 8 bits |
| Voltaje de funcionamiento | 1.8-5.5 V |
| Memoria Flash | 8 KB |
| SRAM | 512 bytes |
| EEPROM | 512 bytes |
| Pines GPIO | 6 |
| ADC | 10 bits, 4 canales |
| Temporizadores | Dos |
| Velocidad de reloj | Hasta 20 MHz (externo), 8 MHz (RC interno, por defecto) |
| Paquetes | PDIP-8, SOIC-8, TSSOP-8, QFN/MLF-20 |
| Rango de temperatura | -40 a +125 °C |
| Interfaz Serial | USI (configurable por software para SPI o I²C) |
| Detección de apagón Sí | |
| Cronómetro Watchdog | Sí |

Configuración de pines
| Pin | Función primaria | Funciones alternativas |
|---|---|---|
| 1 | PB5 (REINICIO) | PCINT5, ADC0, dW (debugWIRE) |
| 2 | PB3 | PCINT3, XTAL1, CLKI, ADC3 |
| 3 | PB4 | PCINT4, XTAL2, CLKO, ADC2 |
| 4 | GND | Campo |
| 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 | Fuente de alimentación |

Cada pin GPIO multiplexa al menos tres funciones. Por experiencia, el conflicto más común es entre la programación SPI (que usa PB0, PB1, PB2) y los periféricos de aplicación en esos mismos pines. Si tu circuito de aplicación carga mucho esos pines o los mantiene en estado fijo, la programación del ISP puede fallar de forma intermitente. Añadir resistencias en serie (220-470 Ω) entre el ATtiny85 y los componentes externos en las líneas SPI permite al programador anular el circuito de la aplicación durante las subidas.
El pin 1 se pone por defecto en RESET con una dominada interna. Configurarlo como GPIO (PB5) a través del fusible RSTDISBL te da un pin de E/S extra, pero pierdes la posibilidad de reprogramarlo con el ISP estándar. A continuación, se requiere programación paralela de alta tensión (HVPP), que requiere un programador especializado y añade complejidad a los flujos de trabajo de producción. He visto a Teams desactivar RESET para conseguir ese sexto pin, solo para descubrir al final del proyecto que las actualizaciones de campo se vuelven poco prácticas.
Diagrama de bloques y arquitectura interna

El ATtiny85 utiliza una arquitectura Harvard con memoria Flash separada de 8 KB para almacenamiento de programas y SRAM de 512 bytes para datos en tiempo de ejecución. La duración del flash está valorada en 10.000 ciclos de escritura/borrado por página; La EEPROM está clasificada para 100.000 ciclos. Si tu aplicación escribe datos de calibración o registros con frecuencia, alcanzarás los límites de EEPROM más rápido de lo que esperas: distribuye las escrituras entre múltiples direcciones o cambia a almacenamiento externo para datos de alto conteo de ciclos.
Dos temporizadores de 8 bits (Timer0 y Timer1) generan PWM, cuentan eventos externos y activan interrupciones. Timer0 es más sencillo y normalmente se utiliza para funciones básicas de PWM o retardo. Timer1 incluye un modo PLL que puede generar PWM de alta frecuencia (hasta 64 MHz en PB1/PB4 con alimentación de 5 V), útil para aplicaciones como la generación de portadoras IR o el atenuado de alta frecuencia.
El temporizador watchdog puede reiniciar el chip si el firmware se bloquea, pero también funciona como temporizador de intervalo de bajo consumo en los modos de suspensión. En un diseño alimentado por batería, usamos el watchdog para despertar el ATtiny85 cada 8 segundos, medir un sensor y volver a entrar en suspensión, lo que resultó en un consumo medio de corriente inferior a 10 μA.
Configuración de la fuente de alimentación y del reloj
El ATtiny85 viene con fusibles ajustados para el oscilador RC interno de 8 MHz dividido entre 8, proporcionando un reloj real de 1 MHz. Este valor conservador por defecto funciona en todo el rango de voltaje, pero deja el rendimiento en la mesa. Para funcionamiento a 5 V, reconfigurar los fusibles para que el oscilador interno funcione a 8 MHz completos es sencillo y no requiere componentes externos.
Cuando necesitas un tiempo preciso - por ejemplo, para un UART a velocidades estándar de baudios o un contador de frecuencia - la calibración interna de fábrica del oscilador al ±10% no es lo suficientemente precisa. Un cristal externo de 16 MHz o 20 MHz mejora la precisión hasta ±50 ppm, pero añade dos condensadores y ocupa PB3/PB4. Ese intercambio merece la pena para aplicaciones que requieren mucha comunicación, pero es doloroso si ya tienes limitaciones de pins.
La detección de apagón (BOD) impide que la CPU ejecute instrucciones inválidas cuando el voltaje de alimentación disminuye. Habilitar la DBO a 2,7 V o 4,3 V añade aproximadamente 20-25 μA a la corriente de reposo. Para diseños de baterías orientados a la suspensión submicroamper, puede que necesites desactivar el BOD y manejar condiciones de bajo voltaje en el firmware, aceptando el riesgo de fallos ocasionales durante el apagado.
Características GPIO y límites de carga
Cada pin GPIO puede obtener o absorber hasta un máximo absoluto de 40 mA según la hoja técnica de Microchip, pero eso es un límite destructivo, no una especificación operativa. La corriente continua recomendada por pin es de 20 mA, y la corriente total en todos los pines debería mantenerse por debajo de 200 mA para evitar el riesgo interno de rebote a tierra y de bloqueo.
Alimentar un LED directamente desde una GPIO es común en proyectos de hobby, pero el voltaje y la corriente directa requieren una consideración cuidadosa. Un LED rojo estándar con una caída directa de 2 V a 20 mA en una fuente de 5 V necesita un mínimo de 150 Ω de resistencia. He depurado placas donde alguien usó 47 Ω "porque el LED estaba demasiado tenue" - funcionó unas horas, luego la GPIO falló de forma permanente.
Para cargas superiores a 20 mA - motores, relés, solenoides o incluso LEDs de alta potencia - utiliza un MOSFET o BJT externo. Un MOSFET de canal N 2N7002 cuesta una miseria y conmuta cientos de miliamperios limpiamente con una resistencia de puerta de 10 kΩ. Intentar poner en paralelo pines GPIO para aumentar la capacidad de corriente no funciona de forma fiable; pequeñas diferencias en la impedancia de los pases causan un reparto desigual de corriente y posibles daños.
Operación del ADC y gestión de ruido
El ADC de 10 bits convierte 0-VCC (o una referencia interna de 1,1 V o 2,56 V) en valores de 0 a 1023. La resolución es de 10 bits, pero el número efectivo de bits (ENOB) en un entorno ruidoso puede bajar a 8 o incluso 7 bits si no se aborda el ruido de la fuente de alimentación.
Tres cosas mejoran la estabilidad del ADC en mi experiencia:
- Condensadores de desacoplamiento cerca del chip. Un cerámico de 100 nF y un electrolítico de 10 μF en paralelo, situados a menos de 5 mm de los pines VCC y GND, cortan el ruido de conmutación de alta frecuencia.
- Modo de suspensión con reducción de ruido ADC. Detener la CPU durante la conversión elimina el ruido de conmutación digital dentro del chip. La diferencia es medible: he visto que el nivel de ruido de fondo baja de ±8 LSB a ±2 LSB solo activando este modo.
- Toma de tierra o estrella analógica separada. Si el ADC comparte un camino de retorno con cargas impulsadas por PWM, la corriente de tierra del PWM inyecta ruido en las mediciones del ADC. Pasar una traza de tierra dedicada de vuelta a la fuente de alimentación para la referencia del ADC mejora notablemente los resultados.
El ADC también soporta modo de entrada diferencial con ganancia opcional (1×, 8×, 20×, 32×) en ciertos pares de pines. Esto rara vez se documenta en tutoriales, pero funciona bien para señales diferenciales pequeñas como puentes termopar o galga extensiométrica. La ganancia tiene el coste de reducir el rango de entrada y aumentar el error de desplazamiento, por lo que la calibración se vuelve crítica.
Comunicación Serial vía USI
La Interfaz Universal Serial (USI) es un bloque de hardware mínimo que ayuda con los protocolos seriales, pero deja la mayor parte del trabajo al firmware. Incluye un registro de desplazamiento, un contador y generación básica de reloj, suficiente para hacer bit-bang en I²C o SPI a velocidades bajas o moderadas.
Cuando USI funciona bien:
- Comunicarse con un único sensor I²C a 100 kHz.
- Pilotar una pantalla SPI o DAC donde el ATtiny85 es siempre el maestro.
- Prototipado o diseños de bajo volumen donde la complejidad del firmware sea aceptable.
Cuando la USI se convierte en un problema:
- Escenarios multi-maestro I²C o estiramiento de reloj; la USI no se encarga de esto automáticamente.
- SPI de alta velocidad por encima de 1 MHz; El tiempo se complica sin hardware dedicado.
- Aplicaciones donde también necesitas UART - no hay hardware UART, así que también lo vas a hacer un bit-bang, consumiendo ciclos de CPU y complicando el tiempo.
He usado con éxito bibliotecas I²C basadas en USI como TinyWireM con sensores como el BMP280 y SSD1306 OLED. Pero también he pasado horas depurando un caso en el que un dispositivo I²C mantenía SCL bajo (estiramiento del reloj), y la biblioteca no lo detectó, lo que provocó que el firmware se bloqueara. La lección: prueba el código USI con tus periféricos reales desde el principio, no en el banco con condiciones ideales.
Programando el ATtiny85 con un IDE de Arduino

Programar el ATtiny85 a través del IDE Arduino requiere añadir una definición de placa de terceros, como el ATTinyCore de Spence Konde o el antiguo paquete attiny de David Mellis. Estos núcleos asignan funciones de Arduino como 'digitalWrite()' y 'analogRead()' al hardware ATtiny85.
Cableado para la programación del ISP:
| PIN ATtiny85 | Señal de Programador ISP |
|---|---|
| 1 (REINICIAR) | REINICIO |
| 5 (PB0) | MOSI |
| 6 (PB1) | MISO |
| 7 (PB2) | SCK |
| 8 (VCC) | +5V (o tensión objetivo) |
| 4 (GND) | GND |
Puedes usar un proveedor de internet USBtiny, USBasp o cualquier placa Arduino configurada como "Arduino como ISP". Si usas un Arduino como proveedor de internet, coloca un condensador de 10 μF entre RESET y GND en el Arduino para evitar que se reinicie durante la subida.
La configuración de la placa importa:
- Seleccionar la velocidad de reloj correcta (1 MHz, 8 MHz interno o 16 MHz externo).
- Elige "Grabar el cargador de arranque" una vez para escribir la configuración del fusible - este paso no instala un cargador de arranque (el ATtiny85 no lo usa), pero configura los fusibles para que coincidan con el reloj seleccionado.
- Después de configurar fusibles, sube bocetos mediante "Sketch > Upload Using Programmer" o establece el programador como predeterminado en las preferencias.
Los números PIN de Arduino no coinciden directamente con los pines físicos. Por ejemplo, el pin digital 0 de Arduino corresponde a PB0 (pin físico 5), y el pin digital 2 de Arduino es PB2 (pin físico 7). Consulta la documentación del núcleo o el diagrama de pines antes de cablear.
Circuito mínimo de funcionamiento

Un circuito mínimo necesita solo:
- VCC (pin 8) conectado a una fuente de 3,3 V o 5 V.
- GND (pin 4) conectado a tierra.
- Un condensador cerámico de 100 nF entre VCC y GND, situado cerca del CI.
- Opcionalmente, una resistencia pull-up de 10 kΩ en RESET (pin 1) si tu alimentación es ruidosa, aunque normalmente basta con la pull-up interna.
Un LED con una resistencia limitadora de corriente (220-470 Ω para 5 V, 150 Ω mínimo para 3,3 V) conectado a PB0 (pin 5) proporciona retroalimentación visual. El oscilador RC interno de 8 MHz funciona por defecto, por lo que no se requiere cristal externo.
Esta configuración funciona de forma fiable para pruebas de parpadeo, experimentos con PWM y desarrollo inicial de firmware. Para aplicaciones de producción o sensibles al ruido, añadir un condensador a granel de 10 μF en paralelo con la cerámica de 100 nF para manejar demandas de corriente transitoria.
Problemas comunes y soluciones prácticas
| Problema | Causa raíz | Solución |
|---|---|---|
| Falla la subida del ISP por "desajuste de firma de dispositivo" | Chip incorrecto seleccionado en IDE, o fusibles configurados en reloj externo sin cristal presente | Verificar la selección del consejo; si los fusibles están mal, conecta una señal de reloj externa a PB3 o usa HVPP para recuperar |
| Las lecturas del ADC se desvían o saltan aleatoriamente | Ruido de la fuente de alimentación, ausencia de condensador de desacoplamiento o mala puesta a tierra | Añadir 100 nF + 10 μF de desacoplamiento cerca de VCC/GND; activar el modo de reducción de ruido ADC; Caminos terrestres analógicos y digitales separados |
| La comunicación I²C/SPI falla intermitentemente | Sincronización incorrecta de USI, desajuste de velocidad de reloj o dominadas externas ausentes (I²C) | Comprobar dos veces la selección de reloj y los ajustes del fusible; añadir dominadas de 4,7 kΩ a SDA/SCL para I²C; reducir la velocidad del bus en firmware |
| El pin GPIO deja de responder después de funcionar durante horas | Paso accionado más allá del límite de corriente, o expuesto a picos de tensión | Comprobar los valores de las resistencias LED; amortiguar cargas de alta corriente con MOSFET; añadir protección contra transitorios (diodo o televisor) si el pin se conecta a cables externos |
| El código se ejecuta a una velocidad incorrecta o el tiempo está desajustado | Los ajustes del fusible de reloj no coinciden con la selección de la placa IDE de Arduino | Quema el cargador de arranque (configura fusibles) tras cambiar la configuración de reloj; verificar la frecuencia real del reloj con un osciloscopio o analizador lógico |
Cuando el fusible RESET se desactiva accidentalmente:
Si configuras el fusible RSTDISBL y pierdes el acceso del ISP, los programadores estándar no funcionan. Necesitas un programador paralelo de alto voltaje (HVPP) como el AVR Dragon (descatalogado pero disponible de segunda mano) o diseños de código abierto basados en Arduino. Esto aplica 12 V al pin RESET mientras mantiene pines específicos en estados definidos, lo que fuerza al chip a entrar en modo de programación independientemente de la configuración del fusible. Es recuperable, pero molesto y lleva mucho tiempo.
Cuándo usar el ATtiny85 (y cuándo no hacerlo)
Buen ajuste:
- Tareas de control sencillas: drivers LED, lectores de sensores, pequeñas pantallas.
- Diseños con restricciones de espacio donde un paquete de 8 pines ahorra área en la placa.
- Aplicaciones alimentadas por batería que aprovechan modos de suspensión (hasta ~0,1 μA en apagado y watchdog apagado).
- Diseños sensibles al coste donde cada céntimo por unidad importa en volumen.
Mal ajuste:
- Aplicaciones que requieren múltiples periféricos seriales simultáneamente (UART + SPI + I²C): la complejidad del firmware explota.
- Comunicación de alta velocidad o requisitos de temporización ajustados - limitados por USI y ejecución de un solo hilo.
- Proyectos donde la velocidad de desarrollo importa más que el coste; pasar a un ATmega328P o STM32 te da hardware UART, SPI, I²C y menos quebraderos de cabeza.
He usado el ATtiny85 con éxito en controladores de iluminación LED, monitores de batería y receptores de mandos IR. Pero también lo abandoné a mitad del proyecto cuando los requisitos se ampliaron para incluir un puerto de depuración UART y el logging flash SPI - cosas que son triviales en un chip más grande pero dolorosas en el ATtiny85.
Conclusión
El ATtiny85 sigue siendo relevante para diseños donde el tamaño, el coste y la potencia son las limitaciones principales y la funcionalidad se mantiene dentro de sus límites bien definidos. Sus seis pines GPIO con funciones compartidas requieren una asignación cuidadosa de pines, y la USI impulsada por software exige más esfuerzo de firmware que los periféricos de hardware. El rendimiento del ADC depende mucho del diseño de la fuente de alimentación, y los límites de corriente en GPIO son reales: si los superas, los pines fallan permanentemente.
Comprender la configuración del fusible, los compromisos de los pines de RESET y los flujos de trabajo de programación del ISP antes de comprometerse con un diseño evita sorpresas costosas en etapas avanzadas. Para la aplicación adecuada, el ATtiny85 ofrece un control fiable en una huella mínima. Para algo más complejo, evalúa si la carga del firmware y las limitaciones de hardware superan el ahorro de costes.