Other Parts Discussed in Thread: MSP430FR5730
Hi, I am using MSP430FR5730 for a shutter glass micocontroller. I need to capture IR LOW signal as interrupts.(120 Hz). So, I took Port2.1 as TimerB0 CCR0 capture as it is pointed in the datasheet below:
I am using MSP430 driver library. I set up continious mode for capture, I started captureand I choosed falling edge since I use this IR receiver below(1 is output)
So nothing is wrong on Hardware side. But I never catch the capture eventhough I monitor the IR output and IR works very fine. There must be something I missed in the code. Could you please help me? Here is my code:
#include "driverlib.h"
#include "msp430.h"
#include "msp430fr5730.h"
int tester = 0;
int tester2 = 0;
int temp;
int i;
int garbageTime;
_Bool state=0;
uint8_t orient = 0;
uint16_t capVal = 0;
uint16_t leftPack[4];
uint16_t rightPack[6];
#define TB2_BaseAddress 0x0440
#define TB0_BaseAddress 0x03C0
#define TA0_BaseAddress 0x0340
#define NO_Orientation 0x00
#define LEFT_Orientation 0x0A
#define RIGHT_Orientation 0x0B
/* USEFUL TIMERB METHODS
*
* Timer_B_getCaptureCompareCount(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_B_getCounterValue(uint16_t baseAddress);
* Timer_B_clearCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_B_clearTimerInterrupt(uint16_t baseAddress);
* Timer_B_clear(uint16_t baseAddress);
* Timer_B_getCaptureCompareInterruptStatus(uint16_t baseAddress, uint16_t captureCompareRegister, uint16_t mask);
* Timer_B_disableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_B_enableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_B_getInterruptStatus(uint16_t baseAddress);
* Timer_B_disableInterrupt(uint16_t baseAddress);
* Timer_B_enableInterrupt(uint16_t baseAddress);
* Timer_B_initCaptureMode(uint16_t baseAddress, sTimer_B_initCaptureModeParam *param);
* Timer_B_startCounter(uint16_t baseAddress, uint16_t timerMode);
*/
/* USEFUL TIMERA METHODS
* Timer_A_startCounter(uint16_t baseAddress, uint16_t timerMode);
* Timer_A_initUpMode(uint16_t baseAddress, Timer_A_initUpModeParam *param);
* Timer_A_enableInterrupt(uint16_t baseAddress);
* Timer_A_disableInterrupt(uint16_t baseAddress);
* Timer_A_getInterruptStatus(uint16_t baseAddress);
* Timer_A_enableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_A_disableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_A_getCaptureCompareInterruptStatus(uint16_t baseAddress, uint16_t captureCompareRegister, uint16_t mask);
* Timer_A_clear(uint16_t baseAddress);
* Timer_A_getCaptureCompareCount(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_A_stop(uint16_t baseAddress);
* Timer_A_setCompareValue(uint16_t baseAddress, uint16_t compareRegister, uint16_t compareValue);
* Timer_A_clearTimerInterrupt(uint16_t baseAddress);
* Timer_A_clearCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister);
* Timer_A_getCounterValue(uint16_t baseAddress);
*
*
*
*/
/* USEFUL GPIO METHODS
* GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_setAsInputPin(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_setOutputLowOnPin(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_getInputPinValue(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins);
* GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect);
*
*
*
*
*/
void setClock(void);
void setInterrupts(void);
void setOutputs(void);
void setInputs(void);
void setTimer(void);
void setCapComp(void);
void outRL(_Bool sw);
void setTimerAUp(void);
int main(void) {
WDT_A_hold(WDT_A_BASE);
//WDTCTL = WDTPW | WDTHOLD;
/*
P2OUT &= ~BIT2;
P2OUT &= ~BIT0;
P2DIR |= BIT2 | BIT0;
P2OUT |= BIT2 | BIT0;
*/
//setInterrupts();
setOutputs();
//setInputs();
setTimer();
setCapComp();
setContMode();
startTimer();
setTimerAUp();
GPIO_setOutputLowOnPin(GPIO_PORT_PJ, GPIO_PIN3 | GPIO_PIN2 | GPIO_PIN0); //Set EN0, CE and SYSOFF to LOW
GPIO_setOutputHighOnPin(GPIO_PORT_PJ, GPIO_PIN1); // Set EN1 to HIGH
temp = 0;
//__bis_SR_register(LPM0 | GIE);
__enable_interrupt();
while(1)
{
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
//
tester += 1;
if(state == 1)
{
//
outRL(1); // Left eye open
Timer_A_stop(TA0_BaseAddress);
Timer_A_clear(TA0_BaseAddress);
Timer_A_clearTimerInterrupt(TA0_BaseAddress);
state = 0;
}
else
{
//
Timer_A_stop(TA0_BaseAddress);
Timer_A_clear(TA0_BaseAddress);
Timer_A_clearTimerInterrupt(TA0_BaseAddress);
}
}
#pragma vector=TIMER0_B0_VECTOR
__interrupt void Timer_B(void)
{
//
tester2 += 1;
capVal = Timer_B_getCaptureCompareCount(TB0_BaseAddress, TIMER_B_CAPTURECOMPARE_REGISTER_0);
if(capVal > 934375/120 - 934375/600)
{
//
state = 1;
Timer_B_clear(TB0_BaseAddress);
Timer_B_clearCaptureCompareInterrupt(TB0_BaseAddress, TIMER_B_CAPTURECOMPARE_REGISTER_0);
Timer_B_clearTimerInterrupt(TB0_BaseAddress);
Timer_A_clear(TA0_BaseAddress);
Timer_A_clearTimerInterrupt(TA0_BaseAddress);
Timer_A_startCounter(TA0_BaseAddress, TIMER_A_UP_MODE);
}
else if(capVal <= 113 && state == 1) // if first bit was for left orientation 40 us
{
//
i = 0;
orient = LEFT_Orientation;
Timer_B_clear(TB0_BaseAddress);
Timer_B_clearCaptureCompareInterrupt(TB0_BaseAddress, TIMER_B_CAPTURECOMPARE_REGISTER_0);
Timer_B_clearTimerInterrupt(TB0_BaseAddress);
outRL(0); // Left eye open
state = 0;
}
}
void setClock(void)
{
//DCO set to 24 MHz
CS_setDCOFreq(CS_DCORSEL_1,
CS_DCOFSEL_3);
// SMCLK sourced by DCO and divided to 32*2
CS_initClockSignal(CS_SMCLK,
CS_DCOCLK_SELECT,
CS_CLOCK_DIVIDER_32);
//Turn on SMCLK
CS_turnOnSMCLK();
//1.33 uS is the cycle step
}
void setInterrupts(void)
{
// First clear the interrupts
GPIO_clearInterrupt(GPIO_PORT_P2,
GPIO_PIN1 | GPIO_PIN2);
// IR_OUT and PGOOD set as interrupt
GPIO_enableInterrupt(GPIO_PORT_P2,
GPIO_PIN1 | GPIO_PIN2);
// IR and PGOOD outs as selected high to low interrupts
GPIO_selectInterruptEdge(GPIO_PORT_P2,
GPIO_PIN1 | GPIO_PIN2,
GPIO_HIGH_TO_LOW_TRANSITION);
}
void setOutputs(void)
{
// Port 1, 0 to 7 pins are outputs to gate driver
GPIO_setAsOutputPin(GPIO_PORT_P1,
GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7);
GPIO_setAsOutputPin(GPIO_PORT_PJ,
GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3);
}
void setInputs(void)
{
// PGOOD!, CHG! and IR_OUT set as inputs
GPIO_setAsInputPin(GPIO_PORT_P2,
GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2);
}
void setTimer(void)
{
//
Timer_B_stop(TB0_BaseAddress);
Timer_B_clearTimerInterrupt(TB0_BaseAddress);
}
void startTimer(void)
{
//
Timer_B_clear(TB0_BaseAddress);
Timer_B_startCounter(TB0_BaseAddress, TIMER_B_CONTINUOUS_MODE);
}
void setCapComp(void)
{
//
Timer_B_initCaptureModeParam timerConfig_1 =
{
//
TIMER_B_CAPTURECOMPARE_REGISTER_0,
//TIMER_B_CAPTUREMODE_RISING_AND_FALLING_EDGE,
TIMER_B_CAPTUREMODE_FALLING_EDGE,
TIMER_B_CAPTURE_INPUTSELECT_CCIxA,
TIMER_B_CAPTURE_ASYNCHRONOUS,
TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE,
//TIMER_B_OUTPUTMODE_TOGGLE_RESET
TIMER_B_OUTPUTMODE_SET
};
//Configure TB2in capture mode like pointed in timerConfig1 module
Timer_B_initCaptureMode(TB0_BaseAddress,
&timerConfig_1);
// Select TimerB Counter length
Timer_B_selectCounterLength(TB0_BaseAddress,
TIMER_B_COUNTER_16BIT);
// Enable interrupt for timerB2 module
Timer_B_enableInterrupt(TB0_BaseAddress);
Timer_B_enableCaptureCompareInterrupt(TB0_BaseAddress,
TIMER_B_CAPTURECOMPARE_REGISTER_0);
}
void setTimerAUp(void)
{
//First stop timer A
Timer_A_stop(TA0_BaseAddress);
//
Timer_A_initUpModeParam timerAUp =
{
//
TIMER_A_CLOCKSOURCE_SMCLK,
TIMER_A_CLOCKSOURCE_DIVIDER_1,
//((24000000/64)/2)/120,
127,
TIMER_A_TAIE_INTERRUPT_ENABLE,
TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE,
TIMER_A_DO_CLEAR,
1
};
//initialize timer module
Timer_A_initUpMode(TA0_BaseAddress, &timerAUp);
//enable interrupt
Timer_A_enableInterrupt(TA0_BaseAddress);
//enable general interrupts
//__enable_interrupt();
//Start TimerA Up mode
//Timer_A_startCounter(TA0_BaseAddress, TIMER_A_UP_MODE);
}
void setContMode(void)
{
//
Timer_B_initContinuousModeParam timerContConfig =
{
TIMER_B_CLOCKSOURCE_SMCLK,
TIMER_B_CLOCKSOURCE_DIVIDER_1, // 934375 Hz measured
TIMER_B_TBIE_INTERRUPT_DISABLE,
TIMER_B_DO_CLEAR,
1
};
Timer_B_initContinuousMode(TB0_BaseAddress, &timerContConfig);
}
void outRL(_Bool sw)
{
//
if(sw)
{
//
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4 | GPIO_PIN5);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6 | GPIO_PIN7);
}
else
{
//GPIO_PIN6 | GPIO_PIN7
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6 | GPIO_PIN7);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4 | GPIO_PIN5);
}
}

