打印
[STC单片机]

使用STC keil环境编译,条件判断出错?

[复制链接]
1227|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序如下:现象为每隔几秒就出现一个错误的 768ms电平,按道理应该是1000ms的高低电平交替


unsigned  int    SysTicktime;                    //系统节拍  1ms
void main(void)
{
        Time0_int();
        LED_GPIO_config();

        while(1)
        {
                if(SysTicktime>1000)
                {

                                P07=!P07;
                                SysTicktime=0;
                }
       
        }
}
void tm0_isr() interrupt 1
{
        if(SysTicktime<=10000)SysTicktime++;
}


用STC仿真后发现在 SysTicktime=768的时候跳进去条件判断里了,导致电平翻转
将程序修改  > 改为 ==后  程序正常。
                if(SysTicktime==1000)
                {

                                P07=!P07;
                                SysTicktime=0;
                }


1000ms一次翻转,输出正常。

不敢贴图了 ,编辑了好久的帖子。提示有问题,全部清理。吐槽一下21的发帖

相关帖子

沙发
小了个明|  楼主 | 2017-7-25 20:22 | 只看该作者
在这里补图吧,这是错误的电平翻转。每隔几次正常的1000ms就会来一次 766ms高电平


  仿真发现跳进来了,变量的值为0X300


QQ图片20170725201002.png (14.85 KB )

QQ图片20170725201002.png

使用特权

评论回复
板凳
小了个明|  楼主 | 2017-7-25 20:24 | 只看该作者
最后面那张是将 if(SysTicktime>1000)  改为 if(SysTicktime==1000)   后,IO口输出的电平。 是我需要的结果。1秒翻转一次

使用特权

评论回复
地板
小了个明|  楼主 | 2017-7-25 20:27 | 只看该作者
几年前用STC,最近两三年都在用STM32和STM8。最近刚好有个项目 STC的资源刚刚合适。丢了几年的51想捡回来。没想到点个灯就栽了。
心好累啊~

使用特权

评论回复
5
linqing171| | 2017-7-25 20:51 | 只看该作者
if(SysTicktime>1000)

这句对应着的代码为 if(SysTicktime的低位大于0xE8 && SysTicktime的高位大于3)
而这两个比较中间是可以被中断打断的,执行if前值为0x2FF, 执行完if的前半句比较后,进入中断,值变为0x300,结果这个if通过了。
而按照比较相等的时候,不会发生0xE8变为0xE9的瞬间发生进位。

代码修改为:
unsinged char bigThan;
EA=0;
bigThan=(SysTicktime>1000);
EA=1;
if(bigThan)
{
巴拉巴拉
}

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
小了个明 + 3 很给力!
6
linqing171| | 2017-7-25 20:55 | 只看该作者
或者增加个变量 unsigned char OneSeconds=0;

void tm0_isr() interrupt 1
{
        SysTicktime++;
        if(SysTicktime>=1000) {OneSeconds=1;
                                SysTicktime=0;}
}
然后在
if(OneSeconds)
                {

                                P07=!P07;
OneSeconds=0;
                }
这样临界资源变为了OneSeconds,而两个线程写OneSeconds的时间差为1秒,根本不会发生冲突,也不用关中断了。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
小了个明 + 3 很给力!
7
小了个明|  楼主 | 2017-7-25 23:47 | 只看该作者
非常感谢 @linqing171 前辈的释疑。谢谢!
祝你事业顺心,步步高升  

使用特权

评论回复
8
changle11sdo5| | 2017-8-30 16:15 | 只看该作者
因为那玩意才是8位单片机,所以会断裂执行,用其它牌子的32位单片机应该就可以了…

使用特权

评论回复
9
ddllxxrr| | 2017-8-31 08:09 | 只看该作者
总觉得楼主的
void tm0_isr() interrupt 1
{
        if(SysTicktime<=10000)SysTicktime++;
}

有点不好,就++就完了,为什么要加上《=10000,这不科学

使用特权

评论回复
10
小了个明|  楼主 | 2017-9-2 20:37 | 只看该作者
ddllxxrr 发表于 2017-8-31 08:09
总觉得楼主的
void tm0_isr() interrupt 1
{

所有递加的变量我都会加一个判断,防止溢出。
特别这个变量是用在数组里面的时候,以前吃过亏

使用特权

评论回复
11
Drake| | 2017-9-2 22:24 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

130

帖子

3

粉丝