//--------------------------------------- TIMERS -----------------------------------------------------------------//
#define PCTIM0 1
#define PCTIM1 2
#define PCTIM2 22
#define PCTIM3 23
#define MR0I 0
#define MR0R 1
#define MR0S 2
#define COUNTER_EN 0
#define COUNTER_R 1
void configura_timer0(u32 preescaler,u32 matcheo)
{
LPC_SC->PCONP|=(1<<PCTIM0); //Habilito el timer0 en el control de consumo de los periféricos
/* Los timers tienen 2 contadores, 1 es el prescaler y el otro es el contador en si mismo, ambos tienen registros son de 32 bits
por lo tanto por c/u puedo contar 2^32, osea como máximo podria contar hasta 2^64*Base de tiempo ---> muchoooos días :)
El timer sería una cosa así: Port-clk --> Prescaler --> Contador (Nota: Fcristal --> PLL --> Core-clock --> Divisor --> Port-clock)
- Prescaler -> 2 registros
. TxPR: Es el valor de la cuenta final del prescaler.
. TxPC: la cuenta del prescaler, también permite fijar desde donde comienza a contar el prescaler, cuando sea igual a TxPR, desborda y empieza de nuevo, mandandole una cuenta al otro contador
- Contador -> 4 registros
. TxTCR: Es un registro de control, si vale:
-0: el contador no cuenta.
-1: el contador cuenta.
-2: reseteo el contador.
. TxTC: la cuenta del contador, también permite fijar el valor de inicio del contador.
. TxMRx: Son varios registros (segun el timer pueden ser 4 o 3), acá se pondrá el valor de la cuenta q se desea alcanzar con el contador, cuando TxTC sea igual se produce un evento.
Son varios porq se lo puede configurar para q envie un evento en cuentas distintas, ej:
- TxMR0 = 34; Al llegar acá se produce un evento, pero el contador sigue
- TxMR1 = 45; Al llegar acá se produce otro evento
. TxMCR: Sirve para configurar q acción tomar cuando se produce un evento, es de 32 bits y c/3bits se configura un MRx distinto:
Sí se produce un evento en MRx y TxMCR vale:
- 001: lanza una interrupcion
- 010: se resetea el contador
- 100: se para el contador
Las 3 acciones se pueden combinar, osea interrumpir y resetear al mismo tiempo.
*/
//------------------ Configuración del Timer -----------------------------------------------//
LPC_TIM0->TCR=0; // el contador no cuenta
LPC_TIM0->TC=0; // el contador comienza de 0
LPC_TIM0->PR=preescaler; // configuro la cuenta del prescaler tal q le mande una cuenta al contador c/ 1 mSeg
LPC_TIM0->PC=0; // el prescaler comienza de 0
LPC_TIM0->MR0=matcheo; // configuro la cuenta del MR0 tal q cuente 1000 mSeg osea 1 seg
LPC_TIM0->MCR=(1<<MR0R)|(1<<MR0I); // configuro q al producirse un evento en MR0, se lance una interrupcion y se resetee el contador
//------------------------------------------------------------------------------------------//
//LPC_TIM0->IR=1; //Habilito la interrupción del timer 0 por match0
LPC_TIM0->TCR=(1<<COUNTER_EN); // el contador empieza a contar
}
void configura_timer1(u32 preescaler,u32 matcheo)
{
LPC_SC->PCONP|=(1<<PCTIM1); //Habilito el timer0 en el control de consumo de los periféricos
//------------------ Configuración del Timer -----------------------------------------------//
LPC_TIM1->TCR=0; // el contador no cuenta
LPC_TIM1->TC=0; // el contador comienza de 0
LPC_TIM1->PR=preescaler; // configuro la cuenta del prescaler tal q le mande una cuenta al contador c/ 1 mSeg
LPC_TIM1->PC=0; // el prescaler comienza de 0
LPC_TIM1->MR0=matcheo; // configuro la cuenta del MR0
LPC_TIM1->MCR=(1<<MR0R)|(1<<MR0I); // configuro q al producirse un evento en MR1, se lance una interrupcion y se resetee el contador
//------------------------------------------------------------------------------------------//
//LPC_TIM1->IR=1; //Habilito la interrupción del timer 1 por match0
LPC_TIM1->TCR=(1<<COUNTER_EN); // el contador empieza a contar
}
void configura_timer2(u32 preescaler,u32 matcheo)
{
LPC_SC->PCONP|=(1<<PCTIM2); //Habilito el timer0 en el control de consumo de los periféricos
//------------------ Configuración del Timer -----------------------------------------------//
LPC_TIM2->TCR=0; // el contador no cuenta
LPC_TIM2->TC=0; // el contador comienza de 0
LPC_TIM2->PR=preescaler; // configuro la cuenta del prescaler tal q le mande una cuenta al contador c/ 1 mSeg
LPC_TIM2->PC=0; // el prescaler comienza de 0
LPC_TIM2->MR0=matcheo; // configuro la cuenta del MR0
LPC_TIM2->MCR=(1<<MR0R)|(1<<MR0I); // configuro q al producirse un evento en MR1, se lance una interrupcion y se resetee el contador
//------------------------------------------------------------------------------------------//
LPC_TIM2->TCR=(1<<COUNTER_EN); // el contador empieza a contar
}
void configura_timer3(u32 preescaler,u32 matcheo)
{
LPC_SC->PCONP|=(1<<PCTIM3); //Habilito el timer0 en el control de consumo de los periféricos
//------------------ Configuración del Timer -----------------------------------------------//
LPC_TIM3->TCR=0; // el contador no cuenta
LPC_TIM3->TC=0; // el contador comienza de 0
LPC_TIM3->PR=preescaler; // configuro la cuenta del prescaler tal q le mande una cuenta al contador c/ 1 mSeg
LPC_TIM3->PC=0; // el prescaler comienza de 0
LPC_TIM3->MR0=matcheo; // configuro la cuenta del MR0
LPC_TIM3->MCR=(1<<MR0R)|(1<<MR0I); // configuro q al producirse un evento en MR1, se lance una interrupcion y se resetee el contador
//------------------------------------------------------------------------------------------//
LPC_TIM3->TCR=(1<<COUNTER_EN); // el contador empieza a contar
}
//--------------------------------------- TIMERS -----------------------------------------------------------------//
//--------------------------------------- EXTERNAS -----------------------------------------------------------------//
//----------------- Tipo y polaridad del disparo EXT1 ------------------//
#define EXT1_MODO_NIVEL 0
#define EXT1_MODO_FLANCO (1<<1)
#define EXT1_POL_NEG 0
#define EXT1_POL_POS (1<<1)
//----------------- Tipo y polaridad del disparo EXT1 ------------------//
//----------------- Configuración del PIN como EXT1 --------------------//
#define PINSEL_EXT1 (1<<22) //Bit 23:22 PINSEL4 -> Funcionando como /EXT1
#define PIN_EXT1 (1<<11)
//----------------- Configuración del PIN como EXT1 --------------------//
//----------------- Estados Anti-Rebote --------------------------------//
#define ANTI_REB_IDLE 0
#define ANTI_REB_FLANCO_DETECTADO 1
#define ANTI_REB_5MSEG 2
#define ANTI_REB_10MSEG 3
#define ANTI_REB_300MSEG 4
//----------------- Estados Anti-Rebote --------------------------------//
int anti_rebote_ext1(u8* variable_estado) //Para flanco descendente
{
switch(*variable_estado)
{
case ANTI_REB_IDLE:
{
configura_timer1(25000,5); //Pre-escaler 250000=> 5mSeg y 5cuentas => 5mSeg
flag_timer1=0;
*variable_estado=ANTI_REB_5MSEG;
break;
}
case ANTI_REB_5MSEG:
{
if(flag_timer1)
{
flag_timer1=0;
if(!(LPC_GPIO2->FIOPIN&PIN_EXT1)) //Verifico el estado Bajo después de 5mSeg
*variable_estado=ANTI_REB_10MSEG;
else
{
LPC_TIM1->TCR=0; // Paro el contador
*variable_estado=ANTI_REB_IDLE; // Vuelvo al 1er estado
LPC_PINCON->PINSEL4|=PINSEL_EXT1; //Habilito EXT1
flag_ext1=0; // Vuelvo a esperar por otra interrupción
} //Rebote detectado
}
break;
}
case ANTI_REB_10MSEG:
{