БАНо
Ребяты, я не злобствую. Просто на этих граблях (когда в симе работает, а на плате радуется своей богатой внутренней жизни), я как начинающий AVR-программер, натопталсо по самое небалуйся. Поэтому могу лишь присоединиться к рекомендации Rula - либо обработка в основном цикле, либо только на прeрываниях по Timer1.
Уговорили, пусть будет на 16-битном таймере.
Теперь границы представлены более наглядными цифрами. 😉
Валерий, парочка корректировок:
1е не совсем понятен делитель на 8мь в таймере - может убрать? А то 65 сек переполнения - более, чем с головой 😃 Но эт не критично.
2е Не разрешены в начале оба прерывания, не исправлена Период1, кстати, прерывание ТОЛЬКО по возрастанию напруги - работать НЕ будет, так как не будет генерироватся прерывание при спаде импульса и корректно считать длинну ППМа!!!
ПС настроил оба прерывания, подкорректировал флаги, таймер оставил в вашем варианте - да, нагляден 😃 😃
В общем - в симуляторе всё работает, проверить в железе надо.
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, увидите, что прога будет вываливаться в этот обработчик, а поскольку такого обработчика нет в Вашей проге, то она будет вылетать неизвестно куда.
Прерывание по активности будет только при изменении лог. состояния на ноге, выбрать спадающий или нарастающий фронт, или низкий уровень для него невозможно. Насколько я понял перевод мануала.
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. Поскольку обработчиков для них нет, то прога будет вылетать неизвестно куда.
Ну не знаю,по крайней мере в симуляторе “дёрганье” ног PB0 и PB1 НЕ приводит к генерации прерывания, и в маску они у меня попадают и присутствуют 😃 ХЗ, но у меня в симуляторе работает 😃
А принцип то исходного - дёрнули в плюс ногу - прерывание - запустился таймер, считает, дёрнули ногу в ноль- прерывание - стоп таймер. Для этого алгоритма прерывание должно на ЛЮБОЕ изменение на ногах генерироваться, что на восход, что на закат 😃…
Андрей, а по какому признаку Вы определяете, что дерганье В0 и В1 не приводят к прерыванию? Только по тому что сим не матюкается? Я для того и предложил Вам дописать обработчик для прерывания PIN_Change, что при его наличии видно, что прерывание происходит. А вот почему не матюкается сим билдера непонятно, в Си написанная по Вашему образцу прога - не работает в симе аврстудио, нет обработчика по адресу вектора Pin_Change…
По проге Антона сигналы от приемника заводятся на D2 и D3, за каким …, спрашивается, нам нужно, чтобы камень отрабатывал по дерганью В0 и В1 и назначать прерывания по ним? 😉
INT0 - PD2, INT1 - PD3. PB0 - PCINT0, PB1 - PCINT1. Почувствуйте разницу, как говорится. 😉
Всем привет! Весь день проторчал в универе. Поэтому Ваши варианты буду пробовать только сейчас. Обязательно отпишусь о результатах!
Андрей, а по какому признаку Вы определяете, что дерганье В0 и В1 не приводят к прерыванию?
По карте флагов прерываний в самом билдере… Там видно, насколько в железе корректно - ХЗ.
По проге Антона сигналы от приемника заводятся на D2 и D3, за каким …, спрашивается, нам нужно, чтобы камень отрабатывал по дерганью В0 и В1?
Ну дык они у меня только на них и реагируют, ПД2 и ПД3, всё работает корректно, на В0 и В1 реакции НЕТ,ну в симуляторе, по крайней мере… Я же говорю - в железе проверять надо…
Поэтому Ваши варианты буду пробовать только сейчас. Обязательно отпишусь о результатах!
Очень жду, тут вон какие страсти горят 😃 😃
Валерий. Проверил два Ваших варианта. оба не работают!😦
Попозже выложу свой вариант. Я его подчистил и написал пояснения. Но маленький баг пока остался!
Валерий. Проверил два Ваших варианта. оба не работают!
Гляньте мой, если не трудно, самому интересно!!!
rcopen.com/forum/f8/topic144500/228
Гляньте мой, если не трудно, самому интересно!!!
rcopen.com/forum/f8/topic144500/228
Андрей, работает и без бага. Спасибо за помощь! Буду чистить.
Только в Вашем проекте прерывания с обоих каналов работают на поворотники. А так всё замечательно!
Работает? Ну и славненько! 😉
Попробовал в железе. Работает мой сегодняшний вариант от 15.55 и вариант Андрея, но подача сигнала на В0 и В1 подвешивает прогу Андрея.
Андрей, работает и без бага. Спасибо за помощь! Буду чистить.
Рад что удалось помочь!!! В свое время (тогда с БАНО) наигрался и таймерами и прерываниями по самое… горло 😃 Хотя должен признать, что использовал идеи Валерия частично - просто взял в теме последнее, что было:)
А что почистить надо? Или вы про код?
Работает? Ну и славненько!
Ага, общими усилиями добили таки 😃
А что почистить надо? Или вы про код?
Ну да, хочу добавить ещё несколько режимов! Надо Прописать режимы включения фар. И добавить типа “аварийки” когда сигнал приёмника пропадает, только пока нет никаких мыслей по этому поводу!
А ещё может кто сможет объяснить как работают магазинные блоки света что народ на машинки покупает. Которые работают от канала газа и поворота. Там же вроде и стопы загараются. Может кто в курсе?
Но сначало буду делать чтоб свободным каналом зажигать только габариты и фары, и поворотниками управлять другим каналом.
В канале газа определить “ворота” от 1400 до 1600, например, и зажигать стопы.
Ну да, хочу добавить ещё несколько режимов!
Опишите их здесь или в личке, сейчас гости, ночью или с утра посижу, потренирую свой ЦПУ 😃
И добавить типа “аварийки” когда сигнал приёмника пропадает, только пока нет никаких мыслей по этому поводу!
Это у меня реализовано, так что перенесу в ваш проэкт, не вопрос!
Опишите их здесь или в личке, сейчас гости, ночью или с утра посижу, потренирую свой ЦПУ
С режимами фар и всем таким я и сам разберусь.
Это у меня реализовано, так что перенесу в ваш проэкт, не вопрос!
Я пока не придумал как реализовать детектирование потери канального импульса. Может подскажите? Буду примного благодарен!!!
Я пока не придумал как реализовать детектирование потери канального импульса. Может подскажите? Буду примного благодарен!!!
Блин, проще перенести, чем описать 😃 Она у меня тут есть, в последней версии, возьмите оттуда. Или выложите свою, я туда её имплантирую:)
Реализация: при прерывании запускается второй таймер, с бОльшим коэф деления, и при каждом следующем прерывании его регистр обнуляется, а при переполнении срабатывает на индикацию “аварийного” состояния. Можно не заморачиватся с переполнением, а в “Майне” проверять его значение, при заведомо бОльшем = стоп таймера и индикация, первый же импульс ППМ вызовет прерывание, которое регистр таймера опять обнулит и запустит таймер снова.
Ну вот, гости ушли, пиво осталось 😃 Под пиво оно как то всё и написалось 😃 Выкладываю законченный вариант, логика должна соответствовать вашему посту rcopen.com/forum/f8/topic144500/216
На выводы порта Д4 и Д5 вывел соответственно “габариты” и “фары”, длительности там подправите под свои нужды, можете на другие выводы привязать, и логику вкл/выкл всего проверить. Аварийка то же работает, по крайней мере в симуляторе, в общем - прошейте в железо и проверьте, если в 2 ночи косяков не оставил - должно работать…
Мысль конечно хорошая. Прошил Вашу прошивку. Аварийка моргает сразу. Включаешь поворотник, он начинает моргать, аварийка не работает. Крутишь ручку свет, он включается, но аварийка моргат.
Видимо таймера Т0 не хватает для этих целей.
Мысль конечно хорошая. Прошил Вашу прошивку. Аварийка моргает сразу. Включаешь поворотник, он начинает моргать, аварийка не работает. Крутишь ручку свет, он включается, но аварийка моргат.
Видимо таймера Т0 не хватает для этих целей.
Всё должно хватать… Странно… Попробуйте подать питание без ППМ, ничего не должно включится… Через часик смогу внимательно просмотреть ещё раз, опишите, где что не так, исправлю, не вопрос!
Новая версия… Постарайтесь описать, что именно не так сработало…😃
Новая версия…
Дежавю…
Исправил глюк со светом, проверил ещё раз работу таймера аварийки - ЛЮБОЙ импульс, приходящий на ЛЮБОЙ вход, его сбрасывает!
Версия 2.5 - переделал логику таймера аварийки, теперь он более “правильно” работает, может сбои были из за его переполнения, хотя оно в принципе не могло быть достигнуто, но теперь для гарантии таймер останавливается при пропадании сигналов на входах, включает аварийку и не запустится до их следующего появления.
Предыдущая версия (2.4) оставлена то же, мало ли что 😃
Андрей, спасибо за Ваши старания!!! Вчера плохо себя чувствовал, ничего не делал. Пробовать буду сегодня.
Андрей, спасибо за Ваши старания!!!
Не за что, рад помочь, чем могу 😃
Вчера плохо себя чувствовал, ничего не делал
Надеюсь ничего серьёзного…
Пробовать буду сегодня.
Попробуйте, самому интересно, как в железе поведёт - вроде логика вся вычесана и на симуляторе все проверено во всех режимах.