Schulz_K 0 21 августа, 2011 Опубликовано 21 августа, 2011 · Жалоба Видать что-то с приривыниями, нужно копать туда Так у вас в программе нету прерываний (по крайней мере в том тексте, который в первом посте темы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 21 августа, 2011 Опубликовано 21 августа, 2011 · Жалоба не пудрите мозг), да ресет подается после 44, но не между 0х44 + Delay и 0xBE Ах, Вам оказывается надо было писать всё подробно, т.е ещё и delay не забыть написать, а то Вы путаетесь. Ну бльше не буду Вам пудрить мозг - работайте спокойно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kumle 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба Посмотри тут http://eugenemcu.ru/publ/13-1-0-74 Там есть пример UART без прерываний и с прерываниями. У меня это работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pkochubei 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба Отложил юарт в сторону и попробовал напрямую работать с 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Schulz_K 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output. На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pkochubei 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба В вашем новом коде я не вижу, как настроены пин GPIO, там все по умолчанию, а это значит floating input. А у вас нужно ставить open drain output. На всякий случай спрошу глупый вопрос - а у вас pull up резистор в схеме имеется, или встроенный подключен? сам пин настраивал как OD и PP и просто инициализировав GPIOA, результат один и тотже. да резистор имеется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kumle 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба Может частота тактирования не та ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Schulz_K 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба А вот эта строка: for (; nCount!=0; nCount--); в delay_1ms не глючит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pkochubei 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба А вот эта строка: в delay_1ms не глючит ? нет, все проходит гладко, даж засекал) Может частота тактирования не та ? наврятли, задержки вычисляются относительно переменых состояний мк, поэтому какая разница какая будет частота, лишбы правильно импульсы генерил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Schulz_K 0 23 августа, 2011 Опубликовано 23 августа, 2011 · Жалоба А как вы проверяли, что 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мкс. Фронт может немного затянуться и импульсы сольются в один. Этот момент должно быть видно на осциллографе - там все четко ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
servol 0 15 декабря, 2011 Опубликовано 15 декабря, 2011 · Жалоба Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы. Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Misha_Traktorist 0 8 января, 2013 Опубликовано 8 января, 2013 · Жалоба Таже проблема была. 0x0E датчик отвечает , а дальше только 0xFF'ы. Ошибка была при ПЕРЕинициализации UART'а с 9600 на 115200, нога TX просаживалась в "0", что мешало обмену. у меня походу та же проблема, причем при частоте до 36мгц(включительно) работает нормально, если 48 и выше, то при чтении битов взвращается 0xFF, ресет проходит вроде нормально. Подскажите, пожалуйста, как вы решили эту проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 9 января, 2013 Опубликовано 9 января, 2013 · Жалоба До DS я пока не дошёл (в области STM32 я пока в стадии светодиодных мигалок :) , сейчас USB долблю и FSMC для разновсяких дисплеев), но, как по мне, проще поставить на датчик какой-нибудь малоногий AVR и рулить им через UART, SPI или через что хотите ... Для авров этих библиотек термодатчиков до хрена понаписано ... И все они работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Я использую по нескольку термостатов, градусники у них - DS18B20. Использовал в проектах на MSP430 (без RTOS) и перенёс на STM32f2xx (использую RTOS). Т.к. градусников много, тона всех не хватит USART-ов, а на одну линию несколько датчиков посадить не могу, т.к. в процессе работы предполагается замена датчиков, термостаты настроены по разному и т.д. Поэтому каждой DS18B20 выделена отдельная нога. Команда на преобразование даётся сразу на все градусники, протокол организован через таймерное прерывание. Алгоритм работы разбит на элементарные функции и задержки между ними, использую прерывание по Compare для вызова этих функций. По вызову прерывания выполняется такая функция, затем в регистр Compare записывается необходимая задержка. Исходники здесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться