Página 1 de 1

DELAYS LIVRES

MensagemEnviado: 15 Jul 2016 15:08
por Vonnilmam
Caros colegas, é o vonnilmem dinovo... :mrgreen:

Olha só, na minha luta ferrenha para entender o C, me deparei com uma questão.

Como fazer um DELAY e ao mesmo tempo continuar executando minha rotina principal, até que esse delay estoure e set um flag de sinalização.

Veja em assembler eu faria assim:

;{
Delay_PiscaLed:

Decfsz D1, F ; aguarda o time D1 estourar para executar a rotina que é piscar um led.
Return ; Enquanto não estoura o time D1, volto a executar a rotina MAIN.
Btfsc Led ; O led esta no portB0, por exemplo.
Bcf Led ; Apaga o led.
Btfss Led ; Mudança de nível?
Bsf Led ; Acende o led.
Return
;}

AGORA COMO EU FAÇO ISSO EM "C". Veja que não quero utilizar o timer do MCU, eu queria fazer direto em software, o motivo é porque tenho uma porrada de timer para serem acionados afim de acender e apagar leds conforme um botão será acionado ou não....vários botões.

Veja é C, eu tenho a instrução:

Delay_ms(2) ; Essa instrução, vai aguardar 2 milesegundos para estourar o timer, o problema é que o programa main fica amarrado aqui nesse ponto esperando terminar o delay...entenderam.

Obrigado :roll:

Re: DELAYS LIVRES

MensagemEnviado: 15 Jul 2016 16:52
por eletroinf
No seu código´
declara a variável D1 como global (depois, tu vai ver que tem jeito melhor e mais correto de fazer, mas pra começo...)
unsigned char D1; // Char = var de 8 bit

Aí tu pode ajustar D1 de qualquer ponto do programa, com o valor que tu quer.

void Delay_PiscaLed(void)
{
D1-- ; aguarda o time D1 estourar para executar a rotina que é piscar um led.
if(D1) return; Enquanto não estoura o time D1, volto a executar a rotina MAIN.
Btfsc Led ; O led esta no portB0, por exemplo.
Bcf Led ; Apaga o led.
Btfss Led ; Mudança de nível?
Bsf Led ; Acende o led.
Return
}

Mas nesse caso aí o resultado é que a função Delay_PiscaLed será chamada D1 vezes sem que ela mexa nos LEDs. O que vai ditar o atraso (delay) é o que for consumido de tempo entre as chamadas.

Uma forma boa de fazer delay é usar um timer, apesar de tu comentar que não tem sobrando...

cria uma variável delay_ms

na interrupção do timer, por exemplo @ 1 ms

InterruptTimer()
{
if(delay_ms) delay_ms--; // Se a variável não é zero, decrementa
}

na função que tu precisa do timer...

inicializa o delay com o valor que tu quer

unsigned int delay_ms = 100;

for(bla bla bla)
{
bla bla bla;
if(delay_ms == 0)
{
// código a executar quando passou os 100 ms
}

bla bla bla;
}

Se o timer tem intervalo de interrupção menor de 1 ms, é só colocar um contador, a cada x interrupts decrementa a var delay_ms.

Re: DELAYS LIVRES

MensagemEnviado: 15 Jul 2016 22:06
por Vonnilmam
Cara, C matou a pau....Parabéns,

Entendi perfeitamente, vou fazer uns testes e com certeza vou postar a idéia que vai ajudar a muitos amigos do forum.

Obrigado