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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: ivan_fd  
Проблемка с прерыванием...
k2mozganet Дата: Вс, 28.11.2010, 20:03  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 23
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 28.11.2010
Broka Дата: Вс, 28.11.2010, 21:30  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 253
Репутация: 9   ±
Замечания:   ±
На сайте с 30.09.2009

Статус: Offline

k2mozganet,
Кой где надо бы поставить флаги внешнего прерывания, оператор DISABLE ставить надо непосредственно перед меткой прерывания( По крайней мере так советуют в книге В.Н. Хилинский), и вот это непонятно portb.4 = 0 и сразу
portb.4 = 0 cool это что,импульс такой?

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
Репутация: 14   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 9   ±
Замечания:   ±
На сайте с 30.09.2009

Статус: Offline

k2mozganet, Именно эта программа для чего тебе нужна? Просто для общего ознакомления с прерываниями?
Если так, значит здесь всё не правильно написано.
impuls:

Disable ; Надо ставить непосредственно перед меткой ПРЕРЫВАНИЯ
portb.4 = 1
pause 50
portb.4 = 0
pause 50

INTCON.1 = 0

Resume
Enable ; Надо ставить в начале выполнения программы ( Программа до этого оператора и не доходит cool


Наладчик КИП и А
terrarus Дата: Вт, 07.12.2010, 13:56  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 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
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (terrarus)
terrarus
, а зачем вообще нужны программные прерывания, ведь лучше использовать аппаратную обработку прерываний ? Прошу просветить.
xxxmonejall Дата: Пн, 03.10.2011, 00:08  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Прерывания надо разрешить. Если бит GIE (INTCON.7) сброшен, то все прерывания запрещены.

Нужно так:
OPTION_REG = %00000111
INTCON = %10100000
On Interrupt Goto myint
xxxmonejall Дата: Вт, 04.10.2011, 13:07  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Можно узнать. Каждое прерывание устанавливает флаг по какому произошло прерывание.

У Вас, например, по таймеру 0 - INTCON.1 .
ЯНДЕКС Дата: 04.10.2011
HardMaster Дата: Ср, 02.11.2011, 23:27  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 27.10.2011

Статус: Offline

По прерыванию интересная штука, пока сам разбираюсь.
http://darreltaylor.com/DT_INTS-14/intro.html
retas Дата: Пт, 04.11.2011, 15:17  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

HardMaster!
Незабудь поделиться достигнутым!!!
Uncle_Dizel Дата: Чт, 17.11.2011, 20:23  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 40
Репутация: 2   ±
Замечания:   ±
На сайте с 09.06.2011

Статус: Offline

А как можно узнать на каком порту произошло прерывание???
brown Дата: Чт, 17.11.2011, 23:55  |                                                                                                                Сообщение # 15
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

По установке флага - бита , обычно, в спец регистре INTCON . Предварительно, конечно, разрешаете нужное вам прерывание. Смотрите даташит на используемый МК.

Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: