Страница 2 из 3
Добавлено: Пт ноя 06, 2009 20:12:05
Dock
уважаемый akl огромное спасибо за помощь!!!
Добавлено: Пт ноя 06, 2009 20:56:39
akl
Dock писал(а):решение найдено...
...кому интересно могу выложить прошивку.
Мне интересно. Как Вы решили вопрос о принятии решения о переходе 0 в 1 и обратно? Введен ли гистерезис?
Добавлено: Пт ноя 06, 2009 21:43:26
Dock
Полного решения пока нет, иду потихоньку к тому чтоб начать писать подпрограмму обработки импульсов.
Добавлено: Вт дек 01, 2009 20:13:56
Dock
Долго мучился сделал, но очень не стабильно, посоветовали сделать вот так:
компаратор и таймер в режиме захвата, прерывание по спаду импульса от передатчика, который подан на вход компаратора. По фронту импульса стартуем таймер. В обработчике прерывания читаем таймер, получаем число, пропорциональное длительности канального импульса.
в общем идею понял, но как это написать на асамблере, просто не понимаю. помогите пожалуйста.
Добавлено: Ср дек 02, 2009 07:20:55
akl
Здравствуйте.
Работа измерителя длительности по "захвату", в моем понимании, будет такой как в "вырезке" из программы, взятой здесь.
http://radioded.ru/content/view/95/49/
Определение гистерезиса можно сделать, примерно, как здесь.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
Добавлено: Чт дек 03, 2009 08:37:50
Vladimir_N
Если хотите добиться стабильности, то советую не трогать значение таймера. Пусть он считает по кругу. Просто перенастраивайте прерывание на фронт или сброс и запоминайте захваченные значения. Искомая длительность будет определяться, как разница захваченных значений таймера.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
Добавлено: Сб дек 05, 2009 01:14:23
Dock
добрый вечер.
прочитал то, что вы посоветовали, просмотрел часть кода, к сожалению моего опыта не хвататет чтобы разобраться.
1) я не понял, обязательно ли использовать внешний кварц или можно обойтись встроенныйм в мк 2313?
2)правильно ли я понял, что сигнал нужно подать на специальную ножку ISP? Судя по datasheet 2313 это 16 ножка PB4 OS1B?
3) разбор программы.
Код: Выделить всё
RJMP START ; On Reset
RETI ; On Interrupt 0
RETI ; On Interrupt 1
IJMP ; Timer 1 capture
RETI ; Timer 1A compare
ADIW XL,1 ; Timer 1 overflow
RETI ; Timer 0 overflow
если RJMP безусловный переход на метку старт, то следующие строки заканчивают программу прерывания, каких непонятно, потом осуществляется косвенный безусловный переход КУДА, зачем?
инициализация портов понятна.
CLR В - сброс разряда r16 на 0? или1?
дальше TCCR1B настройка делителя, как я понял ввели 0, значит нет делителя? или таймер отключен суда до датащиту!?
обнуление таймера
сброс регистровых пар
Код: Выделить всё
LDI R18,$88 ; OVER_T1+CAPT по фронту импульса
OUT TIMSK,R18
значение $88 даёт по датащиту 1)разрешение прерывания защелки 1-го таймера
2)разрешение прерывания по переполнению 1-го таймера
как понять что именно по фронту а не спаду??? какое значение об этом говорит?
Код: Выделить всё
LDI A,$40
OUT TCCR1B,A ; подготовка к приему фронта сигнала на ICP
по датащиту этим мы включаем делитель CK/256
о какой подготовке идёт речь?
CLT - сброс флага T , что за флаг и для чего он?
загрузка начального массива, по метке CAPT!
ser a - установить все биты регистра - значит 0x11111111
OUT TIFR,A ; сброс FLAG's
вывод
SEI - разрешить глобальные прерывания
дальше обработка функции сна, это понятно
потом запрет прерывания и очистка фалга Т, опять же непонятно что это!?
постоянный цикл.
Далее подпрограмма обработки массива CAPT
продолжу завтра
Добавлено: Сб дек 05, 2009 10:11:47
akl
Похоже, что мы говорим о разных контроллерах. Пример был приведен для AT90S2313!
DS на AT90S2313
http://www.atmel.com/dyn/resources/prod ... OC0839.PDF
DS на ATtiny2313
http://www.atmel.com/dyn/resources/prod ... oc2543.pdf
Они очень похожи, но не эквивалентны.
Но, пример должен выполняться корректно для обоих камней.
По порядку
- боюсь, что стабильности встроенного RC-генератора во всем диапазоне не хватит
- для подачи сигнала у обоих камней есть специальная ножка 11 PD6(ICP)
- при разрешенном прерывании CAPT переход на прерывание по активному фронту сигнала, поданного на ICP будет осуществлен независимо от режима работы таймера.
- по коду. Ниже выложил код с максимальными комментариями. Думаю, он снимет вопросы.
Добавлено: Сб дек 05, 2009 23:09:38
Dock
К сожалению не понимаю структуру программы в общем, полностью разобрал что смог, все коменты в коде, или я что-то сильно не понимаю, либо некоторые коменты не верны.
Добавлено: Вс дек 06, 2009 09:47:07
akl
Здравствуйте. ответил в комментах и в рисунках.
Добавлено: Вс дек 06, 2009 17:17:12
Dock
Хочу сказать Спасибо вам akl за терпение, в общем разобрался со значениями регистров и их битами , осталось пару вопросов по этому разделу. Теперь осталось разобраться как это в сборе работает.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
Добавлено: Сб дек 12, 2009 16:51:14
Dock
Добрый вечер, только сегодня появилось время, выкладываю блок схему. правильно я понял работу программы?
Добавлено: Сб дек 12, 2009 17:39:12
Dock
А вот блок схема программы которая дожна получится.
Добавлено: Чт янв 14, 2010 17:17:03
Dock
Добрый день, в общем доработав свой первый вариант и сделав отладочную плату у меня всё получилось. С лёгкостью смог разделить на 8 аналоговых каналов один импульсный.
Прикладываю код программы
И в скором времени видео работы.
Добавлено: Пт янв 15, 2010 00:21:30
Dock
А вот и видео работы которое можно посмотреть
тут
Добавлено: Сб янв 16, 2010 20:23:06
Dock
Сегодня доделал проект фактически полностью, Система БАНО готова но с небольшими минусами, что в свою очередь приносит небольшие неудобства, а именно:
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
Re: обработка импульсов микроконтроллером
Добавлено: Вс апр 04, 2010 16:11:50
Dock
Появилось свободное время, хочу усовершенствовать БАНО, подскажите пожалуйста, как сравнить значение с константами. Например, сравниваем значение TEMP = 5; (2>temp) и.т.д. если меньше 2, то rjmp o1. Если больше 2 то rjmp o2, и.т.д. если можно пример на языке асамблер.
Re: обработка импульсов микроконтроллером
Добавлено: Вс апр 04, 2010 16:31:16
Meteor
Код: Выделить всё
cpi temp, 3;Сравниваем
brsh loop1;Если темп>=3 идем в метку loop1
rjmp loop2;иначе
loop1:
.....;
loop2:
.....;
Вы так хотите?
Re: обработка импульсов микроконтроллером
Добавлено: Вс апр 04, 2010 17:17:52
Dock
можно сделать и так, но код получится длинный.
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
Re: обработка импульсов микроконтроллером
Добавлено: Вс апр 04, 2010 17:22:05
Meteor
Сразу несколько констант? Только по битовому признаку, если конечно их можно разделить по битам. Другого на ум не приходит.
В общем сравнить разом не получится