硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6191|回复: 7
收起左侧

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

[复制链接]

2

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2016-10-13 23:27:57 | 显示全部楼层 |阅读模式
平台是stm32f103rc ,freertos模板是cubemx生成的。  us延时函数移植的安富莱的。

每5秒钟读取一次温度用串口观察,发现只有第一次的值。
以后温度值不再改变。
  1. /* TempTask function */
  2. void TempTask(void const * argument)
  3. {
  4.   /* USER CODE BEGIN TempTask */
  5.   /* Infinite loop */
  6.     u8    ds18b20_temp[3]={0};
  7.     short    temperature=0;
  8.   for(;;)
  9.   {
  10.     osDelay(5000);
  11. //        temperature = DS18B20_Get_Temp();
  12.         temperature = DS18B20_ReadTempReg();
  13.             ds18b20_temp[0]=(temperature/100)+'0';
  14.             ds18b20_temp[1]=(temperature%100/10)+'0';
  15.             ds18b20_temp[2]=(temperature%10)+'0';
  16.         printf("当前温度值为:%sC \r\n",ds18b20_temp);
  17.         printf("temperature=%d\r\n",temperature);
  18.   }
  19.   /* USER CODE END TempTask */
  20. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2016-10-14 10:27:47 | 显示全部楼层
DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。
回复

使用道具 举报

2

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-10-14 12:51:29 | 显示全部楼层

回 eric2013 的帖子

eric2013:DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。 (2016-10-14 10:27) 
我一开始用的以前用过的例子修改过来,发现不行。

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

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

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

使用道具 举报

7

主题

114

回帖

135

积分

初级会员

积分
135
发表于 2016-10-14 14:18:21 | 显示全部楼层
读取的时候临界保护吧。 taskENTER_CRITICAL()
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2016-10-14 14:21:06 | 显示全部楼层

回 huarana 的帖子

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

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

....... (2016-10-14 12:51) 
我们的那个DS18B20驱动做开关中断保护了,相对于裸机,在bsp.h文件中做了开关中断的重定向,使用FreeRTOS的开关中断函数实现。
回复

使用道具 举报

2

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-10-14 18:45:55 | 显示全部楼层

回 eric2013 的帖子

  1. /* TempTask function */
  2. void TempTask(void const * argument)
  3. {
  4.   /* USER CODE BEGIN TempTask */
  5.   /* Infinite loop */
  6.     u8    ds18b20_temp[3]={0};
  7.     volatile    short    temperature=0;
  8.   for(;;)
  9.   {
  10.     osDelay(5000);
  11. //        temperature = DS18B20_Get_Temp();
  12.         DISABLE_INT();
  13.         temperature = DS18B20_ReadTempReg();
  14.         ENABLE_INT();
  15.             ds18b20_temp[0]=(temperature/100)+'0';
  16.             ds18b20_temp[1]=(temperature%100/10)+'0';
  17.             ds18b20_temp[2]=(temperature%10)+'0';
  18.         printf("当前温度值为:%sC \\r\\n",ds18b20_temp);
  19.         printf("temperature=%d\\r\\n",temperature);
  20.   }
  21.   /* USER CODE END TempTask */
复制代码
实在没辙了,在任务里面保护了下。好了。 仅仅保护初始化函数不行。
[/quote][quote]不过这样可能会对其他地方有影响。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2016-10-15 12:32:50 | 显示全部楼层

回 huarana 的帖子

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

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-4-17 12:56:23 | 显示全部楼层
本帖最后由 廷润 于 2020-4-17 14:33 编辑

早上用示波器,对着时序调整就可以了。
发送命令二以及读数据的波形.jpg
Releasing your creativity
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 16:40 , Processed in 0.270629 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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