Página 1 de 2
interrupção e bounce

Enviado:
27 Abr 2019 19:12
por wilson souza
boa noite a todos.
Estou tentando entender como funciona a interrupção e o tratamento do bounce no arduino.
escrevi este sketch
cpp code
volatile int state = HIGH;
const int BUTTON_PIN = 0;
const int LED_PIN = 13;
void setup() {
// init the serial
Serial.begin(300);
// init the led and button
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(0, ledOnOff, CHANGE);
//Define quando a interrupção será acionada.
//Abaixo segue as constantes predefinidas:
//1. LOW : aciona a interrupção sempre que o pino estiver baixo
//2. CHANGE: aciona a interrupção sempre que o pino muda de estado
//3. RISING: aciona a interrupção quando o pino vai de baixo para alto (LOW HIGH)
//4. FALLING: para acionar a interrupção quando o pino vai de alto para baixo (HIGH LOW)
//5. HIGH : aciona a interrupção sempre que o pino estiver alto
}
void ledOnOff(){
Serial.println(" estou dentro da interrupção");
static unsigned long lastMillis = 0;
unsigned long newMillis = millis();
if(newMillis - lastMillis < 50){
}
else{
state = !state;
lastMillis = newMillis;
digitalWrite(LED_PIN, state);
Serial.println(" estou saindo da interrupção");
}
}
void printone() {
Serial.println("print one.....");
}
void printtwo() {
Serial.println("print two.....");
}
void loop() {
Serial.println(" estou fora da interrupção");
delay(2);
printone();
printtwo();
}
o problema aqui, é que mesmo com a rotina de debounce , quando eu aperto e/ou solto um botão, a rotina de interrupção é chamada mais de uma vez. O certo seria a rotina de interrupção ser chamada uma únida vez. uma vez quando aperto o botão e outra quando solto o mesmo botão. O que estou fazendo de errado?
Re: interrupção e bounce

Enviado:
27 Abr 2019 21:47
por pamv
Você já tentou usar outro pino para o botão no lugar do pino 0 ?
Por exemplo, o pino 2?
Como você ativou a serial, o pino 0 vai se comportar como RX
Re: interrupção e bounce

Enviado:
28 Abr 2019 00:03
por andre_luis
Pode não estar havendo debounce mas sim reentrada na interrupção, já que você não desabilita interrupção de dentro da rotina de mudança de estado do LED; Notar que os glitches de contato do botao sao muito rápidos, e voce está adicionando delay dentro da interrupção (o que é desaconselhável), o que pode n'ao dar tempo para executar tudo dentro da ISR antes de ser chamada novamente. Pra contornar isso sem mexer muito no seu codigo, experimenta um detachInterrupt()
no começo da rotina, e um atachInterrupt()
no final dela pra ver se funciona. Obs.: Como voce está usando um baud-rate baixo e bastante caracteres na string, a propria função de envio da serial ja é por si só um debounce; numa rápida conta de padeiro, estima-se algo em torno de 100ms para cada Serial.println()
com os argumentos acima.
Re: interrupção e bounce

Enviado:
28 Abr 2019 08:43
por cfreund
E tb, mude de CHANGE para FALLING.
Re: interrupção e bounce

Enviado:
28 Abr 2019 15:36
por pamv
Pessoal,
caiu a recomendação de não usar a porta 0 e 1 para i/o digital se a serial é ativada?
https://www.arduino.cc/reference/en/lan ... on/serial/
Re: interrupção e bounce

Enviado:
28 Abr 2019 17:10
por Rodrigo_P_A
Não entendo nada de arduino, mas lendo rapidamente primeira coisa que percebo é:
1 - vc inicializou a serial a 300bps
2 - dentro da interrupção você escreve um dado na serial, suponho eu que o ARDUINO num use DMA, logo pelos meus calculos vc gasta quase 10ms só pra enviar o seu texto, eu num recomendo usar rotina de serial dentro de interrupção
Eu num faria debouncing usando interrupção de estado do pino, isso vai gerar um monte de solicitação de interrupção se tua fonte de sinal tiver muito ruido, "parando" o processamento de outras coisas para "tratar ruido" de forma desnecessária.
A maioria das aplicações são para ler um pino, tipo sinal de sensor, botão, etc... eu nas minhas aplicações uso apenas um timer, e controlo os "filtros" por software, usando apenas uma interrupção com tempo determinado. Só uso interrupção para tratar alteração de pino se o sinal for muito rápido ( rápido, por minha definição é tempo menor que 100us ) e funciona para todas minhas aplicações até hoje.
Dá uma olhada, tenta retirar essa rotina de impressão pela serial, e altera colocando acender / apagar um led, talvez o problema seja esse.
Re: interrupção e bounce

Enviado:
28 Abr 2019 17:56
por wilson souza
Ok. O que descobri aqui.
não posso enviar nada pela serial quando estou na rotina ISR (interrupção). Quando esta fazendo isto, as vezes a rotina de interrupção era chamada mais de uma vez quando apertava o botão e as veses a rotina também era chamada quando soltava o botão, mesmo com a ISR configurada com RISING ou FALLING. estranho.
retirei o envio de informações pela serial dentro da ISR e agora parece que a leitura do botão estabilizou. Vou continuar testando por aqui.
Re: interrupção e bounce

Enviado:
28 Abr 2019 18:30
por wilson souza
Mas agora fica a pergunta.
Como posso saber se a rotina de ISR esta sendo executada uma única vez quando aperto ou solto o botão?
Eu usava o envio de string's pela porta serial para monitorar quantas vezes a ISR ocorria. Claro que isto é que estava atrapalhando.
Existe alguma maneira de monitorar quantas veses a isr esta sendo executada, após um evento de botão?
Re: interrupção e bounce

Enviado:
28 Abr 2019 19:51
por eletroinf
Para saber a quantidade de vezes que a ISR foi executada, uma possibilidade é:
- Crie uma variável global, sugiro uma int de 16 bit.
- Inicie esta variável com zero;
- A cada ISR incremente ela;
- Aperte o botão uma vez;
- use outro botão em separado para acionar uma rotina que envie o valor da variável das contagens pela serial para o PC.
Aí tu pode verificar quantas vezes passou pela rotina da ISR.
Aqui tem um artigo pra fazer bouncing sem usar interrupção:
http://tot.eng.br/push-button-arduino-bouncing/
Re: interrupção e bounce

Enviado:
28 Abr 2019 21:10
por pamv
Pessoal
Desculpem insistir.
- O Post inicial usa a port 0 que é reservada à USART e o programa do Post Inicial usa a USART para comunicação
- A documentação do Arduino UNO diz para NÂO usar a port 0 e a port 1 para gpio quando a USART é empregada
onde eu estou errando ao sugerir que o código use a port 2 ou qualquer outra? É uma linha de código e um fiozinho mudado de uma porta pra outra apenans.
io
Repito a pergunta: caiu (não vale mais) a recomendação da documentação do Arduino?
https://www.arduino.cc/reference/en/lan ... on/serial/assim fica difícil colaborar
Re: interrupção e bounce

Enviado:
28 Abr 2019 21:29
por wilson souza
Ok.
Já consigo fazer a leitura de botões evitando o bounce sem usar interrupção.
O problema é que estou trabalhando em uma aplicação, que tem várias rotinas.
Mas o que gostaria, é que independentemente de que rotina esteja sendo executada, se o botão for acionado, uma rotina específica rode.
Foi por isto que pendsei em utilizar interrupção. Porque quando o botão for acionado, este evento precisa ter prioridade. apenas isto.
Re: interrupção e bounce

Enviado:
28 Abr 2019 21:31
por wilson souza
De qualquer forma, agora entendi que não posso utilizar as interrupções do arduino e tentar enviar algo pela serial.
Isto estava dando problema. Já estou corrigindo. Valeu.
Re: interrupção e bounce

Enviado:
28 Abr 2019 22:20
por Rodrigo_P_A
wilson souza escreveu:De qualquer forma, agora entendi que não posso utilizar as interrupções do arduino e tentar enviar algo pela serial.
Isto estava dando problema. Já estou corrigindo. Valeu.
Pode usar sim, só num pode usar dentro da interrupção
Re: interrupção e bounce

Enviado:
29 Abr 2019 08:50
por andre_luis
wilson souza escreveu:De qualquer forma, agora entendi que não posso utilizar as interrupções do arduino e tentar enviar algo pela serial.
Se olhar no codigo fonte, a propria biblioteca Serial do Arduino utiliza interrupção de RX, então isso não faz sentido.
O (maior) problema no seu código era o delay dentro da interrupção.
De qualquer modo, a bola que o pamv levantou ainda não ficou totalmente exclarecida, e se fosse voce, mudaria o pino conforme sugerido.
- A documentação do Arduino UNO diz para NÂO usar a port 0 e a port 1 para gpio quando a USART é empregada
onde eu estou errando ao sugerir que o código use a port 2 ou qualquer outra?
Re: interrupção e bounce

Enviado:
29 Abr 2019 17:21
por MOR_AL
Eu uso este fluxograma que fiz. Além de funcionar bem, os tempos podem ser alterados facilmente.
Com os valores de apenas uma variável "n" consegui evitar o bouncing.
Os tempos delta T não fazem o uC ficar esperando, pois são gerados via interrupção.
Aliás, costumo usar apenas uma interrupção para os tratamentos de todos os delta Ts do meu programa. Por exemplo; gero uma interrupção com o MDC (Máximo Divisor Comum) entre os diversos delta Ts diferentes e necessários no meu programa e um registro contador para cada delta T diferente.
Em tempo: Uso mais um registro que, dependendo do valor, ele determina a localização da continuação no fluxograma.
Segue o fluxograma em pseudo código.
MOR_AL