interrupção e bounce

Fórum sobre plataforma Arduino

Moderadores: andre_luis, 51, guest2003, Renie

interrupção e bounce

Mensagempor wilson souza » 27 Abr 2019 19:12

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?
wilson souza
Nibble
 
Mensagens: 54
Registrado em: 29 Fev 2016 22:53

Re: interrupção e bounce

Mensagempor pamv » 27 Abr 2019 21:47

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
pamv
Word
 
Mensagens: 842
Registrado em: 20 Jun 2016 21:47

Re: interrupção e bounce

Mensagempor andre_luis » 28 Abr 2019 00:03

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: interrupção e bounce

Mensagempor cfreund » 28 Abr 2019 08:43

E tb, mude de CHANGE para FALLING.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: interrupção e bounce

Mensagempor pamv » 28 Abr 2019 15:36

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/
pamv
Word
 
Mensagens: 842
Registrado em: 20 Jun 2016 21:47

Re: interrupção e bounce

Mensagempor Rodrigo_P_A » 28 Abr 2019 17:10

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.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: interrupção e bounce

Mensagempor wilson souza » 28 Abr 2019 17:56

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.
wilson souza
Nibble
 
Mensagens: 54
Registrado em: 29 Fev 2016 22:53

Re: interrupção e bounce

Mensagempor wilson souza » 28 Abr 2019 18:30

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?
wilson souza
Nibble
 
Mensagens: 54
Registrado em: 29 Fev 2016 22:53

Re: interrupção e bounce

Mensagempor eletroinf » 28 Abr 2019 19:51

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/
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: interrupção e bounce

Mensagempor pamv » 28 Abr 2019 21:10

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
pamv
Word
 
Mensagens: 842
Registrado em: 20 Jun 2016 21:47

Re: interrupção e bounce

Mensagempor wilson souza » 28 Abr 2019 21:29

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.
wilson souza
Nibble
 
Mensagens: 54
Registrado em: 29 Fev 2016 22:53

Re: interrupção e bounce

Mensagempor wilson souza » 28 Abr 2019 21:31

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.
wilson souza
Nibble
 
Mensagens: 54
Registrado em: 29 Fev 2016 22:53

Re: interrupção e bounce

Mensagempor Rodrigo_P_A » 28 Abr 2019 22:20

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
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: interrupção e bounce

Mensagempor andre_luis » 29 Abr 2019 08:50

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?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: interrupção e bounce

Mensagempor MOR_AL » 29 Abr 2019 17:21

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
Você não está autorizado a ver ou baixar esse anexo.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Próximo

Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x