Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
прерывания по таймер_1
dimitriy-bc Дата: Чт, 14.06.2012, 20:34  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Похожая программа у меня написана на асм. Для освоения протона решил написать ее на бейсике. Это привод двигателя постоянного тока. Используются прерывания по входу В0 (привязка к сети) и таймер_1 (задержка включения тиристоров). Для отладки в протеусе использую выходы В1, В2, В7. В протеусе видно, что прерывания по В0 отрабатывают нормально (переключение выхода В1). При обработке этого прерывания в таймер_1 прописывается новое значение и разрешается его работа. При переполнении таймера_1, должно отработать прерывание по таймер_1 и установиться (bits_job.0 = 1). Это разрешит программе двигаться дальше. Для отладки должны установиться в единицу В2, В7, но этого не происходит. Подскажите в чем моя ошибка. Заранее благодарен.
Прикрепления: MDC_1000.rar (83.2 Kb)
ЯНДЕКС Дата: 14.06.2012
ivan_fd Дата: Чт, 14.06.2012, 21:51  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

У Вас прерывание по таймеру1 не происходит. Потому, что таймер не успевает переполнится. И вывод PORTB.0 никогда не равен 1 при прерывании.
dimitriy-bc Дата: Чт, 14.06.2012, 23:06  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

ivan_fd, да со временем я … не записал начальные значения TIME_X и TMR1L. Спасибо за подсказку.
А с,

Quote (ivan_fd)
И вывод PORTB.0 никогда не равен 1 при прерывании.


честно говоря, не понял.
ivan_fd Дата: Пт, 15.06.2012, 20:22  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

У Вас прерывание происходит по переднему фронту сигнала, а при нем на выводе PORTB.0 = 0.
dimitriy-bc Дата: Пт, 15.06.2012, 20:53  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

ivan_fd, я с Вами согласен но, в одной книге (очень давно) прочитал о том, что регистр OPTION_REG неустойчив к помехам. Эта программа должна работать в сильных импульсных электромагнитных помехах (сотни А. и выше). Из этих соображений при каждом прерывании проводится проверка и при необходимости правка регистра OPTION_REG.
'______________________________________ПРЕРЫВАНИЯ ПО ПОРТУ В.0_________________________________________
'
If INTCON.1 = 1 Then
If PORTB.0 = 1 Then
OPTION_REG = %10001010: INTCON.1 = 0
Else
PORTB.1 = 0 'ДЛЯ ОТЛАДКИ В ПРОТЕУСЕ
INTCON.6 = 0: T1CON.0 = 0: PIR1.0 = 0:
DelayUS 1
TMR1LH = TIME_XH: TMR1L = TIME_X: INTCON.6 = 1: T1CON.0 = 1: INTCON.1 = 0 'РАЗРЕШИТЬ РАБОТУ ТАЙМЕРУ_1
EndIf
EndIf

Сообщение отредактировал dimitriy-bc - Пт, 15.06.2012, 20:55
  • Страница 1 из 1
  • 1
Поиск: