📄 cts_hal.c
字号:
CACTL2= group->refCactl2Bits + (group->arrayPtr[i])->inputBits;
//** Setup Gate Timer **************
// Set duration of sensor measurment
TACTL = TASSEL_0+TACLR+MC_1; // TACLK, reset, up mode
TACTL &= ~TAIFG; // clear IFG
while(!(TACTL & TAIFG))
{
j++;
} // end accumulation
counts[i] = j;
}
// End Sequence
//** Context Restore
// TIMERA0: TACTL, TACCTL1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: caoutDIR, caoutSel, txclkDIR, txclkSel, caoutSel2, txclkSel2, refout, refdir
#ifdef SEL2REGISTER
*(group->caoutSel2Register) = contextSaveCaoutSel2;
*(group->txclkSel2Register) = contextSaveTxclkSel2;
#endif
TACTL = contextSaveTACTL;
TACCTL0 = contextSaveTACCTL0;
TACCR0 = contextSaveTACCR0;
CACTL1 = contextSaveCACTL1;
CACTL2 = contextSaveCACTL2;
CAPD = contextSaveCAPD;
*(group->caoutDirRegister) = contextSaveCaoutDir;
*(group->caoutSelRegister) = contextSaveCaoutSel;
*(group->txclkDirRegister) = contextSavetxclkDir;
*(group->txclkSelRegister) = contextSavetxclkSel;
*(group->refPxdirRegister) = contextSaveRefDir;
*(group->refPxoutRegister) = contextSaveRefOutSel;
}
#endif
#ifdef fRO_COMPAp_SW_TA0
/***************************************************************************//**
* @brief RO method capactiance measurement using CompA+, TimerA0, and SW loop
*
* \n Schematic Description of CompA+ forming relaxation oscillator.
* \n <- Output
* \n -> Input
* \n R Resistor (typically 100Kohms)
* \n
* \n +-<-Px.y (reference)
* \n |
* \n R
* \n |
* \n +---+-->COMPA+
* \n | |
* \n R R
* \n | |
* \n GND |
* \n |
* \n |
* \n element-+-R--+-<-CAOUT
* \n |
* \n +------->COMPA-
* \n
* \n The SW loop counts to 'n' accumulationCycles, representing the
* \n measurement window. The number of timer counts within TA0R register
* \n 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_fRO_COMPAp_SW_TA0_HAL(const struct Sensor *group, uint16_t *counts)
{
uint8_t i;
uint16_t j;
//** Context Save
// Status Register:
// TIMERA0: TACTL, TACCTL0, TACCTL1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: caoutDIR, caoutSel, caoutSel2, refout, refdir
uint16_t contextSaveTACTL,contextSaveTACCTL0,contextSaveTACCTL1;
uint16_t contextSaveTACCR0,contextSaveTACCR1;
uint8_t contextSaveCACTL1,contextSaveCACTL2,contextSaveCAPD;
uint8_t contextSaveCaoutDir,contextSaveCaoutSel;
uint8_t contextSaveRefDir,contextSaveRefOutSel;
#ifdef SEL2REGISTER
uint8_t contextSaveCaoutSel2,contextSaveTxclkSel2;
contextSaveCaoutSel2 = *(group->caoutSel2Register);
#endif
contextSaveTACTL = TACTL;
contextSaveTACCTL0 = TACCTL0;
contextSaveTACCTL1 = TACCTL1;
contextSaveTACCR0 = TACCR0;
contextSaveTACCR1 = TACCR1;
contextSaveCACTL1 = CACTL1;
contextSaveCACTL2 = CACTL2;
contextSaveCAPD = CAPD;
contextSaveCaoutDir = *(group->caoutDirRegister);
contextSaveCaoutSel = *(group->caoutSelRegister);
contextSaveRefDir = *(group->refPxdirRegister);
contextSaveRefOutSel = *(group->refPxoutRegister);
//** Setup Measurement timer***************************************************
// Configure Timer TA0
TACCTL0 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
TACCTL1 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
// setup connections between CAOUT and TA0
*(group->caoutDirRegister) |= group->caoutBits;
*(group->caoutSelRegister) |= group->caoutBits;
#ifdef SEL2REGISTER
*(group->caoutSel2Register) |= group->caoutBits;
#endif
// setup reference
*(group->refPxdirRegister) |= group->refBits;
*(group->refPxoutRegister) |= group->refBits;
CACTL1 |= CAON; // Turn on comparator
CAPD |= (group->capdBits);
for (i = 0; i<(group->numElements); i++)
{
CACTL2= group->refCactl2Bits + (group->arrayPtr[i])->inputBits;
//** Setup Gate Timer **************
// Set duration of sensor measurment
TACTL = group->measureGateSource+group->sourceScale+TACLR+MC_2;
TACCTL0 ^= CCIS0; // Create SW capture of CCR0
for(j = group->accumulationCycles; j > 0; j--)
{
CACTL1 &= ~CAIFG;
while(!(CACTL1 & CAIFG));
}
TACCTL1 ^= CCIS0; // Create SW capture of CCR1
counts[i] = TACCR1; // Save result
counts[i] -= TACCR0; // Save result
TACCTL0 &= ~CCIFG;
TACCTL1 &= ~CCIFG;
}
// End Sequence
//** Context Restore
// WDTp: IE1, WDCTL
// TIMERA0: TACTL, TACCTL0, TACCTL1, TACCR0, TACCR1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: caoutDIR, caoutSel, txclkDIR, caoutSel2, refout, refdir
#ifdef SEL2REGISTER
*(group->caoutSel2Register) = contextSaveCaoutSel2;
#endif
TACTL = contextSaveTACTL;
TACCTL0 = contextSaveTACCTL0;
TACCTL1 = contextSaveTACCTL1;
TACCR0 = contextSaveTACCR0;
TACCR1 = contextSaveTACCR1;
CACTL1 = contextSaveCACTL1;
CACTL2 = contextSaveCACTL2;
CAPD = contextSaveCAPD;
*(group->caoutDirRegister) = contextSaveCaoutDir;
*(group->caoutSelRegister) = contextSaveCaoutSel;
*(group->refPxdirRegister) = contextSaveRefDir;
*(group->refPxoutRegister) = contextSaveRefOutSel;
}
#endif
#ifdef RO_COMPAp_TA1_WDTp
/***************************************************************************//**
* @brief RO method capactiance measurement using CompA+, TimerA1, and WDT+
*
* Schematic Description of CompA+ forming relaxation oscillator and
* coupling (connection) between the relaxation oscillator and TimerA0.
* \n <- Output
* \n -> Input
* \n R Resistor (typically 100Kohms)
* \n
* \n +-<-Px.y (reference)
* \n |
* \n R
* \n |
* \n +---+-->COMPA+
* \n | |
* \n R R
* \n | |
* \n GND |
* \n |
* \n +-->TA1CLK
* \n |
* \n element-+-R--+-<-CAOUT
* \n |
* \n +------->COMPA-
* \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 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_COMPAp_TA1_WDTp_HAL(const struct Sensor *group, uint16_t *counts)
{
uint8_t i;
//** Context Save
// Status Register:
// WDTp: IE1, WDTCTL
// TIMERA0: TA1CTL, TA1CCTL1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: caoutDIR, caoutSel, txclkDIR, txclkSel, caoutSel2, txclkSel2, refout, refdir
uint8_t contextSaveSR;
uint8_t contextSaveIE1;
uint16_t contextSaveWDTCTL;
uint16_t contextSaveTA1CTL,contextSaveTA1CCTL1;
uint16_t contextSaveTA1CCR1;
uint8_t contextSaveCACTL1,contextSaveCACTL2,contextSaveCAPD;
uint8_t contextSaveCaoutDir,contextSaveCaoutSel;
uint8_t contextSavetxclkDir,contextSavetxclkSel;
uint8_t contextSaveRefDir,contextSaveRefOutSel;
#ifdef SEL2REGISTER
uint8_t contextSaveCaoutSel2,contextSaveTxclkSel2;
contextSaveCaoutSel2 = *(group->caoutSel2Register);
contextSaveTxclkSel2 = *(group->txclkSel2Register);
#endif
contextSaveSR = __get_SR_register();
contextSaveIE1 = IE1;
contextSaveWDTCTL = WDTCTL;
contextSaveWDTCTL &= 0x00FF;
contextSaveWDTCTL |= WDTPW;
contextSaveTA1CTL = TA1CTL;
contextSaveTA1CCTL1 = TA1CCTL1;
contextSaveTA1CCR1 = TA1CCR1;
contextSaveCACTL1 = CACTL1;
contextSaveCACTL2 = CACTL2;
contextSaveCAPD = CAPD;
contextSaveCaoutDir = *(group->caoutDirRegister);
contextSaveCaoutSel = *(group->caoutSelRegister);
contextSavetxclkDir = *(group->txclkDirRegister);
contextSavetxclkSel = *(group->txclkSelRegister);
contextSaveRefDir = *(group->refPxdirRegister);
contextSaveRefOutSel = *(group->refPxoutRegister);
//** Setup Measurement timer***************************************************
// Choices are TA0,TA1,TB0,TB1,TD0,TD1 these choices are pushed up into the
// capacitive touch layer.
TA1CTL = TASSEL_0+MC_2; // TA1CLK, cont mode
TA1CCTL1 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
*(group->caoutDirRegister) |= group->caoutBits;
*(group->txclkDirRegister) &= ~group->txclkBits;
*(group->caoutSelRegister) |= group->caoutBits;
*(group->txclkSelRegister) |= group->txclkBits;
#ifdef SEL2REGISTER
*(group->caoutSel2Register) |= group->caoutBits;
*(group->txclkSel2Register) |= group->txclkBits;
#endif
*(group->refPxdirRegister) |= group->refBits;
*(group->refPxoutRegister) |= group->refBits;
CACTL1 |= CAON; // Turn on comparator
CAPD |= (group->capdBits);
IE1 |= WDTIE; // enable WDT interrupt
for (i = 0; i<(group->numElements); i++)
{
CACTL2= group->refCactl2Bits + (group->arrayPtr[i])->inputBits;
//** Setup Gate Timer *****************************************************
// Set duration of sensor measurment
WDTCTL = WDTPW+WDTTMSEL+ group->measGateSource + group->accumulationCycles;
TA1CTL |= TACLR; // Clear Timer_A TAR
if(group->measGateSource == GATE_WDTp_ACLK)
{
__bis_SR_register(LPM3_bits+GIE); // Wait for WDT interrupt
}
else
{
__bis_SR_register(LPM0_bits+GIE); // Wait for WDT interrupt
}
TA1CCTL1 ^= CCIS0; // Create SW capture of CCR1
counts[i] = TA1CCR1; // Save result
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
}
// End Sequence
//** Context Restore
// WDTp: IE1, WDCTL
// TIMERA0: TACTL, TACCTL1
// COMPAp: CACTL1, CACTL2, CAPD
// Ports: caoutDIR, caoutSel, txclkDIR, txclkSel, caoutSel2, txclkSel2, refout, refdir
#ifdef SEL2REGISTER
*(group->caoutSel2Register) = contextSaveCaoutSel2;
*(group->txclkSel2Register) = contextSaveTxclkSel2;
#endif
__bis_SR_register(contextSaveSR);
if(!(contextSaveSR & GIE))
{
__bic_SR_register(GIE); // Wait for WDT interrupt
}
IE1 = contextSaveIE1;
WDTCTL = contextSaveWDTCTL;
TA1CTL = contextSaveTA1CTL;
TA1CCTL1 = contextSaveTA1CCTL1;
TA1CCR1 = contextSaveTA1CCR1;
CACTL1 = contextSaveCACTL1;
CACTL2 = contextSaveCACTL2;
CAPD = contextSaveCAPD;
*(group->caoutDirRegister) = contextSaveCaoutDir;
*(group->caoutSelRegister) = contextSaveCaoutSel;
*(group->txclkDirRegister) = contextSavetxclkDir;
*(group->txclkSelRegister) = contextSavetxclkSel;
*(group->refPxdirRegister) = contextSaveRefDir;
*(group->refPxoutRegister) = contextSaveRefOutSel;
}
#endif
#ifdef fRO_COMPAp_TA1_SW
/***************************************************************************//**
* @brief RO method capactiance measurement using CompA+, TimerA1, and SW loop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -