读取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 */
} DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。
回 eric2013 的帖子
eric2013:DS18B20读取的时候要做开关中断,时序比较严格,一旦被打断就死翘翘了。可以参看下我们的实现。 (2016-10-14 10:27) images/back.gif我一开始用的以前用过的例子修改过来,发现不行。
然后使用你们的18b20例程里的,发现 也不行、
说明一下,我用的时间片的调度,所有任务为相同的优先级,目前开了4个任务。2个LED的 ,一个串口的,一个就是18b20的。
主要目的也是为了学习us延时的应用。 读取的时候临界保护吧。 taskENTER_CRITICAL()
回 huarana 的帖子
huarana:我一开始用的以前用过的例子修改过来,发现不行。然后使用你们的18b20例程里的,发现 也不行、
....... (2016-10-14 12:51) images/back.gif
我们的那个DS18B20驱动做开关中断保护了,相对于裸机,在bsp.h文件中做了开关中断的重定向,使用FreeRTOS的开关中断函数实现。
回 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 */
实在没辙了,在任务里面保护了下。好了。 仅仅保护初始化函数不行。
不过这样可能会对其他地方有影响。
回 huarana 的帖子
huarana: (2016-10-14 18:45) images/back.gifDS18B20不适合用在对系统实时性有要求的场合,以前测试18B20读取一次得需要4-5ms,关闭中断的时间都是毫秒级的,太影响实时性,中断服务程序程序将无法到的及时执行。FreeRTOS还稍好点,可以有不受FreeRTOS控制的中断优先级。 本帖最后由 廷润 于 2020-4-17 14:33 编辑
早上用示波器,对着时序调整就可以了。
页:
[1]