大家好。 我在 MSP430G2955上有一个应用、用于测量连续6个元件的电容。 遗憾的是、在 WDT 栅极计时器期间、只有六个焊盘中的一个(焊盘0-5、只有焊盘1工作一致)会使 TA0R 计数。 当使用调试器在从 LPM3唤醒后检查 TA0R 的值时、对于焊盘1、TA0R 仅为非零、有时为 Pad2 (每5个读数)。 我的引脚映射已经过验证、此外、在使用示波器探测焊盘时、我可以在每个焊盘上看到正确的信号(每500ms 脉冲一次、其中每个脉冲的顶部由 RO 频率调制计数信号组成)。 振荡器似乎正常运行、但定时器没有计数。
以下是我的 CapSense 代码:
void TI_CTS_RO_PINOSC_TA0_WDTp_HAL (const 结构传感器*组、uint16_t *计数) { uint8_t i = 0; //**上下文保存 //状态寄存器: // WDTp:IE1、WDTCTL // TIMERA0:TA0CTL、TA0CCTL1 //端口: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; //**设置测量计时器********* //选项为 TA0、TA1、TB0、TB1、TD0、TD1这些选项被向上推入 //电容式触控层。 //配置和启动计时器 TA0CTL = tassel_3 + MC_2; // INCLK、CONT 模式//从 tassel_3中更改 TA0CCTL1 = CM_3 + CCIS_2 + CAP; //位置 Neg、GND、电容 IE1|= WDTIE; //启用 WDT 中断
//循环所有6个焊盘 对于(i = 0;i <(group->numElements, i++) { //上下文保存 contextSaveSel =*((group->arrayPtr[i])->inputPxselRegister); contextSaveSel2 =*((group->arrayPtr[i])->inputPxsel2Register); //为张弛振荡器配置端口(英文... 启用电容式感应) *((group->arrayPtr[i])->inputPxselRegister )和=~((group->arrayPtr[i])->inputBits ); *((group->arrayPtr[i])->inputPxsel2Register)|=((group->arrayPtr[i])->inputBits ); //**设置门定时器******** //设置传感器测量的持续时间 WDTCTL =(WDTPW + WDTTMSEL +(group->measGateSource)+(group->accumulationCycles));// WDT 来自 aclk (栅极源)、aclk/512 ->使用 aclk 作为 CapSense TA0CTL |= TACLR; //清除 Timer_A TAR if (group->measGateSource == GATE _WDT_ACLK) { _bis_SR_register (LPM3_bits + GIE); //等待 WDT 中断 } 其他 { _bis_SR_register (LPM0_bits + GIE); //等待 WDT 中断 } //基准信号在 GND 和 VCC 之间交替(这会导致上升和下降触发事件) //这会导致一个转换、开始计算电容 TA0CCTL1 ^= CCIS0;//创建 CCR1的软件捕捉(设置比较源与 VCC) Counts[i]= TA0CCR1; //保存结果-此处的断点用于检查 TA0R 和 TA0CCR1 WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器 //上下文恢复 *((group->arrayPtr[i])->inputPxselRegister)= contextSaveSel; *((group->arrayPtr[i])->inputPxsel2Register)= contextSaveSel2; } //结束序列 //上下文恢复 _bis_SR_register (contextSaveSR); if (!(contextSaveSR & GIE)) { _BIC_SR_register (GIE); // } IE1 = contextSaveIE1; WDTCTL = contextSaveWDTCTL; TA0CTL = contextSaveTA0CTL; TA0CCTL1 = contextSaveTA0CCTL1; TA0CCR1 = contextSaveTA0CCR1; }
我们非常感谢您的任何帮助或想法。 您可以随时提出问题;我很乐意提供更多信息。