обработка импульсов микроконтроллером
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
уважаемый akl огромное спасибо за помощь!!!
- Реклама
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
Полного решения пока нет, иду потихоньку к тому чтоб начать писать подпрограмму обработки импульсов.
- Сообщения: 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
- Реклама
Если хотите добиться стабильности, то советую не трогать значение таймера. Пусть он считает по кругу. Просто перенастраивайте прерывание на фронт или сброс и запоминайте захваченные значения. Искомая длительность будет определяться, как разница захваченных значений таймера.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
Если в программе больше прерываний не планируется, то проще отказаться от таймеров и прерываний и читать порт напрямую в цикле с прирастающим счетчиком.
Введение гистерезиса обязательно. Введенные значения всегда немного гуляют.
И советую не использовать высокую тактовую частоту, иначе контроллер может наводить помеху на приемник.
- Сообщения: 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инициализация портов понятна.
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,R182)разрешение прерывания по переполнению 1-го таймера
как понять что именно по фронту а не спаду??? какое значение об этом говорит?
Код: Выделить всё
LDI A,$40
OUT TCCR1B,A ; подготовка к приему фронта сигнала на ICPо какой подготовке идёт речь?
CLT - сброс флага T , что за флаг и для чего он?
Код: Выделить всё
LDI ZH,HIGH(CAPT)
LDI ZL,LOW (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 будет осуществлен независимо от режима работы таймера.
- по коду. Ниже выложил код с максимальными комментариями. Думаю, он снимет вопросы.
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
К сожалению не понимаю структуру программы в общем, полностью разобрал что смог, все коменты в коде, или я что-то сильно не понимаю, либо некоторые коменты не верны.
- Вложения
-
- doctor_Dlit(razbor).asm
- (5.7 КБ) 310 скачиваний
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
Хочу сказать Спасибо вам akl за терпение, в общем разобрался со значениями регистров и их битами , осталось пару вопросов по этому разделу. Теперь осталось разобраться как это в сборе работает.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
Для этого, завтра после работы, нарисую блок схему по которой можно уже будет вникать, что же происходит в впрограмме в общем.
А вы по возможности поправье меня.
Прикладываю код с вопросами которые остались не понятными.
- Вложения
-
- doctor_Dlit.asm
- (4.3 КБ) 302 скачивания
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
А вот блок схема программы которая дожна получится.
- Вложения
-
- вариант.jpg
- (53.21 КБ) 364 скачивания
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
Добрый день, в общем доработав свой первый вариант и сделав отладочную плату у меня всё получилось. С лёгкостью смог разделить на 8 аналоговых каналов один импульсный.
Прикладываю код программы
И в скором времени видео работы.
Прикладываю код программы
И в скором времени видео работы.
- Вложения
-
- Code1.asm
- исходник
- (4.08 КБ) 293 скачивания
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
Сегодня доделал проект фактически полностью, Система БАНО готова но с небольшими минусами, что в свою очередь приносит небольшие неудобства, а именно:
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
так как основная программа это задействование маячков является первостепенной, то программа прерывания остаётся на 2-м плане, и обрабатывается после небольшой задержки (обработки главной программы), что влечёт за собой небольшое отставание в обработке имупльсов.
Выкладываю прошивку для общего пользования, если кто-то сможет улучшить мой результат, не забудьте поделиться!
- Вложения
-
- Code1.asm
- (3.66 КБ) 294 скачивания
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
Появилось свободное время, хочу усовершенствовать БАНО, подскажите пожалуйста, как сравнить значение с константами. Например, сравниваем значение TEMP = 5; (2>temp) и.т.д. если меньше 2, то rjmp o1. Если больше 2 то rjmp o2, и.т.д. если можно пример на языке асамблер.
Истина где-то рядом
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Код: Выделить всё
cpi temp, 3;Сравниваем
brsh loop1;Если темп>=3 идем в метку loop1
rjmp loop2;иначе
loop1:
.....;
loop2:
.....;Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
можно сделать и так, но код получится длинный.
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
я имею в виду чтобы сравнить сразу и на BRLO и BRSH несколько констант.
задача заключается в том, что я останавливаю таймер по прерыванию int0, затем сохраняю значение таймера в temp.
потом мне надо сравнить это значение с 3-я константами, если меньше первой константы переход (1), если больше второй но меньше первой константы переход (2), если больше второй константы но меньше третий, переход (3)и.т.д. одной командой это можно сделать?
Истина где-то рядом
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Сразу несколько констант? Только по битовому признаку, если конечно их можно разделить по битам. Другого на ум не приходит.
В общем сравнить разом не получится
В общем сравнить разом не получится
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


