DELAYS LIVRES

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

DELAYS LIVRES

Mensagempor Vonnilmam » 15 Jul 2016 15:08

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:
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: DELAYS LIVRES

Mensagempor eletroinf » 15 Jul 2016 16:52

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

Re: DELAYS LIVRES

Mensagempor Vonnilmam » 15 Jul 2016 22:06

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
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial


Voltar para PIC

Quem está online

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

x