|
Датчик температуры DS18B20 и прерывания |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Jul 16 2013, 07:34
|
Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716

|
Цитата(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; }
Сообщение отредактировал firew0rker - Jul 16 2013, 07:37
|
|
|
|
|
Jul 16 2013, 08:50
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(VAI @ Jul 16 2013, 12:36)  Для таймслотов существует диапазон значений, а не строго N микросекунд. Для STM32 можно при настройке контроллера прерываний задать приоритеты каждому прерыванию. Ну и в перрывании не надо сидеть слишком долго... Для STM32 вообще все делается на таймере прекрасно: один канал сравнения и второй канал захвата. Т.е. критичные тайминги формируются аппаратно, а расстояние между битами плюс-минус километр - можно и в другом прерывании поработать. Работает гирлянда из 8 датчиков без вопросов. Проверял один датчик через 200 метров от -30 до 120 C - тоже работает.
|
|
|
|
|
Jul 16 2013, 15:25
|
Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716

|
Цитата(VAI @ Jul 16 2013, 15:07)  Вот тут я выкладывал исходники для работы с несколькими DS18B20 Стало интересно разобраться в схеме опторазвязки. Не понимаю зачем оптопара. X15.T_Data связан с выходом гальванически по цепи R77,R74,выв.3,4 D15.
|
|
|
|
|
Jul 16 2013, 17:07
|
Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716

|
Цитата(VAI @ Jul 16 2013, 23:45)  Точка соединения R77, R74 - это питание. Один источник питания для МК и датчика?
|
|
|
|
|
Jul 16 2013, 18:24
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(sidy @ Jul 16 2013, 21:05)  У меня вопрос близкий к данной теме, по таймерам STM32. Есть один низкочастотный таймер в котором укладывается 100 полных повторений высокочастотного таймера. По переполнению НЧ таймер останавливается, и производятся некоторые расчеты, а ВЧ таймер прожолжает считать. Записав значение счетного регистра ВЧ таймера сразу после прерывания и после окончания расчетов в переменные я хочу вычислить дельту и компенсировать оставание НЧ таймера перед его повторным запуском. Если это произошло в одном периоде ВЧ таймера, то дельту считать легко, но если это произощло в разных периодах, как показано на рис.,
то не понятно как вычислить время между событием 1 и 2. Ох ох ох. То что вы спрашиваете совсем не по теме, и надо куда то в раздел к новичкам. Зачем останавливать таймер? пусть сбросится и тикает заново, никакой задержки не появится. Таймер тикает есть не просит. Если же делать все несколько "ИНАЧЕ" как вы хотите, то все просто Т1 - время 1 события Т2 - время 2 события если Т2 меньше Т1 - условия что было переполнение таймера ДТ = Таймер Макс - Т1 + Т2 = 0xFFFF - T1 + T2. но это слишком элементарно и не отсюда, простите...
|
|
|
|
|
Jul 16 2013, 23:59
|
Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716

|
Цитата(VAI @ Jul 17 2013, 00:18)  В данном варианте - да. Значит, МК и датчик гальванически связаны через источник. И зачем тогда нужна оптопара?
|
|
|
|
|
Jul 17 2013, 06:09
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(k000858 @ Jul 17 2013, 06:44)  здорово было бы увидеть пример кода под любую серию контроллера  Единственное нужно выбрать и настроить таймер. 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); } }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|