Translate

domingo, 13 de abril de 2014

Entendendo os fuses de AVR - attiny, atmega



Baseado na página http://embedderslife.wordpress.com/2012/08/20/fuse-bits-arent-that-scary/ e http://www.ladyada.net/learn/avr/fuses.html, como o próprio nome diz, não deve ser tão assustador de se entender os bits de fuse dos microcontroladores AVR.

Nem vou traduzir fuse e lock porque não tem esse sentido ao pé da letra. Fuse=fusível é feito para queimar e lock seria travar. A idéia do uso não é esta. Baseado no site acima e em alguma pesquisa para confirmar a veracidade das informações, vai um resumo e algumas considerações e obsevações.


Cada modelo de AVR tem uma configuração diferente. Caso queira uma calculadora online, podemos utilizar  http://www.engbedded.com/fusecalc ou http://eleccelerator.com/fusecalc/fusecalc.php (prefiro o último devido às descrições serem mais detalhadas).


Observe que são bits. Bits que configuram de alguma forma o comportamento o AVR "como acesso à memória, clock e seu divisor, as opções de inicialização, de programação e assim por diante".

AVISO: manipular os bits de fuse e lock incorretamenta podem "bricar" o seu microcontrolador, isto é, eles ficam inacessíveis. Caso aconteça isso, tente seguir algumas medidas destas páginas: http://www.larsen-b.com/Article/260.html e https://sites.google.com/site/wayneholder/attiny-fuse-reset (não testadas). Resumindo, muito cuidado ao manipular pois o simples erro de configurar o clock já pode bricar o AVR.

Outro ponto interessante é que para ativar um item de configuração temos que zerar o bit correspondente (isto é o inverso da lógica aprendida em informática), causando muita confusão.

Os bits de fuse e lock podem variar conforme o modelo dos AVRs. É sempre importante conferir nos datasheets de cada modelo. Abaixo estão alguns exemplos. As observações valem para qualquer modelo.

Lock bits

O ideal é evitar mexer nestes bits. Dizem respeito à bootloader, des/ativação da pinagem, etc. 
lock bits do Attiny25/45/85

lock bits do Atmega328P

LB1 caso seja ativado (zero) desabilita a programação da Flash e EEPROM
LB2 caso seja ativado (zero) desabilita a programação e verificação da Flash e EEPROM

High fuse bits

Os 3 bits abaixo são os mais problemáticos quando alterados sem conhecimento:
RSTDISBL: este bit corresponde ao pino de RESET, liberando para I/O caso esteja ativado. Atenção: a maioria dos programadores de AVR utilizam este pino para fazer o upload do programa; quando ativado poderá impossibilitar a reprogramação.
DWEN: também altera o comportamento do pino de RESET. Ativa o modo DebugWire para este pino, podendo causar os mesmos problemas que em RSTDISBL.
SPIEN: desliga a programação no sistema.

Os bits abaixo afetam o comportamento dos AVRs sem tantos problemas ou bricks.
WDTON: WatchDog timer sempre ligado. Watchdog reinicia o microcontrolador quando detectado algum problema (normalmente quando não passa periodicamente por uma determinada instrução do programa, pois todo programa AVR tem um loop).
BOOTRST: controla se a execução do microcontrolador se inicia pelo programa do Flash ou pela seção de bootloader.
EESAVE: preserva o conteúdo da EEPROM mesmo que executado um Chip Erase (apagamento do chip).


Low fuse bits


CKDIV8: quando zerado causa a divisão do clock por 8; caso o clock interno de 8Mhz esteja selecionado o clock efetivo será de 1Mhz;
CKOUT: permite usar o clock para dispositivos externos quando necessário.
SUT1,0: definem o tempo de startup - inicialização:

Atmega328P tempo de startup 

Attiny25/45/85 tempo de startup 

CKSEL3,2,1: definem a faixa do clock a ser utilizado e quais capacitores de cerâmica a serem utilizados.


CKSEL0: juntamente com SUT1,0 definem o tipo de crystal e tempo de startup

CKSEL0 + SUT1,0 - Attiny25/45/85
(valores para Atmega328P são bem próximos)

Extended fuse bits - também e melhor não alterar

BODLEVEL0, 1, 2: (Brown-out Detect) em alguns modelos podem fazer parte do high fuse bits. São usados para configuração da tensão interna de desligamento do AVR. Caso a tensão caia muito o chip se desligará até a normalização, evitando erros de memória, tempo, etc.
SELFPRGEN: habilitação da programação pelos próximos 4 ciclos de clock. Ele se auto-limpa após esse período.

Dica: sempre que possível, leia os valores dos fuse bits (o AVRDudess consegue), transfira o valor para uma das calculadoras de fuse bits, altere o que for necessário e transfira o valor para o o aplicativo que consiga gravar (o AVRDudess também faz isso)






7 comentários:

  1. Como proteger o mega 250 de copia do firmware? que valor de lock bit usar?

    ResponderExcluir
  2. Respostas
    1. Pesquisei um pouco e o que achei: https://www.hackster.io/rayburne/avr-firmware-duplicator-115d8f
      Duplicador de AVR e até de fuses. Dificilmente você conseguirá proteger muito a sua programação nos AVRs. E eu mesmo já publiquei um circuito de reset de fuses de AVRs, não para a finalidade de duplicar, mas para reset de clock de funcionamento, entre outros. Como dito em http://www.avrfreaks.net/forum/how-protect-data-stored-atmega-against-copies?page=all, talvez seja melhor agregar serviços e benefícios do que se preocupar muito com o firmware em si.

      Excluir
    2. Lock bits: dê uma olhada neste artigo: https://electronics.stackexchange.com/questions/53282/protecting-avr-flash-from-reading-through-isp
      Observo que ser travar a leitura, também travará a reprogramação,pelo que entendi. Procure no datasheet pelos bits LB0 e LB1 e zere-os (conforme calculadora para 2560-http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega2560)

      Excluir
  3. Como fazer o Atmega32 respeitar um cristal de 8Mhz, será que não se deve mudar os fusíveis? Preciso de ajuda. portalicarai@bol.com.br. Edgard Filho

    ResponderExcluir
    Respostas
    1. Pelo que vi no site da Atmel, o clock interno é de 16 Mhz, a não ser que seja o atmega32L, que já é de 8 Mhz. Para precisão, teria que usar um cristal externo. Senão, poderia mexer nos fuses sim, mas se errar, pode nem conseguir mais programar o microcontrolador pois pode fixar um clock estranho, não conseguindo mais sincronizar com o usb-serial. Depois, só reconfigurando com a setagem de fábrica. Aviso, porque aconteceu comigo e tentei todos os baud rates, mas não consegui mais me comunicar com o microcontrolador.

      Excluir