БАНо

valera_o

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

МаркАнтоний

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

Авто.rar

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

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

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

МаркАнтоний

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

valera_o

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

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

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

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

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

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

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

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

МаркАнтоний

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

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

V_Alex

При малом разрешении Вы не добьетесь нормальной работы света относительно базовых устройств (сервы поворота и регулятора хода). Попробуйте обойтись без таймера и будет Вам щастье.

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

При малом разрешении Вы не добьетесь нормальной работы света относительно базовых устройств (сервы поворота и регулятора хода). Попробуйте обойтись без таймера и будет Вам щастье.

Не понял вообще!😃

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

Чиво непонятно? Вот готовый девайс : rcmag.ru/manuf/62#product/9076 .
Без таймера 😃. Немного подумаете и у Вас получится.

А с чего Вы взяли что в данном девайсе не используется таймер? Вы помоему не особо понимаете о чём идёт речь! Как же по Вашему там измеряется длительность канального импульса?

Rula

Не знаю, как именно в том устройстве, но я делал подобные девайсы и без таймера, либо просто на прерываниях по нему.

valera_o

Убрал всё не относящееся к сигналам поворотов. В симе работает.
Уточните выходы на светодиоды.

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

А с чего Вы взяли что в данном девайсе не используется таймер? Вы помоему не особо понимаете о чём идёт речь! Как же по Вашему там измеряется длительность канального импульса?

Не, я точно понимаю, о чем идет речь 😂. Там моя прошивка 😃. Камешек - тини 12 с внешним резонатором. Обработка сигнала - в основном цикле.
Если у Вас используется тини 24 или 2313, можете перейти на 16-разрядный таймер 1. Это тоже вариант избавиться от лишних глюков по прерываниям и поднять точность обработки.
P.S. Очень рекомендую книжку : Джон Мортон, “Микроконтроллеры AVR. Вводный курс.” Там есть все, что нужно.

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

Убрал всё не относящееся к сигналам поворотов. В симе работает.
Уточните выходы на светодиоды.

Валерий, в том то и есть вся беда! В симе и у меня работает, а в железе глючит! К вечеру выложу видео, чтоб наглядно объяснить в чём проблемма. Спасибо за участие.

valera_o

Антон, с моей сегодняшней версией работает или тоже глючит?

V_Alex

Ребяты, я не злобствую. Просто на этих граблях (когда в симе работает, а на плате радуется своей богатой внутренней жизни), я как начинающий AVR-программер, натопталсо по самое небалуйся. Поэтому могу лишь присоединиться к рекомендации Rula - либо обработка в основном цикле, либо только на прeрываниях по Timer1.

valera_o

Уговорили, пусть будет на 16-битном таймере.
Теперь границы представлены более наглядными цифрами. 😉

Catsw

Валерий, парочка корректировок:

1е не совсем понятен делитель на 8мь в таймере - может убрать? А то 65 сек переполнения - более, чем с головой 😃 Но эт не критично.

2е Не разрешены в начале оба прерывания, не исправлена Период1, кстати, прерывание ТОЛЬКО по возрастанию напруги - работать НЕ будет, так как не будет генерироватся прерывание при спаде импульса и корректно считать длинну ППМа!!!

ПС настроил оба прерывания, подкорректировал флаги, таймер оставил в вашем варианте - да, нагляден 😃 😃
В общем - в симуляторе всё работает, проверить в железе надо.

Авто.rar

valera_o

1е, делитель на 8 даст один тик таймера в 1мкс, т.е. переполнение таймера будет через 63535мкс 😉
2е, ext_int на старте включает прерывание по нарастающему фронту для external_0, для второго прерывания можно потом включить. Странно, почему не будет прерывания по нарастающему фронту? Согласен, что можно поставить срабатывание по любому изменению на ноге, а определять фронт это был или спад импульса уже по состоянию ноги, в обработчике.
Не путайте “Внешние прерывания” и “Прерывания по активности на выводе”.
"The External Interrupts are triggered by the INT0 pin, INT1 pin or any of the PCINT7…0
pins. Ноги Int0 и Int1 не входят в маску прерывания по активности на ногах. Так что конфигурация внешних прерываний будет срабатывать еще и по активности на ногах PB0 и PB1. Добавьте обработчик для этого прерывания и задайте входные импульсы на В0 или В1, увидите, что прога будет вываливаться в этот обработчик, а поскольку такого обработчика нет в Вашей проге, то она будет вылетать неизвестно куда.
Прерывание по активности будет только при изменении лог. состояния на ноге, выбрать спадающий или нарастающий фронт, или низкий уровень для него невозможно. Насколько я понял перевод мануала.