Проблемка с прерыванием...
|
|
k2mozganet |
Дата: Вс, 28.11.2010, 20:03 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
23
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Ребята сошкряпал программу для теста прерывания... столкнулся с проблемой..... залил прогу на контролер запустил... и помимо 2 светодиодов которые должны просто моргать.... моргает и тот который должен срабатывать только по прерыванию..... он просто хаотично моргает когда ему захочется при этом сигнал на прерывание нет:( в чем может быть проблема.... в протеусе все нормально..... вот сама прога: @ device pic16F84, xt_osc, wdt_off, protect_off, pwrt_on DEFINE OSC 4 include "MODEDEFS.BAS" On Interrupt Goto impuls INTCON = $90 trisb = %00000001 portb = 0 main: pause 200 portb.2 = 1 portb.3 = 0 pause 200 portb.2 = 0 portb.3 = 1 goto main impuls: Disable portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 portb.4 = 0 pause 50 portb.4 = 1 Resume Enable
Сообщение отредактировал
k2mozganet - Вс, 28.11.2010, 20:03
|
|
|
|
Broka |
Дата: Вс, 28.11.2010, 21:30 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
k2mozganet, Кой где надо бы поставить флаги внешнего прерывания, оператор DISABLE ставить надо непосредственно перед меткой прерывания( По крайней мере так советуют в книге В.Н. Хилинский), и вот это непонятно portb.4 = 0 и сразу portb.4 = 0 это что,импульс такой? Symbol INTF = INTCON.1 ; Флаг внешнего прерывания по PORTB.0(INT) Symbol INTE = INTCON.4 ; Бит разрешения прерывания по PORTB.0(INT) Symbol GIE = INTCON.7 ; Бит глобального разрешения прерывания наверно от этого плясать надо бы!
Наладчик КИП и А
Сообщение отредактировал
Broka - Вс, 28.11.2010, 21:34
|
|
|
|
mikhail09p |
Дата: Вс, 05.12.2010, 17:46 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Я не так делал, я программу обработки прерывания не выносил отдельно, а писал в теле прерывания. Иначе тоже не хотело работать. Device 16F628A Declare Xtal=4 Reminders = OFF Config XT_OSC , MCLRE_OFF, WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF Reminders = On Declare All_Digital = On '-------------------------- Настройки подключения ЖКИ ------------------------ Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ Declare LCD_ENPin PORTB.3 ' Управление линией E Declare LCD_RSPin PORTB.2 ' Управление линией RS Declare LCD_Interface 4 ' Разрядность шины данных Declare LCD_CommandUs 200 ' Задержка перед посылкой команды Declare LCD_DataUs 50 ' Задержка перед посылкой данных Declare LCD_Lines 2 ' Количество строк ЖКИ '-------------------------- Настройки портов --------------------------------- Symbol RBIF = INTCON.0 ;RB Port Interrupt Flag Symbol INTF = INTCON.1 ; RB0 External Interrupt Flag Symbol T0IF = INTCON.2 ; TMR0 Overflow Interrupt Flag Symbol RBIE = INTCON.3 ; RB Port Change Interrupt Enable Symbol INTE = INTCON.4 ;RB0 External Interrupt Enable Symbol T0IE = INTCON.5 ; TMR0 Overflow Interrupt Enable Symbol PEIE = INTCON.6 ; Peripheral Interrupt Enable Symbol GIE = INTCON.7 ; Global Interrupt Enable Dim BIG As Dword 'переменная для счета секунд Dim BIG1 As BIG.HighWord Dim SECONDS As Byte ; переменная для счета секунд Dim MINUTES As Byte ; для счета минут ' Dim HOUR As Byte ; для счета часов ' Dim TEMPUST[4] As Byte Dim HOURr[4] As Byte Dim MINUTESr[4] As Byte EData 5, 8, 15, 22, 0, 0, 0, 0, 19, 20, 19, 21 Clear BIG = 1000000 ' Запишем в BIG 1000000 для отсчета секундных интервалов On_Interrupt GoTo MYINT GoTo main ; Переход на начало программы MYINT: ; Обработчик прерывания big1 = big1 -1 ' отнимаем единицу из старшего байта переменной BIG1 'то же самое, что и вычесть 65536 из BIG , но занимает меньше места If BIG < 0 Then 'Если BIG < 0 то значит прошла секунда BIG = BIG + 1000000 'К этому отрицательному числу прибавляем 1000000 Inc SECONDS EndIf T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO Context Restore main: Cls TRISB = %00000000 ' Cконфигурировать вывода PORTB как выходы TRISA = %11111111 OPTION_REG = %00000111 INTCON = %10100000 For i=0 To 3 HOURr[i]=ERead i MINUTESr[i]=ERead i+4 TEMPUST[i]=ERead i+8 SetTemp = TEMPUST[1] Next i loop: If SECONDS>=60 Then ; инкрементируем время SECONDS=0 Inc MINUTES ; +минуты GoSub Sr If MINUTES=60 Then MINUTES=0 'SECONDS=0 Inc HOUR ; +ЧАСЫ If HOUR=24 Then HOUR=0 EndIf EndIf EndIf Print At 1,1,Dec2 HOUR,TEXT,Dec2 MINUTES GoTo loop Полностью проэкт http://www.picbasic.ru//publ/progrmmiruemyj_termostat/2-1-0-72 Я из Красилова!
Сообщение отредактировал
mikhail09p - Вс, 05.12.2010, 17:47
|
|
|
|
k2mozganet |
Дата: Пн, 06.12.2010, 23:04 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
23
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Всем большое спасибо за то что не оставили в беде:)))) Я вот на днях уже разобрался:))) Выкладываю прогу: @ device pic16F84, xt_osc, wdt_off, protect_off, pwrt_on DEFINE OSC 4 include "MODEDEFS.BAS" OPTION_REG = $7f On Interrupt Goto impuls INTCON = $90 trisb = %00000001 portb = 00000000 b4 var byte main: pause 200 portb.2 = 1 portb.3 = 0 pause 200 portb.2 = 0 portb.3 = 1 goto main impuls: Disable portb.4 = 1 pause 50 portb.4 = 0 pause 50 INTCON.1 = 0 Resume Enable Извините что без коментов.... исправлюсь.... просто работы маленько навалило:)))
Сообщение отредактировал
k2mozganet - Пн, 06.12.2010, 23:06
|
|
|
|
Broka |
Дата: Вт, 07.12.2010, 13:18 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
k2mozganet, Именно эта программа для чего тебе нужна? Просто для общего ознакомления с прерываниями? Если так, значит здесь всё не правильно написано. impuls: Disable ; Надо ставить непосредственно перед меткой ПРЕРЫВАНИЯ portb.4 = 1 pause 50 portb.4 = 0 pause 50 INTCON.1 = 0 Resume Enable ; Надо ставить в начале выполнения программы ( Программа до этого оператора и не доходит
Наладчик КИП и А
|
|
|
|
terrarus |
Дата: Вт, 07.12.2010, 13:56 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Вот как рекомендуют разработчики Протона писать проги с программными прерываниями: . Device 16F877 OPTION_REG = %00000111 INTCON = %00100000 Symbol LED = PortD.0 ' Enable software interrupts, and point to interrupt handler On Interrupt Goto My_Int Fin: DelayMs 1 Goto Fin Disable ' Disable interrupts in the handler My_Int: Toggle LED ' Toggle an LED when interrupted Resume ' Return to main program Enable ' Enable interrupts after the handler See also : Software Interrupts in BASIC, Disable, Resume.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
mikhail09p |
Дата: Ср, 08.12.2010, 10:25 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
, а зачем вообще нужны программные прерывания, ведь лучше использовать аппаратную обработку прерываний ? Прошу просветить.
|
|
|
|
xxxmonejall |
Дата: Пн, 03.10.2011, 00:08 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Доброго времени суток.Вот тут пытаюсь написать прогу,но столкнулся с проблемой. Не работает прерывание. Может кто чем поможет. Что я не так делаю??? @ device pic16f877a, hs_osc, wdt_off, protect_off, pwrt_on
DEFINE OSC 20 DEFINE ADC_BITS 8 DEFINE ADC_CLOCK 3 DEFINE ADC_SAMPLEUS 50 DEFINE LCD_DREG PORTD DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTD DEFINE LCD_RSBIT 2 DEFINE LCD_EREG PORTD DEFINE LCD_EBIT 3 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 ADCON1 = %00000010
OPTION_REG = %00000111 INTCON = %00100000 On Interrupt Goto myint
Czastota var byte Czastota1 var byte drosel var BYTE
TRISA = %11111111 TRISB = %00000001 TRISC = %00000000 TRISD = %00000000 TRISE = %00000000 PORTA = %00000000 PORTB = %00000000 PORTC = %00000000 PORTD = %00000000 PORTE = %00000000
Czastota1 = 0 drosel = 0
main: Czastota = 20 portb.5 = 1 ADCIN 0, drosel LCDOUT $FE,$80, DEC3 Czastota1 LCDOUT $FE,$C0, DEC3 drosel Czastota1 = 0 portb.5 = 0 GOTO main
myint: Disable pulsout portb.1, Czastota1 = Czastota + drosel Czastota = 0 INTCON.1 = 0 Resume Enable GOTO MAIN
|
|
|
|
ADMIN |
Дата: Пн, 03.10.2011, 05:56 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Прерывания надо разрешить. Если бит GIE (INTCON.7) сброшен, то все прерывания запрещены.
Нужно так: OPTION_REG = %00000111 INTCON = %10100000 On Interrupt Goto myint
|
|
|
|
xxxmonejall |
Дата: Вт, 04.10.2011, 13:07 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Большое спасибо. Разобрался. Добавлено (04.10.2011, 13.07.23) --------------------------------------------- Еще вопросик: Известно что прерывания могут быть от переполнения таймера, от порта rb0, от изменения состояние портов RB0 -RB7. Но когда происходит прерывание идет переход на нужную часть программы по команде On Interrupt Goto myint. Теперь сам вопрос, возможно ли в подпрограмме обработки прерывания узнать чем именно было вызвано прерывание. Если да то как?
|
|
|
|
ivan_fd |
Дата: Вт, 04.10.2011, 17:19 | Сообщение # 11 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Можно узнать. Каждое прерывание устанавливает флаг по какому произошло прерывание.
У Вас, например, по таймеру 0 - INTCON.1 .
|
|
|
|
HardMaster |
Дата: Ср, 02.11.2011, 23:27 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
2
Замечания:
±
На сайте с 27.10.2011
Статус:
Offline
|
По прерыванию интересная штука, пока сам разбираюсь. http://darreltaylor.com/DT_INTS-14/intro.html
|
|
|
|
retas |
Дата: Пт, 04.11.2011, 15:17 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
HardMaster! Незабудь поделиться достигнутым!!!
|
|
|
|
Uncle_Dizel |
Дата: Чт, 17.11.2011, 20:23 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
А как можно узнать на каком порту произошло прерывание???
|
|
|
|
brown |
Дата: Чт, 17.11.2011, 23:55 | Сообщение # 15 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
По установке флага - бита , обычно, в спец регистре INTCON . Предварительно, конечно, разрешаете нужное вам прерывание. Смотрите даташит на используемый МК.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|