on_interrupt - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » on_interrupt (измерение длительности импульса (положительного или нуля))
on_interrupt
vova5812 Дата: Вт, 02.11.2010, 22:51  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Всем добрый день!

Очень хочется разобраться, как при помощи on_interrupt и tmr0 измерить
длительность импульса.
Нигде не могу найти простых примеров для Протона.
Пытаюсь сам понять.
Информации очень мало.
Ведь кого-то наверняка не затруднит подсказать,
как в этом случае должен выглядеть код обработчика
хардварного прерывания.

С уважением, Владимир.

ЯНДЕКС Дата: 02.11.2010
mikhail09p Дата: Ср, 03.11.2010, 22:43  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Вот смотри, как я с помощью ТМР0 считаю время. Это в качестве примера использования таймера 0.
Кстати, а кто знает, при использовании оператора PulsIn используется какой таймер? Это вопрос в первую очередь terarus biggrin
Прикрепления: Prog_Thermo628.rar(75Kb)

Сообщение отредактировал mikhail09p - Ср, 03.11.2010, 22:58
vova5812 Дата: Чт, 04.11.2010, 08:45  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Уважаемый mikhail09p!

Спасибо Вам за ответ.
Но меня интересует измерение длительности импульса
присутсвующего на RB0.
Нужно чтобы таймер запускался, к примеру, по спаду
импульса и останавлиался на фронте следующего.
Это и будет длительность импульса по количеству переполнений TMR0.
У меня не получается останов и запуск таймера в нужный момент.
TMR0 считает весь период импульса.

С уважением, Владимир.

ivan_fd Дата: Чт, 04.11.2010, 10:05  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Вы эту тему смотрели, такая же задача.

http://picbasic.ru/forum/5-545-1


Меня все время преследуют умные мысли...но я быстрее!!!
vova5812 Дата: Чт, 04.11.2010, 10:54  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Смотрел.

on_interrupt протоновская команда.
Я перерыл в протоновской ветке все.
Если бы я нашел что-то интересующее меня
по измерению длительности + или - импульса
на RB0 при помощи TMR0 и on_interrupt...

С уважением, Владимир.

ivan_fd Дата: Чт, 04.11.2010, 11:04  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ну так чем не устраивает Вас предыдущая программа?
Как раз по импульсах измеряет длительность.


Меня все время преследуют умные мысли...но я быстрее!!!
vova5812 Дата: Чт, 04.11.2010, 12:13  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Не устраивает полное отсутствие команды on_interrupt .

С уважением, Владимир.

ivan_fd Дата: Чт, 04.11.2010, 16:49  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ну так правильно, она же написана на Рибе. Но за основу он подходит. Или Вам нужно весь код. biggrin

Меня все время преследуют умные мысли...но я быстрее!!!
vova5812 Дата: Чт, 04.11.2010, 21:57  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Мне нужно понять принцип .
Я где-то не догоняю.
Я не могу вовремя остановить таймер (TMR0) в PIC16F84A.
У меня программа вместо замера длительности паузы,
замеряет длину всего периода (импульс + пауза).

P.S. Рыбий код увидел впервые...
Не удивляйтесь, я всего-лишь начинающий.
Терпением знающих на этом сайте
надеюсь что научусь.
Все когда-нибудь что-нибудь в этой жизни начинали
впервые. Дорогу осилит идущий.

С уважением, Владимир.

DAlexV Дата: Чт, 04.11.2010, 22:15  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (vova5812)
У меня программа вместо замера длительности паузы, замеряет длину всего периода (импульс + пауза).

все верно. Есть такой бит INTEDG0 (INTCON2.6) (в 18F452). Он определяет выбор активного фронта внешнего прерывания. Либо по переднему фронту, либо по заднему. Комбинируя этим битом можно добиться измерение паузы или импульса.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
vova5812 Дата: Чт, 04.11.2010, 22:46  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

В OPTION_REG.6 ставлю 1 или ноль, все едино.
Замеряет весь период.
Остальные параметры(биты) регистра OPTION_REG управляются без проблем.
Так как -же мне уговорить железку запуститься вовремя и не мерять лишнего?

Кстати бит INTE=1 должен разрешить прерывание,
наблюдаю картину с точностью до наоборот.
При INTE=0 все работает, а при INTE=1 все затыкается.

С уважением, Владимир.

DAlexV Дата: Чт, 04.11.2010, 22:51  |                                                                                                                Сообщение # 12
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Начнем с того что какой проц ????

P/s. Да и на код хотелось бы глянуть.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Чт, 04.11.2010, 23:39
demanik Дата: Пт, 05.11.2010, 09:07  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (vova5812)
В OPTION_REG.6 ставлю 1 или ноль, все едино.
Замеряет весь период

Сначала OPTION_REG.6 ставим в-1 или в-0 в зависимости что будем мерять длитальность импульса или паузы
После первого прерывания запускаем таймер и OPTION_REG.6 меняем на противоположный
при следующем прерывании останавливается таймер и OPTION_REG.6 меняем на противоположный

Тоесть первое прерывание прерывание происходит например по фронту импульса а следующее по спаду.
В Вашем же случаее оба прерывания происходили либо по нарастанию либо поспаду. cool


Попробуй всё и вся... может быть пол...

vova5812 Дата: Пт, 05.11.2010, 11:12  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 0   ±
Замечания:   ±
На сайте с 18.01.2010

Статус: Offline

Вот посмотрите пожалуйста код и модель в Протеусе.
Задача устройства - среагировать выводом RB.0 при появлении импульса,
замерять его длительность в количестве переполнений TMR0 и
вывести на порт А (RA0) тоже в виде импульса.

С уважением, Владимир.

Прикрепления: Timer.rar(28Kb)
DAlexV Дата: Пт, 05.11.2010, 17:08  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 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

Вот наверное и все. Успехов wink

Прикрепления: 7135180.rar(370Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Пт, 05.11.2010, 17:08
Форум Picbasic.ru » Программирование МК » Proton PicBasic » on_interrupt (измерение длительности импульса (положительного или нуля))
Страница 1 из 212»
Поиск: