por xultz » 14 Mai 2012 10:51
Edy, a primeira coisa que você deve ter em mente é que o uso de funções do tipo delay deve ser evitado ao máximo. A maioria dos programadores considera o uso delas uma tremenda gambiarra. A menos que você esteja usando um sistema operacional no teu firmware, em que cada rotina é uma thread, aí sim, o uso do delay é obrigatório. Porém, se você não está usando um sistema operacional (que acho que é teu caso), o delay é uma péssima prática. Existem situações muito específicas que eu uso, por exemplo, num device driver para acionar display alfanumérico, que exige um pequeno delay (de 100us) para gravar um byte nele. Note que o delay é pequeno, e para uma situação muito específica.
Prá exemplificar minha ideia, vamos supor que você tenha o seguinte projeto:
Você tem um circuito com 4 botões, que vou chamar de A, B, C e D. E suponha que tenha 4 leds, que vou chamar de L1, L2, L3 e L4.
Suponha a seguinte especificação:
-Se pressionar A, liga L1 por 2 segundos.
-Se pressionar B, liga L2 por 3,5 segundos.
-Se pressionar C, liga L3 por 2,5 segundos.
-Se pressionar D, liga L4 por 5 segundos.
Se um led estiver aceso e pressionar outro botão, o led anterior deve continuar aceso (pelo seu tempo programado) e deve acender o outro led. Ou seja, é como se um led não tivesse nenhuma influência do outro. Cada led obedece ao seu botão e só.
Se um led estiver aceso e durante este período eu pressionar seu botão, o seu tempo reinicia. Se mantiver o botão pressionado, o led fica aceso, e quando soltar, ele apaga após passar seu tempo programado.
Pronto, é uma especificação tosca, mas é assim que o firmware deve se comportar.
Como implementar isto? Tem milhões de jeitos, vou exemplificar apenas um deles.
Eu crio uma interrupção de timer que gera a cada 100ms. Vou chamar a rotina de interrupção de timer_isr
Eu crio 4 variáveis globais do tipo unsigned char chamadas T1, T2, T3, T4 e inicializo todas com 0.
Na rotina timer_isr, faço o seguinte código:
T1 !=0 ? Então T1--
T2 !=0 ? Então T2--
T3 !=0 ? Então T3--
T4 !=0 ? Então T4--
Ou seja, se uma variável de tempo T estiver diferente de 0, ele decrementa em 1 esta variável.
Na rotina principal, ele vai ter um loop:
Botão A pressionado? Então T1 = 20, liga L1
Botão B pressionado? Então T2 = 35, liga L2
Botão C pressionado? Então T3 = 25, liga L3
Botão D pressionado? Então T4 = 50, liga L4
T1 == 0? Então desliga L1
T2 == 0? Então desliga L2
T3 == 0? Então desliga L3
T4 == 0? Então desliga L4
E refaz o loop
Me fiz entender?
98% das vezes estou certo, e não estou nem aí pros outros 3%.