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

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条回答
迈尔风随
1楼-- · 2019-03-24 18:23
< 你在配置Timer0的输入时钟时使用了ACLK作为时钟,但你却没有为ACLK进行时钟源配置,虽然相关的寄存器的默认值是选择外接的32.768KHz实时时钟晶振作为ACLK的时钟源,但是如果你板子上没有焊上这个晶振的话,结果就是定时器根本无法运行起来,所以在下降沿中断进入定时器中断中时计数值会一直为0,所以你先确定一下是不是这个问题
捕获1.PNG 捕获2.PNG
3955793141
2楼-- · 2019-03-24 22:56
< :TI_MSP430_内容页_SA7 -->
迈尔风随 发表于 2017-1-6 23:38
你在配置Timer0的输入时钟时使用了ACLK作为时钟,但你却没有为ACLK进行时钟源配置,虽然相关的寄存器的默认 ...

首先要谢谢您的解答。
我在外接了一个晶振32K的 ,然后我刚刚配置了ACLK , BCSCTL3 = XT2S_0 | LFXT1S_2 | XCAP_1;
发现我接GND之后拔起来才会有中断,直接接VCC没有反应,是不是该端口本来就有一个电平?
其次是可以进入中断,但是进入中断后中断向量的值扔为0x0000,为无中断,可不应该进入中断后就应该会有一个值得吗?
3955793141
3楼-- · 2019-03-25 00:11
 精彩回答 2  元偷偷看……
迈尔风随
4楼-- · 2019-03-25 02:15
3955793141 发表于 2017-1-7 01:44
还有一个小问题是TIMER0_A0_VECTOR 是不是对应着CCR0,P1.1口,TIMER0_A1_VECTOR 对应着CCR1,P1.2口?

你去确认过引脚功能就可以,你说的没有错,代码中对此两个引脚的配置也没有错
迈尔风随
5楼-- · 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
3955793141
6楼-- · 2019-03-25 10:57
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章