Информация об изменениях

Сообщение Re[31]: Эльбрус - 8 ядер от 08.06.2017 5:15

Изменено 08.06.2017 5:49 vdimas

Re[31]: Эльбрус - 8 ядер
Здравствуйте, Иван Дубров, Вы писали:

ИД>У STM32 можно настроить таймер так, чтобы прерывание только патроны подносило (через теневые регистры). Никакой ошибки, всё аппаратно.


Ну вот самый распространённая задачка вокруг таймеров (остальное не есть "задачка") — это установка после каждого срабатывания таймера новой для него длительности. Насколько я понимаю, через теневые регистры это можно сделать, ОК. Прямо в теле прерывания. И получается тот фокус, что мы уже того-с, поезд уже ушел. Мы можем лишь настроить теневые регистры на следующий цикл, а не на этот, т.е. который вот только что начался.

Я "не дожил" в ассемблере до появления теневых регистров в армах, но правильно ли я понял сию тонкость?


ИД>Я так в своём коде делаю. Потому и спрашивал, что не так с таймерами. Всё гарантировано по времени.


А как получить частоту, скажем, ровно 2/255 от тактовой?
Что вообще можно сделать с обычным 16-тиразрядным счётчиком, кроме как использовать его для чего-то малокритичного?


ИД>С циклом мне непонятно, а что с другими прерываниями-то делать?


Их нет во время рабочего хода инструмента.


ИД>Как раз с прерыванием я бы делал как-то так: один таймер на все шаговики


Это будут шаговики на поиграться. Без особой спешки, в смысле.


ИД>Непонятно только, как очень близкие шаги по разным выходам делать


Именно что. А надо независимо обслуживать задержки. И даже выводить сигналы на разные порты в один и тот же момент времени, т.е. в рамках одной и той же команды записи в порт — это же просто запись в некий адресуемый регистр некоей битовой маски (пусть три младших разряда соответствуют 3-м шаговикам).


ИД>Можно, наверное, немного смещать шаги, с учётом макрошагов, по идее, ошибка будет маленькая.


Ошибка будет просто чудовищная, как по мне — в несколько десятков тактов. Более того, непонятно, как подстраивать фазу в такой конфигурации.


ИД>Может быть, можно через DMA как-то (чё-нить типа копировать из памяти в регистр GPIO по таймеру и в теневые регистры таймера по этому же таймеру).


Или не париться, а взять самую простую конфигурацию чипа и закодить таймеры в софте.
Я так делал. Играет двухголосную музыку, подаёт звонки, ведет отсчёт точного времени дня.
Тупо фиксированный цикл и зашита точная частота кварца конкретного экземпляра — годами часы можно не корректировать.
А частоты нот, знаешь ли, бывают очень дробными, а фальшь режет слух. ))
Re[31]: Эльбрус - 8 ядер
Здравствуйте, Иван Дубров, Вы писали:

ИД>У STM32 можно настроить таймер так, чтобы прерывание только патроны подносило (через теневые регистры). Никакой ошибки, всё аппаратно.


Ну вот самая распространённая задачка вокруг таймеров (остальное не есть "задачка") — это установка после каждого срабатывания таймера новой для него длительности. Насколько я понимаю, через теневые регистры это можно сделать, ОК. Прямо в теле прерывания. И получается тот фокус, что мы уже того-с, поезд уже ушел. Мы можем лишь настроить теневые регистры на следующий цикл, а не на этот, т.е. который вот только что начался.

Я "не дожил" в ассемблере до появления теневых регистров в армах, но правильно ли я понял сию тонкость?


ИД>Я так в своём коде делаю. Потому и спрашивал, что не так с таймерами. Всё гарантировано по времени.


А как получить частоту, скажем, ровно 2/255 от тактовой?
Что вообще можно сделать с обычным 16-тиразрядным счётчиком, кроме как использовать его для чего-то малокритичного?


ИД>С циклом мне непонятно, а что с другими прерываниями-то делать?


Их нет во время рабочего хода инструмента.


ИД>Как раз с прерыванием я бы делал как-то так: один таймер на все шаговики


Это будут шаговики на поиграться. Без особой спешки, в смысле.


ИД>Непонятно только, как очень близкие шаги по разным выходам делать


Именно что. А надо независимо обслуживать задержки. И даже выводить сигналы на разные порты в один и тот же момент времени, т.е. в рамках одной и той же команды записи в порт — это же просто запись в некий адресуемый регистр некоей битовой маски (пусть три младших разряда соответствуют 3-м шаговикам).


ИД>Можно, наверное, немного смещать шаги, с учётом макрошагов, по идее, ошибка будет маленькая.


Ошибка будет просто чудовищная, как по мне — в несколько десятков тактов. Более того, непонятно, как подстраивать фазу в такой конфигурации.


ИД>Может быть, можно через DMA как-то (чё-нить типа копировать из памяти в регистр GPIO по таймеру и в теневые регистры таймера по этому же таймеру).


Или не париться, а взять самую простую конфигурацию чипа и закодить таймеры в софте.
Я так делал. Играет двухголосную музыку, подаёт звонки, ведет отсчёт точного времени дня.
Тупо фиксированный цикл и зашита точная частота кварца конкретного экземпляра — годами часы можно не корректировать.
А частоты нот, знаешь ли, бывают очень дробными, а фальшь режет слух. ))