Conhecendo melhor o ATtiny85, ATtiny2313, ATtiny84 e o histórico ATmega8
O minúsculo ATtiny85 tem primos com mais pinos e recursos comparáveis (ou não) – e aproveitamos para inspecionar o ATmega8, do primeiro Arduino.
O ATtiny85 é popular como microcontrolador alternativo para projetos no estilo do Arduino, porque oferece boa parte dos recursos dos microcontroladores dos próprios Arduinos, em um tamanho pequeno e com pinos limitados que estimulam os projetos minimalistas, e justificam diversos aprendizados motivados pela escassez de recursos.
Ele é aquele chip com 8 terminais, na placa da direita da imagem acima. O chip da placa da esquerda, com 20 terminais, é um ATtiny2313, bem maior mas com bem menos recursos que o seu primo. Entre eles existe uma alternativa interessante: o ATtiny84, com mais pinos que o ATtiny85 (e menos do que o ATtiny2313), mas sem abrir mão dos recursos.
Todos os 3 mencionados acima podem ser programados usando a IDE do Arduino. E já que falamos no Arduino, e eu tinha um ATmega8 à mão, incluí na lista dos microcontroladores que iremos analisar hoje também este, que foi o adotado nas versões iniciais do Arduino, na metade da década passada.
Conhecendo o ATtiny85
Para falar dos outros 2 ATtinys, adotarei como referência o ATtiny85, microcontrolador com 8 pinos físicos que, apesar do pequeno tamanho, tem recursos bem interessantes: pinos digitais, entradas analógicas, suporte a PWM, 8KBytes de flash para armazenar programas, e mais.
O ATtiny85 é popular como alternativa para projetos feitos com a IDE do Arduino. Existem até placas de desenvolvimento compatíveis com o Arduino feitas com ele (como o Digispark). Eu já descrevi como programá-lo usando a IDE do Arduino, e até como desenvolver um shield para facilitar essa programação.
Para desenvolver no ATtiny85 projetos baseados no Arduino, convém identificar as principais diferenças entre ele e o ATmega328, que é o microcontrolador dos Arduinos mais populares:
ATtiny85 | ATmega328 | |
Pinos físicos | 8 | 28 |
Clock interno | 1 a 8 MHz | 1 a 8 MHz |
Clock externo máximo | 20 MHz | 20 MHz |
Flash (kB) | 8 | 32 |
SRAM (bytes) | 512 | 2048 |
EEPROM (bytes) | 512 | 1024 |
Entradas analógicas (ADC) | 4 | 6 |
Saídas PWM | 2 | 6 |
Portas digitais | 6 | 23 |
UART (“serial por hardware”) | não | sim |
I2C | sim (via USI) | sim |
SPI | sim (via USI) | sim |
Observações sobre a tabela acima:
- As contagens de entradas analógicas e de portas digitais do ATtiny85 consideram que o pino RESET tenha sido desativado. Se ele estiver com sua funcionalidade ativa — o que normalmente é o ideal durante o desenvolvimento e testes —, ambas as contagens devem ser subtraídas em 1 unidade.
- O ATtiny85 não tem serial (UART) em hardware, mas pode ter funcionalidade de serial normal, mas esse suporte é por software, usando a biblioteca SoftwareSerial.
Também para usar como referência, o nosso já tradicional sketch de identificação traz as seguintes informações sobre um ATtiny85 que estava aqui na bancada:
Atmega chip detector.
Written by Nick Gammon.
Entered programming mode OK.
Signature = 1E 93 0B
Processor = ATtiny85
Flash memory size = 8192 bytes.
Clock calibration = A6
No bootloader support.
Vale mencionar que, embora a informação sobre não haver suporte a bootloader no ATtiny85 esteja oficialmente correta (e valha para a família ATtiny em geral), faz tempo que a comunidade encontrou maneiras de instalar bootloaders em ATtinys, e isso é essencial para facilitar o funcionamento de placas de desenvolvimento para eles com suporte a USB, como o já mencionado Digispark.
Já o descritor de fuses traz a seguinte listagem:
Atmega fuse calculator.
Written by Nick Gammon.
Entered programming mode OK.
Signature = 0x1E 0x93 0x0B
Processor = ATtiny85
LFuse = 0xE2
HFuse = 0xDF
EFuse = 0xFF
Lock byte = 0xFF
Clock calibration = 0xA6
Self Programming Enable................. [ ]
External Reset Disable.................. [ ]
Debug Wire Enable....................... [ ]
Enable Serial (ICSP) Programming........ [X]
Watchdog Timer Always On................ [ ]
Preserve EEPROM through chip erase...... [ ]
Divide clock by 8....................... [ ]
Clock output............................ [ ]
Start-up time: SUT0: [X] SUT1: [ ] (see datasheet)
Clock source: calibrated internal oscillator.
Brownout detection at: disabled.
Usando as informações acima como referência, vamos explorar outros microcontroladores a seguir.
Conhecendo o ATtiny2313
Acima (e também no artigo anterior) eu fiz uma leitura de configuração do diminuto (para os padrões DIP, ao menos) ATtiny85, de 8 pinos – e agora vou explorar as leituras de um primo maior dele: o ATtiny2313.
O ATtiny2313 é fisicamente bem maior: ele tem 20 pinos físicos, dos quais até 18 podem estar disponíveis como pinos de entrada e saída digital (o ATtiny2313 não tem entrada analógica), e 4 oferecem PWM.
A pinagem é parecida com a do ATtiny85: o Reset, GND e VCC estão nos mesmos quadrantes físicos, e o trio de pinos da comunicação SPI (SCK, MISO, MOSI) está igualmente colado no pino VCC.
Assim como ocorre com o ATtiny85 (cuja programação eu descrevi em um artigo anterior), existe suporte para programar o ATtiny2313 usando a IDE do Arduino.
Mas hoje não vamos programá-lo, e sim explorar sua configuração. Começando pela leitura de identificação básica:
Atmega chip detector.
Written by Nick Gammon.
Version 1.13
Entered programming mode OK.
Signature = 1E 91 0A
Processor = ATtiny2313A
Flash memory size = 2048 bytes.
Lock byte = FF
Clock calibration = 4D
No bootloader support.
O detalhe mais interessante da listagem acima, para mim, é um elemento essencial para comparar o ATtiny2313 com o ATtiny85: embora seja fisicamente muito maior, o ATtiny2313 tem meros 2K de memória flash (para armazenamento de programas), 1/4 do oferecido pelo ATtiny85.
Vamos agora aos fuses:
Atmega fuse calculator.
Written by Nick Gammon.
Entered programming mode OK.
LFuse = 0x64
HFuse = 0xDF
EFuse = 0xFF
Lock byte = 0xFF
Clock calibration = 0x4D
Self Programming Enable................. [ ]
Debug Wire Enable....................... [ ]
Preserve EEPROM through chip erase...... [ ]
Enable Serial (ICSP) Programming........ [X]
Watchdog Timer Always On................ [ ]
External Reset Disable.................. [ ]
Divide clock by 8....................... [X]
Clock output............................ [ ]
Start-up time: SUT0: [X] SUT1: [ ] (see datasheet)
Clock source: low-frequency crystal.
Brownout detection at: disabled.
Nada de inédito aqui: os fuses são os mesmos que apareceram na listagem do ATtiny85, embora estejam em outra ordem e com valores diferentes. Chamou minha atenção que este ATtiny2313 estava configurado para usar clock externo.
Conhecendo o ATtiny84
Já vimos que o ATtiny2313 é bem maior que o ATtiny85, mas também é bem mais limitado quanto aos recursos: tem só 1/4 da capacidade de armazenar programas, e não tem pinos de entrada analógica, por exemplo.
O ATtiny84, lançado 3 anos depois do ATtiny85, traz um ponto de equilíbrio diferente. Ele também é maior (14 pinos físicos, contra 8 do ATtiny85, e 20 do ATtiny2313), mas não abre mão das funcionalidades (incluindo as entradas analógicas), nem do tamanho da memória flash para armazenar programas.
A pinagem do ATtiny84 é bem diferente da dos seus 2 primos que vimos acima. VCC e GND estão ambos "no alto", RESET está no meio, e o trio de pinos da comunicação SPI está separado.
Quanto ao restante, as suas similaridades com o ATtiny85 são muito maiores do que suas diferenças ;-)
Conhecendo o ATmega8
O ATmega8 foi muito importante para a história do Arduino, tendo sido o microcontrolador central dos seus modelos originais, incluindo o protótipo inaugural, em 2005.
Veja acima um modelo histórico do Arduino, com o ATmega8, e ainda com entrada serial pré-USB e um pino de 9V, entre outras diferenças em relação aos modelos de hoje.
A sua pinagem é praticamente idêntica à de seus sucessores ATmega168 e ATmega328, usados nos Arduinos posteriores.
ATmega8A | ATmega168P | ATmega328P | |
Bootloader | Sim | Sim | Sim |
Flash | 8192 | 16384 | 32768 |
SRAM | 1024 | 1024 | 2048 |
EEPROM | 512 | 512 | 1024 |
Clock máximo (MHz) | 16 | 20 | 20 |
Interrup. externas | 2 | 24 | 24 |
picoPower | Não | Sim | Sim |
Vcc | 2,7 a 5,5 | 1,8 a 5,5 | 1,8 a 5,5 |
Comparador In | 1 | 1 | 1 |
Comparador Out | 3 | 6 | 6 |
PWM | 3 | 6 | 6 |
Sua arquitetura interna também é bastante similar, embora você possa conferir na tabela acima as suas limitações: ele tem menos memória (flash, SRAM e EEPROM), menor limite de clock, menos interrupções externas, menor amplitude de tensão e menor quantidade de pinos PWM que os seus sucessores.
Para completar, hoje em dia ele é mais caro, embora existam muitos deles perdidos pelas gavetas das bancadas pelo mundo, e ainda sendo incluídos em projetos de hobby.
Eis o que o descritor de configuração de microcontroladores do nosso artigo anterior tem a dizer sobre um ATmega8A que estava à mão aqui na bancada:
Atmega chip detector.
Written by Nick Gammon.
Version 1.13
Entered programming mode OK.
Signature = 1E 93 07
Processor = ATmega8A
Flash memory size = 8192 bytes.
Lock byte = FF
Clock calibration = B3
Bootloader in use: No
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 2048 bytes starting at 1800
No bootloader (all 0xFF)
Nada de muito especial: o modelo foi reconhecido, e está com o bootloader desativado. Essa é a configuração original, de fábrica.
Vamos agora ao descritor de fuses, também o mesmo do artigo anterior:
Atmega fuse calculator.
Written by Nick Gammon.
Entered programming mode OK.
Signature = 0x1E 0x93 0x07
Processor = ATmega8A
LFuse = 0xE1
HFuse = 0xD9
EFuse = 0xFF
Lock byte = 0xFF
Clock calibration = 0xB3
External Reset Disable.................. [ ]
Watchdog Timer Always On................ [ ]
Self Programming Enable................. [X]
Oscillator Options...................... [ ]
Preserve EEPROM through chip erase...... [ ]
Boot into bootloader.................... [ ]
Brown out detector level................ [ ]
Brown out detector enable............... [ ]
Bootloader size: 2048 bytes.
Start-up time: SUT0: [X] SUT1: [ ] (see datasheet)
Clock source: calibrated internal oscillator.
Aqui encontrei algumas diferenças entre os fuses do ATmega8 e os que eu havia encontrado quando observei a configuração de seu sucessor ATmega32: no ATmega8 estão listados fuses referentes a opções do oscilador (para escolher entre faixas de operação para o clock) e ao detector de baixa tensão (brown-out).
Outra observação interessante exemplifica um fator importante da configuração default desses microcontroladores: eles saem de fábrica configurados para dispensar clock externo, funcionando com seu próprio oscilador.
Tudo que escrevi acima é referente ao ATmega8A, variante atualizada do ATmega8 original. Comparado com o ATmega8, o ATmega8A consome 45% menos corrente (em modo ativo) quando opera a 5V, além de incluir algumas outras diferenças referentes principalmente a tensões de operação.
Comentar