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

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条回答
3955793141
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,为无中断,可不应该进入中断后就应该会有一个值得吗?

一周热门 更多>

相关问题

    相关文章