6280|8

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

MSP430G2553LaunchPad电容触摸例程 [复制链接]

  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - Capacitive Touch, Pin Oscillator Method, 1 button
  3. //
  4. //  Description: Basic 1-button input using the built-in pin oscillation feature
  5. //  on GPIO input structure. PinOsc signal feed into TA0CLK. WDT interval is used
  6. //  to gate the measurements. Difference in measurements indicate button touch.
  7. //  LEDs flash if input is touched.
  8. //  
  9. //  ACLK = VLO = 12kHz, MCLK = SMCLK = 1MHz DCO
  10. //
  11. //               MSP430G2xx3
  12. //             -----------------
  13. //         /|\|              XIN|-
  14. //          | |                 |
  15. //          --|RST          XOUT|-
  16. //            |                 |
  17. //            |             P1.1|<--Capacitive Touch Input 1
  18. //            |                 |
  19. //  LED 2  <--|P1.6             |
  20. //            |                 |
  21. //  LED 1  <--|P1.0             |
  22. //            |                 |
  23. //            |                 |
  24. //
  25. //   Brandon Elliott/D. Dang
  26. //  Texas Instruments Inc.
  27. //  November 2010
  28. //   Built with IAR Embedded Workbench Version: 5.10
  29. //******************************************************************************


  30. #include  "msp430g2553.h"

  31. /* Define User Configuration values */
  32. /*----------------------------------*/
  33. /* Defines WDT SMCLK interval for sensor measurements*/
  34. #define WDT_meas_setting (DIV_SMCLK_512)
  35. /* Defines WDT ACLK interval for delay between measurement cycles*/
  36. #define WDT_delay_setting (DIV_ACLK_512)

  37. /* Sensor settings*/
  38. #define KEY_LVL     220                     // Defines threshold for a key press
  39. /*Set to ~ half the max delta expected*/

  40. /* Definitions for use with the WDT settings*/
  41. #define DIV_ACLK_32768  (WDT_ADLY_1000)     // ACLK/32768
  42. #define DIV_ACLK_8192   (WDT_ADLY_250)      // ACLK/8192
  43. #define DIV_ACLK_512    (WDT_ADLY_16)       // ACLK/512
  44. #define DIV_ACLK_64     (WDT_ADLY_1_9)      // ACLK/64
  45. #define DIV_SMCLK_32768 (WDT_MDLY_32)       // SMCLK/32768
  46. #define DIV_SMCLK_8192  (WDT_MDLY_8)        // SMCLK/8192
  47. #define DIV_SMCLK_512   (WDT_MDLY_0_5)      // SMCLK/512
  48. #define DIV_SMCLK_64    (WDT_MDLY_0_064)    // SMCLK/64

  49. #define LED_1   (0x01)                      // P1.0 LED output
  50. #define LED_2   (0x40)                      // P1.6 LED output

  51. // Global variables for sensing
  52. unsigned int base_cnt, meas_cnt;
  53. int delta_cnt;
  54. char key_pressed;
  55. int cycles;
  56. /* System Routines*/
  57. void measure_count(void);                   // Measures each capacitive sensor
  58. void pulse_LED(void);                       // LED gradient routine

  59. /* Main Function*/
  60. void main(void)
  61. {
  62.   unsigned int i,j;
  63.   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  64.   BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  65.   DCOCTL =  CALDCO_1MHZ;
  66.   BCSCTL3 |= LFXT1S_2;                    // LFXT1 = VLO

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

  71.    __bis_SR_register(GIE);                  // Enable interrupts

  72.   measure_count();                          // Establish baseline capacitance
  73.     base_cnt = meas_cnt;

  74.   for(i=15; i>0; i--)                       // Repeat and avg base measurement
  75.   {
  76.     measure_count();
  77.       base_cnt = (meas_cnt+base_cnt)/2;
  78.   }
  79.   

  80.   /* Main loop starts here*/
  81.   while (1)
  82.   {
  83.     j = KEY_LVL;
  84.     key_pressed = 0;                        // Assume no keys are pressed

  85.     measure_count();                        // Measure all sensors


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

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

  100.     /* Delay to next sample, sample more slowly if no keys are pressed*/
  101.     if (key_pressed)
  102.     {
  103.       BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  104.       cycles = 20;
  105.     }
  106.     else
  107.     {
  108.       cycles--;
  109.       if (cycles > 0)
  110.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  111.       else
  112.       {
  113.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3; // ACLK/(0:1,1:2,2:4,3:8)
  114.         cycles = 0;
  115.       }
  116.     }
  117.     WDTCTL = WDT_delay_setting;             // WDT, ACLK, interval timer

  118.     /* Handle baseline measurment for a base C increase*/
  119.     if (!key_pressed)                       // Only adjust baseline down
  120.     {                                       // if no keys are touched
  121.         base_cnt = base_cnt - 1;            // Adjust baseline down, should be
  122.     }                                       // slow to accomodate for genuine
  123.      pulse_LED();                           // changes in sensor C
  124.    
  125.     __bis_SR_register(LPM3_bits);
  126.   }
  127. }                                           // End Main

  128. /* Measure count result (capacitance) of each sensor*/
  129. /* Routine setup for four sensors, not dependent on NUM_SEN value!*/

  130. void measure_count(void)
  131. {
  132.                
  133.   TA0CTL = TASSEL_3+MC_2;                   // TACLK, cont mode
  134.   TA0CCTL1 = CM_3+CCIS_2+CAP;               // Pos&Neg,GND,Cap


  135.     /*Configure Ports for relaxation oscillator*/
  136.     /*The P2SEL2 register allows Timer_A to receive it's clock from a GPIO*/
  137.     /*See the Application Information section of the device datasheet for info*/
  138.     P1DIR &= ~ BIT1;                        // P1.1 is the input used here
  139.     P1SEL &= ~ BIT1;
  140.     P1SEL2 |= BIT1;
  141.    
  142.     /*Setup Gate Timer*/
  143.     WDTCTL = WDT_meas_setting;              // WDT, ACLK, interval timer
  144.     TA0CTL |= TACLR;                        // Clear Timer_A TAR
  145.     __bis_SR_register(LPM0_bits+GIE);       // Wait for WDT interrupt
  146.     TA0CCTL1 ^= CCIS0;                      // Create SW capture of CCR1
  147.     meas_cnt = TACCR1;                      // Save result
  148.     WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
  149.     P1SEL2 &= ~BIT1;


  150. }

  151. void pulse_LED(void)
  152. {
  153.   if(key_pressed)
  154.   {
  155.     P1OUT ^= LED_1 + LED_2;
  156.   }else{
  157.   P1OUT = 0;
  158.   }
  159. }
  160. /* Watchdog Timer interrupt service routine*/
  161. #pragma vector=WDT_VECTOR
  162. __interrupt void watchdog_timer(void)
  163. {
  164.   TA0CCTL1 ^= CCIS0;                        // Create SW capture of CCR1
  165.   __bic_SR_register_on_exit(LPM3_bits);     // Exit LPM3 on reti
  166. }
复制代码

最新回复

大神,请问硬件电路你有吗?如果有介意发一份吗?   谢谢   474500144@qq.com  详情 回复 发表于 2014-6-18 11:13
 
点赞 关注(1)
个人签名

回复
举报

2781

帖子

419

TA的资源

五彩晶圆(中级)

沙发
 
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - Capacitive Touch, Pin Oscillator Method, 4-buttons
  3. //
  4. //  Description: Basic 4-button input using the built-in pin oscillation feature
  5. //  on GPIO input structure. PinOsc signal feed into TA0CLK. WDT interval is used
  6. //  to gate the measurements. Difference in measurements indicate button touch.
  7. //  LEDs flash if input is touched.
  8. //
  9. //  Input 1: LED1 (LED2 off)
  10. //  Input 2: LED2 (LED1 off)
  11. //  Input 3: Both LEDs on
  12. //  Input 4: Both LEDs flash on/off
  13. //
  14. //  ACLK = VLO = 12kHz, MCLK = SMCLK = 1MHz DCO
  15. //
  16. //               MSP430G2xx3
  17. //             -----------------
  18. //         /|\|              XIN|-
  19. //          | |                 |
  20. //          --|RST          XOUT|-
  21. //            |                 |
  22. //            |             P1.1|<--Capacitive Touch Input 1
  23. //            |                 |
  24. //  LED 2  <--|P1.6         P1.2|<--Capacitive Touch Input 2
  25. //            |                 |
  26. //  LED 1  <--|P1.0         P1.4|<--Capacitive Touch Input 3
  27. //            |                 |
  28. //            |             P1.5|<--Capacitive Touch Input 4
  29. //
  30. //   Brandon Elliott/D. Dang
  31. //  Texas Instruments Inc.
  32. //  November 2010
  33. //   Built with IAR Embedded Workbench Version: 5.10
  34. //******************************************************************************


  35. #include  "msp430g2553.h"

  36. /* Define User Configuration values */
  37. /*----------------------------------*/
  38. /* Defines WDT SMCLK interval for sensor measurements*/
  39. #define WDT_meas_setting (DIV_SMCLK_512)
  40. /* Defines WDT ACLK interval for delay between measurement cycles*/
  41. #define WDT_delay_setting (DIV_ACLK_512)

  42. /* Sensor settings*/
  43. #define NUM_SEN     4                       // Defines number of sensors
  44. #define KEY_LVL     220                     // Defines threshold for a key press
  45. /*Set to ~ half the max delta expected*/

  46. /* Definitions for use with the WDT settings*/
  47. #define DIV_ACLK_32768  (WDT_ADLY_1000)     // ACLK/32768
  48. #define DIV_ACLK_8192   (WDT_ADLY_250)      // ACLK/8192
  49. #define DIV_ACLK_512    (WDT_ADLY_16)       // ACLK/512
  50. #define DIV_ACLK_64     (WDT_ADLY_1_9)      // ACLK/64
  51. #define DIV_SMCLK_32768 (WDT_MDLY_32)       // SMCLK/32768
  52. #define DIV_SMCLK_8192  (WDT_MDLY_8)        // SMCLK/8192
  53. #define DIV_SMCLK_512   (WDT_MDLY_0_5)      // SMCLK/512
  54. #define DIV_SMCLK_64    (WDT_MDLY_0_064)    // SMCLK/64

  55. #define LED_1   (0x01)                      // P1.0 LED output
  56. #define LED_2   (0x40)                      // P1.6 LED output

  57. // Global variables for sensing
  58. unsigned int base_cnt[NUM_SEN];
  59. unsigned int meas_cnt[NUM_SEN];
  60. int delta_cnt[NUM_SEN];
  61. unsigned char key_press[NUM_SEN];
  62. char key_pressed;
  63. int cycles;
  64. const unsigned char electrode_bit[NUM_SEN]={BIT1, BIT2, BIT4, BIT5};
  65. /* System Routines*/
  66. void measure_count(void);                   // Measures each capacitive sensor
  67. void pulse_LED(void);                       // LED gradient routine

  68. /* Main Function*/
  69. void main(void)
  70. {
  71.   unsigned int i,j;
  72.   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  73.   BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  74.   DCOCTL =  CALDCO_1MHZ;
  75.   BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
  76.   IE1 |= WDTIE;                             // enable WDT interrupt
  77.   P2SEL = 0x00;                             // No XTAL
  78.   P1DIR = LED_1 + LED_2;                    // P1.0 & P1.6 = LEDs
  79.   P1OUT = 0x00;                             

  80.    __bis_SR_register(GIE);                  // Enable interrupts

  81.   measure_count();                          // Establish baseline capacitance
  82.   for (i = 0; i
  83.     base_cnt[i] = meas_cnt[i];

  84.   for(i=15; i>0; i--)                       // Repeat and avg base measurement
  85.   {
  86.     measure_count();
  87.     for (j = 0; j
  88.       base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2;
  89.   }
  90.   

  91.   /* Main loop starts here*/
  92.   while (1)
  93.   {
  94.     j = KEY_LVL;
  95.     key_pressed = 0;                        // Assume no keys are pressed

  96.     measure_count();                        // Measure all sensors

  97.     for (i = 0; i
  98.     {
  99.       delta_cnt[i] = base_cnt[i] - meas_cnt[i];  // Calculate delta: c_change

  100.       /* Handle baseline measurment for a base C decrease*/
  101.       if (delta_cnt[i] < 0)                 // If negative: result increased
  102.       {                                     // beyond baseline, i.e. cap dec
  103.           base_cnt[i] = (base_cnt[i]+meas_cnt[i]) >> 1; // Re-average quickly
  104.           delta_cnt[i] = 0;                 // Zero out for pos determination
  105.       }
  106.       if (delta_cnt[i] > j)                 // Determine if each key is pressed
  107.       {                                     // per a preset threshold
  108.         key_press[i] = 1;                   // Specific key pressed
  109.         j = delta_cnt[i];
  110.         key_pressed = i+1;                  // key pressed
  111.       }
  112.       else
  113.         key_press[i] = 0;
  114.     }

  115.     /* Delay to next sample, sample more slowly if no keys are pressed*/
  116.     if (key_pressed)
  117.     {
  118.       BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  119.       cycles = 20;
  120.     }
  121.     else
  122.     {
  123.       cycles--;
  124.       if (cycles > 0)
  125.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  126.       else
  127.       {
  128.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3; // ACLK/(0:1,1:2,2:4,3:8)
  129.         cycles = 0;
  130.       }
  131.     }
  132.     WDTCTL = WDT_delay_setting;             // WDT, ACLK, interval timer

  133.     /* Handle baseline measurment for a base C increase*/
  134.     if (!key_pressed)                       // Only adjust baseline down
  135.     {                                       // if no keys are touched
  136.       for (i = 0; i
  137.         base_cnt[i] = base_cnt[i] - 1;      // Adjust baseline down, should be
  138.     }                                       // slow to accomodate for genuine
  139.      pulse_LED();                           // changes in sensor C
  140.    
  141.     __bis_SR_register(LPM3_bits);
  142.   }
  143. }                                           // End Main

  144. /* Measure count result (capacitance) of each sensor*/
  145. /* Routine setup for four sensors, not dependent on NUM_SEN value!*/

  146. void measure_count(void)
  147. {
  148.   char i;
  149.                      
  150.   TA0CTL = TASSEL_3+MC_2;                   // TACLK, cont mode
  151.   TA0CCTL1 = CM_3+CCIS_2+CAP;               // Pos&Neg,GND,Cap

  152.   for (i = 0; i
  153.   {
  154.     /*Configure Ports for relaxation oscillator*/
  155.     /*The P2SEL2 register allows Timer_A to receive it's clock from a GPIO*/
  156.     /*See the Application Information section of the device datasheet for info*/
  157.     P1DIR &= ~ electrode_bit[i];
  158.     P1SEL &= ~ electrode_bit[i];
  159.     P1SEL2 |= electrode_bit[i];
  160.    
  161.     /*Setup Gate Timer*/
  162.     WDTCTL = WDT_meas_setting;              // WDT, ACLK, interval timer
  163.     TA0CTL |= TACLR;                        // Clear Timer_A TAR
  164.     __bis_SR_register(LPM0_bits+GIE);       // Wait for WDT interrupt
  165.     TA0CCTL1 ^= CCIS0;                      // Create SW capture of CCR1
  166.     meas_cnt[i] = TACCR1;                   // Save result
  167.     WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
  168.     P1SEL2 &= ~electrode_bit[i];
  169.   }

  170. }

  171. void pulse_LED(void)
  172. {
  173.   switch (key_pressed){
  174.   case 0: P1OUT &= ~(LED_1 + LED_2);
  175.           break;
  176.   case 1: P1OUT = LED_1;
  177.           break;
  178.   case 2: P1OUT = LED_2;
  179.           break;
  180.   case 3: P1OUT = LED_1 + LED_2;
  181.           break;
  182.   case 4: P1OUT ^= LED_1 + LED_2;
  183.           break;
  184.          
  185.     }
  186. }
  187. /* Watchdog Timer interrupt service routine*/
  188. #pragma vector=WDT_VECTOR
  189. __interrupt void watchdog_timer(void)
  190. {
  191.   TA0CCTL1 ^= CCIS0;                        // Create SW capture of CCR1
  192.   __bic_SR_register_on_exit(LPM3_bits);     // Exit LPM3 on reti
  193. }
复制代码
 
个人签名
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

板凳
 
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - 4-button Capacitive Touch, Pin Oscillator Method, ACLK CCR
  3. //
  4. //  Description: Basic 4-button input using the built-in pin oscillation feature
  5. //  on GPIO input structure. PinOsc signal feed into TA0CLK. ACLK [32kHz] is fed
  6. //  into the CCR1 register, triggering the CCR flag in timer capture mode.
  7. //  Difference in measurements indicate button touch. LEDs flash according to the
  8. //  input touched:
  9. //
  10. //  Input 1: LED1 (LED2 off)
  11. //  Input 2: LED2 (LED1 off)
  12. //  Input 3: Both LEDs on
  13. //  Input 4: Both LEDs flash on/off
  14. //
  15. //  ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = 1MHz DCO
  16. //
  17. //               MSP430G2xx3
  18. //             -----------------
  19. //         /|\|              XIN|-
  20. //          | |                 |  32kHz xtal
  21. //          --|RST          XOUT|-
  22. //            |                 |
  23. //            |             P2.1|<--Capacitive Touch Input 1
  24. //            |                 |
  25. //  LED 2  <--|P1.6         P2.2|<--Capacitive Touch Input 2
  26. //            |                 |
  27. //  LED 1  <--|P1.0         P2.4|<--Capacitive Touch Input 3
  28. //            |                 |
  29. //            |             P2.5|<--Capacitive Touch Input 4
  30. //
  31. //   Brandon Elliott/D. Dang
  32. //  Texas Instruments Inc.
  33. //  November 2010
  34. //   Built with IAR Embedded Workbench Version: 5.10
  35. //******************************************************************************


  36. #include  "msp430g2553.h"

  37. /* Sensor settings*/
  38. #define NUM_SEN     4                       // Defines number of sensors
  39. #define KEY_LVL     1000                     // Defines threshold for a key press
  40. /*Set to ~ half the max delta expected*/

  41. #define LED_1   (0x01)                      // P1.0 LED output
  42. #define LED_2   (0x40)                      // P1.6 LED output

  43. // Global variables for sensing
  44. unsigned int base_cnt[NUM_SEN];
  45. unsigned int meas_cnt[NUM_SEN];
  46. int delta_cnt[NUM_SEN];
  47. unsigned char key_press[NUM_SEN];
  48. char key_pressed;
  49. int cycles;
  50. const unsigned char electrode_bit[NUM_SEN]={BIT1, BIT2, BIT4, BIT5};
  51. /* System Routines*/
  52. void measure_count(void);                   // Measures each capacitive sensor
  53. void pulse_LED(void);                       // LED gradient routine

  54. /* Main Function*/
  55. void main(void)
  56. {
  57.   unsigned int i,j;
  58.   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  59.   BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1, 8, 12 or 16MHz
  60.   DCOCTL = CALDCO_1MHZ;
  61.   BCSCTL2 |= DIVS_2;                        // SMCLK/(0:1,1:2,2:4,3:8)
  62.   BCSCTL1 |= DIVA_1;                        // ACLK/(0:1,1:2,2:4,3:8)
  63.   BCSCTL3 |= XCAP_1;                        // Configure Load Caps
  64.   IE1 |= WDTIE;                             // enable WDT interrupt
  65.   P1DIR = LED_1 + LED_2;                    // P1.0 & P1.6 = LEDs
  66.   P1OUT = 0x00;                             

  67. do
  68. {
  69.     IFG1 &= ~OFIFG;                         // Clear OSCFault flag
  70.     for (i = 0xFF; i > 0; i--);             // Time for flag to set
  71.   }
  72.   while (IFG1 & OFIFG);                     // OSCFault flag still set?
  73.   
  74.   
  75.    __bis_SR_register(GIE);                  // Enable interrupts

  76.   measure_count();                          // Establish baseline capacitance
  77.   for (i = 0; i
  78.     base_cnt[i] = meas_cnt[i];

  79.   for(i=15; i>0; i--)                       // Repeat and avg base measurement
  80.   {
  81.     measure_count();
  82.     for (j = 0; j
  83.       base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2;
  84.   }
  85.   

  86.   /* Main loop starts here*/
  87.   while (1)
  88.   {
  89.     j = KEY_LVL;
  90.     key_pressed = 0;                        // Assume no keys are pressed

  91.     measure_count();                        // Measure all sensors

  92.     for (i = 0; i
  93.     {
  94.       delta_cnt[i] = base_cnt[i] - meas_cnt[i];  // Calculate delta: c_change

  95.       /* Handle baseline measurment for a base C decrease*/
  96.       if (delta_cnt[i] < 0)                 // If negative: result increased
  97.       {                                     // beyond baseline, i.e. cap dec
  98.           base_cnt[i] = (base_cnt[i]+meas_cnt[i]) >> 1; // Re-average quickly
  99.           delta_cnt[i] = 0;                 // Zero out for pos determination
  100.       }
  101.       if (delta_cnt[i] > j)                 // Determine if each key is pressed
  102.       {                                     // per a preset threshold
  103.         key_press[i] = 1;                   // Specific key pressed
  104.         j = delta_cnt[i];
  105.         key_pressed = i+1;                  // key pressed
  106.       }
  107.       else
  108.         key_press[i] = 0;
  109.     }

  110.     /* Delay to next sample, sample more slowly if no keys are pressed*/
  111.     if (key_pressed)
  112.     {
  113.       BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  114.       cycles = 20;
  115.     }
  116.     else
  117.     {
  118.       cycles--;
  119.       if (cycles > 0)
  120.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  121.       else
  122.       {
  123.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3; // ACLK/(0:1,1:2,2:4,3:8)
  124.         cycles = 0;
  125.       }
  126.     }

  127.     /* Handle baseline measurment for a base C increase*/
  128.     if (!key_pressed)                       // Only adjust baseline down
  129.     {                                       // if no keys are touched
  130.       for (i = 0; i
  131.         base_cnt[i] = base_cnt[i] - 1;      // Adjust baseline down, should be
  132.     }                                       // slow to accomodate for genuine
  133.      pulse_LED();                           // changes in sensor C
  134.    
  135.     __delay_cycles(20000);
  136.   }
  137. }                                           // End Main

  138. /* Measure count result (capacitance) of each sensor*/
  139. /* Routine setup for four sensors, not dependent on NUM_SEN value!*/

  140. void measure_count(void)
  141. {        
  142.   unsigned int i, j;
  143.   _DINT();                              // Disable interrupts                                       
  144.   BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3; // ACLK/(0:1,1:2,2:4,3:8)                     
  145.   for (i = 0; i
  146.   {         
  147.     // Configure Ports for relaxation oscillator
  148.     P2DIR &= ~ electrode_bit[i];        //
  149.     P2SEL &= ~ electrode_bit[i];        //  
  150.     P2SEL2 |= electrode_bit[i];         // Set target Pin Oscillator   
  151.     TA0CTL = TASSEL_3 + MC_2 + TACLR;   // PinOsc Clock source, cont mode
  152.     TA0CCTL0 = CM_1 + CCIS_1 + CAP;     // Capture on Pos Edges, ACLK, Cap, Interrupt
  153.     TA0CCTL0 |= CCIE;                   // Enable Interrupt        
  154.    
  155.     __bis_SR_register(LPM3_bits+GIE);   // Wait for TIMER interrupt
  156.     __bis_SR_register(LPM3_bits+GIE);   // Wait for TIMER interrupt
  157.     meas_cnt[i] = TACCR0;               // Save result
  158.     for (j=0;j<15;j++) {
  159.       __bis_SR_register(LPM3_bits+GIE); // Wait for TIMER interrupt
  160.     }
  161.     TA0CTL &= MC_2;                     // Halt Timer   
  162.     TA0CCTL0 &= ~CCIE;                  // Disable Interrupt      
  163.     meas_cnt[i] = TACCR0 - meas_cnt[i]; // Save Measured        
  164.     P2SEL2 &= ~electrode_bit[i];        // Clear target Pin Oscillator
  165.   }  
  166.   BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)  
  167. }


  168. void pulse_LED(void)
  169. {
  170.   switch (key_pressed){
  171.   case 0: P1OUT &= ~(LED_1 + LED_2);
  172.           break;
  173.   case 1: P1OUT = LED_1;
  174.           break;
  175.   case 2: P1OUT = LED_2;
  176.           break;
  177.   case 3: P1OUT = LED_1 + LED_2;
  178.           break;
  179.   case 4: P1OUT ^= LED_1 + LED_2;
  180.           break;
  181.          
  182.     }
  183. }
  184. /* Timer A1 interrupt service routine*/
  185. #pragma vector=TIMER0_A0_VECTOR
  186. __interrupt void Timer_A0 (void)
  187. {
  188.    __bic_SR_register_on_exit(LPM3_bits);     // Exit LPM3 on reti
  189. }
复制代码
 
个人签名
 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

4
 
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - Capacitive Touch, Pin Oscillator Method, 5 buttons, UART
  3. //
  4. //  Description: Basic 8-button input using the built-in pin oscillation feature
  5. //  on GPIO input structure. PinOsc signal feed into TA0CLK. WDT interval is used
  6. //  to gate the measurements. Difference in measurements indicate button touch.
  7. //  Pins used for inputs listed in the diagram below.
  8. //  After each scan, one UART byte identifying the key# being pressed is
  9. //  transmitted via TimerA UART at port pin P1.1.
  10. //
  11. //
  12. //  ACLK = VLO = 12kHz, MCLK = SMCLK = 1MHz DCO
  13. //
  14. //               MSP430G2xx3
  15. //             -----------------
  16. //         /|\|                 |  
  17. //          | |                 |
  18. //          --|RST              |
  19. //            |                 |
  20. //  input 1-->|P2.0         P1.1|--> TA UART output TXD
  21. //            |                 |
  22. //  input 2-->|P2.1             |
  23. //            |                 |
  24. //  input 3-->|P2.2             |
  25. //            |                 |
  26. //  input 4-->|P2.3             |
  27. //            |                 |
  28. //  input 5-->|P2.4             |
  29. //            |                 |
  30. //             -----------------      All five inputs are capacitive touch inputs      
  31. //
  32. //   Brandon Elliott/D. Dang
  33. //  Texas Instruments Inc.
  34. //  November 2010
  35. //   Built with IAR Embedded Workbench Version: 5.10
  36. //******************************************************************************


  37. #include  "msp430g2553.h"

  38. /* Define User Configuration values */
  39. /*----------------------------------*/
  40. /* Defines WDT SMCLK interval for sensor measurements*/
  41. #define WDT_meas_setting (DIV_SMCLK_512)
  42. /* Defines WDT ACLK interval for delay between measurement cycles*/
  43. #define WDT_delay_setting (DIV_ACLK_512)

  44. /* Sensor settings*/
  45. #define NUM_SEN        5                    // Total number of sensors
  46. #define KEY_LVL     190                     // Defines threshold for a key press
  47. /* Set to ~ half the max delta expected*/

  48. /* Definitions for use with the WDT settings*/
  49. #define DIV_ACLK_32768  (WDT_ADLY_1000)     // ACLK/32768
  50. #define DIV_ACLK_8192   (WDT_ADLY_250)      // ACLK/8192
  51. #define DIV_ACLK_512    (WDT_ADLY_16)       // ACLK/512
  52. #define DIV_ACLK_64     (WDT_ADLY_1_9)      // ACLK/64
  53. #define DIV_SMCLK_32768 (WDT_MDLY_32)       // SMCLK/32768
  54. #define DIV_SMCLK_8192  (WDT_MDLY_8)        // SMCLK/8192
  55. #define DIV_SMCLK_512   (WDT_MDLY_0_5)      // SMCLK/512
  56. #define DIV_SMCLK_64    (WDT_MDLY_0_064)    // SMCLK/64

  57. /* Global variables for sensing*/
  58. unsigned int base_cnt[NUM_SEN];
  59. unsigned int meas_cnt[NUM_SEN];
  60. int delta_cnt[NUM_SEN];
  61. unsigned char key_press[NUM_SEN];
  62. char key_pressed;
  63. int cycles;

  64. const unsigned char electrode_bit_P2[NUM_SEN]={BIT0, BIT1, BIT2, BIT3, BIT4};
  65. /* System Routines*/
  66. void measure_count(void);                   // Measures each capacitive sensor
  67. void TX_Byte (char);                        // Transmits key pressed via UART
  68. /* Main Function*/
  69. void main(void)
  70. {
  71.   unsigned int i,j;
  72.   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  73.   BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  74.   DCOCTL =  CALDCO_1MHZ;
  75.   BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
  76.   IE1 |= WDTIE;                             // enable WDT interrupt
  77.   P2SEL = 0x00;                             // No XTAL

  78.    __bis_SR_register(GIE);                  // Enable interrupts

  79.   measure_count();                          // Establish baseline capacitance
  80.   for (i = 0; i
  81.     base_cnt[i] = meas_cnt[i];

  82.   for(i=15; i>0; i--)                       // Repeat and avg base measurement
  83.   {
  84.     measure_count();
  85.     for (j = 0; j
  86.       base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2;
  87.   }
  88.   

  89.   /* Main loop starts here*/
  90.   while (1)
  91.   {
  92.     j = KEY_LVL;
  93.     measure_count();                        // Measure all sensors

  94.     for (i = 0; i
  95.     {
  96.       /* Handle baseline measurment for a base C decrease*/
  97.       if (base_cnt[i] < meas_cnt[i])        // If negative: result increased
  98.       {                                     // beyond baseline, cap decreased
  99.           base_cnt[i] = (base_cnt[i]+meas_cnt[i]) >> 1; // Re-average up quickly
  100.           delta_cnt[i] = 0;                 // Zero out for position determination
  101.       }
  102.        else
  103.       {
  104.         delta_cnt[i] = base_cnt[i] - meas_cnt[i];  // Calculate delta: c_change
  105.       }
  106.       if (delta_cnt[i] > j)                 // Determine if each key is pressed
  107.       {                                     // per a preset threshold
  108.         key_press[i] = 1;                   // Specific key pressed
  109.         j = delta_cnt[i];
  110.         key_pressed = i+1;                  // key pressed
  111.         
  112.       }
  113.       else
  114.         key_press[i] = 0;
  115.     }

  116.     /* Delay to next sample, sample more slowly if no keys are pressed*/
  117.     if (key_pressed)
  118.     {
  119.       TX_Byte(key_pressed);
  120.       BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8)
  121.       cycles = 20;
  122.     }
  123.     else
  124.     {
  125.       cycles--;
  126.       if (cycles > 0)                       // ACLK/(0:1,1:2,2:4,3:8)
  127.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0;
  128.       else
  129.       {                                     // ACLK/(0:1,1:2,2:4,3:8)  
  130.         BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3;
  131.         cycles = 0;
  132.       }
  133.     }
  134.     WDTCTL = WDT_delay_setting;             // WDT, ACLK, interval timer

  135.     /* Handle baseline measurment for a base C increase*/
  136.     if (!key_pressed)                       // adjust down if no keys touched
  137.     {
  138.       for (i = 0; i
  139.         base_cnt[i] = base_cnt[i] - 1;      // Adjust baseline down, should be
  140.     }                                       // slow to accomodate for genuine
  141.    __bis_SR_register(LPM3_bits);            // changes in sensor C
  142.   }
  143. }                                           // End Main

  144. /* Measure count result (capacitance) of each sensor*/
  145. /* Routine setup for four sensors, not dependent on NUM_SEN value!*/

  146. void measure_count(void)
  147. {
  148.   char i;
  149.   TA0CTL = TASSEL_3+MC_2;                   // TACLK, cont mode
  150.   TA0CCTL1 = CM_3+CCIS_2+CAP;               // Pos&Neg,GND,Cap

  151.     for (i = 0; i
  152.   {
  153.     /*Configure Ports for relaxation oscillator*/
  154.     /*The P2SEL2 register allows Timer_A to receive it's clock from a GPIO*/
  155.     /*See the Application Information section of the device datasheet for info*/
  156.     P2DIR &= ~ electrode_bit_P2[i];         
  157.     P2SEL &= ~ electrode_bit_P2[i];         
  158.     P2SEL2 |= electrode_bit_P2[i];          // input oscillation feeds TACLK
  159.     /*  Setup Gate Timer */
  160.     WDTCTL = WDT_meas_setting;              // WDT, ACLK, interval timer
  161.     TA0CTL |= TACLR;                        // Clear Timer_A TAR
  162.     __bis_SR_register(LPM0_bits+GIE);       // Wait for WDT interrupt
  163.     TA0CCTL1 ^= CCIS0;                      // Create SW capture of CCR1
  164.     meas_cnt[i] = TACCR1;                   // Save result
  165.     WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
  166.     P2SEL2 &= ~electrode_bit_P2[i];
  167.   }
  168.     TA0CTL = 0;                             // Stop Timer_A
  169. }

  170. /* Watchdog Timer interrupt service routine*/
  171. #pragma vector=WDT_VECTOR
  172. __interrupt void watchdog_timer(void)
  173. {
  174.   TA0CCTL1 ^= CCIS0;                        // Create SW capture of CCR1
  175.   __bic_SR_register_on_exit(LPM3_bits);     // Exit LPM3 on reti
  176. }


  177. /* UART Information: Conditions for 9600 Baud SW TX-only UART, SMCLK = 8MHz */
  178. #define Bitime    0x0341                    // x us bit length ~ x baud
  179. #define TXD       BIT1                      // TXD on P1.1
  180. unsigned int RXTXData;
  181. unsigned char BitCnt;
  182. void TX_Byte (char TX_DATA)
  183. {
  184.   BCSCTL1 = CALBC1_8MHZ;                    // Set DCO to 8MHz
  185.   DCOCTL =  CALDCO_8MHZ;
  186.   TX_DATA += '0';                           // Convert key# to ASCII character
  187.   CCTL0 = OUT;                              // TXD Idle as Mark
  188.   TACTL = TASSEL_2 + MC_2;                  // SMCLK, continuous mode
  189.   P1SEL |= TXD;
  190.   P1DIR |= TXD;
  191.   BitCnt = 0xA;                             // Load Bit counter, 8data + ST/SP
  192.   CCR0 = TAR;                               // Current state of TA counter
  193.   CCR0 += Bitime;                           // Some time till first bit
  194.   RXTXData = TX_DATA;
  195.   RXTXData |= 0x100;                        // Add mark stop bit to RXTXData
  196.   RXTXData = RXTXData << 1;                 // Add space start bit
  197.   CCTL0 = CCIS0 + OUTMOD0 + CCIE;           // TXD = mark = idle
  198.   while ( CCTL0 & CCIE )
  199.   {
  200.     __bis_SR_register(LPM0_bits);           // Enter LPM0
  201.   }
  202.   BCSCTL1 = CALBC1_1MHZ;                    // return DCO to 1MHz
  203.   DCOCTL =  CALDCO_1MHZ;
  204.   P1SEL &= ~TXD;
  205.   TACTL = 0;                                // Stop Timer
  206. }

  207. /* Timer A0 interrupt service routine*/
  208. #pragma vector=TIMER0_A0_VECTOR
  209. __interrupt void Timer_A0 (void)
  210. {
  211.     if (CCTL0 & CCIS0)                  // TX on CCI0B?
  212.     {
  213.       CCR0 += Bitime;                   // Add Offset to CCR0
  214.       if ( BitCnt == 0)
  215.         CCTL0 &= ~ CCIE;                // All bits TXed, disable interrupt
  216.       else
  217.       {
  218.         if (RXTXData & 0x01)
  219.           CCTL0 &= ~ OUTMOD2;           // TX Mark
  220.         else
  221.           CCTL0 |=  OUTMOD2;            // TX Space
  222.         RXTXData = RXTXData >> 1;
  223.         BitCnt --;
  224.       }
  225.       CCTL0 &= ~ CCIFG;
  226.     }
  227.     else                                // for LED gradient only
  228.       TACCTL0 &= ~CCIE;                 // interrupt disbled

  229.     __bic_SR_register_on_exit(LPM0_bits);
  230. }
复制代码

点评

谢谢分享 :)  详情 回复 发表于 2013-4-6 09:48
 
个人签名
 
 

回复

2万

帖子

71

TA的资源

管理员

5
 

回复 4楼 qinkaiabc 的帖子

谢谢分享
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

5015

帖子

13

TA的资源

裸片初长成(初级)

6
 
相当长啊,是什么效果呢?

[ 本帖最后由 wstt 于 2013-4-7 14:46 编辑 ]
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

7
 
头有点晕

例如第一个例程,有没有问题呀?
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

8
 
求大神电路图·2820730017@qq.com··万分感谢·
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

9
 
大神,请问硬件电路你有吗?如果有介意发一份吗?   谢谢   474500144@qq.com
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表