estou tentando fazer um contador regressivo com PIC 18f4550, teria que ter um ajuste de tempo e quando chegar ao final do tempo tem que acionar uma sirene, em linguagem c.

att

Exibições: 1489

Responder esta

Respostas a este tópico

Flavio, Para o contador ficar preciso você deve usar uma interrupção de algum timer. Bom vai depender do tanto que você precisa contar, se for algo tipo até uns 3 segundo você consegue fazer o timer contar até isso. Agora se você precisa contar tempos maiores tem que fazer o timer ir somando ou diminuindo uma variável. Você pode fazer por exemplo um timer que estoura a cada 1s, e a cada estouro do timer, você diminui um em uma variável de referência, logo essa variável será seu contador.

Deu para entender?

mais ou menos, vc tem um exemplo?

att

Flavio, peguei um pedaço de um código que eu tinha exatamente para o 18f4550.

Nessa caso eu precisava de um contador a cada 20ms. 

Você pode mexer nos pre e pós scaler para ajudar a contar tempos maiores, ou simplesmente mexer na conta.

Segue o exemplo. Ps. não se esqueça de reiniciar o contador ou ter cuidado (no caso de milisegundos) para ele não estourar.

#include <18F2550.h>
#fuses HS,NOWDT,PROTECT,CPUDIV1
#use delay(clock=20000000)

// Variável que vai contar os milisegundos.
int32 contador_mili_segundo = 0;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////// INTERUPÇÃO DO TIMER0 ////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#int_RTCC
void RTCC_isr(void)
{

// O Valor do Timer deve sempre ser acrescido de um valor ao inicial o loop, para que o estouro aconteça sempre após 20ms,
set_timer0(15536 + get_timer0());

contador_mili_segundo = contador_mili_segundo + contador_mili_segundo;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCAO PRINCIPAL////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main (void)
{

// Para o Clock do Cristal de 20.000.000, o Clock interno é de 5.000.000. -> (20.000.000 / 4).
// Usando um Prescaler de 2 temos 2.500.000 ciclos por segundo. Para acontecer uma interrupção a cada 20ms devo pegar 1/50 de 2.500.000
// 1/50 de 2.500.000 = 50.000 ciclos por loop.
// O timer deve portanto contar até 50.000.
// Como ele é de 16 bits, ele conta até 256*256 = 65536.
// Para ele contar até os 50.000 devo sempre iniciar ele em 65536 - 50.000 = 15536.
// Essa interrupção irá acontecer a cada 20ms.

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //840 ms overflow

set_timer0 (15536);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);

// * LOOP PRINCIPAL *
for (;;)
{
}

}

muito obrigado Antonio, vou testar.... 

att

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço