C51中断里unsigned int不能用?

[复制链接]
6779|22
 楼主| 7120223 发表于 2010-11-30 11:42 | 显示全部楼层 |阅读模式
本帖最后由 7120223 于 2010-11-30 15:55 编辑

用了一款STC的单片机,在定时器中断0里面有个数组的下标要累加,一开我定义为unsigned char Num;能够正常运转,现在由于数组变大,下标超过了255,我就定义为unsigned int  Num;但是程序一运算Num++; 就死机了...

void timer0() interrupt 1   
{
   if(m_flag)
   {
       TH0 = Timer_speed[1]/256;
       TL0 = Timer_speed[1]%256;
       CK = 1;
       m_flag = 0;
   }
else
{
      TH0 = Timer_speed[1]/256;
      TL0 = Timer_speed[1]%256;
      CK = 0;
      m_flag = 1;

//----------------------------------------------------------------------
if(UP_flag)         //加速部分
{
      if(Speed_Count==0)
      {
           Speed_Count = Speed_Step;        //每个定时器速度运算Speed_Step次
           Timer_speed[1] = T1_time[T1_Num];//赋值定时器值
           T1_Num++;
            if(T1_Num>=500)                          //到达预定速度
           {
                 UP_flag  = False;                      //加速标志去除,进入匀速
                 UP_Count = 0;                        
                 T1_Num--;
            }
           UP_Count++;                     
           if(UP_Count>=UP_Rate)       //速度等级判断,当要求较慢速度时的调节
           {
                 UP_flag  = False;
                UP_Count = 0;
                T1_Num--;
            }
        }
    }
    Speed_Count--;
}
if(Down_flag&&(UP_flag==0))      //减速部分
{
      if(Speed_Count==0)
     {
          Speed_Count = Speed_Step;
          Timer_speed[1] = T1_time[T1_Num];
           T1_Num--;
           if((T1_Num<=1)||(Timer_speed[1]<=Timer_speed[0]))
           {
                 Timer_speed[1] = Timer_speed[0];    //[0]是串口数据发来的速度的最低限制
                 Down_flag = False;
            }   
      }
     Speed_Count--;

}
  if(Motor_Count<Motor_Dwon)    //到剩余步数后置位减速标志
  {
        Down_flag = True;
        UP_flag   = False;
  }
  Motor_Count--;
  Motor_Count0--;
  if(Motor_Count0==0)Motor_Stop();//电机停止初始值复位
}

程序有点长:具体意思就是一个步进电机的加速,匀速,减速,到停止
ayb_ice 发表于 2010-11-30 11:57 | 显示全部楼层
本帖最后由 ayb_ice 于 2010-11-30 13:24 编辑

LZ还没有临界代码概念,什么叫原子操作,什么叫公共资源,怎样共享公共资源...


否则不可能写出高质量程序...
liang7143 发表于 2010-11-30 12:09 | 显示全部楼层
LZ程序估计有问题
coody 发表于 2010-11-30 12:13 | 显示全部楼层
C51中断里用unsigned int的多的是,LZ你检查下程序,或者软仿跟踪看看,甚至用反汇编看具体执行情况。
zhiyonghe 发表于 2010-11-30 12:16 | 显示全部楼层
100%程序问题
lwag 发表于 2010-11-30 12:20 | 显示全部楼层
正在学习C51中。
冯冯冯冯 发表于 2010-11-30 12:22 | 显示全部楼层
我也出现类似问题,可能你程序有点问题,在KEIL里单步执行追踪看看吧
 楼主| 7120223 发表于 2010-11-30 13:02 | 显示全部楼层
2楼谢谢你啦  我以前都没听说过 “临界代码”,公司只有我一个搞这个,所以好多东西没有人来指导,也就是在论坛上看大家的一些问题学习一下,不懂的 在在网上问问。
我刚刚查了一下“临界代码”的概念,理解为中断和和主程序同时需要改变或引用一个全局变量的时候出现的一个冲突而产生变量值的改变导致出错的。但是我这个 是没有的 我定义unsigned int  Num; 只在中断里面来自加的,或置零的。
ayb_ice 发表于 2010-11-30 13:25 | 显示全部楼层
LS
那就是访问越界了
 楼主| 7120223 发表于 2010-11-30 13:36 | 显示全部楼层
本帖最后由 7120223 于 2010-11-30 13:41 编辑

能说的详细点么我还是不明白我哪里越界了?
uint code T1_time[600];
uint Timer_speed[2];
...中断....
{
Timer_speed[1] = T1_time[T1_Num];
T1_Num++;
if(T1_Num>500)
{
   T1_Num = 0;
......
}
}

7楼,我没有仿真器,keil里面看不到中断里面值的变化。
ayb_ice 发表于 2010-11-30 14:04 | 显示全部楼层
这里没有问题
也可能是程序逻辑问题,算法本身的问题
实在不行,上全部源代码
冯冯冯冯 发表于 2010-11-30 14:15 | 显示全部楼层
10# 7120223


。。我装了KEIL4和keil3两个版本,单步执行的时候,定时中断的话观察寄存器里的值啊,有变化的。。
外部中断的话,就采用keil的peripherals工具下的I/O进行中断,来观察寄存器值的变化

建议你装KEIL4版本,鼠标放在变量上,直接可以看到定义的变量的存放地址和里头的值
MIHAWK 发表于 2010-11-30 14:18 | 显示全部楼层
T1_Num有定义吗?
按照你贴的程序,你只是把 “T1_time[600]”这个数组的类型定义为unsigned int型,并没有把T1_Num定义成unsigned int型。
冯冯冯冯 发表于 2010-11-30 14:28 | 显示全部楼层
本帖最后由 冯冯冯冯 于 2010-11-30 14:46 编辑

。。
areshan 发表于 2010-11-30 14:32 | 显示全部楼层
还是单独调试看看,要不然错误真的很难找到!
 楼主| 7120223 发表于 2010-11-30 15:52 | 显示全部楼层
本帖最后由 7120223 于 2010-11-30 16:11 编辑

程序的一小段 我贴在了第一楼,变量的各个定义 没有错的,只是我没写出来。
单步运行也看了,恩值都是一样的 按照一个个的向上加的。
现在暂时我先定义两个uchar的型来代替uint了。
这个问题挺奇怪的,我估计也是我程序上的问题,因为我在别的程序也用过也没出现这种现象,只是在这个程序上我实在是找不到原因出在哪里了,可疑的地方我都试着去排除了。
 楼主| 7120223 发表于 2010-11-30 16:32 | 显示全部楼层
那个大数组 是定义在ROM中的 ,他是不变了 我只是对其类似于查表引用
ayb_ice 发表于 2010-11-30 16:39 | 显示全部楼层
EA = 0;
T1_Num++;
EA = 1;
试试
 楼主| 7120223 发表于 2010-12-1 10:54 | 显示全部楼层
前几天怎么试 都是有问题,今天什么都没改就把uchar 改为uint 竟然好了 没问题了,郁闷...
冯冯冯冯 发表于 2010-12-1 11:24 | 显示全部楼层
啥情况啊,这是。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

389

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部