Proyecto de Tesis en Mecatrónica. Universidad Técnica del Norte. Ernesto Palacios <mecatronica.mid@gmail.com>

Dependencies:   EthernetNetIf HTTPServer QEI_hw RPCInterface mbed

setup.cpp

Committer:
Yo_Robot
Date:
2012-03-24
Revision:
2:a1b556d78a7f
Child:
3:8d5a9e3cd680

File content as of revision 2:a1b556d78a7f:

/// 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;
}