БАНо

Catsw
МаркАнтоний:

у меня не получается считать длительность импульсов с двух каналов

Надо второй таймер использовать, но ХЗ как там с прерываниями будет…

МаркАнтоний:

А ещё подскажите пожалуйста: импульсы на каналах приёмника начинаются одновременно или сначала проходит импульс на первом канале, потом на втором канале и так далее.

Именно по очереди, что обусловлено длинной ППМ пакета, поэтому и думаю, что со вторым таймером всё получится 😃 Таймера ставим на 2мс переполнение, ставим оба на 8бит = 255 значений, по подьёму запуск, по спаду останов, смотрим сколько насчитал - знаем длину импульса. Ну как то так в теории…

МаркАнтоний
Catsw:

Именно по очереди, что обусловлено длинной ППМ пакета, поэтому и думаю, что со вторым таймером всё получится

А, ну если по очереди то и одним можно обойтись! Нужно просто в двух прерываниях его использовать. Ладно, спасибо за ответ. Буду пробовать. Обязательно отпишусь как сделаю.

V_Alex
МаркАнтоний:

Всем привет. Задался сделать огни для автомодели на основе Тини2313. Вот только столкнулся с проблемой: у меня не получается считать длительность импульсов с двух каналов (это необходимо чтоб сделать поворотники)…

Попробуйте обрабатывать импульсы по очереди. В один 20 мс такт обрабатываете газ, получаете данные для работы стоп-сигналов, во второй 20 мс такт обрабатываете поворот, получаете данные для поворотников. Иллюминация - не сервы, тут Вы этой задержки не заметите.

Catsw
МаркАнтоний:

А, ну если по очереди то и одним можно обойтись! Нужно просто в двух прерываниях его использовать. Ладно, спасибо за ответ. Буду пробовать. Обязательно отпишусь как сделаю.

То же верно! Ладно, ждёмс результатов 😃

МаркАнтоний

Получилось считать длительность импульсов независимо по каналам одним таймером. Но возникла другая проблемма: Длительность канального импульса видимо больше 2-х милисекунд и при максемальных отклонениях стиков всё работает неправильно. Я так понял что происходит переполнеие таймера, он обнуляется и в счётном регистре получается ерунда а не действительное значение длительности! Как с этим бороться я пока не разобрался! Может у кого нибудь есть мысли на этот счёт?

Catsw
МаркАнтоний:

Я так понял что происходит переполнеие таймера, он обнуляется и в счётном регистре получается ерунда а не действительное значение длительности! Как с этим бороться я пока не разобрался! Может у кого нибудь есть мысли на этот счёт?

Да легко! Следующее значение делителя таймера - 256, время переполнения 8 мс (не 2, как в моей схеме), так что точность пострадает в 4ре раза, но зато запас будет, думаю, в вашем случае точность не актуальна:)

Еще одно - а по завершению импульса таймер останавливаете? А после записи в рабочую переменную счётчик таймера обнуляете? А то дальше считать будет 😃 В общем - проверьте на симуляторе эти два условия.

МаркАнтоний
Catsw:

Еще одно - а по завершению импульса таймер останавливаете? А после записи в рабочую переменную счётчик таймера обнуляете? А то дальше считать будет В общем - проверьте на симуляторе эти два условия.

И останавливаю и обнуляю, все как полагается! Спасибо за наводку! Буду разбираться.

Catsw
МаркАнтоний:

Спасибо за наводку! Буду разбираться.

Да не за что… Если 8мс переполнение, то в вашем случае 2мс = 256/8=32 “тика” таймера, 1мс = соответственно 16. Если чуть точнее, границы будут от 1,5мс (24тика) до 2,5мс (40 тиков) - т.е диапазон 16 тиков. Точность не ахти, но если точно подобрать границы импульса = должна сгодится 😃

Вариант 2 - при работе таймера проверять на переполнение и проводить необходимые действия - например остановить таймер, или декрементировать его.

valera_o

Надо разрешить прерывание по переполнению и в обработчике прерывания устанавливать флаг переполнения. При считывании данных из таймера в переменную по флагу к результату таймера прибавлять 255 или не прибавлять, только надо переменную period(по моей программе) сделать 16-ти битной.

Catsw
valera_o:

Надо разрешить прерывание по переполнению

valera_o:

в переменную по флагу к результату таймера прибавлять 255

Точно! Что то я ступил вчера…

valera_o

внес изменения в обработчик по переполнению и в разделе переменных ввёл переменную flag_ovf и переменные период и период1 сделал 16-ти битными. Добавил условия в обработчики прерываний по каналам управления.

МаркАнтоний

Валерий, мысль понял, спасибо! Но у Вас нет обнуления этого флага, ведь стоит один раз произойти переполнеию и он постоянно будет приплюсовывать 255. Но всё равно спасибо за подсказку!

valera_o

да, забыл. его надо после приплюсовки очищать.

МаркАнтоний

Часы изысканий привели к следующему: Переполнение таймера происходит всего лишь на 1-4 единицы. Я считаю что этим можно пренебречь и в прерывании при переполнении таймера можно записывать 255 в наши регистры, а число что в счётном регистре просто не учитывать. Это сделал.
Но всё равно какаято ошибка есть. Когда стики на пульте не трогаю светодиоды живут своей жизнью. Почему не понятно, ведь когда в отладчике смотрю значения, они не меняются. Отладка в реальном времени с макетной платы.

Авто.rar

Catsw
МаркАнтоний:

. Когда стики на пульте не трогаю светодиоды живут своей жизнью. Почему не понятно,

У меня была проблема с уровнем сигнала с приёмыша, попробуйте запитать макетку от ТРЁХ вольт и посмотрите на поведение светодиодов!!!

МаркАнтоний

С питанием не прокатило.
А своя жизнь это так: стик поворотников стоит в среднем положении, а светодиоды в это время моргают, причём моргаю как хотят, закономерности нет, сначала моргает один, потом может моргнуть второй а потом первый.
Я в тупике! Если обхожу условие подмены во внешнем перывании, то работает, а добавляю его всё ломается.

valera_o

Напомните “идеологию” управления. что и чем должно управлять? Почему два канала, нельзя ли одним каналом поворота? Судя по проге управление только от “период”, зачем второй канал?
И еще, ext0 и ext1 это метки или переменные? В одном месте они вписаны как метки, в другом это похоже на обнуление переменных.
Порог 130 надо уменьшить, в этом крайнем положении будет вываливаться из индикации поворота.

Catsw
МаркАнтоний:

С питанием не прокатило.

Жаль, такая идея была 😃

МаркАнтоний:

причём моргаю как хотят,

И кто у Вас там моргает то непонятно??? 😃 😃

Хинт: У вас по второму прерыванию присваивается Период1, а не просто Период, поэтому канал второй НЕ обрабатывается.

МаркАнтоний

Рассказываю задумку. Делаю свет для авто. На авто у нас какой свет бывает? Габариты, фары, поворотники. Так вот, один канал у нас управляет поворотниками, а другой-крутилка включает габариты и свет.
Первая проблемма: при максимальном отклонении стика “поворотники” вправо (длительность импульса максимум) правый поворотник перестаёт моргать. Эту проблемму я поборол, но вылезла другая, а именно: Когда стик “поворотники” не трогаем, но в это время выкручиваем крутилку “свет” на максимум начинают моргать поворотники, причём и левый и правый, как хотят! Это то, что натворил Я!
А с последними изменениями в программе вообще ерунда творится, светодиоды поворотников моргаю постоянно, хотя стики в средних положениях.
Пока задействован только регистр Period потому что не получается наладить нормально прерывания, Period1 будет включать габариты и фары, но видимо до этого ещё очень далеко!

Я не пойму единственного, почему у меня одно прерывание может влиять на другое!?