Страница 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, значит нет делителя? или таймер отключен суда до датащиту!?

Код: Выделить всё

OUT	TCNT1H,B
OUT	TCNT1L,B
обнуление таймера


Код: Выделить всё

		CLR	XH
		CLR	XL
сброс регистровых пар

Код: Выделить всё

		LDI	A,$20
		OUT	MCUCR,A		; разрешение SLEEP

Код: Выделить всё

		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 , что за флаг и для чего он?

Код: Выделить всё

               LDI	ZH,HIGH(CAPT)
		LDI	ZL,LOW (CAPT)
загрузка начального массива, по метке CAPT!

ser a - установить все биты регистра - значит 0x11111111
OUT TIFR,A ; сброс FLAG's
вывод

SEI - разрешить глобальные прерывания

дальше обработка функции сна, это понятно
потом запрет прерывания и очистка фалга Т, опять же непонятно что это!?

Код: Выделить всё

RJMP	SCHIT
постоянный цикл.

Далее подпрограмма обработки массива 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
Сразу несколько констант? Только по битовому признаку, если конечно их можно разделить по битам. Другого на ум не приходит.
В общем сравнить разом не получится