on_interrupt
|
|
vova5812 |
Дата: Вт, 02.11.2010, 22:51 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Всем добрый день! Очень хочется разобраться, как при помощи on_interrupt и tmr0 измерить длительность импульса. Нигде не могу найти простых примеров для Протона. Пытаюсь сам понять. Информации очень мало. Ведь кого-то наверняка не затруднит подсказать, как в этом случае должен выглядеть код обработчика хардварного прерывания. С уважением, Владимир.
|
|
|
|
mikhail09p |
Дата: Ср, 03.11.2010, 22:43 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Вот смотри, как я с помощью ТМР0 считаю время. Это в качестве примера использования таймера 0. Кстати, а кто знает, при использовании оператора PulsIn используется какой таймер? Это вопрос в первую очередь terarus
Сообщение отредактировал
mikhail09p - Ср, 03.11.2010, 22:58
|
|
|
|
vova5812 |
Дата: Чт, 04.11.2010, 08:45 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Уважаемый mikhail09p! Спасибо Вам за ответ. Но меня интересует измерение длительности импульса присутсвующего на RB0. Нужно чтобы таймер запускался, к примеру, по спаду импульса и останавлиался на фронте следующего. Это и будет длительность импульса по количеству переполнений TMR0. У меня не получается останов и запуск таймера в нужный момент. TMR0 считает весь период импульса. С уважением, Владимир.
|
|
|
|
ivan_fd |
Дата: Чт, 04.11.2010, 10:05 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Вы эту тему смотрели, такая же задача. http://picbasic.ru/forum/5-545-1
|
|
|
|
vova5812 |
Дата: Чт, 04.11.2010, 10:54 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Смотрел. on_interrupt протоновская команда. Я перерыл в протоновской ветке все. Если бы я нашел что-то интересующее меня по измерению длительности + или - импульса на RB0 при помощи TMR0 и on_interrupt... С уважением, Владимир.
|
|
|
|
ivan_fd |
Дата: Чт, 04.11.2010, 11:04 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ну так чем не устраивает Вас предыдущая программа? Как раз по импульсах измеряет длительность.
|
|
|
|
vova5812 |
Дата: Чт, 04.11.2010, 12:13 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Не устраивает полное отсутствие команды on_interrupt . С уважением, Владимир.
|
|
|
|
ivan_fd |
Дата: Чт, 04.11.2010, 16:49 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ну так правильно, она же написана на Рибе. Но за основу он подходит. Или Вам нужно весь код.
|
|
|
|
vova5812 |
Дата: Чт, 04.11.2010, 21:57 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Мне нужно понять принцип . Я где-то не догоняю. Я не могу вовремя остановить таймер (TMR0) в PIC16F84A. У меня программа вместо замера длительности паузы, замеряет длину всего периода (импульс + пауза). P.S. Рыбий код увидел впервые... Не удивляйтесь, я всего-лишь начинающий. Терпением знающих на этом сайте надеюсь что научусь. Все когда-нибудь что-нибудь в этой жизни начинали впервые. Дорогу осилит идущий. С уважением, Владимир.
|
|
|
|
DAlexV |
Дата: Чт, 04.11.2010, 22:15 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (vova5812) У меня программа вместо замера длительности паузы, замеряет длину всего периода (импульс + пауза). все верно. Есть такой бит INTEDG0 (INTCON2.6) (в 18F452). Он определяет выбор активного фронта внешнего прерывания. Либо по переднему фронту, либо по заднему. Комбинируя этим битом можно добиться измерение паузы или импульса.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
vova5812 |
Дата: Чт, 04.11.2010, 22:46 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
В OPTION_REG.6 ставлю 1 или ноль, все едино. Замеряет весь период. Остальные параметры(биты) регистра OPTION_REG управляются без проблем. Так как -же мне уговорить железку запуститься вовремя и не мерять лишнего? Кстати бит INTE=1 должен разрешить прерывание, наблюдаю картину с точностью до наоборот. При INTE=0 все работает, а при INTE=1 все затыкается. С уважением, Владимир.
|
|
|
|
DAlexV |
Дата: Чт, 04.11.2010, 22:51 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Начнем с того что какой проц ???? P/s. Да и на код хотелось бы глянуть.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Чт, 04.11.2010, 23:39
|
|
|
|
demanik |
Дата: Пт, 05.11.2010, 09:07 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (vova5812) В OPTION_REG.6 ставлю 1 или ноль, все едино. Замеряет весь период Сначала OPTION_REG.6 ставим в-1 или в-0 в зависимости что будем мерять длитальность импульса или паузы После первого прерывания запускаем таймер и OPTION_REG.6 меняем на противоположный при следующем прерывании останавливается таймер и OPTION_REG.6 меняем на противоположный Тоесть первое прерывание прерывание происходит например по фронту импульса а следующее по спаду. В Вашем же случаее оба прерывания происходили либо по нарастанию либо поспаду.
Попробуй всё и вся... может быть пол...
|
|
|
|
vova5812 |
Дата: Пт, 05.11.2010, 11:12 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Вот посмотрите пожалуйста код и модель в Протеусе. Задача устройства - среагировать выводом RB.0 при появлении импульса, замерять его длительность в количестве переполнений TMR0 и вывести на порт А (RA0) тоже в виде импульса. С уважением, Владимир.
|
|
|
|
DAlexV |
Дата: Пт, 05.11.2010, 17:08 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (vova5812) Вот посмотрите пожалуйста код и модель в Протеусе Посмотрел. Загнал Bas файл в Протеус. Про прерывание от B.0 ни строчки. Добавил Watch Windows для детального осмотра Option и IntCON. прикрепляю для изучения. GIE не обязательно сбрасывать, достаточно сбросить флаги источников прерываний и после Context Restore он сам восстановиться. А вот FSR лучше сохранять, лишним не будет. обработчик прерываний выглядеть примерно так: Code flash: Context Save if T0IF = 1 then ' Если прерывание от TMR0 T0IF = 0 ' сбросили флаг ' далее нужные нам действия по этому условию ftmr0 = ftmr0 + 1 dimp = ftmr0 end if
if INTF=1 then ' Если прерывание от B.0 INTF = 0 ' сбросили флаг ' далее нужные нам действия по этому условию
end if Context Restore Quote (vova5812) Задача устройства - среагировать выводом RB.0 при появлении импульса, замерять его длительность в количестве переполнений TMR0 и вывести на порт А (RA0) тоже в виде импульса. Для данной задачи можно не использовать таймер, достаточно прерывание от B.0. Code OPTION_REG = %10001000 INTEDG=1 ' флаг активного фронта прерывания по B.0 INTF=1 ' сбросим на всякий пожарный INTE=1 ' разрешение прерывания GIE = 1 ' разрешим все прерывания On_Interrupt GoTo flash
GoTo MainProgram
flash: Context Save
if INTF=1 then ' Если прерывание от B.0 INTF = 0 ' сбросили флаг ' далее нужные нам действия по этому условию
if INTEDG=1 then ' Если Настроенно по нарастанию Porta.0=1 ' 1 на портA INTEDG=0 ' переключили источник на спад
else Porta.0=0 ' 0 на портA INTEDG=1 ' переключили источник на фронт end if
end if Context Restore
MainProgram: ' здесь можно заниматься всем чем угодно. Прерывание полностью независимо с одним но... ' на время обработки прерывания работа основной программы останавливается GoTo MainProgram Вот наверное и все. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Пт, 05.11.2010, 17:08
|
|
|
|