Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

18B20 и STM32F4

Непрочитано 06.08.2013, 12:31  
banzayy
Временная регистрация
 
Регистрация: 12.09.2006
Сообщений: 69
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
banzayy на пути к лучшему
По умолчанию 18B20 и STM32F4

помогите разобраться, почему не работает программа.

18В20 при reset нормально видится, т.е. "отпускаю" и "притягиваю" шину я правильно. дальше мрак. Программа один в один такая же на AVR прекрасно работает, поэтому просто переделал её со своей под STM. Думал, что проблема в delay, но уже опробовал несколько разных. Не помогает.
Реклама:
banzayy вне форума  
Непрочитано 06.08.2013, 12:34  
banzayy
Временная регистрация
 
Регистрация: 12.09.2006
Сообщений: 69
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
banzayy на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

вот текст. датчик один на шине. проверки CRC нет.

Код:
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "hd44780.h"
#include "delay.h"
#include "stdio.h"

  char string_out[5];
  unsigned int temp;
  unsigned char error;

void PIN_IN (GPIO_TypeDef * GPIOx,u16 PINx);
void PIN_OUT (GPIO_TypeDef * GPIOx,u16 PINx);
unsigned char reset_1820(GPIO_TypeDef * GPIOx,u16 PINx);
void send_ds18b20(unsigned char data,GPIO_TypeDef * GPIOx, u16 PINx);
int receive_ds18b20(GPIO_TypeDef * GPIOx,u16 PINx);
void start_ds18b20(GPIO_TypeDef * GPIOx, u16 PINx);

#define Time_Pulse_Delay_Low	10
#define Time_Pulse_Delay_High	60
#define Time_Reset_Low			480
#define Time_After_Reset		350
#define Time_Hold_Down			5


int main(void)
{
	SystemInit();
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

	lcd_init();

    while(1)
    {
    	start_ds18b20(GPIOC,GPIO_Pin_15);
    	temp=receive_ds18b20(GPIOC,GPIO_Pin_15);
    	lcd_set_xy(0,1);
    	sprintf (string_out,"%5i", temp);
    	lcd_put(string_out);
    	delay_ms(1000);
    }
}

void PIN_IN (GPIO_TypeDef * GPIOx,u16 PINx)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=PINx;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOx, &GPIO_InitStruct);
}

void PIN_OUT (GPIO_TypeDef * GPIOx,u16 PINx)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=PINx;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOx, &GPIO_InitStruct);
}

unsigned char reset_1820 (GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned char result;
   //настроим на вход
   PIN_IN(GPIOx, PINx);
   //проверить линию на отсутствие замыкания
   if(GPIO_ReadInputDataBit(GPIOx, PINx)==0)  return 2;		//замыкание на корпус
   //потянуть шину к земле
   PIN_OUT(GPIOx, PINx);
   GPIO_ResetBits(GPIOx, PINx);
   //ждать 480 микросекунд
   delay_us(Time_Reset_Low);
   //отпустить шину
   PIN_IN(GPIOx, PINx);
   GPIO_ResetBits(GPIOx, PINx);
   //ждать 70 микросекунд
   delay_us(Time_Pulse_Delay_High);
   //прочитать шину
   result=GPIO_ReadInputDataBit(GPIOx, PINx);
   delay_us(Time_After_Reset);
   if(result) return 1;                            			//датчик не обнаружен
   return 0;                                       			//датчик обнаружен
}


void send_ds18b20(unsigned char data,GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned char i;

PIN_OUT(GPIOx, PINx);
GPIO_ResetBits(GPIOx, PINx);

for(i=0;i‹8;i++)    {//передача лог. 1
					 if ((data&0x01)==0x01)	{delay_us(Time_Pulse_Delay_Low);
					 	 	 	 	 	     PIN_IN(GPIOx, PINx);
					 	 	 	 	 	     GPIO_ResetBits(GPIOx, PINx);
					 	 	 	 	 	     delay_us(Time_Pulse_Delay_High);}
					 //передача лог. 0
					 else					{delay_us(Time_Pulse_Delay_High);
	 	 	 	 	 	 	 	  	 	 	 PIN_IN(GPIOx, PINx);
	 	 	 	 	 	 	 	  	 	 	 GPIO_ResetBits(GPIOx, PINx);
	 	 	 	 	 	 	 	  	 	 	 delay_us(Time_Pulse_Delay_Low);};
					 data=data››1;};
}


int receive_ds18b20(GPIO_TypeDef * GPIOx,u16 PINx)
{
unsigned char i;
int temp=0;

for(i=0;i‹16;i++)   {PIN_OUT(GPIOx, PINx);
					 GPIO_ResetBits(GPIOx, PINx);
					 delay_us(Time_Hold_Down);
					 PIN_IN(GPIOx, PINx);
					 GPIO_ResetBits(GPIOx, PINx);
					 delay_us(Time_Hold_Down);
					 temp=temp››1;
					 if(GPIO_ReadInputDataBit(GPIOx, PINx)==0)	{temp|=0x8000;}
					 else										{temp&=~0x8000;};
					 delay_us(Time_Pulse_Delay_High);};
return temp;
}


void start_ds18b20(GPIO_TypeDef * GPIOx, u16 PINx)
{
error=reset_1820(GPIOx,PINx);

lcd_set_xy(0,0);
sprintf (string_out,"%5i", error);
lcd_put(string_out);

send_ds18b20(0xCC,GPIOx,PINx);
send_ds18b20(0x44,GPIOx,PINx);
delay_ms(120);
send_ds18b20(0xCC,GPIOx,PINx);
send_ds18b20(0xBE,GPIOx,PINx);
}
на TIM7 сделаны задержки delay_ms и delay_us

Код:
void delay_ms(unsigned int delay)
{
     TIM7-›PSC = F_APB1/1000+1;				//устанавливаем предделитель
     TIM7-›ARR = delay;	 					//устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
     TIM7-›EGR |= TIM_EGR_UG;				//Генерируем Событие обновления для записи данных в регистры PSC и ARR
     TIM7-›CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;	//Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
     while (TIM7-›CR1&TIM_CR1_CEN!=0);
}

void delay_us(unsigned int delay)
{
     TIM7-›PSC = F_APB1/1000000+1;			//устанавливаем предделитель
     TIM7-›ARR = delay;	 					//устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
     TIM7-›EGR |= TIM_EGR_UG;				//Генерируем Событие обновления для записи данных в регистры PSC и ARR
     TIM7-›CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;	//Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
     while (TIM7-›CR1&TIM_CR1_CEN!=0);
}
banzayy вне форума  
Непрочитано 06.08.2013, 12:55  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

А что показывает осциллограф или хотя бы логанализатор который стОит как один Ф4??

Из мелких придирок - под задержки специально придумали СисТик, и зачем ставить скорость выхода 50 МГц для низкоскоростного девайса?? Всегда стремитесь установить скорость как можно меньше, ибо это источник звона в линиях. Режим 2 МГц добавили не для того, чтобы вы его игнорировали...
niXto вне форума  
Непрочитано 06.08.2013, 13:21  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Сообщение от banzayy Посмотреть сообщение
Программа один в один такая же на AVR прекрасно работает, поэтому просто переделал её со своей под STM.
Это не замшелый АВР, нафига выписывать вензеля ногами, когда можно просто настроить ногу как OD и вкинуть туда "1"? Всё, больше ничего не надо, читаем, пишем, всё работает.
Цитата:
Думал, что проблема в delay, но уже опробовал несколько разных. Не помогает.
Не надо думать, надо смотреть. Вы уверены в правильности задержек? С них и нужно было начинать, в первую очередь.
nahimovv вне форума  
Непрочитано 06.08.2013, 21:10  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
Easyrider83 вне форума  
Непрочитано 07.08.2013, 08:18  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Как и на АВР, через УАРТ, только с ДМА
niXto вне форума  
Непрочитано 07.08.2013, 08:36  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Сообщение от Easyrider83 Посмотреть сообщение
nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
На easyelectronics было. Я, собственно, оттуда идею и воровал. Правда, там не работал протокол поиска, но это дело поправимое: тоже где-то спер, подкорректировал. Все работает. Через USART+DMA.

P.S. на сосфорже мой проектик IRcontroller, там 1-wire тоже есть. Причем, т.к. базовый код является платформонезависимым, все должно работать и на F4, хотя изначально делалось для F1.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 07.08.2013, 12:28  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Сообщение от Easyrider83 Посмотреть сообщение
nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
Кто тут видел мои обещания?
Забудь! Это был больше академический интерес, типа "можно-нельзя". Практически - интереса не составляет, геморно и накладно.
nahimovv вне форума  
Непрочитано 07.08.2013, 12:30  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Сообщение от nahimovv Посмотреть сообщение
Практически - интереса не составляет, геморно и накладно.
Не сказал бы: вам не нужно самодеятельностью заниматься, железяка все делает за вас…

P.S. вот — "честно наворованная" процедура отправки команды по 1-wire через USART с использованием DMA.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!

Последний раз редактировалось eddy; 07.08.2013 в 12:34.
eddy вне форума  
Непрочитано 07.08.2013, 12:30  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

Сообщение от niXto Посмотреть сообщение
Как и на АВР, через УАРТ, только с ДМА
Да эту срань можно лепить на чём угодно, даже на таймерах и SPI. Остаётся только вопрос наличия свободных ресурсов и целесообразности.
nahimovv вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADC+DMA stm32f4 STM32F4 ARM 37 02.06.2014 23:32
stm32f4 sqrt, возведение в степень и т.д sosedi ARM 8 09.04.2013 15:28
Не стартует stm32f4 STM32F4 Песочница (вопросы новичков) 2 04.12.2012 22:46
stm32f4, asm с чего начать? sosedi ARM 44 14.11.2012 16:52
ШИМ в STM32F4 sosedi Микроконтроллеры, АЦП, память и т.д 5 15.08.2012 12:20


Часовой пояс GMT +4, время: 17:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.