OMG,例程竟然是错的..我都无语了!.终于学习电容按键

2019-07-22 16:35发布

从上周就在学习TI的电容触摸按键...当然我是有学习板的....前几年也是在二姨家做活动拿到的...已经有做了一个产品...算是用过了的..
从资料看TI的430单片机里有集成了电容触摸功能,共有三种模式可以实现...
1.Pin oscillator:使用内部定时器加管脚上的振荡功能实现
2.RO,使用内部定时器和比较器,可以比较好的抗干扰
3.RC,直接用管脚对外输出加定时器计时.
////看资料看了很久,很多,,,头晕啊..一直把官方的例程(就是上图那个板的程序)加载进去,一直没看懂...可能心不静...////
今天终于静心下来,把CCS里面例程(msp430g2xx3_pinosc_01 Capacitive Touch, Pin Oscillator Method, 1 button)加载进来..好好学习,单步运行...


int main(void)
{
  unsigned int i,j;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  if (CALBC1_1MHZ==0xFF)                                        // If calibration constant erased
  {                                                                                       
    while(1);                               // do not load, trap CPU!!       
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  DCOCTL =  CALDCO_1MHZ;
  BCSCTL3 |= LFXT1S_2;                    // LFXT1 = VLO

  IE1 |= WDTIE;                             // enable WDT interrupt
  P2SEL = 0x00;                             // No XTAL
  P1DIR = LED_1 + LED_2;                    // P1.0 & P1.6 = LEDs
  P1OUT = 0x00;                             

   __bis_SR_register(GIE);                  // Enable interrupts

  measure_count();                          // Establish baseline capacitance
    base_cnt = meas_cnt;

  for(i=15; i>0; i--)                       // Repeat and avg base measurement
  {
    measure_count();
      base_cnt = (meas_cnt+base_cnt)/2;
  }


  /* Main loop starts here*/
  while (1)
  {
    j = KEY_LVL;
    key_pressed = 0;                        // Assume no keys are pressed

    measure_count();                        // Measure all sensors


      delta_cnt = base_cnt - meas_cnt;  // Calculate delta: c_change

      /* Handle baseline measurment for a base C decrease*/
      if (delta_cnt < 0)                    // If negative: result increased
      {                                     // beyond baseline, i.e. cap dec
          base_cnt = (base_cnt+meas_cnt) >> 1; // Re-average quickly
          delta_cnt = 0;                    // Zero out for pos determination
      }
      if (delta_cnt > j)                    // Determine if each key is pressed
      {                                     // per a preset threshold
        j = delta_cnt;
        key_pressed = 1;                    // key pressed
      }
      else
        key_pressed = 1;

...........


上面的例程中有两处错误:
,第1个错误:    j   这个变量在运行时无法被赋值,程序可以编译,在运行时点了暂停,看 j 竟然提示找不到这个变量.....
                      ====于是我把这个变量的定义移动主程序外面,当作全局变量...然后就正常了

,第2个错误:   就是最后一行的命令,key_pressed = 1;....两个都是1...再怎么操作,不管有没有触摸都是是..那么就一直是在按键生效的状态...我就晕了..之前有下载过一次看到无误如何灯一直在闪..就傻了...
                     ========所以...要把最后一个变成  key_pressed = 0; //没有电容触摸时按键无效!

还有一个不算是程序的问题,但是也影响了程序运行:例程中的电容感应脚是P1.1,这个脚也是编程的串口脚UART没办法实测电容触摸功能..用示波器看没有振荡一直处于高电平状态.
                     ========要把电容脚设置在2.1脚,这个脚刚好是触摸板上的左键.
    P2DIR &= ~ BIT1;                        // P1.1 is the input used here==设置成P2.1
    P2SEL &= ~ BIT1;         //==设置成P2.1
    P2SEL2 |= BIT1;           //==设置成P2.1

    /*Setup Gate Timer*/
    WDTCTL = WDT_meas_setting;              // WDT, ACLK, interval timer
    TA0CTL |= TACLR;                        // Clear Timer_A TAR
    __bis_SR_register(LPM0_bits+GIE);       // Wait for WDT interrupt
    TA0CCTL1 ^= CCIS0;                      // Create SW capture of CCR1
    meas_cnt = TACCR1;                      // Save result
    WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
    P2SEL2 &= ~BIT1;             //==设置成P2.1


##############最后还有一个关键就是要改变电容按键的触摸阀值:程序默认是200,我换上触摸板...在没有触摸时的delta_cnt值是0,,当手有触摸时的值是:92====所以按键灵敏值设置成70左右就可以啦!!!!
        #define KEY_LVL     70                     // Defines threshold for a key press            


其实这次学习搞这么久主要原因 1.学习态度不太好,方法不对,一直不能静下心来学习.资料下载了很多,一下看这份,一下看那份...又有三个触摸的模式就看晕了..  2. 自己学习时看到英文资料内心就很抵触,不想看....英文不可逃避啊!!!
           再继续吧...RO模式还没有完全学习.....





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
pywmiss
1楼-- · 2019-07-22 19:08
 精彩回答 2  元偷偷看……
zhangbo1985
2楼-- · 2019-07-22 21:26
学习时还是要能静下心的才可以的。

一周热门 更多>