📄 cts_hal.c
字号:
// TIMERA0: TA0CTL
// Ports: PxSEL, PxSEL2
uint16_t contextSaveTA0CTL, contextSaveTA0CCTL0;
uint8_t contextSaveSel,contextSaveSel2;
contextSaveTA0CTL = TA0CTL;
contextSaveTA0CCTL0 = TA0CCTL0;
// Setup Measurement timer
TACCR0 =(group->accumulationCycles);
for (i =0; i< (group->numElements); i++)
{
j = 0;
// Context Save
contextSaveSel = *((group->arrayPtr[i])->inputPxselRegister);
contextSaveSel2 = *((group->arrayPtr[i])->inputPxsel2Register);
// start single oscillation (rise then fall and trigger on fall)
*((group->arrayPtr[i])->inputPxselRegister) &= ~((group->arrayPtr[i])->inputBits);
*((group->arrayPtr[i])->inputPxsel2Register) |= ((group->arrayPtr[i])->inputBits);
TA0CTL = TASSEL_3+TACLR+MC_1; // INCLK, reset, up mode
TA0CTL &= ~TAIFG; // clear IFG
// start timer in up mode
while(!(TA0CTL & TAIFG))
{
j++;
} // end accumulation
counts[i] = j;
TA0CTL &= ~MC_1;
// Context Restore
*((group->arrayPtr[i])->inputPxselRegister) = contextSaveSel;
*((group->arrayPtr[i])->inputPxsel2Register) = contextSaveSel2;
}
// End Sequence
// Context Restore
TA0CTL = contextSaveTA0CTL;
TA0CCTL0 = contextSaveTA0CCTL0;
}
#endif
#ifdef RO_PINOSC_TA0_WDTp
/***************************************************************************//**
* @brief RO method capactiance measurement using PinOsc IO, TimerA0, and WDT+
*
* Schematic Description:
*
* \n element-----+->Px.y
*
* \n The WDT+ interval represents the measurement window. The number of
* counts within the TA0R that have accumulated during the measurement
* window represents the capacitance of the element.
*
* @param group Pointer to the structure describing the Sensor to be measured
* @param counts Pointer to where the measurements are to be written
* @return none
******************************************************************************/
void TI_CTS_RO_PINOSC_TA0_WDTp_HAL(const struct Sensor *group,uint16_t *counts)
{
uint8_t i;
//** Context Save
// Status Register:
// WDTp: IE1, WDTCTL
// TIMERA0: TA0CTL, TA0CCTL1
// Ports: PxSEL, PxSEL2
uint8_t contextSaveSR;
uint8_t contextSaveIE1;
uint16_t contextSaveWDTCTL;
uint16_t contextSaveTA0CTL,contextSaveTA0CCTL1,contextSaveTA0CCR1;
uint8_t contextSaveSel,contextSaveSel2;
contextSaveSR = __get_SR_register();
contextSaveIE1 = IE1;
contextSaveWDTCTL = WDTCTL;
contextSaveWDTCTL &= 0x00FF;
contextSaveWDTCTL |= WDTPW;
contextSaveTA0CTL = TA0CTL;
contextSaveTA0CCTL1 = TA0CCTL1;
contextSaveTA0CCR1 = TA0CCR1;
//** Setup Measurement timer***************************************************
// Choices are TA0,TA1,TB0,TB1,TD0,TD1 these choices are pushed up into the
// capacitive touch layer.
// Configure and Start Timer
TA0CTL = TASSEL_3+MC_2; // TACLK, cont mode
TA0CCTL1 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
IE1 |= WDTIE; // enable WDT interrupt
for (i = 0; i<(group->numElements); i++)
{
// Context Save
contextSaveSel = *((group->arrayPtr[i])->inputPxselRegister);
contextSaveSel2 = *((group->arrayPtr[i])->inputPxsel2Register);
// Configure Ports for relaxation oscillator
*((group->arrayPtr[i])->inputPxselRegister) &= ~((group->arrayPtr[i])->inputBits);
*((group->arrayPtr[i])->inputPxsel2Register) |= ((group->arrayPtr[i])->inputBits);
//** Setup Gate Timer ********************************************************
// Set duration of sensor measurment
//WDTCTL = (WDTPW+WDTTMSEL+group->measGateSource+group->accumulationCycles);
WDTCTL = (WDTPW+WDTTMSEL+(group->measGateSource)+(group->accumulationCycles));
TA0CTL |= TACLR; // Clear Timer_A TAR
if(group->measGateSource == GATE_WDT_ACLK)
{
__bis_SR_register(LPM3_bits+GIE); // Wait for WDT interrupt
}
else
{
__bis_SR_register(LPM0_bits+GIE); // Wait for WDT interrupt
}
TA0CCTL1 ^= CCIS0; // Create SW capture of CCR1
counts[i] = TA0CCR1; // Save result
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// Context Restore
*((group->arrayPtr[i])->inputPxselRegister) = contextSaveSel;
*((group->arrayPtr[i])->inputPxsel2Register) = contextSaveSel2;
}
// End Sequence
// Context Restore
__bis_SR_register(contextSaveSR);
if(!(contextSaveSR & GIE))
{
__bic_SR_register(GIE); //
}
IE1 = contextSaveIE1;
WDTCTL = contextSaveWDTCTL;
TA0CTL = contextSaveTA0CTL;
TA0CCTL1 = contextSaveTA0CCTL1;
TA0CCR1 = contextSaveTA0CCR1;
}
#endif
#ifdef RO_PINOSC_TA0
/***************************************************************************//**
* @brief RO method capactiance measurement using PinOsc IO, and TimerA0
*
* Schematic Description:
*
* \n element-----+->Px.y
*
* \n The measurement window is accumulation_cycles/ACLK. The ACLK is
* used to generate a capture event via the internal connection CCIOB.
* The counts within the TA0R that have accumulated during the
* measurement window represents the capacitance of the element.
*
* @param group Pointer to the structure describing the Sensor to be measured
* @param counts Pointer to where the measurements are to be written
* @return none
******************************************************************************/
void TI_CTS_RO_PINOSC_TA0_HAL(const struct Sensor *group,uint16_t *counts)
{
uint8_t i;
uint16_t j;
//** Context Save
// TIMERA0: TA0CTL, TA0CCTL0
// Ports: PxSEL, PxSEL2
uint16_t contextSaveTA0CTL,contextSaveTA0CCTL0,contextSaveTA0CCR0;
uint8_t contextSaveSel,contextSaveSel2;
contextSaveTA0CTL = TA0CTL;
contextSaveTA0CCTL0 = TA0CCTL0;
contextSaveTA0CCR0 = TA0CCR0;
//** Setup Measurement timer***************************************************
// Choices are TA0,TA1,TB0,TB1,TD0,TD1 these choices are pushed up into the
// capacitive touch layer.
// Configure and Start Timer
TA0CTL = TASSEL_3+MC_2; // TACLK, cont mode
for (i =0; i< (group->numElements); i++)
{
// Context Save
contextSaveSel = *((group->arrayPtr[i])->inputPxselRegister);
contextSaveSel2 = *((group->arrayPtr[i])->inputPxsel2Register);
// Configure Ports for relaxation oscillator
j = (group->accumulationCycles);
*((group->arrayPtr[i])->inputPxselRegister) &= ~((group->arrayPtr[i])->inputBits);
*((group->arrayPtr[i])->inputPxsel2Register) |= ((group->arrayPtr[i])->inputBits);
TA0CCTL0 = CM_3+CCIS_1+CAP; // Pos&Neg,ACLK (CCI0B),Cap
while(!(TA0CCTL0 & CCIFG)); // wait for capture event
TA0CTL |= TACLR; // Clear Timer_A TAR
while(j--)
{
TA0CCTL0 = CM_3+CCIS_1+CAP; // Pos&Neg,ACLK (CCI0B),Cap
while(!(TA0CCTL0 & CCIFG)); // wait for capture event
}
counts[i] = TA0CCR0; // Save result
TA0CTL = TASSEL_3+MC_2;
// Context Restore
*((group->arrayPtr[i])->inputPxselRegister) = contextSaveSel;
*((group->arrayPtr[i])->inputPxsel2Register) = contextSaveSel2;
}
// End Sequence
// Context Restore
TA0CTL = contextSaveTA0CTL;
TA0CCTL0 = contextSaveTA0CCTL0;
TA0CCR0 = contextSaveTA0CCR0;
}
#endif
#ifdef RO_COMPB_TA0_WDTA
/***************************************************************************//**
* @brief RO method capactiance measurement using CompB, TimerA0, and WDTA
*
* \n Schematic Description of CompB forming relaxation oscillator and
* coupling (connection) between the relaxation oscillator and TimerA0.
* \n <- Output
* \n -> Input
* \n R Resistor (typically 100Kohms)
*
* \n element---R----<-CBOUT/TA0CLK
*
* \n The WDTA interval represents the measurement window. The number of
* counts within the TA0R that have accumulated during the measurement
* window represents the capacitance of the element.
*
* @param group Address of the structure describing the Sensor to be measured
* @param counts Address to where the measurements are to be written
* @return none
******************************************************************************/
void TI_CTS_RO_COMPB_TA0_WDTA_HAL(const struct Sensor *group,uint16_t *counts)
{
uint8_t i;
//** Context Save
// Status Register:
// WDTA: IE1, WDTCTL
// TIMERA0: TA0CTL, TA0CCTL1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: CboutDIR, CboutSel
uint8_t contextSaveSR;
uint16_t contextSaveSFRIE1;
uint16_t contextSaveWDTCTL;
uint16_t contextSaveTA0CTL,contextSaveTA0CCTL1,contextSaveTA0CCR1;
uint16_t contextSaveCBCTL0,contextSaveCBCTL1;
uint16_t contextSaveCBCTL2,contextSaveCBCTL3;
uint8_t contextSaveCboutDir,contextSaveCboutSel;
contextSaveSR = __get_SR_register();
contextSaveSFRIE1 = SFRIE1;
contextSaveWDTCTL = WDTCTL;
contextSaveWDTCTL &= 0x00FF;
contextSaveWDTCTL |= WDTPW;
contextSaveTA0CTL = TA0CTL;
contextSaveTA0CCTL1 = TA0CCTL1;
contextSaveTA0CCR1 = TA0CCR1;
contextSaveCBCTL0 = CBCTL0;
contextSaveCBCTL1 = CBCTL1;
contextSaveCBCTL2 = CBCTL2;
contextSaveCBCTL3 = CBCTL3;
contextSaveCboutDir = *(group->cboutTAxDirRegister);
contextSaveCboutSel = *(group->cboutTAxSelRegister);
//** Setup Measurement timer***************************************************
// connect CBOUT with TA0
*(group->cboutTAxDirRegister) |= (group->cboutTAxBits);
*(group->cboutTAxSelRegister) |= (group->cboutTAxBits);
CBCTL2 = CBREF14+CBREF13 + CBREF02;
// Configure Timer TA0
TA0CTL = TASSEL_0+MC_2; // TACLK, cont mode
TA0CCTL1 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
// Turn on Comparator
CBCTL1 = CBON + CBF; // Turn on comparator with filter
// Vcc to resistor ladder
CBCTL3 |= (group->cbpdBits); // set CPD bits to disable
// I/O buffer
SFRIE1 |= WDTIE; // enable WDT interrupt
CBCTL2 |= CBRS_1; // Turn on reference
for (i = 0; i<(group->numElements); i++)
{
CBCTL0 = CBIMEN + (group->arrayPtr[i])->inputBits;
//** Setup Gate Timer ********************************************************
// Set duration of sensor measurment
WDTCTL = WDTPW+WDTTMSEL+ group->measGateSource + group->accumulationCycles;
TA0CTL |= TACLR; // Clear Timer_A TAR
if(group->measGateSource == GATE_WDTA_ACLK)
{
__bis_SR_register(LPM3_bits+GIE); // Wait for WDT interrupt
}
else
{
__bis_SR_register(LPM0_bits+GIE); // Wait for WDT interrupt
}
TA0CCTL1 ^= CCIS0; // Create SW capture of CCR1
counts[i] = TA0CCR1; // Save result
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
}
// End Sequence
//** Context Restore
// WDTA: IE1, WDCTL
// TIMERA0: TACTL, TACCTL1
// COMPB: CBCTL0, CBCTL1, CBCTL2, CBCTL3
// Ports: CboutDIR, CboutSel
__bis_SR_register(contextSaveSR);
if(!(contextSaveSR & GIE))
{
__bic_SR_register(GIE); // Wait for WDT interrupt
}
SFRIE1 = contextSaveSFRIE1;
WDTCTL = contextSaveWDTCTL;
TA0CTL = contextSaveTA0CTL;
TA0CCTL1 = contextSaveTA0CCTL1;
TA0CCR1 = contextSaveTA0CCR1;
CBCTL0 = contextSaveCBCTL0;
CBCTL1 = contextSaveCBCTL1;
CBCTL2 = contextSaveCBCTL2;
CBCTL3 = contextSaveCBCTL3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -