Ajuste de variável na interrupção - Alguém poderia ajudar

Bom Srs.!

Gostaria de fazer um ajuste manual de uma variável, dentro da interrupção de um arduino nano, pela programação irei me explanar melhor.

Após acionar a interrupção pela entrada 2, o usuário  terá acesso aos ajustes de três variáveis. Caso o usuário não queira fazer nenhum ajuste, ele não pressionará nenhum botão e o próprio sistema sairá da interrupção e retornará para o void loop.

Já no caso realização de ajustes pelo usuário, após terminar o primeiro ajuste, a programação entrará e identificará que nenhum botão está sendo acionado; esta condição acionaria (tipo um "watch dog time") e passaria para o ajuste da próxima  variável, consequentemente, faria o mesmo processo para o segundo ajuste, o usuário realizaria a modificação da variável, aguardaria um determinado tempo para executar o ajuste da terceira e ultima variável. Após realizado o terceiro e ultimo ajuste, a interrupção voltaria para o Void Loop.

Alguém saberia me ajudar?!

Seguem o arquivo em anexo.

 

Exibições: 140

Anexos

Responder esta

Respostas a este tópico

AS. boa tarde,

Varios especialistas e programadores  recomendam que uma rotina chamada por um interrupt seja a menor possível.

No caso arduino, dentro de uma rotina de interrupt algumas coisas não funcionam.

A função delay() não funciona dentro de rotina de interrupt.

Serial.print(), pode funciona mal.

Acho que as rotinas de LCD também podem apresentar problemas.

Apesar de não se exatamente assim mas de modo geral qdo o programa sofre uma interrupção,

ele bloquei outras interrupções, o que vai afetar rotinas de funções diversas.

este bloqueio termina ao sair da rotina de interrupção.

Ao sair da rotina de interrupção, o programa volta ao mesmo local onde estava qdo foi interrompido, graças a um registrador de nome "Stack"

Datasheet Atmega328 " During interrupts and subroutine calls, the return address Program Counter (PC)

is stored on the Stack.

O melhor é usar flags, indicando que um interrupt foi gerado.

Como exemplo faça assim:

Ao entrar em uma rotina de interrupt,  flag = 1;

Daí dentro da rotina de loop, vc verifica qual é o "status" do flag, se for 0 significa que não existiu interrupt,

mas se for 1 vc faz o que deveria após um interrupt e ainda e "reseta" o flag novamente para 0.

Assim a rotina de interrupt será composta de apenas 1 instrução, não afetado o restante do seu processamento.

RV

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço