找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3965|回复: 4
打印 上一主题 下一主题
收起左侧

stc单片机两个长整型相减出错 仿真总是不行

[复制链接]
跳转到指定楼层
楼主
ID:218365 发表于 2017-7-18 18:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-7-19 06:35 | 只看该作者
约定是非符号数,求差后,如果出现负数了,你让编译如何下结论?说正,可是差出来是负不能说瞎话;说负又违反你的约定,于是跳楼牺牲被你逼死了。
回复

使用道具 举报

板凳
ID:218365 发表于 2017-7-19 21:00 | 只看该作者
yzwzfyz 发表于 2017-7-19 06:35
约定是非符号数,求差后,如果出现负数了,你让编译如何下结论?说正,可是差出来是负不能说瞎话;说负又违 ...

有什么好的算法吗,刚学就照着宏晶例子抄来的,有什么好的算法吗,是不是在持续一个周期后清零重新计数,
回复

使用道具 举报

地板
ID:111634 发表于 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  数据类型转换
回复

使用道具 举报

5#
ID:218365 发表于 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;               
        }
}
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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