huarana 发表于 2016-10-13 23:27:57

读取18b20温度传感器 温度值不更新请教

平台是stm32f103rc ,freertos模板是cubemx生成的。us延时函数移植的安富莱的。

每5秒钟读取一次温度用串口观察,发现只有第一次的值。
以后温度值不再改变。

/* TempTask function */
void TempTask(void const * argument)
{
/* USER CODE BEGIN TempTask */
/* Infinite loop */
    u8    ds18b20_temp={0};
    short    temperature=0;
for(;;)
{
    osDelay(5000);
//      temperature = DS18B20_Get_Temp();
      temperature = DS18B20_ReadTempReg();
            ds18b20_temp=(temperature/100)+'0';
            ds18b20_temp=(temperature%100/10)+'0';
            ds18b20_temp=(temperature%10)+'0';
      printf("当前温度值为:%sC \r\n",ds18b20_temp);
      printf("temperature=%d\r\n",temperature);
}
/* USER CODE END TempTask */
}

eric2013 发表于 2016-10-14 10:27:47

DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。

huarana 发表于 2016-10-14 12:51:29

回 eric2013 的帖子

eric2013:DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。 (2016-10-14 10:27) images/back.gif

我一开始用的以前用过的例子修改过来,发现不行。

然后使用你们的18b20例程里的,发现 也不行、

说明一下,我用的时间片的调度,所有任务为相同的优先级,目前开了4个任务。2个LED的 ,一个串口的,一个就是18b20的。

主要目的也是为了学习us延时的应用。

maksim 发表于 2016-10-14 14:18:21

读取的时候临界保护吧。 taskENTER_CRITICAL()

eric2013 发表于 2016-10-14 14:21:06

回 huarana 的帖子

huarana:我一开始用的以前用过的例子修改过来,发现不行。

然后使用你们的18b20例程里的,发现 也不行、

....... (2016-10-14 12:51) images/back.gif

我们的那个DS18B20驱动做开关中断保护了,相对于裸机,在bsp.h文件中做了开关中断的重定向,使用FreeRTOS的开关中断函数实现。

huarana 发表于 2016-10-14 18:45:55

回 eric2013 的帖子

/* TempTask function */
void TempTask(void const * argument)
{
/* USER CODE BEGIN TempTask */
/* Infinite loop */
    u8    ds18b20_temp={0};
    volatile    short    temperature=0;
for(;;)
{
    osDelay(5000);
//      temperature = DS18B20_Get_Temp();
      DISABLE_INT();
      temperature = DS18B20_ReadTempReg();
      ENABLE_INT();
            ds18b20_temp=(temperature/100)+'0';
            ds18b20_temp=(temperature%100/10)+'0';
            ds18b20_temp=(temperature%10)+'0';
      printf("当前温度值为:%sC \\r\\n",ds18b20_temp);
      printf("temperature=%d\\r\\n",temperature);
}
/* USER CODE END TempTask */
实在没辙了,在任务里面保护了下。好了。 仅仅保护初始化函数不行。
不过这样可能会对其他地方有影响。

eric2013 发表于 2016-10-15 12:32:50

回 huarana 的帖子

huarana: (2016-10-14 18:45) images/back.gif

DS18B20不适合用在对系统实时性有要求的场合,以前测试18B20读取一次得需要4-5ms,关闭中断的时间都是毫秒级的,太影响实时性,中断服务程序程序将无法到的及时执行。FreeRTOS还稍好点,可以有不受FreeRTOS控制的中断优先级。

廷润 发表于 2020-4-17 12:56:23

本帖最后由 廷润 于 2020-4-17 14:33 编辑

早上用示波器,对着时序调整就可以了。
页: [1]
查看完整版本: 读取18b20温度传感器 温度值不更新请教