Страница 1 из 1
Нужна помощь по PIC (перерывания)
Добавлено: Чт сен 23, 2010 11:46:39
nppElM
Доброго время суток! Поставили задачу откорректировать программу написанную для PICа с пиками не когда не сталкивался, а сделать нужно быстро, в программе есть прерывания по входу INT, а мене бы нужно еще добавить туда прерывания по переполнению TMR0 (нужен отсчет 1 сек). С тем как проинициализировать их все понятно, а вот как к ним обратиться что то не очень, обычное есть вектора прерываний которые имеют совой приоритет, и конкретно прописаны и при срабатывании того или иного прерывания оно и происходит, а тут как???
У меня есть МК PIC16f73
Код: Выделить всё
INTCON equ 0b ; здесь поправлю это понятно
OPTIONs equ 1
org 0000
goto start
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ПРЕРЫВАНИЕ
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
org 4
int
movwf RwTmp ;|
swapf STATUS,w ;\сохранение
movwf RstaTmp ;/STATUS и W
; процедура
movwf STATUS ;/STATUS
swapf RwTmp,f ;\ и W
swapf RwTmp,w ;/
retfie
А как сюда добавить прерывания по переполнению TMR0? подскажите, пожалуйста!
Re: Нужна помощь по PIC (перерывания)
Добавлено: Чт сен 23, 2010 11:51:55
radio-kot
Смотрите ПРИМЕРЫ !!!!!!!!!!!
у PIC16 обычно один адрес (вектор) прерывания. Т.е. при всех прерываниях прога перескакивает на него. В процедуре прерывания вам надо програмно проанализировать его источник.
Re: Нужна помощь по PIC (перерывания)
Добавлено: Чт сен 23, 2010 13:37:58
driver_gv
Примерно так:
Код: Выделить всё
list p=16f73 ; list directive to define processor
#include <p16f73.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC
;***** VARIABLE DEFINITIONS * IRQ *****
w_temp EQU 0x20 ; variable used for context saving
w_temp1 EQU 0xA0 ; reserve bank1 equivalent of w_temp
status_temp EQU 0x21 ; variable used for context saving
pclath_temp EQU 0x22 ; variable used for context saving
..........................
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto START ; go to beginning of program
;**********************************************************************
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
bcf STATUS,RP0 ; ensure file register bank set to 0
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
movlw HIGH RETIRQ ;load high 8-bit address of Table
movwf PCLATH
; узнавание источника прерывания
BTFSS INTCON,INTF
GOTO IRQ_TIMER
; обработка прерывания не от таймера
BCF INTCON,INTF
..................
..................
GOTO RETIRQ
IRQ_TIMER
; обработка прерывания таймера
BCF INTCON,T0IF ; RESET FLAG TIMER
..............
..............
RETIRQ
bcf STATUS,RP0 ; ensure file register bank set to 0
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;**********************************************************************
;##########################################################
; Начало нашей программы
START
...............
Re: Нужна помощь по PIC (перерывания)
Добавлено: Чт сен 23, 2010 20:38:57
nppElM
БОЛЬШОЕ СПАСИБО!!! Все стало понятно!