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

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

Сообщение Dock »

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

Сообщение akl »

Dock писал(а):решение найдено...
...кому интересно могу выложить прошивку.

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

Сообщение Dock »

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

Сообщение Dock »

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

Сообщение akl »

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

Сообщение Vladimir_N »

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

Сообщение Dock »

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

Сообщение akl »

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

Сообщение Dock »

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

Сообщение Dock »

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

Сообщение Dock »

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

Сообщение Dock »

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

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

Сообщение Dock »

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

Сообщение Dock »

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

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

Сообщение Dock »

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

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

Сообщение Meteor »

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

cpi temp, 3;Сравниваем
brsh loop1;Если темп>=3 идем в метку loop1
rjmp loop2;иначе
loop1:
.....;
loop2:
.....;

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

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

Сообщение Dock »

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

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

Сообщение Meteor »

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

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