刚刚写程序的时候遇到一个问题

2019-03-24 08:43发布

  1. #include <msp430g2553.h>
  2. #include "LCD_init.h"
  3. #define CPU_F ((double)1000000)
  4. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  5. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  6. #define delay_s(x)  __delay_cycles((long)(CPU_F*(double)x/1.0))

  7. unsigned int start,end;
  8. unsigned char overflow;
  9. unsigned int length;
  10. unsigned char display_buffer[]={0x00,0x00,0x00,0x00,0xff};
  11. unsigned char number_table[]={'0','1','2','3','4','5','6','7','8','9'};


  12. void Data_Converter(uchar *p)
  13. {

  14.         uint j=0;
  15.         j=length/1000;
  16.         p[0]=number_table[length/10000];
  17.         j=length%10000/1000;
  18.         p[1]=number_table[j];
  19.         j=length%1000/100;
  20.         p[2]=number_table[j];
  21.         j=length%100/10;
  22.         p[3]=number_table[j];
  23.         j=length%10/1;
  24.         p[4]=number_table[j];
  25. }

  26. void LCD_GPIO_init(void)
  27. {
  28.     LCD_DIR|=BIT0+BIT1+BIT2+BIT3+BIT5;
  29.     LCD_IN|=BIT4;//字库输入脚设置
  30. }

  31. void setup(void)
  32. {
  33.     BCSCTL1 = CALBC1_1MHZ;                       /* Set DCO 改变频率显示速度改变  */
  34.     DCOCTL =  CALDCO_1MHZ;
  35.         P1DIR |= BIT0+BIT3;                           //设置P1.0 P1.4为输出
  36.         P1SEL |= BIT1 + BIT2;                         //设置P1.2端口为功能模块使用
  37.         TA0CTL = TASSEL_1 | ID_0 | MC_2 | TACLR;     //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
  38.         TA0CCTL0 =  CM_1 | CCIS_0 | SCS | CAP | CCIE;
  39.         _EINT(); //中断允许

  40.         LCD_GPIO_init();
  41.         initial_lcd();
  42.         clear_screen();    //clear all dots
  43. }

  44. int main(void)
  45. {
  46.         WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
  47.         setup();
  48.         start=1;
  49.     while(1)
  50.     {
  51.             P1OUT |= BIT0;
  52.             delay_us(15);
  53.             P1OUT &= ~BIT0;
  54.             delay_ms(60);
  55.             length=start;
  56.             Data_Converter(display_buffer);
  57.         display_GB2312_string(2,1,display_buffer);
  58.     }
  59. }

  60. #pragma vector=TIMER0_A0_VECTOR
  61. __interrupt void TIMER0_A0(void)
  62. {
  63.         switch(TA0IV) //向量查询
  64.         {
  65.                 case 2: //捕获中断
  66.                         if(TA0CCTL0&CM_0) //上升沿
  67.                         {
  68.                                 TA0CCTL0=(TA0CCTL0&(~CM_1))|CM_2;//更变设置为下降沿触发
  69.                                 start=TA0CCR0; //记录初始时间
  70.                                 overflow=0; //溢出计数变量复位
  71.                         }
  72.                         else if (TA0CCTL0&CM_2) //下降沿
  73.                         {
  74.                                 TA0CCTL0=(TA0CCTL0&(~CM_2))|CM_1;//更变设置为上升沿触发
  75.                                 end=TA0CCR0;
  76.                                 TA0CTL |= TACLR;//用start,end,overflow计算脉冲宽度
  77.                         }
  78.                         break;
  79.                 case 10: //定时器溢出中断
  80.                         overflow++;
  81.                         break; //溢出计数加1
  82.                 default:break;
  83.         }
  84. }
复制代码我在写一个对脉冲宽度的捕捉然后在显示屏上显示出脉冲的宽度,这是程序的一部分。然后我调试的时候,一开始是发现无法进入中断,然后对P1.1口接VCC时应该会有一个上升沿的,但是没有进入中断,但是接GND的时候会产生中断,但是这个时候观察寄存器TA0IV  发现一直显示的是0x0000,我就觉得很奇怪,请问是怎么回事呢?
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
迈尔风随
2019-03-25 05:33
本帖最后由 迈尔风随 于 2017-1-7 13:45 编辑
3955793141 发表于 2017-1-7 01:42
首先要谢谢您的解答。
我在外接了一个晶振32K的 ,然后我刚刚配置了ACLK , BCSCTL3 = XT2S_0 | LFXT1S_ ...

1、如果外接了晶振,那为什么在你的代码中没有关于此晶振的配置代码?晶振功能引脚与P2.6 P2.7功能脚复用,晶振都没有起振,定时器怎么会正常运行呢; 捕获3.PNG

2、TA0CTL = TASSEL_1 | ID_0 | MC_2 | TACLR;     //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
这一句我认为有些问题,TACLR不应该放在这里,官方手册里有说到设置TACLR位为清除TAR计数值、分频系数和计数方向,执行完这一句后可能定时器看似配置完成了可能却又回到了停止状态,根本没有运行。建议是先执行TACLR,再配置分频系数和运行模式;
捕获4.PNG

3、TA0CCTL0 =  CM_1 | CCIS_0 | SCS | CAP | CCIE;
这句代码中你将捕获方式设置为了上升沿触发捕获,可能是因为你用于捕获的P1.1引脚却没有使能上下拉电阻,引脚处于浮空状态,电平不稳定,所有当接到GND是引脚为低电平,拨开后变为浮空状态,电平高于GND电平,产生了一个假的上升沿才会进入捕获中断中。
捕获5.PNG

4、#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0(void)
{
        switch(TA0IV) //向量查询
你这样做也是有问题的,每个定时器的捕获/比较模块0都是单独占用一个中断向量TIMERx_A0_VECTOR,且是这个定时器中中断优先级最高的,其后的定时器溢出中断,捕获/比较模块1,2都共用一个中断向量TIMERx_A1_VECTOR,需要在中断程序中判断中断源,所以你这里是不需要判断中断向量源,因此你看到的TA0VI一直都是0。
捕获6.PNG

一周热门 更多>

相关问题

    相关文章