quarta-feira, julho 13, 2011

Microcontrolador Atmel ATmega328 - Parte 4

Todo código a ser executado pelo ATmega328 precisa residir na memória Flash. Embora o usuário casual do Arduino não perceba, esta memória possui diversas excentricidades, que veremos neste post.

As Memórias Flash

De uma forma geral, as memórias do tipo Flash se caracterizam por não necessitarem de alimentação para manter seu conteúdo (são não voláteis) e permitirem a sua alteração ocasional.

A leitura da memória Flash não costuma envolver cuidados especiais (porém ela é mais lenta que a memória Ram). A operação de escrita é um pouco mais complexa e permite apenas mudar bits do estado '1' para o estado '0'. Para retornar os bits em '0' para '1' é necessária uma operação de apagamento, que é lenta e tipicamente afeta muitas posições de memória.

O número de escritas/apagamentos é limitado; a Atmel garante um mínimo de 10000 operações no ATmega328.

Usando Dados na Flash do ATmega328

Como dito no início, o ATMega328 só é capaz de executar instruções que estejam na Flash (consequência da sua arquitetura Harvard). Nada impede, é claro, de colocar bytes arbitrários na Flash. Entretanto, usar estes dados requer um procedimento especial. Afinal, na arquitetura Harvard, as vias de endereços e dados são separadas para Ram e Flash. No primeiros microcontroladores PIC, por exemplo, era impossível acessar diretamente o conteúdo da Flash; constante tinham que ser geradas executando código.

Felizmente o ATmega328 (e outros microcontroladores da família AVR) possuem a instrução LPM (Load Program Memory). Esta instrução copia o byte da Flash apontado pelo registrador Z para um registrador de uso geral (de onde pode ser escrito na Ram se necessário) e, opcionalmente, incrementa Z para apontar para a posição seguinte.

Gravando a Flash

Como colocar um programa inicialmente na Flash do ATmega328? Existem três maneiras básicas:
  • Programador paralelo externo: esta opção requer colocar +12V no pino de reset e fazer um "sapateado" complexo em vários outros pinos. É, portanto, mais adequado para a programação fora do circuito.
  • Programador serial (SPI) externo: esta opção não requer tensões especiais e utiliza apenas três pinos (além do reset), sendo viável de ser usada sem retirar o ATmega328 do circuito.
  • Programação por software: através de instruções especiais é possível o firmware regravar a Flash.
Em todos os casos muitos cuidados especiais precisam ser tomados.

Além de programar a Flash, estes procedimentos permitem programar também a EEProm, alguns bytes especiais de configuração (chamados de fuse - fusíveis) e os bits de Lock que permitem travar a leitura e reprogramação da Flash. Uma vez travada a reprogramação, a única opção é fazer um apagamento total, que limpa toda a memória e os fusíveis.

Não está nos meus planos brincar com o programador paralelo. Já com o serial pretendo testar três opções "faça você mesmo": usando um Arduino, usando um adaptador ligado à porta paralela do PC e montando um programador que se conecta a uma porta USB do PC.

Vou começar, porém, investigando um pouco a programação por software, examinando o Bootloader do Arduino a partir do próximo post.

Nenhum comentário: