Como configurar os fusíveis de velocidade do relógio em um ATtiny85 ao usar um Arduino como programador?

17

Estou seguindo este tutorial , programando o ATtiny85 com um Arduino, usando-o para tocar alguns tons (através de um alto-falante piezo). Estou tendo dificuldades para obter os tons no tom certo (estou criando as formas de onda manualmente, pois a função tone () não é suportada no ATtiny85).

Acredito que o problema pode estar relacionado a diferentes velocidades de clock no Arduino e no ATtiny. Entendo que a velocidade do relógio pode ser alterada no ATtiny, como faço isso usando o ambiente do arduino?

medo
fonte
a propósito, isso é muito legal, obrigado por compartilhar!
vicatcu
Tiremos o chapéu! Nunca consegui programar meu attiny85 dessa maneira. Sempre tenho erros de "programador fora de sincronia" quando o avrdude tenta gravar o flash. Trocar o arduino com um pirata de ônibus funciona ...
JonathanD
@ Jon: Não tenho certeza da causa raiz do "programador fora de sincronia", mas com o AVR Studio você pode ajustar a frequência de programação. Pode haver uma opção semelhante no avrdude, vale a pena dar uma olhada se você voltar a tentar novamente #
Nick T

Respostas:

2

Acredito que o software Arduino (bibliotecas e tudo) pressupõe que você esteja operando em 16MHz. Se você aplicar essa suposição ao relógio em que está realmente executando ... as coisas devem dar certo. Supondo que você esteja executando o Tiny85 em seu oscilador interno, acho que ele roda a 1 MHz, então multiplique todas as suas declarações de atraso (e outras noções de tempo) por 16.

Se você precisar de uma precisão melhor do que o oscilador interno fornece, pense em usar um cristal externo ou um ressonador, mas precisará alterar as configurações de fusíveis do AVR para que funcionem, e acho que você precisará de um programador como o AVRISP mkII para fazer isso com o AVR Studio (minha recomendação).

Eu não sei muito sobre o esboço do ArduinoISP, mas para mim parece um pouco complicado o protocolo ISP carregar um programa no chip de destino (não no Mega328 integrado), não tenho certeza de que ele esteja equipado para manipular fusíveis. O ArduinoISP está documentado aqui http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Observe que você não pode usar um UNO atualmente para executar o esboço do ArduinoISP. Não me parece que você possa usar o esboço para tornar o Arduino uma interface viável para usar as ferramentas da GUI do AVR Studio.

EDIT : Parece que as coisas foram atualizadas e uma UNO é viável para o ArduinoISP agora - obrigado pelos comentários

vicatcu
fonte
Obrigado pelas informações sobre a UNO, na verdade, estou usando um Duemilanove com o chip 168 trocado por um 328 e posso obter os esboços ATtiny normais para carregar corretamente via ArduinoISP. Vou tentar sua dica / 16!
Fearoffours
@fearoffours Você sabe que outra coisa que você pode tentar é escrever um esboço baseado no ArduinoISP que defina os fusíveis para um determinado valor. Se o ArduinoISP puder escrever o Flash, não há motivo para pensar que você não tenha conseguido modificar o protocolo ISP descrito nas folhas de dados do AVR para definir os fusíveis.
vicatcu
1
@fearoffours, também eu só percebi (e atualização post) para dizer multiplicar por 16 em vez de dividir por 16 (o seu executando um relógio mais lento vai demorar mais carrapatos para obter a mesma duração)
vicatcu
Sei que já faz mais de um ano, mas uso com sucesso o UNO como programador AVR. (No entanto, eu fiz alterar o esboço ArduinoISP para delay(20)insted de delay(40)na sua definição de void heartbeat().)
JellicleCat
Sei que é ainda mais tarde, mas usei com sucesso o meu Uno como programador AVR sem alterar nada no esboço.
ingh.am
4

Estou usando o Arduino UNO + ArduinoISP com êxito.

Adicione -Usinalizadores ao seu avrdudecomando para definir um ou todos os três fusíveis ATtiny.

avrdude -p attiny85 -P com8 -c stk500v1 -b 19200 -U lfuse:w:0x6f:m -U flash:w:main.hex

A seleção do relógio é feita em bits [3: 0] no terceiro fusível ('Fuse Low Byte'). Defina-os da seguinte forma para fazer uso de um cristal externo (de 8 MHz ou mais rápido):

-U lfuse:w:0x6f:m

Sua definição (eu deduzo) deve ser algo como: [Fuse Low Byte]: [write]: [hex value]: [set manualmente]

O valor padrão para os quatro bits altos desse byte é 0110, então deixe o 6in 0x6fcomo está e altere apenas o segundo dígito, o f(seu valor padrão é 2).

NB: Se os seus processos demoram mais ou menos do que o esperado, verifique o prescaler relógio e sua definição de F _ CPU.

JellicleCat
fonte
Eu queria advertir que acabei de bloquear meu AtTiny85 usando a -U lfuse:w:0x6f:mopção avrdude acima . Vou precisar redefini-lo usando uma configuração de alta tensão. Portanto, uma palavra de cautela para as pessoas (como eu) que estão tentando redefinir os fusíveis sem saber o que estão fazendo.
MV
@MV Você realmente o transformou ou simplesmente não usou o XO externo ao tentar redefinir o fusível?
DAMD
Não tinha relógio externo para usar. O que significa bricking em um sentido mais rigoroso?
JellicleCat
@JellicleCat, Se você definir o fusível para usar um XO externo, precisará usar um XO externo conectado ao mcu a partir de então para programar / configurar / redefinir os fusíveis. Caso contrário, você terá a impressão de que o mcu está emparedado (~ não está mais funcionando) porque precisa do ext. XO para funcionar, mesmo para programá-lo através do ISP.
DAMD
Bem. Se eu entendi o problema, configurei os fusíveis para esperar um XO e, para restaurar o chip, usei um Arduino para fornecer uma onda estacionária, que servia para um XO.
JellicleCat
3

Tente usar o tutorial relacionado do mesmo grupo (High-Low Tech) do MIT, intitulado Programming an ATtiny w / Arduino 1.0 .

Um resumo rápido: no menu Ferramentas-> Placa no IDE do Arduino, selecione o ATtiny85 e a frequência que você deseja executar (relógio interno de 1 ou 8 Mhz ou cristal externo de 20Mhz) e use o menu Ferramentas -> Gravar carregador de inicialização " Eu acredito que a seleção da placa de velocidade desejada modifica a maneira como o delay () e outras funções do Arduino relacionadas ao tempo funcionam para sincronizar com a velocidade do relógio.

Eu mesmo tive sucesso com essa abordagem usando alguns chips ATtiny84. O programa simples de piscar é fixo, bem como o tempo mais sensível necessário para controlar manualmente os pulsos enviados para um servo usando delayMicroseconds ().

Tom B
fonte
1

Parece que você está usando o ArduinoISP, tente usar o AVR Studio ou as opções de linha de comando para avrdude. Dependendo de como o ArduinoISP foi escrito, ele pode funcionar como um Atmel AVRISP mkII ou similar.

Nick T
fonte
Eu não acho que o Arduino fosse ele próprio um programador de ISP - eu pensei que ele tinha um cabeçalho de ISP nele, para que você pudesse gravar um novo gerenciador de inicialização em um novo ATMega328 em circuito ...
vicatcu
lendo o artigo mais de perto, parece que você pode usar o esboço do ArduinoISP para fazer isso - você aprende algo novo todos os dias! :)
vicatcu
O AVR studio está bom se você estiver no Windows. Saiba que existe um plug-in AVR para Eclipse (isso é diferente do plug-in do Arduino, conhecido como Sloeber). Há um diálogo de fusível bacana disponível em Propriedades -> AVR. Mas sim, o OP só quer usar as frequências "core" e "Burn Bootloader".
mckenzm
1

As configurações padrão de fusível para o ATtiny85 são: lfuse 0x62, hfuse 0xdf, efuse 0xff. Isso usa o oscilador RC (8 MHz) interno com "dividir por 8", portanto o relógio é de 1 MHz.

Consulte http://www.engbedded.com/fusecalc para obter mais configurações de fusível.

Você ainda pode usar o avrdude diretamente para alterar as configurações de fusível do seu ATtiny85, mesmo quando usar um ArduinoISP como programador.

Se você acabar trocando manualmente o fusível para alterar o relógio, edite a attiny85.build.f_cpulinha do seu arquivo [arduino_folder] \ hardware \ attiny45_85 \ boards.txt.

Craig
fonte
+1 este é realmente útil, esp a ser 1MHz velocidade de relógio, graças
fearoffours
0

Acho que você pode definir os fusíveis com o ArduinoISP, mas não com o Arduino IDE, mas com o avrdude, verifique este link . Nunca testei eu mesmo.

O tutorial diz explicitamente que você pode usar o Arduino UNO e eu o testei e funcionou, para que eu possa confirmar isso, para que a página ArduinoISP esteja desatualizada e o aviso da UNO deva ser ignorado. Se o seu UNO foi um do primeiro lote, você provavelmente tem um carregador de inicialização com defeito, precisará atualizar novamente o carregador de inicialização. Verifique esta página para obter mais informações (ignore os números de série, todas as minhas UNOs não eram dessa série e tiveram problemas).

As bibliotecas principais portadas que você baixou do tutorial foram escritas para usar o oscilador interno de 1 MHz (confirmado no arquivo boards.txt), portanto, talvez o problema de temporização possa estar nas bibliotecas principais portadas ou no seu código.

Atenciosamente

Havok
fonte
0
  1. Escolha uma placa ATTiny no "gerenciador de placas" que inclui a ATTiny85. Isso está no menu "Ferramentas". Eu acho que isso inclui "PLL interno de 16 MHz" agora. (Você pode instalar um em http://drazzy.com/package_drazzy.com_index.json )

  2. Selecione ATTiny85 explicitamente, se necessário.

  3. Escolha um relógio. Até você saber mais, escolha um relógio interno .

  4. Clique em "Burn Bootloader" como um item de menu.

Cuidado, talvez você não consiga mais programar o MCU se escolher valores muito baixos. Se essa é sua intenção, faça isso por último, a menos que você tenha peças de reposição ou um programador de alta tensão para reiniciar os fusíveis.

mckenzm
fonte