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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Програмный 1-wire на прерываниях таймера, Красивый выход из прерывания с переключением контекста
Arlleex
сообщение Sep 28 2018, 11:54
Сообщение #31


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Sep 28 2018, 14:21) *
Вы наверное перепутали: наверное всё-таки в режиме захвата (capture), а не сравнения (compare). rolleyes.gif

Почему? Именно по сравнению: как только заданный период прошёл (счётчик таймера сравнялся с указанным значением сравнения), формируется прерывание, в котором регистр сравнения перенастраивается на следующий интервал, а лапка дергается в соответствующую сторону laughing.gif
А захват - это защёлкивание текущего значения таймера по какому-либо событию, как я понимаю эту всю кухню.

Хотя, кстати, да, можно (скорее нужно) делать по захвату. Дёрнулась лапка - захватили значение таймера и проконтролировали рамки прихода ожидаемого фронта...

Сообщение отредактировал Arlleex - Sep 28 2018, 11:58
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 28 2018, 12:02
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Sep 28 2018, 14:15) *
Кстати, попутно тут хочу узнать, как красиво организовать счётчик, который считает до, например, 5 и сбрасывается в 0 без условия if(). Ну то есть вычитая, сдвигая... Интересно можно ли так сделать. Для ровных битовых чисел, как в коде выше, как видно, я битовой маской обнуляю. А вот интересно, как быть с числами, не являющихся степенями 2.

Код
int i, i1;
i1 = i - 5 >> 31;
i = i - i1 & i1;

Будет 3 или 4 команды (в зависимости от оптимизации).

Цитата(Arlleex @ Sep 28 2018, 14:54) *
Почему? Именно по сравнению: как только заданный период прошёл (счётчик таймера сравнялся с указанным значением сравнения), формируется прерывание, в котором регистр сравнения перенастраивается на следующий интервал, а лапка дергается в соответствующую сторону laughing.gif

А чтение значения ноги когда?
Если по этому прерыванию, то так делать - ненадёжно, так как будет зависимо от задержек входа в ISR. К тому же - требует в 2 раза большей частоты прерываний.

Цитата(Arlleex @ Sep 28 2018, 14:54) *
А захват - это защёлкивание текущего значения таймера по какому-либо событи'юю, как я понимаю эту всю кухню.

Вот именно. А потом анализируем защёлкнутое значение и решаем что это было - 0 или 1.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Sep 28 2018, 12:07
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Sep 28 2018, 15:02) *
Код
int i, i1;
i1 = i - 5 >> 31;
i = i - i1 & i1;

Будет 3 или 4 команды (в зависимости от оптимизации).

Благодарю! Потестирую sm.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 28 2018, 13:08
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Sep 28 2018, 15:07) *
Благодарю! Потестирую sm.gif

Можно ещё проще, но значения чисел будут не через 1, а через большие промежутки. Типа так:
Код
#define LIMIT 5
#define STEP ((u32)(((1u << 31) + LIMIT - 1) / LIMIT))  //значение шага округлённое до ближайшего бОльшего целого
u32 i;
i = __USAT(i + STEP, 31);
Всего две операции. wink.gif Значения шагов будут: STEP*0, STEP*1, STEP*2, STEP*3, STEP*4, а на следующем шаге получим опять STEP*0.
Для switch-а такие значения конечно неудобны. sad.gif

Ещё вариант - использовать отрицательный диапазон чисел:
Код
enum {LIMIT = 5};
int i = -LIMIT;
i -= i >> 31 | LIMIT; //-5,-4,-3,-2,-1,0
Всего 3 операции cool.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Sep 28 2018, 20:35
Сообщение #35


Гуру
******

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



Цитата(jcxz @ Sep 28 2018, 14:21) *
Вообще не понимаю здешних товарищей, которые пытаются колхозить на чём угодно, только не делать как надо. cranky.gif

RTOS
предлагаете всё в SysTick вешать, у которого наивысший приоритет?
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 28 2018, 20:55
Сообщение #36


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(toweroff @ Sep 28 2018, 23:35) *
предлагаете всё в SysTick вешать, у которого наивысший приоритет?

Вы наверно удивитесь, но в RTOS системному таймеру SysTick назначают как раз самый низкий приоритет (наравне с PendSV - переключатель контекста)
И вообще, если не используется RTOS, то ничего не мешает настроить Systick так, чтобы использовать его как самый простой аппаратный таймер, только назначив уже нужный приоритет.
Именно так я сделал в примитивных проектах, где RTOS ни к чему, но нужны простые временные выдержки, в частности с кратностью 1us и 1ms. Systick отлично для этого подходит.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 28 2018, 21:54
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(toweroff @ Sep 28 2018, 23:35) *
предлагаете всё в SysTick вешать, у которого наивысший приоритет?

SysTick то тут при чём???? wacko.gif Само собой оптимально делается - на режиме захвата таймера.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 19:13
Рейтинг@Mail.ru


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