реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 USART и DS18B20, траблы с приемо-передачей байтов
iPKM
сообщение Aug 19 2011, 19:53
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Пытаюсь завести DS18B20 на STM32(дискавери) по USART. Работу с 1-wire делаю по апптоуту максима
Проблемы начинаются после инициализации, после того как послали 0xF0 получили 0x0E, что значит датчик наместе, далее посылаем 0xCC и т.п не буду повторять код. вот собственно после передачи всех команд начинаем получать биты температуры, но все время нули вылазят. Я думаю что ошибка возможна в OneWireReadByte() хотя хз. OneWireSendByte() формирует из hex -> bin вроде правильно, к примеру 0xCC в двоичной 1100 1100, OneWireSendByte формирует и отсылает 0011 0011, какбы задом наперед, т.е сначала младшие биты слова потом старшие.

CODE
#include "stm32l1xx.h"
#include "PLL/inc/stm32l1xx_gpio.h"
#include "PLL/inc/stm32l1xx_usart.h"
#include "PLL/inc/stm32l1xx_rcc.h"
void Delay_ms(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);

nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}

void initPereherial()
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Включаем тактирование */
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/* USART1 Rx (PA10) вход */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 Tx (PA9) выход */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Конфигурируем порты PA9, PA10 как альтернативную функцию для USART1 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

}

void UsartInit(int BaudRate)
{
USART_InitTypeDef USART_InitStructure;

/* Настраиваем USART1 */
USART_InitStructure.USART_BaudRate = BaudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* Включаем USART1 */
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}

volatile uint16_t temp[7];

void OneWireSendByte(uint16_t byte)
{
for(int i=0; i<8; i++)
{
if((byte & (1<<i) ) != 0)
{
USART_SendData(USART1, 0xFF);
Delay_ms(1);
}else{
USART_SendData(USART1, 0x00);
}
}
}

uint16_t OneWireReadByte()
{
uint16_t result=0;

for(int i=0; i<8; i++)
{
USART_SendData(USART1, 0xFF);
Delay_ms(1);
}

for(int i=0; i<8; i++)
{
if(USART_ReceiveData(USART1) != 0xFF)
{
result |= (1<<i);
}
}

return result;
}


int main()
{
initPereherial();

UsartInit(9800);
USART_SendData(USART1, 0xF0);


USART_DeInit(USART1);
UsartInit(115200);
OneWireSendByte(0xCC);
OneWireSendByte(0x44);

Delay_ms(750);

USART_DeInit(USART1);
UsartInit(9800);
USART_SendData(USART1, 0xF0);


USART_DeInit(USART1);
UsartInit(115200);
OneWireSendByte(0xCC);
OneWireSendByte(0xBE);


for(int i=0; i<8; i++)
{
temp[i] = OneWireReadByte();
}

}
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 19 2011, 20:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Загляните внурь функций USART_SendData/USART_ReceiveData Думаю вопросы отпадут.
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 19 2011, 20:32
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Flexz @ Aug 20 2011, 00:26) *
Загляните внурь функций USART_SendData/USART_ReceiveData Думаю вопросы отпадут.

и что я там должен был увидеть чтобы меня осинило, записываем и читаем в\из DR, вы с аппноутом знакомы который указывал в ссылке, или работали с 1-wire по uart?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 20 2011, 09:29
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А зачем Вы задержки налепили в 1 ms? Зачем они там нужны. Задержка только после команды 0х44. Я писал обмен по USART с этим датчиком , правда для MEGA. У ATMEL есть два Application Note (AVR318 и AVR274 ) для этого случая - где чётко расписанно как осуществлять обмен по USART и приложены коды для С. USART он и в Африке USART , а уж DS тем более про С и говорить нечего. Может поможет.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 20 2011, 17:06
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(ILYAUL @ Aug 20 2011, 13:29) *
А зачем Вы задержки налепили в 1 ms? Зачем они там нужны. Задержка только после команды 0х44. Я писал обмен по USART с этим датчиком , правда для MEGA. У ATMEL есть два Application Note (AVR318 и AVR274 ) для этого случая - где чётко расписанно как осуществлять обмен по USART и приложены коды для С. USART он и в Африке USART , а уж DS тем более про С и говорить нечего. Может поможет.

почитаю эти аппы, а про задержку в 1ms, вычитал на какомто форуме что нужно при записи ставить, хотя и без неё все изначально было и также не фурычило
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 20 2011, 19:09
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Цитата(iPKM @ Aug 20 2011, 00:32) *
и что я там должен был увидеть чтобы меня осинило, записываем и читаем в\из DR, вы с аппноутом знакомы который указывал в ссылке, или работали с 1-wire по uart?

не читал и не работал. Зато достаточно работал с уартом, что бы видеть что код у вас нерабочий. Перед тем как читать DR надо дождаться того что бы там что-то появилось, а перед тем как писать в него надо дождаться пока из него все будет отправлено (задержки у вас там именно за этим стоят, причем почему то не везде).
Аппноуты это конечно здорово, но документацию на контроллер тоже читать надо.
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 21 2011, 09:45
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Flexz @ Aug 20 2011, 23:09) *
не читал и не работал. Зато достаточно работал с уартом, что бы видеть что код у вас нерабочий. Перед тем как читать DR надо дождаться того что бы там что-то появилось, а перед тем как писать в него надо дождаться пока из него все будет отправлено (задержки у вас там именно за этим стоят, причем почему то не везде).
Аппноуты это конечно здорово, но документацию на контроллер тоже читать надо.


Ожидание освобожнение буфера прописывал не помогает, и ожидание никакое никанает(его там вообще не должно быть)
Попробую сегодня сделать обвязку как указано аппноуте на всяк случай, потом уже буду возращаться к коду.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 21 2011, 10:18
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Да кстати , между командами 0х44 + Delay и 0xBE должен быть RESET. И ещё один подводный камень - UDRE т.к он обдадает двойной буферизацией и если Вы будите использовать его прерывание , то алгоритм такой - послали бит - отключили UDRE - приняли бит - записали в буфер -вкл. UDRE - снова послали бит. Все команды которые Вы хотите посылать датчику , проще всего расположить в памяти ( у меня в SRAM) и "вытягивать" их оттуда побитно и возвращать на своё же место . Т.е буфер у Вас будет постоянно содержать Ваши команды.
И не забывайте , что после прочтения температуры и ее вывода необходимо (если использовать буфер) занести в часть значений для температуры 0xFF


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 21 2011, 10:19
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Ну дело ваше, конечно, но на вашем месте прежде чем делать что-то посложнее я бы разобрался с простым. А именно с работой с уартом, ибо в коде полная ахинея.
Вот это:
Код
  for(int i=0; i<8; i++)
  {
    if(USART_ReceiveData(USART1) != 0xFF)
    {
      result |= (1<<i);
    }
  }

не считает 8 байт по уарту, а 8 раз считает одно и тоже значение из регистра DR, нафига оно вам 8 раз?
Отправка данных выглядит примерно так (копипаст из семплов)
Код
    USART_SendData(USARTy, data1);
    
    /* Loop until USARTy DR register is empty */
    while(USART_GetFlagStatus(USARTy, USART_FLAG_TXE) == RESET)
    {
    }

соответсвенно прием:
Код

    /* Loop until the USARTz Receive Data Register is not empty */
    while(USART_GetFlagStatus(USARTz, USART_FLAG_RXNE) == RESET)
    {
    }

    /* Store the received byte in RxBuffer */
    data2 = USART_ReceiveData(USARTz);


PS: аппноут, кстати, почитал - интересно, не знал что с 1-wire можно работать через uart
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 21 2011, 12:37
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Flexz @ Aug 21 2011, 14:19) *
Ну дело ваше, конечно, но на вашем месте прежде чем делать что-то посложнее я бы разобрался с простым. А именно с работой с уартом, ибо в коде полная ахинея.
Вот это:
Код
  for(int i=0; i<8; i++)
  {
    if(USART_ReceiveData(USART1) != 0xFF)
    {
      result |= (1<<i);
    }
  }


да тут ошибка вышла, т.к переписывал код библиотеки с использованием FT232(а там идет работа с буфером), То для STM он должен выглядить так:
Код
for(int i=0; i<8; i++)
  {
    USART_SendData(USART1, 0xFF);
    while (!(USART1->SR & USART_SR_TXE)) {} // Ждать освобождения буфера.
    if(USART_ReceiveData(USART1) != 0xFF)
    {
      result |= (1<<i);
    }
  }


но это все равно пока проблемы не рашает. смотрю щас как сие реализовано в АВР, там заметил что прирывания на время запроса температуры запрещаются и еще помелочи что, в общем нужно проверить.

Цитата(ILYAUL @ Aug 21 2011, 14:18) *
Да кстати , между командами 0х44 + Delay и 0xBE должен быть RESET. И ещё один подводный камень - UDRE

Я не нашел в даташите упоминание про UDRE. а 0xF0 как раз таки и есть ресет и приветствие. и между 0х44 и 0xBE он стоять не может
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 21 2011, 12:39
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



В вашем коде я не вижу, где задается временная диаграмма 1Wire. Если можно - покажите.
Например прием бита с 1Wire (смотрите рис.14 в даташит Максима): мы даем низкий уровень на более чем 1 мкс (например на 5 мкс), потом ждем например 6 мкс, потом читаем состояние шины, потом ждем >45мкс до следующего бита. Где можно увидеть на какой микросекунде слота происходит семплирование ?
Возможно имеется в виду, что отправка 8 раз подряд байта 0xFF в UART на скорости 115200 как раз эквивалентна (после сглаживания фильтром) подаче низкого уровня на время примерно 8,68мкс (то есть master reaq slot), а затем сразу делается считывание, но не вижу, где ожидание 45 мкс до следующего бита.
Не проще ли это сделать на GPIO и не занимать UART - GPIO хотя бы можно на любой порт вывести.
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 21 2011, 13:35
Сообщение #12





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Schulz_K @ Aug 21 2011, 16:39) *
Возможно имеется в виду, что отправка 8 раз подряд байта 0xFF в UART на скорости 115200 как раз эквивалентна (после сглаживания фильтром) подаче низкого уровня на время примерно 8,68мкс (то есть master reaq slot), а затем сразу делается считывание, но не вижу, где ожидание 45 мкс до следующего бита.
Не проще ли это сделать на GPIO и не занимать UART - GPIO хотя бы можно на любой порт вывести.

Именно так, потому и диаграмма ненужда. Думал просто ногами дрыгать, но хочеться именно с юартом поработать, потому GPIO пока не рассматриваю.
щас что-то вообще бредятина, при посылке F0, получаю FF, вроде датчик откликается, но ответ должен быть 0x10 - 0x90, раньшебыл 0x0E но эт нормально. при считывании температуры в DR все время болтается 0x80, это видать мои чудеса монтажа сказываются)

не это просто команды перепутал.
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 21 2011, 14:36
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



А сколько в вашем случае времени проходит при чтении после освобождения шины мастером до момента семплирования ? Это время нужно делать максимально возможным (в пределах тех 15мкс, когда можно делать чтение). Помехоустойчивость такой схемы зависит от программы, тем более что у вас фильтры затягивают сигналы, чтобы 8 импульсов UART превращались в один. У меня были случаи, когда DS18B20 на линии длиной 100м часто сбоил, но при добавлении 2-4 мкс во временные диаграммы все начинало работать стабильно.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 21 2011, 14:54
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(iPKM @ Aug 21 2011, 16:37) *
Я не нашел в даташите упоминание про UDRE. а 0xF0 как раз таки и есть ресет и приветствие. и между 0х44 и 0xBE он стоять не может

Это из DS тогда уж не знаю какой у Вас


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 21 2011, 15:58
Сообщение #15





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(ILYAUL @ Aug 21 2011, 18:54) *
Это из DS тогда уж не знаю какой у Вас

не пудрите мозг), да ресет подается после 44, но не между 0х44 + Delay и 0xBE
( a 0xCC вместо 0xBE ) <- вот так более понятно непоняток не вызывает

заметил еще такую странность, когда идет отладка кода на месте чтения битов, товсе время висит значение 0x80, но если поставить брекпоит в любом месте приема данных, то в окне регистров можно наблюдать 0x80, но когда начиеш просто щелкать по ячейки с любым битом юарта то значение регистра все время обновляется:
80, C0, E0, F0, F8, FC, FE, FF
и глохнет, причем меняется только один бит в юарте IDLE. Видать что-то с приривыниями, нужно копать туда

Сообщение отредактировал iPKM - Aug 21 2011, 16:02
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 21 2011, 17:42
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



Цитата(iPKM @ Aug 21 2011, 18:58) *
Видать что-то с приривыниями, нужно копать туда

Так у вас в программе нету прерываний (по крайней мере в том тексте, который в первом посте темы).
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 21 2011, 18:36
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(iPKM @ Aug 21 2011, 19:58) *
не пудрите мозг), да ресет подается после 44, но не между 0х44 + Delay и 0xBE

Ах, Вам оказывается надо было писать всё подробно, т.е ещё и delay не забыть написать, а то Вы путаетесь. Ну бльше не буду Вам пудрить мозг - работайте спокойно


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
kumle
сообщение Aug 22 2011, 06:06
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Посмотри тут http://eugenemcu.ru/publ/13-1-0-74
Там есть пример UART без прерываний и с прерываниями.
У меня это работает.
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 22 2011, 11:43
Сообщение #19





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Отложил юарт в сторону и попробовал напрямую работать с 1-wire. Сначала сам написал код по дрыганью ножками с указанными задержками по даташиту, в конце концов все равно получаю 0xFF, с горя решил глянуть пример работы с этим датчиком под STM32, нашел в китае один проект, перенёс себе, исправил в некоторых местах вызовы системной библы под свой МК, в этоге теже 0xFF в ответ.
Думал уж датчик голимый, но он ведь отвечает присутствием значит не палёный, хотя хз работает ли в нем сам датчик температуры. если кому интересно код работы с 1-wire из китая:

Код
#include "stm32l1xx.h"
#include "PLL/inc/stm32l1xx_gpio.h"
#include "PLL/inc/stm32l1xx_usart.h"
#include "PLL/inc/stm32l1xx_rcc.h"

#define SKIP_ROM 0xCC
#define CONVERT 0x44
#define READ_TEMP 0xBE

#define DS_PORT GPIOA    
#define DS_PIN GPIO_Pin_5

#define ResetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_RESET)
#define SetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_SET)
#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_PIN)

void delay_1ms(uint32_t ms)
{
        volatile uint32_t nCount;
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);

        nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
        for (; nCount!=0; nCount--);
}

void delay_1us(uint32_t us)
{
        SysTick->LOAD=us*9;
    SysTick->CTRL|=0x01;
    while(!(SysTick->CTRL&(1<<16)));
    SysTick->CTRL=0x00000000;
    SysTick->VAL=0x00000000;  
}

void GPIO_init()
{
      RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
      //GPIOA->BSRRL = GPIO_BSRR_BS_5;  
      //GPIOA->BSRRH = GPIO_BSRR_BS_5;    
}
void Init_ds18b20(void)    
{
    SetDQ();
    delay_1us(30);    
    ResetDQ();    
    delay_1us(470);      
    SetDQ();      
    delay_1us(30);    
    while(!GetDQ());    
    delay_1us(450);
    SetDQ();    
}


void DS18B20WriteByte( unsigned char  Dat)
{
    uint8_t i;
    for(i=8;i>0;i--)
    {
        ResetDQ();
        delay_1us(5);

        if(Dat&0x01)    
        SetDQ();
        else
        ResetDQ();

        delay_1us(65);
        SetDQ();
        delay_1us(2);
        Dat>>=1;
    }
}

unsigned char  DS18B20ReadByte(void)
{
     unsigned char  i,Dat;
    SetDQ();
    delay_1us(5);
    for(i=0;i<8;i++)
    {
        Dat>>=1;
        ResetDQ();
        delay_1us(5);
        SetDQ();
        delay_1us(5);

        if(GetDQ())
            Dat|=0x80;
        else
            Dat&=0x7f;
        delay_1us(65);
        SetDQ();
    }
    return Dat;
}

unsigned char  readtemperature(void)
{
     unsigned char  a,b;
    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(CONVERT);
    delay_1ms(750);    

    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(READ_TEMP);    

    a=DS18B20ReadByte();    
    b=DS18B20ReadByte();

    b<<=4;
    b+=(a&=0xf0)>>4;

    return b;
}

volatile int temp[8];

int main()
{
   GPIO_init();
  
  volatile uint8_t value=readtemperature();
}
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 22 2011, 12:00
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output.
На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен?
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 22 2011, 12:19
Сообщение #21





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Schulz_K @ Aug 22 2011, 16:00) *
В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output.
На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен?

сам пин настраивал как OD и PP и просто инициализировав GPIOA, результат один и тотже. да резистор имеется.
Go to the top of the page
 
+Quote Post
kumle
сообщение Aug 22 2011, 13:47
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Может частота тактирования не та ?
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 22 2011, 14:49
Сообщение #23


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



А вот эта строка:
Цитата
for (; nCount!=0; nCount--);
в delay_1ms не глючит ?
Go to the top of the page
 
+Quote Post
iPKM
сообщение Aug 22 2011, 15:01
Сообщение #24





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Цитата(Schulz_K @ Aug 22 2011, 18:49) *
А вот эта строка: в delay_1ms не глючит ?

нет, все проходит гладко, даж засекал)

Цитата(kumle @ Aug 22 2011, 17:47) *
Может частота тактирования не та ?

наврятли, задержки вычисляются относительно переменых состояний мк, поэтому какая разница какая будет частота, лишбы правильно импульсы генерил
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Aug 23 2011, 08:30
Сообщение #25


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



А как вы проверяли, что 1мс точно соответствует - осциллографом, или делали 10000 таких пауз и меряли секундомером?
Проверить работоспособность интерфейса можно по байтам 5 (всегда=FF), 6 (=0C) и 7 (=10) в scratcpad. Кстати, как то некорректно вы отрабатываете команду 0xBE - вместо 9 байт принимаете только 2. (Правда в даташите написано, что так можно - "The master may issue a reset to terminate reading at any time if only part of the scratchpad data is needed."
А еще причина может быть в слишком коротком промежутке при передаче "1" между освобождением линии и новым импульсом - у вас всего 2мкс. Фронт может немного затянуться и импульсы сольются в один. Этот момент должно быть видно на осциллографе - там все четко ?
Go to the top of the page
 
+Quote Post
servol
сообщение Dec 15 2011, 22:14
Сообщение #26


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 4-11-04
Пользователь №: 1 042



Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы.
Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену.
Go to the top of the page
 
+Quote Post
Misha_Traktorist
сообщение Jan 8 2013, 16:31
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 8-01-13
Пользователь №: 75 111



Цитата(servol @ Dec 16 2011, 02:14) *
Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы.
Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену.

у меня походу та же проблема, причем при частоте до 36мгц(включительно) работает нормально, если 48 и выше, то при чтении битов взвращается 0xFF, ресет проходит вроде нормально.
Подскажите, пожалуйста, как вы решили эту проблему?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jan 9 2013, 07:45
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



До DS я пока не дошёл (в области STM32 я пока в стадии светодиодных мигалок sm.gif , сейчас USB долблю и FSMC для разновсяких дисплеев), но, как по мне, проще поставить на датчик какой-нибудь малоногий AVR и рулить им через UART, SPI или через что хотите ...
Для авров этих библиотек термодатчиков до хрена понаписано ... И все они работают.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
VAI
сообщение Jan 10 2013, 05:53
Сообщение #29


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Я использую по нескольку термостатов, градусники у них - DS18B20. Использовал в проектах на MSP430 (без RTOS) и перенёс на STM32f2xx (использую RTOS).
Т.к. градусников много, тона всех не хватит USART-ов, а на одну линию несколько датчиков посадить не могу, т.к. в процессе работы предполагается замена датчиков, термостаты настроены по разному и т.д. Поэтому каждой DS18B20 выделена отдельная нога.
Команда на преобразование даётся сразу на все градусники, протокол организован через таймерное прерывание.
Алгоритм работы разбит на элементарные функции и задержки между ними, использую прерывание по Compare для вызова этих функций. По вызову прерывания выполняется такая функция, затем в регистр Compare записывается необходимая задержка.

Исходники здесь.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 08:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01651 секунд с 7
ELECTRONIX ©2004-2016