Estou tentando criar um atraso de tempo com o Arduino. Eu gostaria de usar a função interrupts (), porque é uma interrupção interna.
Exemplo: digamos, eu gostaria de acender e apagar uma luz, apenas com o tempo da interrupção.
Há um código de amostra, mas ele usa interrupções externas (attachInterrupt ()). Eu gostaria de continuar usando as interrupções internas.
arduino
microcontroller
interrupts
Aleatório
fonte
fonte
Respostas:
O blog de Noah Stahl tem um exemplo de piscar de um LED com o Timer2 . Com isso e a planilha de dados, você poderá adaptá-lo à interrupção que desejar usar - ou seja, a interrupção cuja função normal você mais pode desistir ou deseja modificar. Timer2 é geralmente usado para algumas funções PWM.
Seu exemplo cita o ATmega2560; Posso confirmar que ele funciona com um ATmega328p também. Veja em seu site exemplos mais úteis de interrupção do Arduino.
Editar:
Aqui está minha versão levemente editada - principalmente nos comentários - do código de Noé. Chame Timer2init () da função setup do Arduino () depois de inicializar qualquer estrutura de dados ou hardware relacionado, porque o tempo - e a interrupção - começarão assim que você o fizer.
F / ex, usei-o para multiplexar uma tela de 3 dígitos e 7 segmentos, então, antes de inicializar o timer, inicializei os registros de E / S da tela e apaguei os dados da tela no local em que o ISR a procuraria.
Há uma tabela nos comentários de alguns dados úteis de tempo da folha de dados e meus próprios cálculos de referência para configurar outro esquema de tempo.
A macro ISR () cuida da criação de código de entrada e saída de interrupção para um ISR, em vez da entrada e saída de uma função normal, e de vinculá-lo ao vetor de interrupção apropriado. O restante dessa função é 1) o código a ser executado a cada interrupção e 2) o código de código para redefinir o timer para a próxima interrupção.
Conforme escrito, isso deve aparecer em um esboço .pde ou .ino (ou em um arquivo .cpp, se você usar eclipse, f / ex). O esboço precisa # definir LEDPIN, e setup () precisa chamar Timer2init (). A função loop pode estar vazia ou não; o LED deve começar a piscar no download (bem, literalmente, depois que Timer2init () for chamado).
fonte
A função attachInterrupt () na verdade está anexando uma interrupção a uma alteração de estado externa em um pino, não possui outras opções.
Na mesma página, as opções de modo estão listadas como:
Desculpe ser o portador de más notícias, essa é uma das primeiras coisas que procurei também.
fonte
Este artigo sobre PWM esclarecerá muitas dúvidas sobre o uso de temporizadores do Arduino. Existem dois temporizadores de 8 bits e um temporizador de 16 bits no Arduino. Não existe uma API de alto nível para conectar a função ISR diretamente aos timers, que é fornecida com o Arduino SDK (ou seja, como uma biblioteca padrão), mas um método de nível um pouco inferior para definir Registros de Função Especial e bit-aritmética / operações sobre eles. No entanto, existe uma biblioteca contribuída pelo usuário chamada Timer one .
fonte
O Arduino está usando todos os três temporizadores no ATMega328.
Timer1
(16 bits) é usado para funções comodelay()
emillis()
e para a saída de PWM nos pinos 5 e 6. Os outros dois temporizadores -Timer0
eTimer2
são utilizados para a saída de PWM sobre os pinos 3, 9, 10, 11.Portanto, não há função do Arduino para interrupção do timer. Mas, existe um jeito. Você pode usar este código para ativar a interrupção do timer em
Timer2
:Eu escrevi esse código sem testar, por isso é possível que tenha cometido um erro. Nesse caso, verifique a folha de dados, p.156 .
Se você deseja alterar a frequência do temporizador (pré-calibrador), basta alterar o registro
TCCR2A
. Para obter mais informações, consulte a página 153 da folha de dados. Mas se você alterar a frequência do temporizador, também altera a frequência do sinal PWM nos dois pinos de saída!fonte
Timer0
eTimer2
são 8 bits e somenteTimer1
16 bits.