Delay dentro de interrupção

Software e Hardware para uC STM

Moderadores: aluis-rcastro, 51

Delay dentro de interrupção

Mensagempor mrgadotti » 19 Out 2020 15:18

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.
Avatar do usuário
mrgadotti
Byte
 
Mensagens: 420
Registrado em: 02 Jun 2010 21:14
Localização: Timbó - SC

Re: Delay dentro de interrupção

Mensagempor rafael » 19 Out 2020 15:20

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
/***************************************
Rafael Gebert

TEWAC Tecnologia
e-mail: rafael@tewac.com.br
***************************************/
rafael
Nibble
 
Mensagens: 70
Registrado em: 08 Mar 2007 10:37
Localização: Rio Grande, RS - Brazil

Re: Delay dentro de interrupção

Mensagempor eletroinf » 19 Out 2020 16:11

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

Re: Delay dentro de interrupção

Mensagempor mrgadotti » 19 Out 2020 17:09

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.
Avatar do usuário
mrgadotti
Byte
 
Mensagens: 420
Registrado em: 02 Jun 2010 21:14
Localização: Timbó - SC

Re: Delay dentro de interrupção

Mensagempor mrgadotti » 23 Out 2020 11:16

Resolvido o problema para ter delay de us:

https://community.st.com/s/question/0D5 ... rosecondus
Avatar do usuário
mrgadotti
Byte
 
Mensagens: 420
Registrado em: 02 Jun 2010 21:14
Localização: Timbó - SC

Re: Delay dentro de interrupção

Mensagempor vtrx » 23 Out 2020 12:15

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2174
Registrado em: 20 Abr 2008 21:01

Re: Delay dentro de interrupção

Mensagempor mrgadotti » 23 Out 2020 12:47

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.
Avatar do usuário
mrgadotti
Byte
 
Mensagens: 420
Registrado em: 02 Jun 2010 21:14
Localização: Timbó - SC

Re: Delay dentro de interrupção

Mensagempor brasilma » 25 Out 2020 17:34

Não dá para utilizar uns NOPs ao invés de delay?
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3410
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Delay dentro de interrupção

Mensagempor vtrx » 25 Out 2020 19:18

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2174
Registrado em: 20 Abr 2008 21:01

Re: Delay dentro de interrupção

Mensagempor mrgadotti » 26 Out 2020 07:55

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.
Avatar do usuário
mrgadotti
Byte
 
Mensagens: 420
Registrado em: 02 Jun 2010 21:14
Localização: Timbó - SC

Re: Delay dentro de interrupção

Mensagempor Guri » 30 Ago 2021 11:17

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:
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 451
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Delay dentro de interrupção

Mensagempor Guri » 08 Jun 2022 16:29

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.
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 451
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais


Voltar para STMicroelectronics

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x