3668|6

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

刚刚写程序的时候遇到一个问题 [复制链接]

  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,我就觉得很奇怪,请问是怎么回事呢?

最新回复

本帖最后由 迈尔风随 于 2017-1-7 13:45 编辑 1、如果外接了晶振,那为什么在你的代码中没有关于此晶振的配置代码?晶振功能引脚与P2.6 P2.7功能脚复用,晶振都没有起振,定时器怎么会正常运行呢;[attach]277992[/attach] 2、TA0CTL = TASSEL_1 | ID_0 | MC_2 | TACLR;     //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式 这一句我认为有些问题,TACLR不应该放在这里,官方手册里有说到设置TACLR位为清除TAR计数值、分频系数和计数方向,执行完这一句后可能定时器看似配置完成了可能却又回到了停止状态,根本没有运行。建议是先执行TACLR,再配置分频系数和运行模式; [attach]277993[/attach] 3、TA0CCTL0 =  CM_1 | CCIS_0 | SCS | CAP | CCIE; 这句代码中你将捕获方式设置为了上升沿触发捕获,可能是因为你用于捕获的P1.1引脚却没有使能上下拉电阻,引脚处于浮空状态,电平不稳定,所有当接到GND是引脚为低电平,拨开后变为浮空状态,电平高于GND电平,产生了一个假的上升沿才会进入捕获中断中。 [attach]277994[/attach] 4、#pragma vector=TIMER0_A0_VECTOR __interrupt void TIMER0_A0(void) {         switch(TA0IV) //向量查询 你这样做也是有问题的,每个定时器的捕获/比较模块0都是单独占用一个中断向量TIMERx_A0_VECTOR,且是这个定时器中中断优先级最高的,其后的定时器溢出中断,捕获/比较模块1,2都共用一个中断向量TIMERx_A1_VECTOR,需要在中断程序中判断中断源,所以你这里是不需要判断中断向量源,因此你看到的TA0VI一直都是0。 [attach]277995[/attach]   详情 回复 发表于 2017-1-7 21:43
 
点赞 关注

回复
举报

578

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
你在配置Timer0的输入时钟时使用了ACLK作为时钟,但你却没有为ACLK进行时钟源配置,虽然相关的寄存器的默认值是选择外接的32.768KHz实时时钟晶振作为ACLK的时钟源,但是如果你板子上没有焊上这个晶振的话,结果就是定时器根本无法运行起来,所以在下降沿中断进入定时器中断中时计数值会一直为0,所以你先确定一下是不是这个问题

 
个人签名刻苦学习,共同进步
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
迈尔风随 发表于 2017-1-6 23:38
你在配置Timer0的输入时钟时使用了ACLK作为时钟,但你却没有为ACLK进行时钟源配置,虽然相关的寄存器的默认 ...

首先要谢谢您的解答。
我在外接了一个晶振32K的 ,然后我刚刚配置了ACLK , BCSCTL3 = XT2S_0 | LFXT1S_2 | XCAP_1;
发现我接GND之后拔起来才会有中断,直接接VCC没有反应,是不是该端口本来就有一个电平?
其次是可以进入中断,但是进入中断后中断向量的值扔为0x0000,为无中断,可不应该进入中断后就应该会有一个值得吗?

点评

1、如果外接了晶振,那为什么在你的代码中没有关于此晶振的配置代码?晶振功能引脚与P2.6 P2.7功能脚复用,晶振都没有起振,定时器怎么会正常运行呢;[attachimg]277992[/attachimg] 2、TA0CTL = TASSEL_1 | ID_0  详情 回复 发表于 2017-1-7 21:43
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 
迈尔风随 发表于 2017-1-6 23:38
你在配置Timer0的输入时钟时使用了ACLK作为时钟,但你却没有为ACLK进行时钟源配置,虽然相关的寄存器的默认 ...

还有一个小问题是TIMER0_A0_VECTOR 是不是对应着CCR0,P1.1口,TIMER0_A1_VECTOR 对应着CCR1,P1.2口?

点评

你去确认过引脚功能就可以,你说的没有错,代码中对此两个引脚的配置也没有错  详情 回复 发表于 2017-1-7 21:10
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

5
 
3955793141 发表于 2017-1-7 01:44
还有一个小问题是TIMER0_A0_VECTOR 是不是对应着CCR0,P1.1口,TIMER0_A1_VECTOR 对应着CCR1,P1.2口?

你去确认过引脚功能就可以,你说的没有错,代码中对此两个引脚的配置也没有错
 
个人签名刻苦学习,共同进步
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

6
 
本帖最后由 迈尔风随 于 2017-1-7 13:45 编辑
3955793141 发表于 2017-1-7 01:42
首先要谢谢您的解答。
我在外接了一个晶振32K的 ,然后我刚刚配置了ACLK , BCSCTL3 = XT2S_0 | LFXT1S_ ...

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

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


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


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

赞赏

1

查看全部赞赏

 
个人签名刻苦学习,共同进步
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
迈尔风随 发表于 2017-1-7 21:43
1、如果外接了晶振,那为什么在你的代码中没有关于此晶振的配置代码?晶振功能引脚与P2.6 P2.7功能脚复用 ...

好的,先谢谢您这么详细的解答,我再调试看看有什么结果吧~~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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