智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3287|回复: 3
打印 上一主题 下一主题

怎么破!?测试程序出不了中断,无法正常测速

[复制链接]

2

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
512
威望
429
贡献
55
兑换币
0
注册时间
2010-4-3
在线时间
14 小时
跳转到指定楼层
1#
发表于 2010-5-22 16:06:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用编译器单步后,发现出不了中断~~for中根本不执行
求达人~~!!
  1. int flag;
  2. int n;
  3. int x;
  4. unsigned int sudu;
  5. static unsigned int waittime ;
  6. void delay(int x)
  7. {
  8.      int i,j,k;
  9.      for(i=0;i<125;i++)
  10.       for(j=0;j<125;j++)
  11.         for(k=0;k<x;k++);
  12. }

  13. void duoji(int anger)
  14. {  
  15.       PWMDTY01=1000 + (anger + 45) * (1000 / 90);
  16. }

  17. static void PWM_Init(void)
  18. {     
  19.    
  20.       
  21.     PWMCTL_CON01=1;                  //0和1联合成16位PWM;
  22.     PWMCAE_CAE1=0;
  23.     PWMCAE_CAE3=0;
  24.     PWMCAE_CAE2=0;                        //选择输出模式为左对齐输出模式
  25.     PWMCNT01 = 0;
  26.     PWMCNT3 = 0;
  27.     PWMCNT2 = 0;                                //计数器清零;
  28.     PWMPOL_PPOL1=1;
  29.     PWMPOL_PPOL3=1;
  30.     PWMPOL_PPOL2=1;                        //先输出高电平,计数到DTY时,反转电平
  31.     PWMPRCLK = 0X40;    //clockA不分频,clockA=busclock=16MHz;CLK B 16分频:1Mhz   
  32.     PWMSCLA = 8;
  33.     PWMSCLB = 50;        //对clock SA 进行2*8=16分频;pwm clock=clockA/16=1MHz;     
  34.     PWMCLK_PCLK1 = 1;
  35.     PWMCLK_PCLK3 = 1;
  36.     PWMCLK_PCLK2 = 1;   //选择clock SA做时钟源
  37.     PWMPER01  =  20000;   //周期20ms; 50Hz;(可以使用的范围:50-200hz)
  38.     PWMDTY01  =  1500;
  39.     PWMPER3   =  200;
  40.     PWMPER2   =  200;
  41.     PWMDTY3   =  0;
  42.     PWMDTY2   =  0;   
  43.     PWME_PWME1 = 1;
  44.     PWME_PWME3 = 1;
  45.     PWME_PWME2 = 1;        
  46. }

  47. void setbusclock(void)   //PLL setting
  48. {   
  49.     CLKSEL=0X00;    //disengage PLL to system
  50.     PLLCTL_PLLON=1;   //turn on PLL
  51.     SYNR=1;         
  52.     REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
  53.     _asm(nop);          //BUS CLOCK=16M
  54.     _asm(nop);
  55.     while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
  56.     CLKSEL_PLLSEL =1;          //engage PLL to system;
  57. }

  58. //--------------------定时器初始化------------------//
  59. void ECT0_Init(void)
  60. {
  61.   TIOS=0x01;    //定时器通道0设置为输出比较
  62.   TC0=0x1388;   //赋初值,当TCNT从0计数到此值时第一次进入中断
  63.   TCTL2=0x02;  //其他七路与定时器断开   执行的动作时:0通道输出清零
  64.   TSCR2=0x07;   //溢出中断禁止   32M/128=4微秒,计一个数用4微秒
  65.   TSCR1=0x80;  //使能定时器
  66.   TIE=0x01;     //通道0输出比较中断允许
  67. }

  68. void Pulse_int(void)    //脉冲累加器初始化
  69. {
  70. // TSCR1_TEN =1;
  71.   PACTL_PAEN =0;
  72.   PACTL_PAMOD=0  ;
  73.   PACTL_PEDGE=0 ;
  74.    
  75.   PACTL_PAOVI=0;
  76.   PACTL_PAI = 1;
  77.   PACNT=0;   
  78.   PAFLG_PAOVF=1;
  79.   PAFLG_PAIF =1;
  80.   PACTL_PAEN =1;
  81. }


  82. unsigned int speed_get(void)  
  83. {     unsigned int speed;
  84.       speed = PACNT;
  85.       PACNT = 0;
  86.       return speed;
  87. }
  88. unsigned int speed(unsigned int m)
  89. {     unsigned int s;
  90.         s=10*m/105;//转每秒
  91.         return s;
  92. }
  93.    
  94.      
  95.          
  96.      
  97. //-----------------------主函数------------------------//
  98. void main(void)
  99. {
  100.   unsigned int y=0;
  101.   Pulse_int();
  102.   setbusclock();
  103.   ECT0_Init();
  104.   PWM_Init();
  105.    flag=1;
  106.    x=0;
  107.    n=0;
  108.    sudu=0 ;
  109.    waittime=0;
  110.    DDRA=0xFF;

  111.   EnableInterrupts;
  112.   for(;;)
  113.   {    //EnableInterrupts;
  114.         if(flag==1)
  115.      {
  116.         n++;
  117.        }
  118.       
  119.         if(n==10)
  120.         { flag=0;}
  121.       
  122.         if(flag==0)
  123.          { n--;}
  124.         
  125.         if(n==0)
  126.          { flag=1;}
  127.          x=10*n-25;
  128.         // duoji(x);
  129.          if(flag==1)
  130.          {
  131.           PWMDTY2=0;
  132.           PWMDTY3 =20*n;
  133.          }
  134.          if(flag==0)
  135.          {
  136.           PWMDTY3=0;
  137.           PWMDTY2 =20*n;
  138.          }
  139.          delay(1);        
  140.          y=speed(sudu);//获得速度
  141.          if(y>=50)//大于50转每秒
  142.           {
  143.           n=0;
  144.          }
  145.   }
  146. }


  147. //-----------------------中断函数处理-------------------//
  148. #pragma CODE_SEG NON_BANKED
  149. void interrupt 8 Timer0_ISR(void) //8为定时器通道0的中断标号
  150. {
  151.   unsigned int m;
  152.   TFLG1_C0F=1;//清中断标志位
  153.   //DisableInterrupts;
  154.   m=TCNT;
  155.   TC0=m+5000; //5000*4us=20ms定时时间
  156.   waittime++;
  157.   if(waittime>=10)
  158.   { PORTA_PA0=~PORTA_PA0;//led灯
  159.     sudu=speed_get();
  160.     waittime=0;
  161.    
  162.   }
  163.   
  164. }
  165. #pragma CODE_SEG DEFAULT
复制代码

7

主题

158

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2843
QQ
威望
393
贡献
2380
兑换币
26
注册时间
2009-11-5
在线时间
35 小时
2#
发表于 2010-5-27 08:42:59 | 只看该作者
你试一下中断函数里关中断看看,还有就是主函数中应该先关中断,再初始化,再开中断
回复 支持 反对

使用道具 举报

1

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
威望
241
贡献
36
兑换币
0
注册时间
2009-12-23
在线时间
7 小时
3#
发表于 2010-6-27 13:16:58 | 只看该作者
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

高级会员

Rank: 4

积分
659
威望
436
贡献
199
兑换币
18
注册时间
2010-4-9
在线时间
12 小时
4#
发表于 2010-7-15 21:40:31 | 只看该作者
改prm文件了么....??
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 08:11 , Processed in 0.073809 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表