从上周就在学习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模式还没有完全学习.....
|