обработка импульсов микроконтроллером

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

уважаемый akl огромное спасибо за помощь!!!
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Dock писал(а):решение найдено...
...кому интересно могу выложить прошивку.
Мне интересно. Как Вы решили вопрос о принятии решения о переходе 0 в 1 и обратно? Введен ли гистерезис?
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Полного решения пока нет, иду потихоньку к тому чтоб начать писать подпрограмму обработки импульсов.
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Долго мучился сделал, но очень не стабильно, посоветовали сделать вот так:
компаратор и таймер в режиме захвата, прерывание по спаду импульса от передатчика, который подан на вход компаратора. По фронту импульса стартуем таймер. В обработчике прерывания читаем таймер, получаем число, пропорциональное длительности канального импульса.
в общем идею понял, но как это написать на асамблере, просто не понимаю. помогите пожалуйста.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте.
Работа измерителя длительности по "захвату", в моем понимании, будет такой как в "вырезке" из программы, взятой здесь.
http://radioded.ru/content/view/95/49/
Определение гистерезиса можно сделать, примерно, как здесь.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс фев 01, 2009 11:26:45
Откуда: Тобольск

Сообщение Vladimir_N »

Если хотите добиться стабильности, то советую не трогать значение таймера. Пусть он считает по кругу. Просто перенастраивайте прерывание на фронт или сброс и запоминайте захваченные значения. Искомая длительность будет определяться, как разница захваченных значений таймера.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение 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
продолжу завтра
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение 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 будет осуществлен независимо от режима работы таймера.
- по коду. Ниже выложил код с максимальными комментариями. Думаю, он снимет вопросы.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

К сожалению не понимаю структуру программы в общем, полностью разобрал что смог, все коменты в коде, или я что-то сильно не понимаю, либо некоторые коменты не верны.
Вложения
doctor_Dlit(razbor).asm
(5.7 КБ) 310 скачиваний
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте. ответил в комментах и в рисунках.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Хочу сказать Спасибо вам akl за терпение, в общем разобрался со значениями регистров и их битами , осталось пару вопросов по этому разделу. Теперь осталось разобраться как это в сборе работает.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
Вложения
doctor_Dlit.asm
(4.3 КБ) 302 скачивания
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Добрый вечер, только сегодня появилось время, выкладываю блок схему. правильно я понял работу программы?
Вложения
.jpg
(18.91 КБ) 356 скачиваний
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

А вот блок схема программы которая дожна получится.
Вложения
вариант.jpg
(53.21 КБ) 364 скачивания
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Добрый день, в общем доработав свой первый вариант и сделав отладочную плату у меня всё получилось. С лёгкостью смог разделить на 8 аналоговых каналов один импульсный.

Прикладываю код программы
И в скором времени видео работы.
Вложения
Code1.asm
исходник
(4.08 КБ) 293 скачивания
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

А вот и видео работы которое можно посмотреть тут
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Сегодня доделал проект фактически полностью, Система БАНО готова но с небольшими минусами, что в свою очередь приносит небольшие неудобства, а именно:
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
Вложения
Code1.asm
(3.66 КБ) 294 скачивания
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

Появилось свободное время, хочу усовершенствовать БАНО, подскажите пожалуйста, как сравнить значение с константами. Например, сравниваем значение TEMP = 5; (2>temp) и.т.д. если меньше 2, то rjmp o1. Если больше 2 то rjmp o2, и.т.д. если можно пример на языке асамблер.
Истина где-то рядом
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

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

cpi temp, 3;Сравниваем
brsh loop1;Если темп>=3 идем в метку loop1
rjmp loop2;иначе
loop1:
.....;
loop2:
.....;
Вы так хотите?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24

Сообщение Dock »

можно сделать и так, но код получится длинный.
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
Истина где-то рядом
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Сразу несколько констант? Только по битовому признаку, если конечно их можно разделить по битам. Другого на ум не приходит.
В общем сравнить разом не получится
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»