06.08.2013, 12:31
|
|
Временная регистрация
Регистрация: 12.09.2006
Сообщений: 69
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
18B20 и STM32F4
помогите разобраться, почему не работает программа.
18В20 при reset нормально видится, т.е. "отпускаю" и "притягиваю" шину я правильно. дальше мрак. Программа один в один такая же на AVR прекрасно работает, поэтому просто переделал её со своей под STM. Думал, что проблема в delay, но уже опробовал несколько разных. Не помогает.
|
|
|
|
06.08.2013, 12:34
|
|
Временная регистрация
Регистрация: 12.09.2006
Сообщений: 69
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
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);
} |
|
|
|
|
06.08.2013, 12:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: 18B20 и STM32F4
А что показывает осциллограф или хотя бы логанализатор который стОит как один Ф4??
Из мелких придирок - под задержки специально придумали СисТик, и зачем ставить скорость выхода 50 МГц для низкоскоростного девайса?? Всегда стремитесь установить скорость как можно меньше, ибо это источник звона в линиях. Режим 2 МГц добавили не для того, чтобы вы его игнорировали...
|
|
|
|
06.08.2013, 13:21
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: 18B20 и STM32F4
Сообщение от banzayy
|
Программа один в один такая же на AVR прекрасно работает, поэтому просто переделал её со своей под STM.
|
Это не замшелый АВР, нафига выписывать вензеля ногами, когда можно просто настроить ногу как OD и вкинуть туда "1"? Всё, больше ничего не надо, читаем, пишем, всё работает.
Цитата:
|
Думал, что проблема в delay, но уже опробовал несколько разных. Не помогает.
|
Не надо думать, надо смотреть. Вы уверены в правильности задержек? С них и нужно было начинать, в первую очередь.
|
|
|
|
06.08.2013, 21:10
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: 18B20 и STM32F4
nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
|
|
|
|
07.08.2013, 08:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: 18B20 и STM32F4
Как и на АВР, через УАРТ, только с ДМА
|
|
|
|
07.08.2013, 08:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: 18B20 и STM32F4
Сообщение от Easyrider83
|
nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
|
На easyelectronics было. Я, собственно, оттуда идею и воровал. Правда, там не работал протокол поиска, но это дело поправимое: тоже где-то спер, подкорректировал. Все работает. Через USART+DMA.
P.S. на сосфорже мой проектик IRcontroller, там 1-wire тоже есть. Причем, т.к. базовый код является платформонезависимым, все должно работать и на F4, хотя изначально делалось для F1.
__________________
Смерть бандеровской мразоте!
|
|
|
|
07.08.2013, 12:28
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: 18B20 и STM32F4
Сообщение от Easyrider83
|
nahimovv, а вы как-то обещали рассказать, как 1-wire хардварно реализовать?
|
Кто тут видел мои обещания?
Забудь! Это был больше академический интерес, типа "можно-нельзя". Практически - интереса не составляет, геморно и накладно.
|
|
|
|
07.08.2013, 12:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: 18B20 и STM32F4
Сообщение от nahimovv
|
Практически - интереса не составляет, геморно и накладно.
|
Не сказал бы: вам не нужно самодеятельностью заниматься, железяка все делает за вас…
P.S. вот — "честно наворованная" процедура отправки команды по 1-wire через USART с использованием DMA.
__________________
Смерть бандеровской мразоте!
Последний раз редактировалось eddy; 07.08.2013 в 12:34.
|
|
|
|
07.08.2013, 12:30
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: 18B20 и STM32F4
Сообщение от niXto
|
Как и на АВР, через УАРТ, только с ДМА
|
Да эту срань можно лепить на чём угодно, даже на таймерах и SPI. Остаётся только вопрос наличия свободных ресурсов и целесообразности.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:23.
|
|