Свежие обсуждения
Микроконтроллеры

Работа таймеров в AVR

1 2 3

Да ужо разобрался вроде. Теперь другая задача:

Есть некоторое количество событий инициализируемых соответствующими изменениями состояния входов (24 всего) надо ровно через хх милисекунд после события изменить состояние некоторого выхода события асинхронны, ведичина задержки должна отрабатываться +/- несколько сот тактов. Процессор загружен также бдугими задачами. оЗУ занято на 100%, стек использовать нельзя.

 

Wladimir_TS: состояние некоторого выхода

выход один или 24 ?

 

Если выходов не более восьми - можно достичь практически нулевой и главное постоянной задержки с любой комбинацией используя в качестве ядра - флешку (правда большую, но те не менее) или нужно уже использовать ПЛИС, а вычисления оставить AVR.

сильно сомневаюсь, что реально обслужить 24 асинхронных входа этим камнем, (причем активных EXT прерываний у него всего 8 (ну 11 если сильно подняпрячь) да еще и не трогая ОЗУ и с равенстовом тактов...

 

С ПЛИС любой сможет (кто умеет с ними работать - так и было сделано), но нужно сделать как раз без. Линий 24 штуки. Для простоты - как только на линии А1-А24 (ВХОД) установился 1 надо отсчитать ХХ времени +/- пол-лаптя (типично 1+/-0,2 Сек) и установить "1" на соответствующей линии выхода.

Доступных таймеров нет - уже все задействованы на контроль таймаутоа связи с вышестоящим устройством - один отсчитывает таймаут от последнего принятого байта, а второй от последней корректно принятой команды. (очень поганая и зашумленная линия, а отказ обмена череват). Еще 4 на другие программные UARTы

ОЗУ занято на 90% под буфера обмена - слишком большие объемы информации прогоняются, брос в вышестоящее устройство не успевает - для надежности там 4х кратная избыточность в обмене.

 

... Вот и делайте буфер по каждому из 3х input портов с частотой опроса не менее пол-лаптя и выталкивайте в output порт ( эдакое примитивное FIFO) спустя некое кратное ХХ / пол-лаптя число отсчетов...

Но
время считать - нечем.
Озу зянято,
а еще и - вычисляет чего-то там.

вот и
Wladimir_TS: С ПЛИС любой сможет (кто умеет с ними работать - так и было сделано),

 

Плис изъяли для уменьшения габаритов и удешевления.

Cheeeper: ... Вот и делайте буфер по каждому из 3х input портов с частотой опроса не менее пол-лаптя и выталкивайте в output порт ( эдакое примитивное FIFO) спустя некое кратное ХХ / пол-лаптя число отсчетов...

Не очень понял ?

Cheeeper: Но
время считать - нечем.
Озу зянято,
а еще и - вычисляет чего-то там.

Да передает и принимает одновременно по 4 UART, причем UART програмный из-за того что скорость сильно может отличаться и надо ее определять "на лету".

 

Wladimir_TS: Ну - а события - то асинхронны как отсчитать время для каждого ?
Создайте 24 переменных и запоминайте в них нужный интервал времени.
Или что-то типа :использовать счетчик времени в указателях(численно равных интервалу времени) на 24битовые поля , каждый "1"бит это интервал который в это время заканчивается.

Поставьте еще один МК и сделайте на нем програм. таймер.
Хотя, где взять 24 прерывания?
Тогда еще один МК , для опроса 24 ног.

Wladimir_TS: Процессор загружен также бдугими задачами. оЗУ занято на 100%, стек использовать нельзя.

Wladimir_TS: Плис изъяли для уменьшения габаритов и удешевления.
Осталось теперь застрелиться.
Я бы делал на ПЛИС.
Возьмите другой проц. В Хмегах есть по 6-8 УАРТов и памяти больше.

 

Wladimir_TS: Не очень понял ?
Владимир, FIFO может работать как некоторая цифровая линия задержки.
и , по большому - какая разница изменился сигнал на входе или нет?
вы просто транслируете на выход входной сигнал с некоторой дискретной , но равной для всех сигналов задержкой с интервалом, скажем - в полдопуска.

но если вам нужно отдельно рулить каждой задержкой по каждому ОТДЕЛЬНОМУ порту и эти задержки изменяются или неравны - тоды ОЙ
Alexey: Осталось теперь застрелиться.
ага, упрощенцы...

 

Alexey: Alexey
сегодня, 11:05
Wladimir_TS: Ну - а события - то асинхронны как отсчитать время для каждого ?
Создайте 24 переменных и запоминайте в них нужный интервал времени.

Все равно не очень понятно. В смысле по событию записываю в ячейку память FFh и декрементирую каждые ХХ мСек до нуля ?


Или что-то типа :использовать счетчик времени в указателях(численно равных интервалу времени) на 24битовые поля , каждый "1"бит это интервал который в это время заканчивается.
Поставьте еще один МК и сделайте на нем програм. таймер.

Физически некуда. И так плотность монтажа такова, что монтажныцы меня скоро убьют за простую коррекцию в плате.


Хотя, где взять 24 прерывания?
Тогда еще один МК , для опроса 24 ног.

Это стрельба из пушки по мелким пернатым.

Cheeeper: Cheeeper ◊
сегодня, 13:03

Wladimir_TS: Не очень понял ?
Владимир, FIFO может работать как некоторая цифровая линия задержки.
и , по большому - какая разница изменился сигнал на входе или нет?
вы просто транслируете на выход входной сигнал с некоторой дискретной , но равной для всех сигналов задержкой с интервалом, скажем - в полдопуска.

Задержка фиксирована для всех линий и неизменна (завязана на параметры внешних компонентов).

 

Wladimir_TS: Все равно не очень понятно. В смысле по событию записываю в ячейку память FFh и декрементирую каждые ХХ мСек до нуля ?
Мне тоже. По таймеру , каждый раз инкрементир. переменная каунт.
При событии на пине записываете в одну из 24 переменных время окончания интервала (каунт+интервал)
По таймеру , каждый раз сраниваете все 24переменных с каунт.

Второй вариант мне больше нравится.

Wladimir_TS: Физически некуда.
Видел АРМ 2х2 мм ВГА

Wladimir_TS: Это стрельба из пушки по мелким пернатым.
А то чего вы делаете , это даже стрельба , это секс с ними.
Посмотрите Хмегу.УАРТы будут аппаратными , а проц займется опросом пинов , если у него тоже прерываний не хватит.