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:
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por