标题: stc单片机两个长整型相减出错 仿真总是不行 [打印本页]

作者: ZXHREG    时间: 2017-7-18 18:06
标题: stc单片机两个长整型相减出错 仿真总是不行
unsigned char cnt=0;//pca计数器溢出次数
unsigned long count0=0;//记录上一次捕获值
unsigned long count1=0;//记录本次捕获值
unsigned long length=0;//存储信号的时间长度

void PCA_ISR() interrupt 7
{
        if(CF)
        {        CF=0;
                cnt++;//pca计数器溢出次数+1
        }
        if(CCF3)
        {
                CCF3=0;
                count0=count1;//备份上次捕获的值(上次捕获时的计数值)
                ((unsigned char *)&count1)[3]=CCAP3L;
                ((unsigned char *)&count1)[2]=CCAP3H;
                ((unsigned char *)&count1)[1]=cnt;
                 ((unsigned char *)&count1)[0]=0;
               
                length=count1 - count0;没有执行相减之前,count1和count0的值都正常不超1M,减完最大数竟然有428M


               
                cnt=0;
               
        }
}
用的是stc8a8k64sa12最新的单片机
不知道错在哪里了 count1和count0的值用lcd输出都显示正常
length的值就不稳定,最大到400多M
这个芯片有仿真功能,就是仿真不成功 总是 Connection to target system lost!


作者: yzwzfyz    时间: 2017-7-19 06:35
约定是非符号数,求差后,如果出现负数了,你让编译如何下结论?说正,可是差出来是负不能说瞎话;说负又违反你的约定,于是跳楼牺牲被你逼死了。
作者: ZXHREG    时间: 2017-7-19 21:00
yzwzfyz 发表于 2017-7-19 06:35
约定是非符号数,求差后,如果出现负数了,你让编译如何下结论?说正,可是差出来是负不能说瞎话;说负又违 ...

有什么好的算法吗,刚学就照着宏晶例子抄来的,有什么好的算法吗,是不是在持续一个周期后清零重新计数,
作者: zl2168    时间: 2017-7-20 10:07
先学概念:数据类型转换,再学Keil C调试,观测程序逐条执行后,数据类型变化。最后再去Proteus仿真。介绍一本书,《80C51单片机实用教程——基于Keil C和Proteus》,4.2.4  数据类型转换,高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。内有一节:4.2.4  数据类型转换
作者: ZXHREG    时间: 2017-7-20 19:12
zl2168 发表于 2017-7-20 10:07
先学概念:数据类型转换,再学Keil C调试,观测程序逐条执行后,数据类型变化。最后再去Proteus仿真。介绍 ...

新学,用的是最新的stc8a8k64s4a12 ,不知为什么keil下仿真就出connection to target system  lost
改了一下,不出溢出的错误了,但总是觉得哪里不对,还请指教
void PCA_ISR() interrupt 7
{
        if(CF)
        {        CF=0;
                cnt++;//pca计数器溢出次数+1
                if(cnt>=168)//11.0592频率下不足1HZ清零
                {
                        CH=0;    CL=0;
                        count1=0;count0=0;
                        cnt=0;
                        CCF3=0;
                        HZ=0;
                        pcaFlag=1;
                }
        }
        if(CCF3)
        {
                CCF3=0;
                count0=count1;//备份上次捕获的值(上次捕获时的计数值)
                ((unsigned char *)&count1)[3]=CCAP3L;
                ((unsigned char *)&count1)[2]=CCAP3H;
                ((unsigned char *)&count1)[1]=cnt;
                ((unsigned char *)&count1)[0]=0;
                 length=count1-count0;
                HZ=11059200/length;//11.0592M频率
                pcaFlag=1;               
        }
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1