zhuyi25762 发表于 2010-6-10 23:01:39

大家帮我看下是STC EEPROM不行,还是我程序哪里错了,10秒倒计时我都搞不定了

我设置的time=00,time=10四位数码管显示 00:10 表示10秒钟,倒计时
read_time();   
time_sum=time*60+time;//计算总共多少秒,每秒减一

void read_time(void)
{
time=byte_read(minute_addr);
time=byte_read(second_addr);
}
是我写入设置好time后写入EERPOM后,再从中读出来的

现在问题是 如下,我程序在模式1中,,,,正常情况下,收到启动倒计是信号,应该会从10.9.8……0倒计时,结束后 ,读回原来的时间。回到00:10

而现在的问题是,收到启动信号后,在倒计时没结束前收到停止信号,工作正常,倒计时后会回到10。。。。

可在我让倒计时自己减到0,,本来应该是回到0后,也是返回到原来的设置时间 00:10。。。可奇怪的时,它总是要先跳一个 68:14 出来。。。。然后再又

回到00:10。。为什么会先读一个错误的值出来,而后又回到正常呢,,,,但是在收到停止信号时为什么是正常的? 搞不懂


还有就是第二种模式下,我让倒计是自己减一,从10到0,然后应该回到10。。。然后再等待第二次触发信号

现在问题却是,10减到0后,回到了10。可它却接着再减1,变成了 9 停在那等第二次触,有时还是8。7.6。。。。。有时却又很正常



大家帮我看一下是我程序问题吗??还是STC内部EEPROM不稳定?。。。。


不胜感激!!!




if(0xa1==mod)//模式1,停止信号 优先,收到停止信号,停倒计时,当然,倒计时结束后还没收到停止信号,也自动产生一个停止信号
{
if(start_time)//收到从机启动倒计时触发信号
{
if(time_sum--)//减一秒
{
time_over=0;
time=time_sum/60;
time=time_sum%60;
}
else //倒计时时间为0
{
start_time=0;
time_over=true;//定时时间到,发送信号通知从机产生停止信号和关风机
}
}
if(stop_time)//在定时时间到之前,收到从机发过来的停止倒计时触发信号,停止倒计时
{
time_over=0;
stop_time=0;
delayms(20);//待数据稳定后,读数据
read_time();//重新读回设置时间
time_sum=time*60+time;
}
}
if(0xa2==mod)//定时器优先模式,,不检测从机的停止触发信号
{
if(start_time)//收到启动倒计时信号
{
if(time_sum--)
{
    time_over=0;
time=time_sum/60;
time=time_sum%60;
}
else
{
time_over=1;//定时时间到,通知从机关风机
start_time=0;
delayms(20);//待数据稳定后,读数据
read_time();//重新读回设置时间
time_sum=time*60+time;
mod2_over=1;
}
}
if(mod2_over && stop_time)
{
mod2_over=0;
time_over=0;
stop_time=0;
}





从机那边 if(time_over)//收到主机发过来的,定时时间到标志位,关电机   
{   
start_time=0;//   
stop_time=1;//
FansOff();   
}

zhuyi25762 发表于 2010-6-10 23:16:41

uchar time;


EEPROM 的读写,我也试过了,能读能写。。就是在这个自动倒计时结束才会出问题,其它都不出问题。。。我触发后也是执行

if(stop_time)//在定时时间到之前,收到从机发过来的停止倒计时触发信号,停止倒计时
{
time_over=0;
stop_time=0;
delayms(20);//待数据稳定后,读数据
read_time();//重新读回设置时间
time_sum=time*60+time;
}

倒计是结束也是执行它,可结果却不同,,,我很讷闷呀,,,老是要先闪一个其它的值出来,然后再是正确的值

zhuyi25762 发表于 2010-6-11 00:06:00

自已分析,可是没找到理由

为什么收到停止信号是正常的,因为没减到0

为什么自动减到0就不正常了,,,可能是减到0后,它还在往下减,所以出现了负的

可……唉,自己在程序里也没找到其错误在哪

eduhf_123 发表于 2010-6-11 02:13:15

68:14,按LZ你的算法,可以得到:68*60+14=4094,这个数字很有意思啊……

snoopyzz 发表于 2010-6-11 03:55:36

time_sum==-2时,即16位int的65534时
65534/60=1092=0x0444,赋给8位变量时只取了低8位0x44=68
65534%60=14

68:14就这么来的
至于为什么,代码不全,无法继续分析

zhuyi25762 发表于 2010-6-11 09:22:11

谢谢哈

找到问题

if(time_sum--)问题,

改成if(time_sum>=0)就好了

郁闷的是 我time_sum是unsigned int...怎么会减到负数去了呢

snoopyzz 发表于 2010-6-11 10:19:40

为什么减到负数很简单,凌晨精神不好懒得仔细看

当time_sum==0时
if(time_sum--)
{
这里的确是不执行了
}
但执行完后,time_sum就是-1了

martal 发表于 2010-6-13 00:28:00

4094,有意思,哈哈

xiaomage_2000 发表于 2010-6-18 15:32:02

我有个疑问,当一个整形数组减为0后继续减不是0XFF吗?起码汇编里面是这样的?
页: [1]
查看完整版本: 大家帮我看下是STC EEPROM不行,还是我程序哪里错了,10秒倒计时我都搞不定了