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:
- 3:8d5a9e3cd680
- Parent:
- 2:a1b556d78a7f
- Child:
- 4:552beeda4722
--- a/setup.cpp Sat Mar 24 04:40:21 2012 +0000 +++ b/setup.cpp Sat Mar 24 17:37:20 2012 +0000 @@ -1,108 +1,110 @@ -/// 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; +/// 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() +{ + int newValue; + char command; + + pc.scanf( "%d-%c", &newValue, &command ) ; + pc.printf("\n %d-%c \n", newValue, command ); + + if( command == 'p') + setPrescaler( newValue ); + else if( command == 'm') + setMR2( newValue ); + else if( command == 'n') + setMR3( newValue ); + else if( command == 'a') + startTimer2(); + else if( command == 's') + stopTimer2(); + + +} + + +/** @brief: Esta Funcion cambia el preescaler + * directamente + */ +void setPrescaler( int newValue) +{ + LPC_TIM2->PR = newValue; +} + + +void setMR2( int newValue ) +{ + LPC_TIM2->MR2 = newValue; +} + + +void setMR3( int newValue ) +{ + LPC_TIM2->MR3 = newValue; +} + +void startTimer2() +{ + // Arrancer el Timer 2 + LPC_TIM2->TCR = 1; +} + +void stopTimer2() +{ + // Arrancer el Timer 2 + LPC_TIM2->TCR = 0x2; } \ No newline at end of file