Thắc mắc về Cảm biến điện dung

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Cái này là em dùng code của bạn Nghiem Hiep, em đang cần dùng là nút bấm với chức năng bấm-thả và bấm giữ..Nhưng mà cái code của em hình như hơi có vấn đề..Mọi người giúp em với ạ
1. Khi vào chức năng bấm-giữ thì nó chạy chức năng bấm-thả trước
Led đỏ sáng trước rồi Led xanh mới sáng trong khi em muốn là nó chỉ sáng led xanh thôi
2. cái touch_count em phải để cái giá trị gần nhau nó mới nhận
VD: touch_count<100 (push) với touch_count>100 (hold) chứ nếu để touch_count>200 (hold) thì không được
3. Cái này hỏi bạn Nghiem Hiep là nếu mình chuyển qua SMCLK thì nên chỉnh lại cái nào? Vì khi chuyển qua thì giá trị nó giảm đi 1 nửa ở Count_Edge/Default. touch_count sẽ đọc giá trị gì? vì trong code chỉ thấy lúc gán và lúc debug chỉ thấy touch_count tất cả là dấu "." không à :(..
Help me please :(
Code:
#include <msp430g2553.h>
 
int count_default[3], count_edge[3];
char touch_count[3], j, i;
const char sensivity = 20;    //Threshold
 
void push()
{
    P1OUT = BIT0;
}
void hold()
{
    P1OUT = BIT6;
}
 
void Init(void) //OK in main
{
    P1DIR |= 0xff;
    P2DIR |= 0xff;
    P2SEL &= ~(BIT3 + BIT4 + BIT5);    // Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1;
    P2OUT &= ~(BIT3 + BIT4 + BIT5);
 
    //Config timer A
    TA0CTL = TASSEL_3+MC_2;                // TACLK, cont mode
    TA0CCTL1 = CM_3+CCIS_3+CAP;            // Pos&Neg,GND,Cap
}
 
void Get_info(void)
{
    for (j = 0; j < 3; j++)
    {
        P2SEL2 &= ~(BIT3 + BIT4 + BIT5);
        P2SEL2 |= 0x08 << j;        // Mask from SW1 to SW3
        TA0CTL |= TACLR;            // Clear Timer_A TAR
        _delay_cycles(500);            // Delay to count
        TA0CCTL1 ^= CCIS0;            // Create SW capture of CCR1 (CCIxA)
        count_edge[j] = TACCR1;        // Save result
    }
 
}
 
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                //Stop Watchdog Timer
    Init();                                    //
 
    //10 measurements
    for (i = 0; i < 10; i++)
    {
        Get_info();
        for (j = 0; j < 3; j++)
            count_default[j] = (count_default[j] + count_edge[j]) /2;
    }
 
    while (1)
    {
        Get_info();
        P1OUT &= ~(BIT0 + BIT6);
        for (i = 0; i < 3; i++)
        {
 
            if ((count_edge[i] + sensivity)< count_default[i])
            {
            if (touch_count[i] > 0)
                touch_count[i]++;
            }
            else
            {
                touch_count[i] = 1;
            }
 
            if ((touch_count[0] > 100) && (touch_count[0] < 200))
            {
                push();
            }
            if (touch_count[0] > 200)
            {
                hold();
            }
 
 
        }
 
    }
}
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Em làm theo cái này, ý tưởng là khi thả nút ra thì TAIFG được bật và nhảy vào chương trình ngắt để chạy. Xét xem nếu thỏa điều kiện thì vào chương trình con tương ứng và reset lại mode và trả lại chương trình thường, nhưng mà sao cũng không được luôn :(
Mọi người giúp em với :(
Code:
#include <msp430g2553.h>
 
int count_default[3], count_edge[3], touch_count[3], mode[3];
char j, i;
const char sensivity = 20;//Threshold
 
void push()
{
P1OUT = BIT0;
}
void hold()
{
P1OUT = BIT6;
}
 
void Init(void) //OK in main
{
P1DIR |= 0xff;
P2DIR |= 0xff;
P2SEL &= ~(BIT3 + BIT4 + BIT5);// Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1;
P2OUT &= ~(BIT3 + BIT4 + BIT5);
 
//Config timer A
TA0CTL = TASSEL_3+MC_2;                 // TACLK, cont mode
TA0CCTL1 = CM_3+CCIS_3+CAP;             // Pos&Neg,GND,Cap
}
 
void Get_info(void)
{
for (j = 0; j < 3; j++)
{
P2SEL2 &= ~(BIT3 + BIT4 + BIT5);
P2SEL2 |= 0x08 << j;// Mask from SW1 to SW3
TA0CTL |= TACLR;// Clear Timer_A TAR
_delay_cycles(500);// Delay to count
TA0CCTL1 ^= CCIS0;// Create SW capture of CCR1 (CCIxA)
count_edge[j] = TACCR1;// Save result
}
 
}
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//Stop Watchdog Timer
Init();//
 
//10 measurements
for (i = 0; i < 10; i++)
{
Get_info();
for (j = 0; j < 3; j++)
count_default[j] = (count_default[j] + count_edge[j]) /2;
}
 
 
while (1)
{
Get_info();
P1OUT &= ~(BIT0 + BIT6);
 
for (i = 0; i < 3; i++)
{
if ((count_edge[i]+sensivity) < count_default[i])
{
if (touch_count[i] > 0)
{
mode[i]++;
touch_count[i]++;
 
}
}
else
{
mode[i]=mode[i];
touch_count[i] = 1;
TA0CTL |= TAIFG;//Go to interrupt
}
 
 
}
 
 
 
 
}
}
 
#pragma vector=TIMER0_A0_VECTOR
__interrupt void CapSensor_Interrupt(void)
{
switch (TA0IV)
{
case 0x0A://TAIFG
for (i=0;i<3;i++)//Read mode[i]
{
if (mode[i] > 1)//Check if mode[i] exist
{
if (mode[i] > 500)//Hold mode
{
P1OUT = BIT6;
}
if ((mode[i] > 100)&&(mode[i] < 300))//Push mode
{
P1OUT = BIT0;
}
 
}
mode[i]=0;//Reet mode[i]
}
TA0CTL &= ~TAIFG;//Out of interrupt
break;
}
}
 

honghiep

Cố Vấn CLB
Staff member
Cái này là em dùng code của bạn Nghiem Hiep, em đang cần dùng là nút bấm với chức năng bấm-thả và bấm giữ..Nhưng mà cái code của em hình như hơi có vấn đề..Mọi người giúp em với ạ
1. Khi vào chức năng bấm-giữ thì nó chạy chức năng bấm-thả trước
Led đỏ sáng trước rồi Led xanh mới sáng trong khi em muốn là nó chỉ sáng led xanh thôi
2. cái touch_count em phải để cái giá trị gần nhau nó mới nhận
VD: touch_count<100 (push) với touch_count>100 (hold) chứ nếu để touch_count>200 (hold) thì không được
3. Cái này hỏi bạn Nghiem Hiep là nếu mình chuyển qua SMCLK thì nên chỉnh lại cái nào? Vì khi chuyển qua thì giá trị nó giảm đi 1 nửa ở Count_Edge/Default. touch_count sẽ đọc giá trị gì? vì trong code chỉ thấy lúc gán và lúc debug chỉ thấy touch_count tất cả là dấu "." không à :(..
Help me please :(
Code:
#include <msp430g2553.h>
 
int count_default[3], count_edge[3];
char touch_count[3], j, i;
const char sensivity = 20;    //Threshold
 
void push()
{
    P1OUT = BIT0;
}
void hold()
{
    P1OUT = BIT6;
}
 
void Init(void) //OK in main
{
    P1DIR |= 0xff;
    P2DIR |= 0xff;
    P2SEL &= ~(BIT3 + BIT4 + BIT5);    // Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1;
    P2OUT &= ~(BIT3 + BIT4 + BIT5);
 
    //Config timer A
    TA0CTL = TASSEL_3+MC_2;                // TACLK, cont mode
    TA0CCTL1 = CM_3+CCIS_3+CAP;            // Pos&Neg,GND,Cap
}
 
void Get_info(void)
{
    for (j = 0; j < 3; j++)
    {
        P2SEL2 &= ~(BIT3 + BIT4 + BIT5);
        P2SEL2 |= 0x08 << j;        // Mask from SW1 to SW3
        TA0CTL |= TACLR;            // Clear Timer_A TAR
        _delay_cycles(500);            // Delay to count
        TA0CCTL1 ^= CCIS0;            // Create SW capture of CCR1 (CCIxA)
        count_edge[j] = TACCR1;        // Save result
    }
 
}
 
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                //Stop Watchdog Timer
    Init();                                    //
 
    //10 measurements
    for (i = 0; i < 10; i++)
    {
        Get_info();
        for (j = 0; j < 3; j++)
            count_default[j] = (count_default[j] + count_edge[j]) /2;
    }
 
    while (1)
    {
        Get_info();
        P1OUT &= ~(BIT0 + BIT6);
        for (i = 0; i < 3; i++)
        {
 
            if ((count_edge[i] + sensivity)< count_default[i])
            {
            if (touch_count[i] > 0)
                touch_count[i]++;
            }
            else
            {
                touch_count[i] = 1;
            }
 
            if ((touch_count[0] > 100) && (touch_count[0] < 200))
            {
                push();
            }
            if (touch_count[0] > 200)
            {
                hold();
            }
 
 
        }
 
    }
}
1. Về việc Led xanh Led đỏ thì bạn xem lại code, thuật toán...
2. touch_count là 1 biến đếm thời gian phím được giữ, càng cao thì phím cần được giữ càng lâu
3. Chuyển đổi sang SMCLK thì clock thay đổi, cái gì liên quan sẽ thay đổi theo
- Còn debug ra dấu "." là do kiểu dữ liệu đang chọn để hiển thị là string
 

messier

Ban Chủ Nhiệm
touch_count của e là kiểu char có dấu, giá trị dương lớn nhất là 127 thôi. :D Đổi thử sang kiểu integer đi e :D
 
Top