Interrupção no ESP8266 travando a placa - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-29T14:40:49Zhttps://labdegaragem.com/forum/topics/interrup-o-no-esp8266-travando-a-placa?commentId=6223006%3AComment%3A666577&xg_source=activity&feed=yes&xn_auth=noGeralmente costumo resolver o…tag:labdegaragem.com,2018-04-12:6223006:Comment:6665792018-04-12T23:58:26.078ZCarlos kwiekhttps://labdegaragem.com/profile/Carloskwiek
<p>Geralmente costumo resolver o problema do bounce via software, anexo arquivo do programa e imagem de um exemplo pratico simulado no Proteus VSM Arduino um liga desliga LED via botão usando interrupção.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1939722306?profile=original" target="_self"><img class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1939722306?profile=RESIZE_1024x1024" width="721"></img></a></p>
<p></p>
<p>Meu canal: …</p>
<p>Geralmente costumo resolver o problema do bounce via software, anexo arquivo do programa e imagem de um exemplo pratico simulado no Proteus VSM Arduino um liga desliga LED via botão usando interrupção.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1939722306?profile=original" target="_self"><img width="721" src="http://storage.ning.com/topology/rest/1.0/file/get/1939722306?profile=RESIZE_1024x1024" width="721" class="align-full"/></a></p>
<p></p>
<p>Meu canal: <a href="https://www.youtube.com/channel/UCLZ2cga6-yqz5jtI-XvE7PA?view_as=subscriber" target="_blank" rel="noopener">AQUI</a></p>
<p></p>
<p>Abs.</p>
<p></p>
<p>CK</p>
<p></p> ah, e se vc usar algo como o…tag:labdegaragem.com,2018-04-12:6223006:Comment:6665782018-04-12T23:00:56.419ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p>ah, e se vc usar algo como o 74HC14, e "sobrar" inversores, não vai deixar estes que sobraram "largados" de qualquer jeito. Se vc os deixar "largados", isso pode ser bastante desastroso (e em alguns casos, vai parecer "fantasmagórico").</p>
<p></p>
<p><a href="http://www.onsemi.com/pub/Collateral/MC74HC14A-D.PDF" rel="nofollow noopener" target="_blank">http://www.onsemi.com/pub/Collateral/MC74HC14A-D.PDF</a></p>
<p></p>
<p>(coloquei o link da ON, pra te agradar, já que vc disse que trabalhou…</p>
<p>ah, e se vc usar algo como o 74HC14, e "sobrar" inversores, não vai deixar estes que sobraram "largados" de qualquer jeito. Se vc os deixar "largados", isso pode ser bastante desastroso (e em alguns casos, vai parecer "fantasmagórico").</p>
<p></p>
<p><a rel="nofollow noopener" href="http://www.onsemi.com/pub/Collateral/MC74HC14A-D.PDF" target="_blank">http://www.onsemi.com/pub/Collateral/MC74HC14A-D.PDF</a></p>
<p></p>
<p>(coloquei o link da ON, pra te agradar, já que vc disse que trabalhou com Freescale)</p>
<p></p>
<p>Abrçs</p>
<p>Elcids</p>
<p></p> O capacitor resolveu perfeita…tag:labdegaragem.com,2018-04-12:6223006:Comment:6665772018-04-12T22:49:26.245ZJoão Matheushttps://labdegaragem.com/profile/JoaoMatheus
<p>O capacitor resolveu perfeitamente.</p>
<p></p>
<p>Valeu!</p>
<p>O capacitor resolveu perfeitamente.</p>
<p></p>
<p>Valeu!</p> ok JM.
Mas não se iluda: mes…tag:labdegaragem.com,2018-04-12:6223006:Comment:6667182018-04-12T22:41:37.408ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p>ok JM.</p>
<p>Mas não se iluda: mesmo o melhor de todos os botões (seja com contato de ouro ou estanho), vai ter algum "bouncing". Eu realmente fico surpreso que o pessoal use "a torto e a direito" os botões por aí, e não se preocupem com isso.</p>
<p>É muito fácil eliminar o "bouncing". O ideal, é usar um capacitor em paralelo com o botão, e que a entrada usada seja do tipo "Schmitt-Trigger". Caso a entrada não possa ser do tipo "Schmitt-Trigger", use uma externa, como por exemplo através…</p>
<p>ok JM.</p>
<p>Mas não se iluda: mesmo o melhor de todos os botões (seja com contato de ouro ou estanho), vai ter algum "bouncing". Eu realmente fico surpreso que o pessoal use "a torto e a direito" os botões por aí, e não se preocupem com isso.</p>
<p>É muito fácil eliminar o "bouncing". O ideal, é usar um capacitor em paralelo com o botão, e que a entrada usada seja do tipo "Schmitt-Trigger". Caso a entrada não possa ser do tipo "Schmitt-Trigger", use uma externa, como por exemplo através de algo como um 74HC14 (que é uma ótima escolha, pois além de barato, é facilmente encontrado). Claro, usando um inversor com "Schmitt-Trigger", compense a inversão da lógica de estado provocada por ele, bastanto para isso "negar" sua variável no código logo após a leitura do botão).</p>
<p>Mas se seu Sistema (hardware), não estiver sendo utilizado em um ambiente muito eletricamente ruidoso (que é, por exemplo um ambiente industrial), então você pode até dispensar o uso do "Schmitt-Trigger", e por isso eu não sugeri isso anteriormente.</p>
<p></p>
<p>Abrçs,</p>
<p>Elcids</p>
<p></p> ah sim cometi uma comida de b…tag:labdegaragem.com,2018-04-12:6223006:Comment:6665752018-04-12T22:23:39.020ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p>ah sim cometi uma comida de bola violenta (até fico com vergonha pela trapalhada):</p>
<p><strong>o <span style="text-decoration: underline;"><em>capacitor deve estar em paralelo com seu botão</em></span>, e NÃO com o Resistor externo. Mas o Resistor deve existir (ou usar pullup ou pulldown).</strong></p>
<p></p>
<p>e esqueci de mencionar:</p>
<p>como um único acionamento do botão provoca várias IRQs (a quantidade depende do quão "brabo" é o "bouncing" do seu botão), devem estar ocorrendo…</p>
<p>ah sim cometi uma comida de bola violenta (até fico com vergonha pela trapalhada):</p>
<p><strong>o <span style="text-decoration: underline;"><em>capacitor deve estar em paralelo com seu botão</em></span>, e NÃO com o Resistor externo. Mas o Resistor deve existir (ou usar pullup ou pulldown).</strong></p>
<p></p>
<p>e esqueci de mencionar:</p>
<p>como um único acionamento do botão provoca várias IRQs (a quantidade depende do quão "brabo" é o "bouncing" do seu botão), devem estar ocorrendo Interrupções Reentrantes, já que reabilitamos as Interrupções. Isso não seria um problema, se você souber o efeito delas (isso é moleza, já que o código da sua ISR é muito simples), e se a quantidade de reentrâncias não provocar um "STACK OVERFLOW" (o que também resulta em um "CRASH" no Sistema).</p>
<p>Assim, peço desculpas, pois não me atentei a isso quando na minha primeira resposta eu sugeri reabilitar as Interrupções. Note que o "<strong>delay(1)</strong>" que coloquei posteriormente, é na tentativa de impedir essa reentrância, mas o valor exato depende da intensidade do "bouncing" (e de evitar o bloqueio das tarefas no background).</p>
<p>Siga o conselho do <strong>capacitor</strong>, e poderá eliminar por completo os delays da ISR, e claro não precisará reabilitar as Interrupções lá dentro.</p>
<p>Abrçs</p>
<p>Elcids</p>
<p></p>
<p></p> Valeu pela ajuda.
O circuito…tag:labdegaragem.com,2018-04-12:6223006:Comment:6668012018-04-12T22:15:24.916ZJoão Matheushttps://labdegaragem.com/profile/JoaoMatheus
<p>Valeu pela ajuda.</p>
<p></p>
<p>O circuito é bem besta, mesmo, só o esp, o botão (com pulldown) e o led.</p>
<p>Peguei um desses botões de protoboard, acho que não da para esperar muito de algo de uns 20 centavos, ao apertar ele não deve estar bem preso, então perde o contato rapidamente com as trilhas e logo volta, até porque mudando o local da protoboard o bouncing chegou a sumir.</p>
<p>Empiricamente coloquei um capacitor cerâmico, fui testando com vários que tinha aqui até achar o…</p>
<p>Valeu pela ajuda.</p>
<p></p>
<p>O circuito é bem besta, mesmo, só o esp, o botão (com pulldown) e o led.</p>
<p>Peguei um desses botões de protoboard, acho que não da para esperar muito de algo de uns 20 centavos, ao apertar ele não deve estar bem preso, então perde o contato rapidamente com as trilhas e logo volta, até porque mudando o local da protoboard o bouncing chegou a sumir.</p>
<p>Empiricamente coloquei um capacitor cerâmico, fui testando com vários que tinha aqui até achar o melhor no osciloscópio (um que não distorcesse tanto a borda de descida)</p>
<p></p>
<p>Por enquanto não estou fazendo nenhum circuito, só voltando a mexer com isso para lembrar bem como tudo funciona, então só de ter entendido a razão desse erro já está ótimo.</p>
<p></p>
<p>Muito obrigado pela ajuda.</p>
<p></p> ok JM.
Então vamos à realida…tag:labdegaragem.com,2018-04-12:6223006:Comment:6666652018-04-12T21:44:56.245ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p>ok JM.</p>
<p></p>
<p>Então vamos à realidade:</p>
<p>1) você está continuamente enviando o "state" via terminal (serial). Tudo bem aqui.</p>
<p></p>
<p>2) você está gerando uma IRQ ("Interrupt Request") quando aciona o botão. Isto provoca sua ISR ser executada. E claro, reabilitamos interrupções no início dela, para não bloquear o background do Sistema (e assim evitar, por exemplo, que o WDT atue provocando um CRASH). Lá dentro da ISR você lê o status do botão.</p>
<p></p>
<p> Então o que…</p>
<p>ok JM.</p>
<p></p>
<p>Então vamos à realidade:</p>
<p>1) você está continuamente enviando o "state" via terminal (serial). Tudo bem aqui.</p>
<p></p>
<p>2) você está gerando uma IRQ ("Interrupt Request") quando aciona o botão. Isto provoca sua ISR ser executada. E claro, reabilitamos interrupções no início dela, para não bloquear o background do Sistema (e assim evitar, por exemplo, que o WDT atue provocando um CRASH). Lá dentro da ISR você lê o status do botão.</p>
<p></p>
<p> Então o que está errado? Vamos lá:</p>
<p></p>
<p>1) seu botão tem um "bouncing", ou ruído mecânico, e cada vez que vc o aciona, ele provoca não uma, mas várias IRQs, inclusive depois que uma já foi executada, caso o "bouncing" seja muito "brabo". Então primeiro de tudo: deve eleiminar o "bouncing". Isto deve ser feito por hardware ou por software. Por hardware, acrescente um capacitor <em><span style="text-decoration: underline;">em paralelo com o Resistor externo</span></em> que vc ligou junto ao botão. O valor do capacitor depende de duas coisas: o quão "brabo" é o seu "bouncing", e o resistor externo que você ligou junto ao botão. Por favor, se possível nos envie aqui o circuito para que possamos calcular o valor mais adequado. Mas no geral, não precisa se preocupar muito, pois certamente deverá ficar entre <strong>0.1uF</strong> e uns <strong>4.7uF</strong>.</p>
<p>2) uma vez que ocorrem várias IRQs devido ao bouncing mecânico do botão, quando você entra na ISR e vai ler o botão, ele já pode ter sido liberado, devido ao próprio "bouncing", já que o atendimento e processamento da ISR é bem rápido. Então o que ocorre? você acaba lendo "LOW", pois o botaõ foi liberado devido ao "bouncing". E o delay(10) no início da ISR, certamente é maior que os spikes provocados pelo "bouncing", piorando ainda mais a situação, já que é quase certo que o "bouncing" vai mascarar o acionamento do botão.</p>
<p> Então faça isso:</p>
<p>1) minimize o bouncing, através da colocação do capacitor, conforme te expliquei. E,</p>
<p>2) altere a ISR:</p>
<p>state = digitalRead(14);</p>
<p>delay(1);</p>
<p>interrupts();</p>
<p>delay(10);</p>
<p></p>
<p>Veja que esta alteração na ISR vai funcionar também como um "anti-bouncing", por motivos óbvios. O delay(1) é um tanto empírico, pois o correto é saber o limite do mesmo (devido ao Background), e o quanto é "brabo" o "bouncing" do seu botão. No entanto, veja que se o Capacitor que mencionei tiver o valor adequado, você pode até eliminar todos os delays dentro da ISR.</p>
<p></p>
<p>Note: é possível fazer isso tudo apenas por software, mesmo sem usar o capacitor externo, e eliminando inclusive todos os delays dentro da ISR. Basta que implemente uma lógica de confirmação do estado do botão antes de enviar seu status pela serial. Para isso, use o "micros" ou o "millis" para cadenciar esta lógica de confirmação, mas isso deve ser feito fora da ISR, ok?</p>
<p></p>
<p>Espero ter ajudado, e como disse antes, é preciso usar a técnica adequada para cada situação.</p>
<p>abrçs,</p>
<p>Elcids</p>
<p></p> Valeu pela resposta e explica…tag:labdegaragem.com,2018-04-12:6223006:Comment:6666642018-04-12T21:13:47.028ZJoão Matheushttps://labdegaragem.com/profile/JoaoMatheus
<p><span>Valeu pela resposta e explicação, mesmo com o interrupts(); o problema continuou, mas removendo o delay e jogando coisa inútil para atrasar um pouco a execução o problema foi solucionado.</span></p>
<p></p>
<p><span>Valeu.</span></p>
<p><span>Valeu pela resposta e explicação, mesmo com o interrupts(); o problema continuou, mas removendo o delay e jogando coisa inútil para atrasar um pouco a execução o problema foi solucionado.</span></p>
<p></p>
<p><span>Valeu.</span></p> Valeu, retirei o delay e reso…tag:labdegaragem.com,2018-04-12:6223006:Comment:6666622018-04-12T21:12:47.632ZJoão Matheushttps://labdegaragem.com/profile/JoaoMatheus
<p>Valeu, retirei o delay e resolveu.</p>
<p>Valeu, retirei o delay e resolveu.</p> Coloquei o código de PULLUP,…tag:labdegaragem.com,2018-04-12:6223006:Comment:6665672018-04-12T21:12:28.789ZJoão Matheushttps://labdegaragem.com/profile/JoaoMatheus
<p>Coloquei o código de PULLUP, mas não funcionou bem, pela lógica que pensei em fazer, preciso ter um pulldown, não um pullup.</p>
<p>Pelo que vi, não tem função de INPUT_PULLDOWN, correto? Coloquei um resistor externo mesmo.</p>
<p></p>
<p></p>
<p>Valeu</p>
<p>Coloquei o código de PULLUP, mas não funcionou bem, pela lógica que pensei em fazer, preciso ter um pulldown, não um pullup.</p>
<p>Pelo que vi, não tem função de INPUT_PULLDOWN, correto? Coloquei um resistor externo mesmo.</p>
<p></p>
<p></p>
<p>Valeu</p>