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

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

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

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

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

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


 
Опции темы
Непрочитано 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.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: 18B20 и STM32F4

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

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

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

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

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

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

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

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

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

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

Последний раз редактировалось eddy; 07.08.2013 в 12:34.
eddy вне форума  
Непрочитано 07.08.2013, 12:30  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
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, время: 15:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot