обработка импульсов микроконтроллером
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Долго мучился сделал, но очень не стабильно, посоветовали сделать вот так:
компаратор и таймер в режиме захвата, прерывание по спаду импульса от передатчика, который подан на вход компаратора. По фронту импульса стартуем таймер. В обработчике прерывания читаем таймер, получаем число, пропорциональное длительности канального импульса.
в общем идею понял, но как это написать на асамблере, просто не понимаю. помогите пожалуйста.
компаратор и таймер в режиме захвата, прерывание по спаду импульса от передатчика, который подан на вход компаратора. По фронту импульса стартуем таймер. В обработчике прерывания читаем таймер, получаем число, пропорциональное длительности канального импульса.
в общем идею понял, но как это написать на асамблере, просто не понимаю. помогите пожалуйста.
Здравствуйте.
Работа измерителя длительности по "захвату", в моем понимании, будет такой как в "вырезке" из программы, взятой здесь.
http://radioded.ru/content/view/95/49/
Определение гистерезиса можно сделать, примерно, как здесь.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
Работа измерителя длительности по "захвату", в моем понимании, будет такой как в "вырезке" из программы, взятой здесь.
http://radioded.ru/content/view/95/49/
Определение гистерезиса можно сделать, примерно, как здесь.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
-
Vladimir_N
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Вс фев 01, 2009 11:26:45
- Откуда: Тобольск
Если хотите добиться стабильности, то советую не трогать значение таймера. Пусть он считает по кругу. Просто перенастраивайте прерывание на фронт или сброс и запоминайте захваченные значения. Искомая длительность будет определяться, как разница захваченных значений таймера.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
добрый вечер.
прочитал то, что вы посоветовали, просмотрел часть кода, к сожалению моего опыта не хвататет чтобы разобраться.
1) я не понял, обязательно ли использовать внешний кварц или можно обойтись встроенныйм в мк 2313?
2)правильно ли я понял, что сигнал нужно подать на специальную ножку ISP? Судя по datasheet 2313 это 16 ножка PB4 OS1B?
3) разбор программы.
если RJMP безусловный переход на метку старт, то следующие строки заканчивают программу прерывания, каких непонятно, потом осуществляется косвенный безусловный переход КУДА, зачем?
инициализация портов понятна.
CLR В - сброс разряда r16 на 0? или1?
дальше TCCR1B настройка делителя, как я понял ввели 0, значит нет делителя? или таймер отключен суда до датащиту!?
обнуление таймера
сброс регистровых пар
значение $88 даёт по датащиту 1)разрешение прерывания защелки 1-го таймера
2)разрешение прерывания по переполнению 1-го таймера
как понять что именно по фронту а не спаду??? какое значение об этом говорит?
по датащиту этим мы включаем делитель CK/256
о какой подготовке идёт речь?
CLT - сброс флага T , что за флаг и для чего он?
загрузка начального массива, по метке CAPT!
ser a - установить все биты регистра - значит 0x11111111
OUT TIFR,A ; сброс FLAG's
вывод
SEI - разрешить глобальные прерывания
дальше обработка функции сна, это понятно
потом запрет прерывания и очистка фалга Т, опять же непонятно что это!?
постоянный цикл.
Далее подпрограмма обработки массива CAPT
продолжу завтра
прочитал то, что вы посоветовали, просмотрел часть кода, к сожалению моего опыта не хвататет чтобы разобраться.
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
продолжу завтра
Похоже, что мы говорим о разных контроллерах. Пример был приведен для 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 будет осуществлен независимо от режима работы таймера.
- по коду. Ниже выложил код с максимальными комментариями. Думаю, он снимет вопросы.
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
- Контактная информация:
К сожалению не понимаю структуру программы в общем, полностью разобрал что смог, все коменты в коде, или я что-то сильно не понимаю, либо некоторые коменты не верны.
- Вложения
-
- doctor_Dlit(razbor).asm
- (5.7 КБ) 308 скачиваний
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Хочу сказать Спасибо вам akl за терпение, в общем разобрался со значениями регистров и их битами , осталось пару вопросов по этому разделу. Теперь осталось разобраться как это в сборе работает.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
- Вложения
-
- doctor_Dlit.asm
- (4.3 КБ) 300 скачиваний
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Добрый день, в общем доработав свой первый вариант и сделав отладочную плату у меня всё получилось. С лёгкостью смог разделить на 8 аналоговых каналов один импульсный.
Прикладываю код программы
И в скором времени видео работы.
Прикладываю код программы
И в скором времени видео работы.
- Вложения
-
- Code1.asm
- исходник
- (4.08 КБ) 292 скачивания
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Сегодня доделал проект фактически полностью, Система БАНО готова но с небольшими минусами, что в свою очередь приносит небольшие неудобства, а именно:
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
- Вложения
-
- Code1.asm
- (3.66 КБ) 292 скачивания
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Re: обработка импульсов микроконтроллером
Появилось свободное время, хочу усовершенствовать БАНО, подскажите пожалуйста, как сравнить значение с константами. Например, сравниваем значение TEMP = 5; (2>temp) и.т.д. если меньше 2, то rjmp o1. Если больше 2 то rjmp o2, и.т.д. если можно пример на языке асамблер.
Истина где-то рядом
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: обработка импульсов микроконтроллером
Код: Выделить всё
cpi temp, 3;Сравниваем
brsh loop1;Если темп>=3 идем в метку loop1
rjmp loop2;иначе
loop1:
.....;
loop2:
.....;Вы так хотите?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Dock
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
- Контактная информация:
Re: обработка импульсов микроконтроллером
можно сделать и так, но код получится длинный.
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
Истина где-то рядом
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: обработка импульсов микроконтроллером
Сразу несколько констант? Только по битовому признаку, если конечно их можно разделить по битам. Другого на ум не приходит.
В общем сравнить разом не получится
В общем сравнить разом не получится
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже