打印

程序中延迟等待问题请教大家

[复制链接]
1392|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asdfghzxcv|  楼主 | 2013-1-6 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在写程序时遇到了编程思想的问题,想请教大家一下。大家可以自己的处理办法
char SHTMeasure(char *value, char *p_checksum, enum Mode mode)
// 进行温度或者湿度转换,由参数mode决定转换内容;
{
//  enum Mode {TEMP,HUMI};                 //已经在头文件中定义
        unsigned error=0;
        unsigned int i;

        SHTStart();                       //启动传输
        switch(mode)                     //选择发送命令
    {        
                case TEMP : error+= SHTWriteByte(0x03); break;                   //测量温度
            case HUMI : error+= SHTWriteByte(0x05); break;                   //测量湿度
            default   : break;
        }
/*
        这个等待的时间有点长应该处理一下
        当发出了温(湿)度测量命令后,控制器就要等到测量完成。
        使用8/12/14位的分辨率测量分别需要大约11/55/210ms的时间
*/        for (i=0;i<65535;i++)
                if(SHTSDA==0)
                        break; //等待测量结束
        if(SHTSDA) error+=1;                // 如果长时间数据线没有拉低,说明测量错误
        *value     = SHTReadByte(ACK);    //读第一个字节,高字节 (MSB)
        *(value+1) = SHTReadByte(ACK);    //读第二个字节,低字节 (LSB) 把两个字节组合起来
        *p_checksum =SHTReadByte(noACK); //read CRC校验码
        return error;                                         // error=1 通讯错误                                                              
}

那个等待的时间太长长,我想请教大家一下,我怎么样处理那个等待时间,来提高系统的实时性。谢谢大家

相关帖子

沙发
asdfghzxcv|  楼主 | 2013-1-7 00:39 | 只看该作者
看了匠人手记中编程思想,经过自己半天的摸索。修改为自己比较满意的程序为,大家看看修改的怎么样,个人还是比较满意的,在这先谢谢:匠人和吴坚鸿(电子发烧友)。

把这个函数放在定时中断中使用,既不会影响其他程序的运行调高了实时性,同时也把这个测量的任务分解了几个阶段去运行。

unsigned char SHTStep = 1;//步骤变量 也可以说状态变量
unsigned char  shtdelay = 0;//延迟计数变量
void SHTMeasure(unsigned char *tempvalue, unsigned char *humivalue)
{
        char check;

        switch(SHTStep)
        {
                case 1:
                                SHTStart();
                                if(SHTWriteByte(0x03))          //测温度
                                {
                                       
                                        SHTConnectionReset();        //不成功就复位
                                        SHTStep = 1;
                                        break;       
                                }
                                else
                                {
                                        SHTStep++;                           //成功就进行下一步
                                        break;
                                       
                                }
                case 2:                                                        //等待转换
                                if(SHTSDA)
                                {                                                //转换时间等待
                                        shtdelay++ ;
                                        if(shtdelay > 211)               
                                        {
                                                SHTStep = 1;    //时间到仍然没有的就返回1处  重新开始测量
                                                shtdelay = 0;
                                                break;               
                                        }
                                }
                                else
                                {
                                        shtdelay = 0;
                                        SHTStep++;                 //成功进行下一步
                                }
                                break;               
                case 3:                                                                  //转换完成读取数据
                    *tempvalue = SHTReadByte(ACK);
                                 _nop_();_nop_();  
                *(tempvalue+1)= SHTReadByte(ACK);
                                check =SHTReadByte(noACK); //read CRC校验码
                                SHTStep++;
                                break;
            case 4:                                                           //开始湿度的测量
                                SHTStart();
                                if(SHTWriteByte(0x05))
                                {
                                        SHTConnectionReset();  //不成功就复位
                                        SHTStep = 4;
                                        break;       
                                }
                                else
                                {
                                        SHTStep++;                  //成功就进行下一步
                                        break;
                                       
                                }
                case 5:
                                if(SHTSDA)
                                {
                                        shtdelay++ ;
                                        if(shtdelay > 55)
                                        {
                                                SHTStep = 4;
                                                shtdelay = 0;
                                                break;               
                                        }
                                }
                                else
                                {
                                        shtdelay = 0;
                                        SHTStep++;       
                                }
                                break;
                case 6:                                                                                  //读取测量的数值
                                *humivalue = SHTReadByte(ACK);
                                 _nop_();_nop_();
                                *(humivalue+1) = SHTReadByte(ACK);
                                check =SHTReadByte(noACK); //read CRC校验码
                                SHTStep = 1;
                                break;
                default:break;                       
                                       
        }
       
}

使用特权

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

本版积分规则

0

主题

33

帖子

1

粉丝