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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Датчик температуры DS18B20 и прерывания
Golikov A.
сообщение Jul 16 2013, 18:24
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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


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

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

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


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

Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 16 2013, 22:52
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Я использовал SSP (то, что от аппаратного осталось sm.gif )
16 бит вполне хватало. Подогнал по тайм-слотам и все, анализировал либо ответ (какой-то % нулей в 16-битном слове), либо обычный 0 (тоже % нулей, но меньший, конечно)
все нормально работает и проц не грузит, ибо в прерывании
Go to the top of the page
 
+Quote Post
firew0rker
сообщение Jul 16 2013, 23:59
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 11-07-12
Из: Новосибирск
Пользователь №: 72 716



Цитата(VAI @ Jul 17 2013, 00:18) *
В данном варианте - да.

Значит, МК и датчик гальванически связаны через источник. И зачем тогда нужна оптопара?
Go to the top of the page
 
+Quote Post
k000858
сообщение Jul 17 2013, 02:44
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



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

здорово было бы увидеть пример кода под любую серию контроллера rolleyes.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 17 2013, 06:09
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(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);
}
}

Прикрепленные файлы
Прикрепленный файл  tim_ds18b20.zip ( 4.33 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
k000858
сообщение Jul 17 2013, 06:17
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(adnega @ Jul 17 2013, 09:09) *
Единственное нужно выбрать и настроить таймер.

примного благодарен за пример.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 00:44
Рейтинг@Mail.ru


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