PIC16F629 Не могу разобраться с прерыванием

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

Здравствуйте, я новичек, потому прошу не судить строго. Никак не могу сообразить, помогите пожалуйста. Текст проги проверен в 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
Последний раз редактировалось Midori Вт июн 21, 2011 19:01:15, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

А в чём проблема то ? Вы только и твердите - "не работает", "помогите" и т.д... А по сути ничего не сказали.
Реклама
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

Да, прошу прощения. Похоже, что прерывание не срабатывает. Не могу понять в чем дело, может ошибка в коде?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

По какому событию прерывание ? Не вижу ни одного обработчика событий.
С чего Вы взяли что программе не уходи в ОП ? Симптомы какие ? На чём отлаживаете ?
Реклама
Эиком - электронные компоненты и радиодетали
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

Прерывание от внешнего источника, приходит сигнал на GP2/INC, в данном МК 5ножка. Сигнал, короткий, 12V. В прерывании должны инвертироваться биты и при выходе в зависимости от значения нулевого бита инвертируемого регистра принимаеться решение включить или погасить свет. Задумка была такова, возможно в реализации ошибка, потому и прошу совета более опытных. Отлаживаю в MPLAB, проверяю в симуляторе Proteus.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

Всё понятно.
На первый взгляд. Нет сброса флага внешнего прерывания в ОП (но это грозит только зависанием в ОП). Не разрешены прерывания от периферийных модулей.
Выкладывайте сюда весь проект со всеми файлами (всю папку вобщем).
Реклама
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

Может я вам на мейл скину, если вы не против. Адрес можите прислать сюда midori-88@mail.ru
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

А что, такая тайна ? :))
Сейчас напишу :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

Код: Выделить всё

;--------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------------------------------------------
            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
;--------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------------------------------------------
vkl.zip
(44.75 КБ) 166 скачиваний
Ну вот, как то так :dont_know:
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

О-О-О!!! СПАСИБО ВАМ ОГРОМНОЕ!!! Теперь вижу свои ошибки! Да, мне еще долго учиться...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

Midori писал(а):Да, мне еще долго учиться...
Учиться всегда полезно, было бы желание :)
Удачи Вам !
Midori
Родился
Сообщения: 10
Зарегистрирован: Сб фев 05, 2011 19:52:51
Откуда: Краснодар

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Midori »

Спасибо!!!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F629 Не могу разобраться с прерыванием

Сообщение Аlex »

Этот код, который я написал, не совсем идеален. Это надо учесть.
Во первых, обработчик. В нём нужно проверять событие, вызовшее его. Т.е. проверять флаг INTE в нашем случае. Т.к. у нас одно событие, мы упустили эту проверку. Но всё таки, необходимо это делать.
Во вторых. Т.к. проверяется у нас 0-вой бит регистра флагов, инвертировать необходимо именно этот бит, а не весь регистр.
В третих. Полное зацикливание программы на 2-х строчках не есть гуд. Точнее так не делают. Необходимо проверить флаг и пропустить блок кода, обрабатывающий этот флаг.
В четвёртых. Обрабатывать кнопку по внешнему прерыванию - это, извеняюсь за выражение, маразм. Необходимо потратить очень много услий и нервов, что-бы сделать полностью работоспособным этот вариант на железе. Протеус в этом плане далеко не железо. Обычно кнопки опрашивают на изменение состояния через определённый интервал времени (например 10 мс.). Просто и без гемора :)
Вобщем основные моменты я уточнил. а выбор как и что делать, естественно останется за Вами.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»