interrupt igen ,men börjat att begripa
Postat: 4 januari 2006, 15:01:01
Hej på er där ute. börjar mer och mer begripa vad man kan göra,och hur man ska gå till väga med att arbeta med interrupt. Nu har jag fått en del funderingar till. Först så kommer min kod se nedan för denna mening.
koden:
list P=18F452
#include <P18F452.INC>
CONFIG OSC=HS ; Sätt in det som stämmer överens med din miljö !!
; CONFIG isrOSCS=OFF, PWRT=ON, BOR=OFF, WDT=OFF, LVP=OFF, DEBUG=OFF
CONFIG CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
CONFIG WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
CONFIG EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;
;UDATA
;
;WREG_TEMP RES 1 ;variable in RAM for context saving
;STATUS_TEMP RES 1 ;variable in RAM for context saving
;BSR_TEMP RES 1 ;variable in RAM for context saving
;
; OVANSTÅENDE BEHÖVS INTE...
;
;
;******************Reset_start*************************************************
;Reset and interrupt vectors
code h'0000'
goto Main
ISR_hog code h'8'
goto isr_start_hog
ISR_log code h'18'
goto isr_start_log
;**************************************************************************
;***************interrupt_låg****************************************************
isr_log_code code
isr_start_log
nop
nop
nop
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
retfie
;**************interrupt_hög**************************************************************
isr_hog_code code
isr_start_hog
nop
nop
nop
nop
bcf INTCON3,INT2IF ;Clear INT2 external interrupt flag.
retfie
;***************interrupt_konfig***********************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
;init_code code
init
;****************************Konfig portB*********************************************
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
;****************************Generella Interrupts inställningar*************
bcf RCON,IPEN ;Disable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON,GIE ;Enable global interrupts.
;**************************Interrupt ingång 1(INT1)*************************
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
bcf INTCON3,INT1IP
;**************************Interrupt ingång 2(INT2)*************************
bsf INTCON2,INTEDG2 ;Interrupt on rising edge
bsf INTCON3,INT2IE ;Enables the INT2 external interrupt
bcf INTCON3,INT2IF ;Clear INT2 external interrupt flag.
bsf INTCON3,INT2IP
;***************************************************************************
return
;*********************Main********************************************
; Start of main program
Main
call init
Loop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
som ni ser så har jag två interruptingångar RB1(INT1) och RB2(INT2).INT1 är satt till låg prioteringsnivå medans prioteringsnivån på INT2 är satt till hög prioteringsnivå. Nu när jag kör programmet så hoppar programmet från huvudprogrammet och kör isr_start_hog subrutinen när jag jag trycker på RB1. det ska den inte göra utan den ska gå till isr_start_log.varför det? Sedan testar jag ändå under subrutinens gång så trycker jag på RB2(INT2) med högre prioteringsnivå än INT1. Men jag antar att programmet kör subrutinen isr_start_log tills retfie kommandot sätter GIE(Global interrupt enable) biten till ett. För att framtida intterupt ska inträffa. Så fattade jag på databladet. För interrupten ska inte kunna bli störd av en annan interrupt.
Så blev i alla fall resultatet av detta. när pic:en körde isr_start_hog så arbetade i denna subrutin tills retfie kommandot dök upp. Då tänkte jag att ok nu är INT2IF flaggan ett så efter detta kommando så kommer isr_start_hog att köras igen, men det gjorde det inte. Varför är frågan?.vad är det för mer inställing jag bör göra i mitt konfiguering inställningar sub init.
Står
mina frågor är nu föjande.
fråga 1
Vad menar dom med meningen High priority interrupt events will override any low priority interrupts that may be in progress. Dena mening fattar jag som att om interrupt med låg prio körs kan den brytas när som helst med en hög prioterad Interrupt. Så i mitt fall jag beskrev tidigare så borde programmet hoppa ur och köra den hög prioterings subrutinen(isr_start_hog). Men då får ju GIE biten ingen funktion. Den ska blocka interrupt källor när en interrupt körs.Den vill inte bli stör i en interrupt precis.
Kan någon bena ut mina funderingar och förviringar.
i data bladet står det klart och tydligt adress H8 är vector adress för hög priotering medans H18 är för låg priotering.
fråga 2
Sedan fundera jag på om jag har programmerat rätt om jag vill ha två ingångar RB1, OCH RB2 med två olika prioteringsnivåer HÖG=RB2 och låg=RB1 ingången. Sedan ska det vara en subrutin för vardera en för hög prioteringsinterrupt(isr_start_hog) sedan en för låg(isr_start_log)?
fråga 3
Funderar på kanske på att han en ingång till in på pic:en. INT 0 alltså. Denna interrupt signal ska också ha en subrutin. I mitt fall behövde jag ha tre vectro adresser H8,H18,HXX. kan man få detta eller inte?
Fråga 4
Testade att trycka på RB2(INT2) i stället för RB1 fört när den var i huvudprogrammet main. Då hände det något sludigt den gick till samma subrutin som för RB1. fattar inget.varför det?
i data bladet står det klart och tydligt adress H8 är vector adress för hög priotering medans H18 är för låg priotering.
MVH Markus Carlsson
koden:
list P=18F452
#include <P18F452.INC>
CONFIG OSC=HS ; Sätt in det som stämmer överens med din miljö !!
; CONFIG isrOSCS=OFF, PWRT=ON, BOR=OFF, WDT=OFF, LVP=OFF, DEBUG=OFF
CONFIG CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
CONFIG WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
CONFIG EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;
;UDATA
;
;WREG_TEMP RES 1 ;variable in RAM for context saving
;STATUS_TEMP RES 1 ;variable in RAM for context saving
;BSR_TEMP RES 1 ;variable in RAM for context saving
;
; OVANSTÅENDE BEHÖVS INTE...
;
;
;******************Reset_start*************************************************
;Reset and interrupt vectors
code h'0000'
goto Main
ISR_hog code h'8'
goto isr_start_hog
ISR_log code h'18'
goto isr_start_log
;**************************************************************************
;***************interrupt_låg****************************************************
isr_log_code code
isr_start_log
nop
nop
nop
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
retfie
;**************interrupt_hög**************************************************************
isr_hog_code code
isr_start_hog
nop
nop
nop
nop
bcf INTCON3,INT2IF ;Clear INT2 external interrupt flag.
retfie
;***************interrupt_konfig***********************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
;init_code code
init
;****************************Konfig portB*********************************************
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
;****************************Generella Interrupts inställningar*************
bcf RCON,IPEN ;Disable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON,GIE ;Enable global interrupts.
;**************************Interrupt ingång 1(INT1)*************************
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
bcf INTCON3,INT1IP
;**************************Interrupt ingång 2(INT2)*************************
bsf INTCON2,INTEDG2 ;Interrupt on rising edge
bsf INTCON3,INT2IE ;Enables the INT2 external interrupt
bcf INTCON3,INT2IF ;Clear INT2 external interrupt flag.
bsf INTCON3,INT2IP
;***************************************************************************
return
;*********************Main********************************************
; Start of main program
Main
call init
Loop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
som ni ser så har jag två interruptingångar RB1(INT1) och RB2(INT2).INT1 är satt till låg prioteringsnivå medans prioteringsnivån på INT2 är satt till hög prioteringsnivå. Nu när jag kör programmet så hoppar programmet från huvudprogrammet och kör isr_start_hog subrutinen när jag jag trycker på RB1. det ska den inte göra utan den ska gå till isr_start_log.varför det? Sedan testar jag ändå under subrutinens gång så trycker jag på RB2(INT2) med högre prioteringsnivå än INT1. Men jag antar att programmet kör subrutinen isr_start_log tills retfie kommandot sätter GIE(Global interrupt enable) biten till ett. För att framtida intterupt ska inträffa. Så fattade jag på databladet. För interrupten ska inte kunna bli störd av en annan interrupt.
Så blev i alla fall resultatet av detta. när pic:en körde isr_start_hog så arbetade i denna subrutin tills retfie kommandot dök upp. Då tänkte jag att ok nu är INT2IF flaggan ett så efter detta kommando så kommer isr_start_hog att köras igen, men det gjorde det inte. Varför är frågan?.vad är det för mer inställing jag bör göra i mitt konfiguering inställningar sub init.
Står
mina frågor är nu föjande.
fråga 1
Vad menar dom med meningen High priority interrupt events will override any low priority interrupts that may be in progress. Dena mening fattar jag som att om interrupt med låg prio körs kan den brytas när som helst med en hög prioterad Interrupt. Så i mitt fall jag beskrev tidigare så borde programmet hoppa ur och köra den hög prioterings subrutinen(isr_start_hog). Men då får ju GIE biten ingen funktion. Den ska blocka interrupt källor när en interrupt körs.Den vill inte bli stör i en interrupt precis.
Kan någon bena ut mina funderingar och förviringar.
i data bladet står det klart och tydligt adress H8 är vector adress för hög priotering medans H18 är för låg priotering.
fråga 2
Sedan fundera jag på om jag har programmerat rätt om jag vill ha två ingångar RB1, OCH RB2 med två olika prioteringsnivåer HÖG=RB2 och låg=RB1 ingången. Sedan ska det vara en subrutin för vardera en för hög prioteringsinterrupt(isr_start_hog) sedan en för låg(isr_start_log)?
fråga 3
Funderar på kanske på att han en ingång till in på pic:en. INT 0 alltså. Denna interrupt signal ska också ha en subrutin. I mitt fall behövde jag ha tre vectro adresser H8,H18,HXX. kan man få detta eller inte?
Fråga 4
Testade att trycka på RB2(INT2) i stället för RB1 fört när den var i huvudprogrammet main. Då hände det något sludigt den gick till samma subrutin som för RB1. fattar inget.varför det?
i data bladet står det klart och tydligt adress H8 är vector adress för hög priotering medans H18 är för låg priotering.
MVH Markus Carlsson