Peguei um ESP8266 ontem e comecei a mexer, estou programando ele diretamente (não estou usando de módulo para o arduino) direto pela IDE do arduino.

Estou com um problema, no código abaixo tem uma interrupção que lê um botão, basicamente se eu mudo rapidamente o status do botão, a placa pode travar, não é tão comum, mas aperto e solto rapidamente, volto a apertar e soltar, repito isso diversas vezes, o software do ESP trava e também a IDE do arduino.

Como podem ver, o código é extremamente simples:

Exibições: 2871

Anexos

Responder esta

Respostas a este tópico

Já tentei colocar um delay logo no início do void loop(), mas é ainda pior, essa é a resposta no serial cada vez que aperto o botão:


Exception (9):
epc1=0x40100ec8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000003 depc=0x00000000

ctx: sys
sp: 3ffffc70 end: 3fffffb0 offset: 01a0

>>>stack>>>
3ffffe10: 40219655 3ffffed0 3ffee0d0 00000016
3ffffe20: 401010f8 0002f835 3ffee728 00000000
3ffffe30: 3ffe8c90 3ffee728 3ffedf78 3ffed910
3ffffe40: 00000000 0002ec00 4020109c 0000000a
3ffffe50: 3ffee728 ffffffff 00000020 00616769
3ffffe60: 7fffffff 0000000e 00000000 40202044
3ffffe70: 401067da 00000080 3fffc200 40106834
3ffffe80: c0033005 001f5ae6 3ffeff7c 00000000
3ffffe90: 00000000 00000000 0000001f 00000022
3ffffea0: 3fffc200 401067a0 3fffc258 4000050c
3ffffeb0: 40000f68 00000030 00000014 ffffffff
3ffffec0: 40000f58 00000000 00000020 00000000
3ffffed0: feefeffe 3ffee728 3ffee728 fffffffe
3ffffee0: ffffffff 3ffedf30 3ffee728 3fffdab0
3ffffef0: 00000000 3fffdad0 3ffee924 00000030
3fffff00: 00000000 00000000 3ffea6df 3ffea76f
3fffff10: 3ffea72b 3ffea747 00000000 3ffea6f5
3fffff20: 402331e6 00000000 00000016 00000000
3fffff30: 402309ec 3ffed200 3ffeff64 00000000
3fffff40: 4021779e 3ffed200 3ffe8c6c 40209a31
3fffff50: 00000000 00000000 00000001 40202539
3fffff60: 40100e66 0002ed4c 3ffe8c90 4020101c
3fffff70: 40220560 3ffe9584 3ffe8c90 0009bb10
3fffff80: 40220586 3fffdab0 00000000 3ffee930
3fffff90: 00000000 3fffdad0 3ffee924 402024d3
3fffffa0: 40000f49 40000f49 3fffdab0 40000f49
<stack/p>

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v614f7c32
~ld

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)

Use isso e veja se melhora.

Mesma coisa, também travou tudo depois de algumas variações

Valeu pela ajuda.

Boa tarde JM,

Recomendações:
1. Remova seu sketch da área de texto do seu tópico;
2. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
3. Comente as linhas do seu sketch. Fica mais fácil entender o que vc quer fazer com cada linha e facilita a ajuda.
4. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
     com o seu sketch.

RV

PS:  Até acho que sei o que é o problema.

RV

Desculpe-me, achei que <code></code> deixaria o código certo.

Agora está anexado, comentei só o que faz as funções, até porque é tudo muito simples, menos de 20 linhas de código, já contando os espaçamentos.

boa tarde JM.

Vi seu código, e imediatamente visualizei o problema.

Dentro de ISRs (Interrup Service Routines), seja do Arduino,  seja do ESP8266, você não deve colocar delays (pelo menos não do jeito que vc colocou).

Isto porque quando a CPU entra em uma ISR, o mecanismo de hardware de atendimento de Interrupções, automaticamente desabilita outras Interrupções (que claro, podem vir a serem reabilitadas se vc tiver ciência de como fazer isso de forma organizada e seguindo as regras).

Uma vez que demais Interrupções estejam desabilitadas (no caso dentro da ISR), o controle do código está completamente nas suas mãos: você é o  senhor e dono absoluto da máquina). Mas existem perigos: funções e tarefas ordinárias do Sistema (e pode acreditar: elas existem, principalmente no ESP8266, mas mesmo o Arduino as tem) devem continuar executando, pois do contrário elas deixarão de fazer o trabalho nos bastidores (o trabalho "por trás das câmeras"), e inevitavelmente CRASH!!! no seu sistema. Um dos responsáveis evidentes por esse crash, é o WDT (Watch Dog Timer). Uma vez que você bloqueou o código (através do delay), e as Interrupções estão desabilitadas, se o período do WDT for menor que o período do seu delay, o crash será inevitável (pois esta é a forma automática de por "ordem na casa").

Claro que é simples resolver isso. Mas é importante também, entender o motivo pelo qual a coisa aconteceu (conforme expliquei acima).

Para resolver, apenas faça isso na sua ISR:

---------------------------------------------------

void isr()

{

   interrupts();

   delay(10);

   state = digitalRead(14);    //Interrupção, lê o valor do pino 14

}

---------------------------------------------------

Note que reabilitei as Interrupções no inicio da ISR.

Embora isso resolva seu problema, preciso ser franco ao extremo com vc (como sempre sou): os princípios básicos de programação, estão um tanto deixados de lado no seu código, e caso vc queira fazer voos mais altos, você precisa expandir sua técnica de codificar.

Não é "natural" existir delays dentro de ISRs. Então o que fazer? você precisa correr atrás e conhecer a técnica adequada de fazer isso (sem usar o delay).

Espero ter ajudado.

Caso precise de alguma colaboração a mais, fique à vontade.

Abrçs,

Elcids

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.

Valeu.

Delay não pode ser usado se usa interrupção.

Abs.

CK

Valeu, retirei o delay e resolveu.

Ok, obrigado pelo entendimento.

Defina o mode do porte 14 como INPUT, pois o ESP precisa saber como está definido o port, antes

de usa-lo.

pinMode(14, INPUT); 

ou pinMode(14, INPUT_PULLUP);  Sugiro usar este formato e ligar um lado do botão no port 14

e o outro em Gnd, para evitar falsos interrupts

No seu sketch coloque logo antes de definir o interrupt.

Acredito que assim vai dar certo.

Depois conta pra gente.

O que o CK falou  é correto, delay não funciona dentro de rotina de interrupção.

RV

https://techtutorialsx.com/2016/12/11/esp8266-external-interrupts/

PS: Concordando com o  CK, o delay não deve ser usado com base nas explicações do EC.

RV

boa tarde RV.

apenas clarificando:  não é que delay não funciona dentro de ISRs. É inconveniente usá-los, pois você bloqueia as tarefas no background (uma vez que as Interrupções são automaticamente desabilitadas por um mecanismo de hardware específico da CPU). Para usá-los, é preciso conhecer qual a gama de valores possíveis para o delay, de forma a não bloquear funções e tarefas no background. E claro, conhecer isso pode ser bastante indigesto, dada a complexidade dos Sistemas no background (no Arduino ainda pode parecer "merreca", mas imagina tais funções no ESP8266).

Então a técnica adequada deve ser usada, para se alcançar o resultado desejado.

Espero ter ajudado.

Abrçs,

Elcids

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.

Pelo que vi, não tem função de INPUT_PULLDOWN, correto? Coloquei um resistor externo mesmo.

Valeu

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço