Bom dia galera.

Estou com uma dúvida, primária mas que não estou entendendo bem.

Estou trabalhando em um projeto e vou precisar de usar as duas interrupções externas do arduino UNO.

Minha dúvida é como fazer para que no meio do processamento de uma rotina disparada por uma interrupção a outra não acione.

Será que algo como abaixo funciona, ou haveria algo mais "elegante"?:

// ROTINA DE INTERRUPÇÃO 0

void processo0() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

}

// ROTINA DE INTERRUPÇÃO 1

void processo1() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

}

void setup() {

  // bla bla bla

  attachInterrupt(0, processo0, RISING);   //Inicializa interrupção 0

  attachInterrupt(1, processo1, RISING);   //Inicializa interrupção 1

}

void loop() {

  // Rotinas

  // Rotinas

  // Rotinas

}

Valeu, amigos

Exibições: 999

Responder esta

Respostas a este tópico

Oi

Marcus tudo bem ?

Acredito que o que pretende é que apenas uma rotina de interrupção seja accionada sem que a outra seja accionada, mas o teu maior problema está na forma de leitura do Arduino se a 1ª rotina for accionada ela irá automaticamente na próxima rotina e é isto que quer evitar ?

Eu não sei se percebi mas bastava simplesmente fazer isso para iniciar as interrupções:

                                                                Código Abaixo

_____________________________________________________________________

// ROTINA DE INTERRUPÇÃO 0

void processo0() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

}

// ROTINA DE INTERRUPÇÃO 1

void processo1() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

}

void setup() {

  // bla bla bla

  processo0();   //Inicializa interrupção 0

  processo1();   //Inicializa interrupção 1

}

void loop() {

  // Rotinas

  // Rotinas

  // Rotinas

}

_________________________________________________________________________

                                                 Fim do Código

Melhores Cumprimentos

Olá Helio,

Revendo a minha pergunta vi que não fui muito claro.

Estou usando dois dispositivos que acionarão cada um deles uma interrupção externa e cada um deles tem rotinas próprias de tratamento.

Enquanto o sketch roda normalmente as rotinas do loop, lendo alguns sensores, as interrupções podem ser acionadas.

O que pretendo evitar é que enquanto trato das rotinas de uma interrupção a outra seja acionada. Após o tratamento eu gostaria de estar esperando uma chamada de qualquer uma das duas interrupções, voltando às rotinas normais.

Bom dia Marcus, 

Todo processador ou Microcontrolador tem uma sequência de prioridades de interrupções. 

( veja que existem outros tipos de interrupções como SW, interna, etc.) 

Int 0 , depois Int 1 , etc. 

Se as duas chegarem juntas, a que tiver maior prioridade tomará o processo de execução. 

E somente deixará a outra executar o processo, quando a primeira terminar. (pelo que sei) 

Existem vários recursos para se trabalhar com Interrupções. 

Máscaras, tipos de disparo, bloqueio e habilitação de interrupções, etc. 

Veja os capítulos

13 - External Interrupts do Datasheet do ATmega 328:

12.1 Interrupt Vectors in ATmega48A and ATmega48PA

http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-AT...

https://learn.adafruit.com/multi-tasking-the-arduino-part-2/externa...

https://sites.google.com/site/qeewiki/books/avr-guide/external-inte...

Obrigado, José

Boa tarde!

Concordo com o Gustavo.

No Arduino não existem interrupções aninhadas. O próprio processador desabilita a chamada de interrupções quando uma já está sendo atendida.

Então você não precisa se preocupar.

Veja aqui mais informações sobre isso:

http://electronics.stackexchange.com/questions/20486/when-arduino-c...

http://stackoverflow.com/questions/5111393/do-interrupts-interrupt-...

Obrigado José...

Busquei esta informação e não havia encontrado.
Já deu pra perceber a minha "nobisse" no Arduino, né? ... KKKKK

Depois de ler as fontes que vc referenciou (e as do José Gustavo), ficou muito claro...
A única questão é que as rotinas chamadas pelas interrupções sejam breves, para que não se perca informação, mas isso não é problema no meu sketch.

Obrigado e valeu pela ajuda

Se a sua função principal for o Loop

Acredito que basta fazer o seguinte

  Código Abaixo

_____________________________________________________________________

// ROTINA DE INTERRUPÇÃO 0

void processo0() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

 loop();

}

// ROTINA DE INTERRUPÇÃO 1

void processo1() {

  noInterrupts();

  // rotinas a ser processadas

  interrupts();

  loop();

}

void setup() {

  // bla bla bla

  processo0();   //Inicializa interrupção 0

  processo1();   //Inicializa interrupção 1

}

void loop() {

  // Rotinas

  // Rotinas

  // Rotinas

}

_________________________________________________________________________

                                                 Fim do Código

Melhores Cumprimentos

Obrigado...
 Valeu Hélio, vou testar aqui e depois posto se deu certo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço