Página 1 de 1

Delay dentro de interrupção

MensagemEnviado: 19 Out 2020 15:18
por mrgadotti
Alguém já utilizou o HAL_Delay dentro de uma interrupção? Estou detectando o cruzamento de zero para disparo de um TRIAC, porém o HAL_Delay está travando quando utilizado na interrupção EXTI1_IRQHandler. O mesmo ocorre se utilizo o HAL_GetTick para verificar quanto tempo passou e alterar o estado da GPIO.

Re: Delay dentro de interrupção

MensagemEnviado: 19 Out 2020 15:20
por rafael
Olá amigo! Nunca utilize delay dentro de interrupção.

E nem no laço principal, substitua delay por máquina de estado e tick.

Se desejares continuar usando delay, ai vais ter que colocar um FreeRTOS da vida.




Enviado do meu iPhone usando Tapatalk

Re: Delay dentro de interrupção

MensagemEnviado: 19 Out 2020 16:11
por eletroinf
Sobre esta função específica mencionada eu não sei como é feita, mas se for do jeito tradicional, a função de delay pode estar em execução devido a chamada de algum ponto do programa e tu chama ela na interrupção, causando resultados imprevisíveis.

Além do que foi sugerido, tem a opção de usar um timer tipo o systick para criar seus timers, onde tu pode criar um específico para a interrupção (variável que decrementa ou incrementa pelo systick). De qualquer forma precisa sair da interrupção. Ou ainda criar sua própria rotina a parte pra delay na interrupção (que não pode ser chamada fora dela). Mas concordo com o que foi dito: Não use delay dentro de uma interrupção.

Re: Delay dentro de interrupção

MensagemEnviado: 19 Out 2020 17:09
por mrgadotti
De primeiro momento criei uma flag que é alterada na interrupção de cruzamento de zero e no loop principal fico verificando seu estado. Ao detectar a flag, realizo o acionamento da GPIO responsável por acionar o TRIAC e cortar a senoide. Dentro do loop principal que faço a varredura dos botões os 10 ms não vão afetar o funcionamento.

Como comentado, ficou melhor a abordagem de não utilizar delay na interrupção.

Re: Delay dentro de interrupção

MensagemEnviado: 23 Out 2020 11:16
por mrgadotti
Resolvido o problema para ter delay de us:

https://community.st.com/s/question/0D5 ... rosecondus

Re: Delay dentro de interrupção

MensagemEnviado: 23 Out 2020 12:15
por vtrx
mrgadotti escreveu:Resolvido o problema para ter delay de us:

https://community.st.com/s/question/0D5 ... rosecondus

Pensei que voce tinha atentado sobre o limite do tempo do delay em relação a o que voce quer fazer.
Eu tenho circuito que disparam uma interrupção por passagem por zero,para controlar cargas AC,e elas tem delay dentro da interrupção,mas não ultrapassando um período entre uma passagem por zero até a outra.

Re: Delay dentro de interrupção

MensagemEnviado: 23 Out 2020 12:47
por mrgadotti
vtrx escreveu:
mrgadotti escreveu:Resolvido o problema para ter delay de us:

https://community.st.com/s/question/0D5 ... rosecondus

Pensei que voce tinha atentado sobre o limite do tempo do delay em relação a o que voce quer fazer.
Eu tenho circuito que disparam uma interrupção por passagem por zero,para controlar cargas AC,e elas tem delay dentro da interrupção,mas não ultrapassando um período entre uma passagem por zero até a outra.


Tive de tomar esse cuidado, cada ciclo da rede 60 Hz ocorre a interrupção e dentro dela realizo o acionamento do triac.

Re: Delay dentro de interrupção

MensagemEnviado: 25 Out 2020 17:34
por brasilma
Não dá para utilizar uns NOPs ao invés de delay?

Re: Delay dentro de interrupção

MensagemEnviado: 25 Out 2020 19:18
por vtrx
brasilma escreveu:Não dá para utilizar uns NOPs ao invés de delay?

Dependendo da velocidade do microcontrolador,isso gera bastante linha de código.

Re: Delay dentro de interrupção

MensagemEnviado: 26 Out 2020 07:55
por mrgadotti
brasilma escreveu:Não dá para utilizar uns NOPs ao invés de delay?


Foi a alternativa que acabei utilizando, medi um tempo aproximado com o osciloscópio e fiz um for de NOP. Pode não ser a melhor abordagem, mas resolveu o problema devido a não exigir precisão.

Re: Delay dentro de interrupção

MensagemEnviado: 30 Ago 2021 11:17
por Guri
Bom, não sei se vai ajudar, mas lá vai:

Eu uso simplesmente um delay baseado em ciclos de máquina, ou seja, algo do tipo:

....sua rotina dentro da interrupção:
....
......
if(VarTimer1 >= 1000) // 1000 é o tempo que você vai desejar, pode usar uma variável int e regular esse tempo externamente.
{
VarTimer1 = 0;
...Aqui vai o disparo do seu triac
} VarTimer1 ++;

Eu uso muito esse sistema, inclusive quando tenho muitos timers para controlar, sem comprometer o loop principal ou interrupt que seja.
Quando eu trabalhava com iluminação DMX512, usava essa técnica para controlar as lâmpadas com base na rede elétrica. :mrgreen:

Re: Delay dentro de interrupção

MensagemEnviado: 08 Jun 2022 16:29
por Guri
Delay, dentro da interrupção? :shock:

Se utilizar o HAL_Delay, obviamente sua interrupção vai ficar comprometida. Se eu entendi você deseja capturar um ponto de referencia, ex. da REDE e disparar um TIMER para contar um determinado tempo!
Se for isso, utilize dentro da sua interrupção, o módulo PWM para gerar um pulso de x tempo, a cada passada pela interrupção o PWM será disparado (reiniciado), e o controle do PWM fica fica no MAIN.