Uses Timer 0 of the 11U24 to capture input pulsesl

capturet0_11u24.cpp

Committer:
hexley
Date:
2014-03-13
Revision:
0:22c6b94e7da6

File content as of revision 0:22c6b94e7da6:

 /* mbed Library - Capture driver for CT32B0
 * Copyright (c) 2010
 * released under MIT license http://mbed.org/licence/mit
 */
 /***********************************************************************//**
 * @file        capturet1_11u24.cpp
 * @brief       Driver file for the CAP1 function of CT32B0 in the  mbed 11U24. 
 * @version     0.0
 * @date        05 Feb 2014
 * @author      
 **************************************************************************/
#include "mbed.h"
#include "capturet0_11u24.h"

Capture *Capture::instance;

/*********************************************************************//**
 * @brief       Create a Capture object and configure it. 
 * @param       None   Uses p7 as the Capture input
 * @return      None
 **********************************************************************/
Capture::Capture(void)
{       
    /* Set up clock and power, using default peripheral system clock divider */   
    LPC_SYSCON->SYSAHBCLKCTRL |=   CT32B0_CLK_ENABLE; // See page 30 of the 11U24 User Guide
    // Check the clock divider ratio by reading   LPC_SYSCON->SYSAHBCLKDIV ls byte
    LPC_CT32B0->PR  =  0;                           // Prescale counter divide by 1
       
    /* Configure IOCON for the proper function of the capture pin. Use a pull-up.     */
    LPC_IOCON->PIO1_29 = (CT32B0_CAP1 | CAP_PULLUP); // See page 114 of the 11U24 User Guide   
              
    // Select the capture edge and int mode
    LPC_CT32B0->CCR =   CCR_CAP1FE  | CCR_CAP1I;    // Select inputs and interrupts. See page 345
    
    // Set up the rising edge clear, using timer mode
    LPC_CT32B0->CTCR = CTCR_CTM_TIMER | CTCR_ENCC | CTCR_SEICC_CAP1RE; // See page 350
    
        
    // Clear interrupt flag
    LPC_CT32B0->IR = IR_CR1INT;     // See page 342             
  
    /* preemption = 1, sub-priority = 1 */
//    NVIC_SetPriority(TIMER2_IRQn, ((0x01<<3)|0x01));
//     NVIC_SetPriority(TIMER2_IRQn, 0);          // Set to top priority to minimize interference from tickers.
     
    //* Attach IRQ
    instance = this;
    NVIC_SetVector(TIMER_32_0_IRQn, (uint32_t)&_Captureisr);                   
  
}

/*********************************************************************//**
 * @brief        Start capturing data. Average the specified number of samples. 
 * @param        (int) numsamples    Log base 2 of the number of samples to be averaged
 * @return        None
 **********************************************************************/
void Capture::Start(int numsamples) {
    Nsamples = numsamples;
    capturedata = 0;                        // Clear the accumulator
    flag = 0;                               // No data ready
    
    /* Enable interrupt for CAPTURE  */
    NVIC_EnableIRQ(TIMER_32_0_IRQn); 
    
    // Start the timer
    LPC_CT32B0->TCR =  TCR_CEN; // enable
}

/*********************************************************************//**
 * @brief        Read (accumulated) sample count. 
 * 
 * @return       (unsigned int) Accumulated capture value
 **********************************************************************/
unsigned int Capture::Read(void) {
    flag = 0;                   // Clear previous status (or error)
    return capturedata;
}

/*********************************************************************//**
 * @brief        Check for accumulation complete (data is ready to read). 
 * 
 * @return       (unsigned int) Accumulated capture value
 **********************************************************************/
int Capture::Ready(void) {
    return flag;
}


/* Capture isr instantiator */    
void Capture::_Captureisr(void)
{
    instance->Captureisr();
}

/*********************************************************************//**
 * @brief        Capture interrupt service routine. Handles accumulation.
 * 
 * @param[in]    none
 *                                 
 * @return       none
 **********************************************************************/
void Capture::Captureisr(void) {
    static unsigned int samplecount = 0;   // Counts passes
    static unsigned int capturesum = 0;    // Accumulates the readings
    
    if(LPC_CT32B0->IR & IR_CR1INT) {
        LPC_CT32B0->IR |= IR_CR1INT;       // Clear the interrupt request
        capturesum += LPC_CT32B0->CR2;     // Read and accumulate the captured results
                                            // It is necessary to use "CR2" in order to get the proper
                                            //  offset from the base address (an issue with CMSIS)
        if(++samplecount == Nsamples) {
            capturedata = capturesum;      // Update the output data
            samplecount = 0;               // Restart the pass counter
            capturesum = 0;                // Re-initialize the running total
            if(flag != 0) flag = -1;       // Make flag negative on an overrun
            else flag = 1;                 // Set flag to 1 if no error
        }     
    }
    return;
}