|
Проблема с функцией задержки., STM32F107 |
|
|
|
Jun 27 2016, 09:05
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Какая то ну очень странная проблема. Я сделал функцию задержки так. Код void Delay_us(uint32_t us) { uint32_t ticks = 72 * us; SysTick->LOAD = ticks; SysTick->CTRL |= 0x01; //enable while (!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk)); SysTick->CTRL &= ~0x01; //disable } Проверяю Код PIN_OUT_PP(One_Wire_Pin); while (1) { PIN_ON(One_Wire_Pin); Delay_us(500); PIN_OFF(One_Wire_Pin); Delay_us(500); } Вижу хороший сигнал 500 микросек. Никаких проблем. А вот в этой функции Код unsigned int One_Wire_Reset(GPIO_TypeDef * GPIOx, uint16_t PINx) { unsigned int tmp; PIN_IN(GPIOx, PINx); if ((PIN_SYG(GPIOx, PINx))==0) return One_Wire_Bus_Low_Error;
PIN_OUT_PP(GPIOx, PINx); PIN_OFF(GPIOx, PINx); Delay_us(480); PIN_ON(GPIOx, PINx); PIN_IN(GPIOx, PINx); Delay_us(60);
if ((PIN_SYG(GPIOx, PINx))==0) tmp=One_Wire_Success; else tmp=One_Wire_Error_No_Echo; Delay_us(Time_After_Reset); return tmp; } я вижу сигнал идет вниз на 350 микро (вместо 480). Кручу и так и этак, ума не приложу в чем проблема
Сообщение отредактировал Jenya7 - Jun 27 2016, 09:06
|
|
|
|
|
 |
Ответов
|
Jun 28 2016, 05:34
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Переделал функции под вариант с OPEN DRAIN. CODE #define OPEN_DRAIN 1
unsigned int One_Wire_Reset(GPIO_TypeDef * GPIOx, uint16_t PINx) { #if OPEN_DRAIN unsigned int tmp; PIN_ON(GPIOx, PINx); if ((PIN_SYG(GPIOx, PINx))==0) return One_Wire_Bus_Low_Error;
PIN_OFF(GPIOx, PINx); TIM6_Delay_us(480); PIN_ON(GPIOx, PINx); TIM6_Delay_us(60);
if ((PIN_SYG(GPIOx, PINx))==0) tmp=One_Wire_Success; else tmp=One_Wire_Error_No_Echo; TIM6_Delay_us(350); return tmp; #else unsigned int tmp; PIN_IN(GPIOx, PINx); if ((PIN_SYG(GPIOx, PINx))==0) return One_Wire_Bus_Low_Error;
PIN_OUT_PP(GPIOx, PINx); PIN_OFF(GPIOx, PINx); TIM6_Delay_us(480); PIN_ON(GPIOx, PINx); PIN_IN(GPIOx, PINx); TIM6_Delay_us(60);
if ((PIN_SYG(GPIOx, PINx))==0) tmp=One_Wire_Success; else tmp=One_Wire_Error_No_Echo; TIM6_Delay_us(350); return tmp; #endif }
void One_Wire_Write_Byte(unsigned char Byte,GPIO_TypeDef * GPIOx, uint16_t PINx) { unsigned char cnt; for (cnt=0;cnt!=8;cnt++) One_Wire_Write_Bit(Byte&(1<<cnt),GPIOx, PINx); }
void One_Wire_Write_Bit (unsigned char Bit, GPIO_TypeDef * GPIOx, uint16_t PINx) { #if OPEN_DRAIN PIN_OFF(GPIOx, PINx); if (Bit==0) { TIM6_Delay_us(60); PIN_ON(GPIOx, PINx); TIM6_Delay_us(10); } else { TIM6_Delay_us(10); PIN_ON(GPIOx, PINx); TIM6_Delay_us(60); } #else PIN_OUT_PP(GPIOx, PINx); PIN_OFF(GPIOx, PINx); if (Bit==0) { //Delay_us(Time_Pulse_Delay_High); TIM6_Delay_us(60); PIN_ON(GPIOx, PINx); //Delay_us(Time_Pulse_Delay_Low) TIM6_Delay_us(10); } else { TIM6_Delay_us(10); PIN_ON(GPIOx, PINx); TIM6_Delay_us(60); } PIN_IN(GPIOx, PINx); #endif }
unsigned char One_Wire_Read_Byte(GPIO_TypeDef * GPIOx, uint16_t PINx) { unsigned char tmp=0; unsigned char cnt; for (cnt=0;cnt!=8;cnt++) if (One_Wire_Read_Bit(GPIOx, PINx)!=0) tmp|=(1<<cnt); TIM6_Delay_us(60); return tmp; }
unsigned char One_Wire_Read_Bit (GPIO_TypeDef * GPIOx, uint16_t PINx) { #if OPEN_DRAIN unsigned char tmp; PIN_OFF(GPIOx, PINx); TIM6_Delay_us(2); TIM6_Delay_us(10); if ((PIN_SYG(GPIOx, PINx))!=0) tmp = 1; else tmp = 0; TIM6_Delay_us(60); return tmp; #else unsigned char tmp; PIN_OUT_PP(GPIOx, PINx); PIN_OFF(GPIOx, PINx); TIM6_Delay_us(2); PIN_IN(GPIOx, PINx); TIM6_Delay_us(10); if ((PIN_SYG(GPIOx, PINx))!=0) tmp = 1; else tmp = 0; TIM6_Delay_us(60); return tmp; #endif } Что то не работает. Хотя на скопе вижу рисет корректный но температура и серийный номер не читаются. В старом варианте (OPEN_DRAIN 0) все работает.
Сообщение отредактировал Jenya7 - Jun 28 2016, 05:35
|
|
|
|
|
Jun 28 2016, 07:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Jenya7 @ Jun 28 2016, 08:34)  но температура и серийный номер не читаются. В старом варианте (OPEN_DRAIN 0) все работает. Сравните: CODE PIN_OUT_PP(GPIOx, PINx); PIN_OFF(GPIOx, PINx); TIM6_Delay_us(2); PIN_IN(GPIOx, PINx); // <-- обратите внимание, тут нога перешла на ввод TIM6_Delay_us(10); if ((PIN_SYG(GPIOx, PINx))!=0) tmp = 1; } и CODE PIN_OFF(GPIOx, PINx); TIM6_Delay_us(2); TIM6_Delay_us(10); // а тут она осталась притянутой к нулю if ((PIN_SYG(GPIOx, PINx))!=0) tmp = 1;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Jenya7 Проблема с функцией задержки. Jun 27 2016, 09:05 scifi А я вот так сделал:
CODE#include "systick.h... Jun 27 2016, 09:16 Jenya7 Цитата(scifi @ Jun 27 2016, 14:16) А я во... Jun 27 2016, 09:38  scifi Цитата(Jenya7 @ Jun 27 2016, 12:38) Я не ... Jun 27 2016, 11:09  pitt Цитата(Jenya7 @ Jun 27 2016, 05:38) Я не ... Jun 27 2016, 13:23 KnightIgor Цитата(Jenya7 @ Jun 27 2016, 10:05) Какая... Jun 27 2016, 11:35 Jenya7 Цитата(KnightIgor @ Jun 27 2016, 16:35) У... Jun 27 2016, 12:01 Сергей Борщ Извиняюсь, что не про задержку:
QUOTE (Jenya7 ... Jun 27 2016, 12:45 Jenya7 Цитата(Сергей Борщ @ Jun 27 2016, 17:45) ... Jun 27 2016, 13:18  Сергей Борщ QUOTE (Jenya7 @ Jun 27 2016, 16:18) выход... Jun 27 2016, 13:23   Jenya7 Цитата(Сергей Борщ @ Jun 27 2016, 18:23) ... Jun 27 2016, 13:28    Сергей Борщ QUOTE (Jenya7 @ Jun 27 2016, 16:28) Серге... Jun 27 2016, 13:46     Jenya7 Цитата(Сергей Борщ @ Jun 27 2016, 18:46) ... Jun 27 2016, 13:54      Сергей Борщ QUOTE (Jenya7 @ Jun 27 2016, 16:54) После... Jun 27 2016, 16:13       Jenya7 Цитата(Сергей Борщ @ Jun 27 2016, 21:13) ... Jun 27 2016, 16:22        Сергей Борщ QUOTE (Jenya7 @ Jun 27 2016, 19:22) Нижни... Jun 27 2016, 16:48         Jenya7 Цитата(Сергей Борщ @ Jun 27 2016, 21:48) ... Jun 27 2016, 16:57      jcxz Цитата(Jenya7 @ Jun 27 2016, 19:54) Вообщ... Jun 28 2016, 03:47 jcxz Цитата(Jenya7 @ Jun 27 2016, 15:05) Какая... Jun 27 2016, 13:44  Jenya7 То есть нужно так?
Код PIN_OFF(GPIOx, PINx... Jun 28 2016, 07:44 Tarbal Цитата(Jenya7 @ Jun 27 2016, 13:05) Какая... Jun 29 2016, 18:13 Alechek Цитата(Tarbal @ Jun 29 2016, 23:13) Я бол... Jun 29 2016, 18:42  Tarbal Цитата(Alechek @ Jun 29 2016, 22:42) И чт... Jun 29 2016, 20:26 Jenya7 Цитата(Tarbal @ Jun 29 2016, 23:13) Я бол... Jun 30 2016, 08:05  Сергей Борщ QUOTE (Jenya7 @ Jun 30 2016, 11:05) Единс... Jun 30 2016, 08:48   KnightIgor Цитата(Сергей Борщ @ Jun 30 2016, 09:48) ... Jun 30 2016, 09:04   Jenya7 Цитата(Сергей Борщ @ Jun 30 2016, 13:48) ... Jun 30 2016, 09:30    jcxz Цитата(Jenya7 @ Jun 30 2016, 15:30) разгр... Jun 30 2016, 10:15     Tarbal Цитата(jcxz @ Jun 30 2016, 14:15) А чем у... Jun 30 2016, 12:47    Эдди Цитата(Jenya7 @ Jun 30 2016, 12:30) Интер... Jun 30 2016, 10:40 Эдди ТС, возьми нормальную реализацию 1-wire через тайм... Jun 30 2016, 09:14 Сергей Борщ QUOTE (Эдди @ Jun 30 2016, 12:14) ТС, воз... Jun 30 2016, 09:43 Alechek Ой, о чем спор? Ногодрыг или аппаратный 1-wire? ... Jun 30 2016, 11:21 Jenya7 Цитата(Alechek @ Jun 30 2016, 16:21) Ой, ... Jun 30 2016, 12:26  Alechek Цитата(Jenya7 @ Jun 30 2016, 17:26) Я вид... Jul 1 2016, 04:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|