Proyecto de Tesis en Mecatrónica. Universidad Técnica del Norte. Ernesto Palacios <mecatronica.mid@gmail.com>
Dependencies: EthernetNetIf HTTPServer QEI_hw RPCInterface mbed
Diff: setup.cpp
- Revision:
- 2:a1b556d78a7f
- Child:
- 3:8d5a9e3cd680
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/setup.cpp Sat Mar 24 04:40:21 2012 +0000 @@ -0,0 +1,108 @@ +/// Codigo Fuente para configurar al + +#include "setup.h" +#include "mbed.h" + + +// Esta variable global determina +// los incrementos del Preescaler +extern uint32_t PRESCALER_STEP; + +// Salida Serial de mbed +extern Serial pc; + + +/** @brief: Esta función configura al Timer2 + * para que las salidas p5 y p6 del mbed + * se alternen cada vez que se iguala al + * registro MR2 y MR3. + */ +void Setup_PTO_Timer2() +{ + // Encender Timer2 (PCONP[22]) + LPC_SC->PCONP |= 1 << 22; + + // Resetear y parar el Timer + LPC_TIM2->TCR = 0x2; + LPC_TIM2->CTCR = 0x0; + + // Establecer el Preescaler inicial 0.5 seg + LPC_TIM2->PR = 100; + + // Calcular el periodo + uint32_t periodo = ( SystemCoreClock / 4000 ); + + // Establecer los Registros de Coincidencia + // ( Match Register ) + LPC_TIM2->MR2 = periodo; + LPC_TIM2->MR3 = periodo * 2; + + LPC_TIM2->MCR |= 1 << 10; // Resetear Timer en MR3 + + LPC_TIM2->EMR |= 15UL << 8; // Alternar Pin MAT2.2 + // y MAT2.3 + + LPC_PINCON->PINSEL0 |= 15UL << 16; //Activar MAT2.2 + // y MAT2.3 como salidas + + // Arrancer el Timer 2 + LPC_TIM2->TCR = 1; + +} + + +/** @brief: Esta es la rutina que maneja las interrupciones + * seriales, al recibir un caracter. + */ +void ISR_Serial() +{ + char c = pc.getc(); + + if( c == 'w') + setPeriodUp(); + else if( c == 's') + setPeriodDown(); + + else if( c == 'z') + { + float newStep; + pc.printf("\nIntroducir nuevo paso: "); + pc.scanf( "%d", &newStep ); + setPeriodStep( newStep ); + } + +} + + +/** @brief: Esta Funcion incrementará el preescaler + * del timer en un paso. + */ +void setPeriodUp() +{ + // Es muy dícil llegar a un límite superior + // de 4294967295 para los 32bit del preescaler + // Pero quizás haga falta chequear el + + LPC_TIM2->PR += PRESCALER_STEP; +} + + +/** @brief: Esta Funcion decrementará el preescaler + * del timer en un paso. + */ +void setPeriodDown() +{ + uint32_t prescaler = (uint32_t ) LPC_TIM2->PR ; + + if( prescaler > PRESCALER_STEP ) + LPC_TIM2->PR -= PRESCALER_STEP; +} + + +/** @brief: Esta Funcion Cambiara los pasos en los que + * se aumenta o disminuye el Preescaler. + */ +void setPeriodStep( uint32_t newStep ) +{ + PRESCALER_STEP = newStep; +} \ No newline at end of file