Translate

segunda-feira, 14 de abril de 2014

Acertando o Atmega8-16PU para testes com o USBAsp


    Tive um pequeno problema ao programar o Atmega8 somente tendo o protoboard e o USBAsp. A dica é ligar um crystal de 16Mhz e dois capacitores cerâmicos de 22 pF como no esquema do Minimal Shrimp.
    Depois basta ligar o USBAsp nos pino 17 a 20, 22 e 1, conforme  http://webappfreelancer.blogspot.com.br/2013/06/bootloader-no-arduino-minimal-shrimp.html. jumpeia-se somente os pinos 7 com 20 e 22 com 8. O restante dos componentes são dispensáveis. 


    Acertamos os fuses para 8MHz internos (os meus fuses ficaram com L:0xE4 e H:0xD9. 
    Pode se retirar os capacitores e o crystal. 
    Agora o circuito com o Atmega8 funciona praticamente sem qualquer componente extra a 8Mhz.
    Lembre-se que a precisão não é tão boa quanto quando utilizamos um crystal externo, além dos ciclos serem mais demorados. Mas vários projetos que não demandam muita velocidade podem ser utilizados dessa maneira.
    Planejo utilizar para manipular um controle remoto com IR, que deve ser meu próximo projeto.

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)