Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Датчик температуры DS18B20 и прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
k000858
Работа с датчиком основывается на точных задержках при маханиях ножкой (1wire). В больших проектах, где используется много прерываний, точные задержки могут растягиваться (по скольку во время выполнения задержек срабатывают прерывания, да не по одной штуки и тд). В результате показания с датчика могут сниматься некорректные. Как вы с этим боритесь? Запрещать прерывания на время выполнения задержек не вариант т.к. могут быть пропуски прерываний.
1113
вешать 1-wire на какой-то апаратный интерфейс, некоторые его умудряются даже USART`ом эмулировать.
firew0rker
Цитата(1113 @ Jul 16 2013, 13:13) *
вешать 1-wire на какой-то апаратный интерфейс, некоторые его умудряются даже USART`ом эмулировать.


Доводилось эмулировать 1-wire с помощью SPI.

Код
unsigned char w1_io( unsigned char b )
{
  unsigned char r, j;
  j = 8;
  do{
    if (b & 1) r=xchg_spi(0x7F); else r=xchg_spi(1);
    b >>= 1;
    if (r == 0x7F) b |= 0x80;
    }while( --j );
  return b;
}
k000858
я так понимаю, временные задержки интерфейс соблюдает сам?
1113
Цитата(k000858 @ Jul 16 2013, 10:45) *
я так понимаю, временные задержки интерфейс соблюдает сам?
именно так. исходя из его baudrate`а.
VAI
Вот тут я выкладывал исходники для работы с несколькими DS18B20 используя прерывание по Compare и ногодрыг. Работают в нескольких проектах на разных типах процессоров. Я использовал от 2-х до 8 DS18B20. Проблем никаких.
http://electronix.ru/forum/index.php?showt...p;#entry1089884
Golikov A.
а можно ЦПЛД махонькую воткнуть чтобы она все собирала и у себя хранила, пока проц не забирет...
k000858
Цитата(VAI @ Jul 16 2013, 11:07) *
Вот тут я выкладывал исходники для работы с несколькими DS18B20 используя прерывание по Compare и ногодрыг. Работают в нескольких проектах на разных типах процессоров. Я использовал от 2-х до 8 DS18B20. Проблем никаких.
http://electronix.ru/forum/index.php?showt...p;#entry1089884

Исходники пока не смотрел, но сразу вопрос: что будет, если во время задания таймслота чтения/записи сработает другое прерывание, обработка которого займет некоторое время, в результате чего четкий таймслот будет нарушен?
VAI
Цитата(k000858 @ Jul 16 2013, 12:13) *
Исходники пока не смотрел, но сразу вопрос: что будет, если во время задания таймслота чтения/записи сработает другое прерывание, обработка которого займет некоторое время, в результате чего четкий таймслот будет нарушен?

Для таймслотов существует диапазон значений, а не строго N микросекунд.
Для STM32 можно при настройке контроллера прерываний задать приоритеты каждому прерыванию. Ну и в перрывании не надо сидеть слишком долго...
adnega
Цитата(VAI @ Jul 16 2013, 12:36) *
Для таймслотов существует диапазон значений, а не строго N микросекунд.
Для STM32 можно при настройке контроллера прерываний задать приоритеты каждому прерыванию. Ну и в перрывании не надо сидеть слишком долго...

Для STM32 вообще все делается на таймере прекрасно: один канал сравнения и второй канал захвата.
Т.е. критичные тайминги формируются аппаратно, а расстояние между битами плюс-минус километр -
можно и в другом прерывании поработать.
Работает гирлянда из 8 датчиков без вопросов.
Проверял один датчик через 200 метров от -30 до 120 C - тоже работает.
firew0rker
Цитата(VAI @ Jul 16 2013, 15:07) *
Вот тут я выкладывал исходники для работы с несколькими DS18B20

Стало интересно разобраться в схеме опторазвязки.
Не понимаю зачем оптопара. X15.T_Data связан с выходом гальванически по цепи R77,R74,выв.3,4 D15.
VAI
Точка соединения R77, R74 - это питание.
sidy
У меня вопрос близкий к данной теме, по таймерам STM32. Есть один низкочастотный таймер в котором укладывается 100 полных повторений высокочастотного таймера. По переполнению НЧ таймер останавливается, и производятся некоторые расчеты, а ВЧ таймер прожолжает считать. Записав значение счетного регистра ВЧ таймера сразу после прерывания и после окончания расчетов в переменные я хочу вычислить дельту и компенсировать оставание НЧ таймера перед его повторным запуском. Если это произошло в одном периоде ВЧ таймера, то дельту считать легко, но если это произощло в разных периодах, как показано на рис.,
Нажмите для просмотра прикрепленного файла
то не понятно как вычислить время между событием 1 и 2.
firew0rker
Цитата(VAI @ Jul 16 2013, 23:45) *
Точка соединения R77, R74 - это питание.

Один источник питания для МК и датчика?
VAI
Цитата(firew0rker @ Jul 16 2013, 21:07) *
Один источник питания для МК и датчика?

В данном варианте - да.
Golikov A.
Цитата(sidy @ Jul 16 2013, 21:05) *
У меня вопрос близкий к данной теме, по таймерам STM32. Есть один низкочастотный таймер в котором укладывается 100 полных повторений высокочастотного таймера. По переполнению НЧ таймер останавливается, и производятся некоторые расчеты, а ВЧ таймер прожолжает считать. Записав значение счетного регистра ВЧ таймера сразу после прерывания и после окончания расчетов в переменные я хочу вычислить дельту и компенсировать оставание НЧ таймера перед его повторным запуском. Если это произошло в одном периоде ВЧ таймера, то дельту считать легко, но если это произощло в разных периодах, как показано на рис.,
Нажмите для просмотра прикрепленного файла
то не понятно как вычислить время между событием 1 и 2.


Ох ох ох. То что вы спрашиваете совсем не по теме, и надо куда то в раздел к новичкам.
Зачем останавливать таймер? пусть сбросится и тикает заново, никакой задержки не появится. Таймер тикает есть не просит.

Если же делать все несколько "ИНАЧЕ" как вы хотите, то все просто
Т1 - время 1 события
Т2 - время 2 события

если Т2 меньше Т1 - условия что было переполнение таймера
ДТ = Таймер Макс - Т1 + Т2 = 0xFFFF - T1 + T2.


но это слишком элементарно и не отсюда, простите...

toweroff
Я использовал SSP (то, что от аппаратного осталось sm.gif )
16 бит вполне хватало. Подогнал по тайм-слотам и все, анализировал либо ответ (какой-то % нулей в 16-битном слове), либо обычный 0 (тоже % нулей, но меньший, конечно)
все нормально работает и проц не грузит, ибо в прерывании
firew0rker
Цитата(VAI @ Jul 17 2013, 00:18) *
В данном варианте - да.

Значит, МК и датчик гальванически связаны через источник. И зачем тогда нужна оптопара?
k000858
Цитата(adnega @ Jul 16 2013, 11:50) *
Для STM32 вообще все делается на таймере прекрасно: один канал сравнения и второй канал захвата.
Т.е. критичные тайминги формируются аппаратно, а расстояние между битами плюс-минус километр -
можно и в другом прерывании поработать.
Работает гирлянда из 8 датчиков без вопросов.
Проверял один датчик через 200 метров от -30 до 120 C - тоже работает.

здорово было бы увидеть пример кода под любую серию контроллера rolleyes.gif
adnega
Цитата(k000858 @ Jul 17 2013, 06:44) *
здорово было бы увидеть пример кода под любую серию контроллера rolleyes.gif

Единственное нужно выбрать и настроить таймер.
CODE

//-----------------------------------------------------------------------------
// void init_TIMER12(void)
//-----------------------------------------------------------------------------
void init_TIMER12(void)
{
TIM12->CR1 = 0;
TIM12->CCER = 0;

if(rcc_state == RCC_STATE_PLL)
TIM12->PSC = ((FPLL >> 1) / 1000000) - 1;
else
TIM12->PSC = (FHSI / 1000000) - 1;

TIM12->ARR = 1000;

TIM12->CCR1 = 2 - 1;
TIM12->CCMR1 =
(OC_MODE_PWM1 << TIM_CCMR1_OC1M)
| (1 << TIM_CCMR1_CC2S);

TIM12->CCER = (1 << TIM_CCER_CC2E) | (0 << TIM_CCER_CC2P);

TIM12->DIER =
(1 << TIM_DIER_UIE)
| (1 << TIM_DIER_CC1IE)
| (1 << TIM_DIER_CC2IE);

TIM12->CR1 = (0 << TIM_CR1_CEN);
}

//-----------------------------------------------------------------------------
// void TIM8_BRK_TIM12_IRQHandler(void)
//-----------------------------------------------------------------------------
void TIM8_BRK_TIM12_IRQHandler(void) __attribute__((interrupt("IRQ")));
void TIM8_BRK_TIM12_IRQHandler(void)
{
if(TIM12->SR & (1 << TIM_SR_UIF))
{
TIM12->SR &= ~(1 << TIM_SR_UIF);

OW_on_data(TIM12->CCR2);
}

if(TIM12->SR & (1 << TIM_SR_CC1IIF))
{
TIM12->CCER &= ~(1 << TIM_CCER_CC1E);
TIM12->SR &= ~(1 << TIM_SR_CC1IIF);
}

if(TIM12->SR & (1 << TIM_SR_CC2IIF))
{
TIM12->SR &= ~(1 << TIM_SR_CC2IIF);
}
}
k000858
Цитата(adnega @ Jul 17 2013, 09:09) *
Единственное нужно выбрать и настроить таймер.

примного благодарен за пример.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.