PIC16F629 Не могу разобраться с прерыванием
PIC16F629 Не могу разобраться с прерыванием
Здравствуйте, я новичек, потому прошу не судить строго. Никак не могу сообразить, помогите пожалуйста. Текст проги проверен в Proteus, потому и знаю, что не работает, хотя отладчик создал HEX-файл. Вот код:
19:50 21.06.2011 LIST p=12F629
__CONFIG 0x3FD4
#include <p12f629.inc>
;Регистры общего назначения
W_Temp equ 26h
Stat_Temp equ 27h
Flag equ 21h
W equ 0
F equ 1
org 0
goto START
org 4
;Начало прерывания
INT movlw W_Temp
movwf STATUS
movwf Stat_Temp
comf Flag ;Инвертировать все биты регистра
;Конец прерывания
ENDINT
bsf INTCON,1
movf Stat_Temp,W
movwf STATUS
retfie
;Выход из прерывания
START clrf INTCON ;Запрет прерываний
bsf STATUS,5 ;Перешли в первый банк
movlw 4h ;Все на выход GP2
movwf TRISIO ;на вход
bcf OPTION_REG,6 ;Прерывание по заднему фронту
bsf INTCON,4 ;Внешнее прерывание разрешено
bsf INTCON,7 ;Глобальное разрешение прерываний
bcf STATUS,5 ;Переход в нулевой банк
btfss Flag,0 ;проверка бита
goto Loop_0 ;Если 0, идти Loop_0
Loop_1 bsf GPIO,1 ;Если 1, включить свет
goto Loop_1 ;Закольцовка, свет горит
Loop_0 bcf GPIO,1 ;Если ноль выключить свет
goto Loop_0 ;Закольцовка, свет не горит
goto START
end
19:50 21.06.2011 LIST p=12F629
__CONFIG 0x3FD4
#include <p12f629.inc>
;Регистры общего назначения
W_Temp equ 26h
Stat_Temp equ 27h
Flag equ 21h
W equ 0
F equ 1
org 0
goto START
org 4
;Начало прерывания
INT movlw W_Temp
movwf STATUS
movwf Stat_Temp
comf Flag ;Инвертировать все биты регистра
;Конец прерывания
ENDINT
bsf INTCON,1
movf Stat_Temp,W
movwf STATUS
retfie
;Выход из прерывания
START clrf INTCON ;Запрет прерываний
bsf STATUS,5 ;Перешли в первый банк
movlw 4h ;Все на выход GP2
movwf TRISIO ;на вход
bcf OPTION_REG,6 ;Прерывание по заднему фронту
bsf INTCON,4 ;Внешнее прерывание разрешено
bsf INTCON,7 ;Глобальное разрешение прерываний
bcf STATUS,5 ;Переход в нулевой банк
btfss Flag,0 ;проверка бита
goto Loop_0 ;Если 0, идти Loop_0
Loop_1 bsf GPIO,1 ;Если 1, включить свет
goto Loop_1 ;Закольцовка, свет горит
Loop_0 bcf GPIO,1 ;Если ноль выключить свет
goto Loop_0 ;Закольцовка, свет не горит
goto START
end
Последний раз редактировалось Midori Вт июн 21, 2011 19:01:15, всего редактировалось 1 раз.
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
А в чём проблема то ? Вы только и твердите - "не работает", "помогите" и т.д... А по сути ничего не сказали.
Re: PIC16F629 Не могу разобраться с прерыванием
Да, прошу прощения. Похоже, что прерывание не срабатывает. Не могу понять в чем дело, может ошибка в коде?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
По какому событию прерывание ? Не вижу ни одного обработчика событий.
С чего Вы взяли что программе не уходи в ОП ? Симптомы какие ? На чём отлаживаете ?
С чего Вы взяли что программе не уходи в ОП ? Симптомы какие ? На чём отлаживаете ?
Re: PIC16F629 Не могу разобраться с прерыванием
Прерывание от внешнего источника, приходит сигнал на GP2/INC, в данном МК 5ножка. Сигнал, короткий, 12V. В прерывании должны инвертироваться биты и при выходе в зависимости от значения нулевого бита инвертируемого регистра принимаеться решение включить или погасить свет. Задумка была такова, возможно в реализации ошибка, потому и прошу совета более опытных. Отлаживаю в MPLAB, проверяю в симуляторе Proteus.
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
Всё понятно.
На первый взгляд. Нет сброса флага внешнего прерывания в ОП (но это грозит только зависанием в ОП). Не разрешены прерывания от периферийных модулей.
Выкладывайте сюда весь проект со всеми файлами (всю папку вобщем).
На первый взгляд. Нет сброса флага внешнего прерывания в ОП (но это грозит только зависанием в ОП). Не разрешены прерывания от периферийных модулей.
Выкладывайте сюда весь проект со всеми файлами (всю папку вобщем).
Re: PIC16F629 Не могу разобраться с прерыванием
Может я вам на мейл скину, если вы не против. Адрес можите прислать сюда midori-88@mail.ru
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
А что, такая тайна ?
Сейчас напишу
Сейчас напишу
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
Код: Выделить всё
;--------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------------------------------------------
LIST p=12F629
__CONFIG 0x3FD4
#include <p12f629.inc>
;--------------------------------------------------------------------------
;Регистры общего назначения
;--------------------------------------------------------------------------
;Sec_1 equ 28h
;Sec_2 equ 22h
;Sec_3 equ 23h
;Sec_4 equ 24h
;Sec_5 equ 25h
w_temp equ 26h
s_temp equ 27h
Flag equ 21h
W equ 0
F equ 1
;--------------------------------------------------------------------------
;
;--------------------------------------------------------------------------
org 0
goto START
;--------------------------------------------------------------------------
; Обработчик прерываний
;--------------------------------------------------------------------------
org 4 ; Точка входа в ОП
INT movwf w_temp ;
swapf STATUS,W ;
movwf s_temp ;
;*********************************
bcf INTCON, INTF ; Сброс флага внешнего прерывания
bcf STATUS, RP0 ; Переход в нулевой банк
comf Flag ; Инверсия регистра флагов
bsf Flag, 1 ; Установка флага обработки события
;*********************************
ENDINT ; Выход из ОП
swapf s_temp,W ;
movwf STATUS ;
swapf w_temp,F ;
swapf w_temp,W ;
retfie
;--------------------------------------------------------------------------
; Конец ОП
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
; Начало программы
;--------------------------------------------------------------------------
START bcf STATUS, RP0 ; Переход в нулевой банк
clrf INTCON ; Запрет прерываний
clrf GPIO ; Очистка выводов МК
bsf STATUS, RP0 ; Перешли в первый банк
movlw 4h ; иним
movwf TRISIO ; Выводы МК
bcf OPTION_REG, 6 ; Прерывание по заднему фронту
bcf INTCON, INTF ; Сброс флага внешнего прерывания
bsf INTCON, INTE ; Внешнее прерывание разрешено
bsf INTCON, PEIE ; Разрешаем прерывания от периферии
bsf INTCON, GIE ; Глобальное разрешение прерываний
bcf STATUS, RP0 ; Переход в нулевой банк
clrf Flag
LOOP btfss Flag, 1 ; Ждём флага события от внешнего прерывания
goto LOOP ;
bcf Flag, 1 ; Сброс флага события
btfss Flag, 0 ; проверка бита
bcf GPIO, 1 ; Если 0 - выключить свет
btfsc Flag, 0 ; проверка бита
bsf GPIO, 1 ; Если 1 - включить свет
goto LOOP ;
end
;--------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------------------------------------------
Re: PIC16F629 Не могу разобраться с прерыванием
О-О-О!!! СПАСИБО ВАМ ОГРОМНОЕ!!! Теперь вижу свои ошибки! Да, мне еще долго учиться...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
Учиться всегда полезно, было бы желаниеMidori писал(а):Да, мне еще долго учиться...
Удачи Вам !
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: PIC16F629 Не могу разобраться с прерыванием
Этот код, который я написал, не совсем идеален. Это надо учесть.
Во первых, обработчик. В нём нужно проверять событие, вызовшее его. Т.е. проверять флаг INTE в нашем случае. Т.к. у нас одно событие, мы упустили эту проверку. Но всё таки, необходимо это делать.
Во вторых. Т.к. проверяется у нас 0-вой бит регистра флагов, инвертировать необходимо именно этот бит, а не весь регистр.
В третих. Полное зацикливание программы на 2-х строчках не есть гуд. Точнее так не делают. Необходимо проверить флаг и пропустить блок кода, обрабатывающий этот флаг.
В четвёртых. Обрабатывать кнопку по внешнему прерыванию - это, извеняюсь за выражение, маразм. Необходимо потратить очень много услий и нервов, что-бы сделать полностью работоспособным этот вариант на железе. Протеус в этом плане далеко не железо. Обычно кнопки опрашивают на изменение состояния через определённый интервал времени (например 10 мс.). Просто и без гемора
Вобщем основные моменты я уточнил. а выбор как и что делать, естественно останется за Вами.
Во первых, обработчик. В нём нужно проверять событие, вызовшее его. Т.е. проверять флаг INTE в нашем случае. Т.к. у нас одно событие, мы упустили эту проверку. Но всё таки, необходимо это делать.
Во вторых. Т.к. проверяется у нас 0-вой бит регистра флагов, инвертировать необходимо именно этот бит, а не весь регистр.
В третих. Полное зацикливание программы на 2-х строчках не есть гуд. Точнее так не делают. Необходимо проверить флаг и пропустить блок кода, обрабатывающий этот флаг.
В четвёртых. Обрабатывать кнопку по внешнему прерыванию - это, извеняюсь за выражение, маразм. Необходимо потратить очень много услий и нервов, что-бы сделать полностью работоспособным этот вариант на железе. Протеус в этом плане далеко не железо. Обычно кнопки опрашивают на изменение состояния через определённый интервал времени (например 10 мс.). Просто и без гемора
Вобщем основные моменты я уточнил. а выбор как и что делать, естественно останется за Вами.


