Projet S5 Lecture de l'accelerometre avec interruption

Dependencies:   mbed PowerControl

Fork of Projet_S5 by Jonathan Tousignant

main.cpp

Committer:
joGenie
Date:
2014-03-27
Revision:
2:d7784cc39c81
Parent:
1:feae56685ab1
Child:
3:17a4ceb30535

File content as of revision 2:d7784cc39c81:

#include "accelerometer.h"
#include "interrupt.h"

Serial pc(USBTX, USBRX);
DigitalOut led1(LED1);
DigitalOut out(p26);

void *accelerometer = Accelerometer_C_new();
bool capture = false;
bool first = true;
bool ready = false;

extern "C" void interruptCapture(void)
{
    if ((LPC_TIM2->IR & 0x10) == 0x10) // Interrupt capture
    {
        ready = !ready;
        if (first)
        {
            capture = !capture;
            first = false;
            
            LPC_TIM2->TC = 0;       // clear timer counter
            LPC_TIM2->PC = 0;       // clear prescale counter
            LPC_TIM2->PR = 0;       // clear prescale register
            LPC_TIM2->MCR |= 0x03;  // interrupt and reset control
        }
        
    } 
    else if ((LPC_TIM2->IR & 0x01) == 0x01) // Interrupt match
    {
        if (ready)
        {
            if (capture)
            {
                LPC_TIM3->TC = 0;       // clear timer counter
                LPC_TIM3->PC = 0;       // clear prescale counter
                LPC_TIM3->PR = 0;       // clear prescale register
                LPC_TIM3->IR |= 0xFF;
                
                NVIC_EnableIRQ(TIMER3_IRQn); // Enable timer3 interrupt
            }
            else
            {
                NVIC_DisableIRQ(TIMER3_IRQn); // Disable timer3 interrupt
            }
            
            ready = false;
            first = true;
            LPC_TIM2->MCR = 0;
        } 
    }
    
    LPC_TIM2->IR |= 0xFF;
}

extern "C" void interruptMatch(void)
{
    unsigned short* values;
    
    values = Accelerometer_C_getAccelValue(accelerometer);
    
    for(int i = 0; i < 3; i++)
        pc.printf("%d; ", values[i]);
        
    pc.printf("\n");
    

    LPC_TIM3->IR |= 0x01; // Reset timer  
}

void initialize()
{
    // Set system control
    LPC_SC->PCONP |= (3 << 22); // Enable Timer2 and Timer3
    LPC_SC->PCLKSEL1 |= (1 << 12); // PClk Timer2 = CCLK
    LPC_SC->PCLKSEL1 |= (1 << 14); // PClk Timer3 = CCLK
    
    // Set pin connection
    LPC_PINCON->PINSEL0 |= (3 << 8) | (3 << 12) | (3 << 20); // Capture 2.0 and Match 2.0 and Match 3.0
    
    // Set timer 2 for capture
    LPC_TIM2->TC = 0;               // clear timer counter
    LPC_TIM2->PC = 0;               // clear prescale counter
    LPC_TIM2->PR = 0;               // clear prescale register
    LPC_TIM2->TCR |= (1 << 1);      // reset timer
    LPC_TIM2->TCR &= ~(1 << 1);     // release reset
    LPC_TIM2->MR0 = SystemCoreClock / 10000;
    
    //LPC_TIM2->MCR |= 0x03;          // interrupt and reset control
    LPC_TIM2->IR |= 0xFF;           // Clear interrupt flag
    LPC_TIM2->CCR |= 0x07;          // enable cap2.0 rising-edge capture and falling-edge; interrupt on cap2.0
    
    // Set timer 3 for match
    LPC_TIM3->MR0 = SystemCoreClock / 20;
    LPC_TIM3->MCR |= 0x03;              // interrupt and reset control
    LPC_TIM3->TC = 0;                   // clear timer counter
    LPC_TIM3->PC = 0;                   // clear prescale counter
    LPC_TIM3->PR = 0;                   // clear prescale register
    LPC_TIM3->TCR = 0x1;                // enable timer3
    LPC_TIM3->IR |= 1 << 0;             // Clear MR0 interrupt flag
    
    // Set call function
    NVIC_SetVector(TIMER2_IRQn, uint32_t(interruptCapture));
    NVIC_SetVector(TIMER3_IRQn, uint32_t(interruptMatch));
        
    NVIC_EnableIRQ(TIMER2_IRQn);    // enable timer2 interrupt
    LPC_TIM2->TCR = 0x01;           // start Timer2
}

int main()
{
    initialize();
    
    while(true)
    {
    }
}