| on_interrupt | 
|  | 
| 
 
 
 
 | vova5812 | Дата: Вт, 02.11.2010, 22:51  |                                                                                                                Сообщение # 1 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 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 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | Уважаемый mikhail09p!  Спасибо Вам за ответ. Но меня интересует измерение длительности импульса
 присутсвующего на RB0.
 Нужно чтобы таймер запускался, к примеру, по спаду
 импульса и останавлиался на фронте следующего.
 Это и будет длительность импульса по количеству переполнений TMR0.
 У меня не получается останов и запуск таймера в нужный момент.
 TMR0 считает весь период импульса.
  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | ivan_fd | Дата: Чт, 04.11.2010, 10:05  |                                                                                                                Сообщение # 4 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Вы эту тему смотрели, такая же задача.  http://picbasic.ru/forum/5-545-1 |  
 |  |  |  | 
| 
 
 
 
 | vova5812 | Дата: Чт, 04.11.2010, 10:54  |                                                                                                                Сообщение # 5 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | Смотрел.  on_interrupt протоновская команда. Я перерыл в протоновской ветке все.
 Если бы я нашел что-то интересующее меня
 по измерению длительности + или - импульса
 на RB0 при помощи TMR0 и on_interrupt...
  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | ivan_fd | Дата: Чт, 04.11.2010, 11:04  |                                                                                                                Сообщение # 6 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Ну так чем не устраивает Вас предыдущая программа? Как раз по импульсах измеряет длительность.
 |  
 |  |  |  | 
| 
 
 
 
 | vova5812 | Дата: Чт, 04.11.2010, 12:13  |                                                                                                                Сообщение # 7 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | Не устраивает полное отсутствие команды on_interrupt .  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | ivan_fd | Дата: Чт, 04.11.2010, 16:49  |                                                                                                                Сообщение # 8 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Ну так правильно, она же написана на Рибе. Но за основу он подходит. Или Вам нужно весь код.   |  
 |  |  |  | 
| 
 
 
 
 | vova5812 | Дата: Чт, 04.11.2010, 21:57  |                                                                                                                Сообщение # 9 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | Мне нужно понять принцип . Я где-то не догоняю.
 Я не могу вовремя остановить таймер (TMR0) в PIC16F84A.
 У меня программа вместо замера длительности паузы,
 замеряет длину всего периода (импульс + пауза).
  P.S. Рыбий код увидел впервые... Не удивляйтесь, я всего-лишь начинающий.
 Терпением знающих на этом сайте
 надеюсь что научусь.
 Все когда-нибудь что-нибудь в этой жизни начинали
 впервые. Дорогу осилит идущий.
  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | DAlexV | Дата: Чт, 04.11.2010, 22:15  |                                                                                                                Сообщение # 10 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 655
 
 
 Замечания: ± На сайте с 13.05.2008
 
 
 Статус: 
 Offline
 
 | Quote (vova5812) У меня программа вместо замера длительности паузы, замеряет длину всего периода (импульс + пауза).все верно. Есть такой бит INTEDG0 (INTCON2.6) (в 18F452). Он определяет выбор активного фронта внешнего прерывания. Либо по переднему фронту, либо по заднему. Комбинируя этим битом можно добиться измерение паузы или импульса.
 
 Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
 |  
 |  |  |  | 
| 
 
 
 
 | vova5812 | Дата: Чт, 04.11.2010, 22:46  |                                                                                                                Сообщение # 11 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | В OPTION_REG.6 ставлю 1 или ноль, все едино. Замеряет весь период.
 Остальные параметры(биты) регистра OPTION_REG управляются без проблем.
 Так как -же мне уговорить железку запуститься вовремя и не мерять лишнего?
  Кстати бит INTE=1 должен разрешить прерывание, наблюдаю картину с точностью до наоборот.
 При INTE=0 все работает, а при INTE=1 все затыкается.
  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | DAlexV | Дата: Чт, 04.11.2010, 22:51  |                                                                                                                Сообщение # 12 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 655
 
 
 Замечания: ± На сайте с 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 |  
 | ![vova5812]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 32
 
 
 Замечания: ± На сайте с 18.01.2010
 
 
 Статус: 
 Offline
 
 | Вот посмотрите пожалуйста код и модель в Протеусе. Задача устройства - среагировать выводом RB.0 при появлении импульса,
 замерять его длительность в количестве переполнений TMR0 и
 вывести на порт А (RA0) тоже в виде импульса.
  С уважением, Владимир. |  
 |  |  |  | 
| 
 
 
 
 | DAlexV | Дата: Пт, 05.11.2010, 17:08  |                                                                                                                Сообщение # 15 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 655
 
 
 Замечания: ± На сайте с 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
 Для данной задачи можно не использовать таймер, достаточно прерывание от B.0.Quote (vova5812) Задача устройства - среагировать выводом RB.0 при появлении импульса, замерять его длительность в количестве переполнений TMR0 и вывести на порт А (RA0) тоже в виде импульса.
 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
 
  |  
 |  |  |  |