INT0 ve TMR0 için hangi interrupt komutlarını kullanmalıyım ?

Başlatan pcb, 10 Ekim 2010, 16:17:03

pcb

Merhaba arkadaşlar,

18F serisi bir işlemci kullanıyorum, INT0(dış kesme) ve TMR0(timer0) interruptlarını bir arada kullanmak istiyorum, interruptların çalışmalarında problem yok, sadece interrupt oluştuğunda INT0 veya TMR0 hangi komut satırına gitmesi gerektiği karışması sorunu var.

İstisnasız INT0 ve TMR0 kullanıldığında INT0 önceliklidir yazıyor manuel de. Yinede TMR0 düşük öncelikli olarak belirtiyorum.
Symbol TMR0IP = INTCON2.2   ' TMR0 Overflow Interrupt Priority bit
TMR0IP=0

INT0 için belirtecek bişey yok zaten high priorty.
TMR0 için On_Low_Interrupt Goto DENE_1 olarak belirtiyorum gideceği adresi ayrıca 18F serisi için Low_Int_Sub_Start ve Low_Int_Sub_End arasına kod u yerleştiriyorum ama yine de TMR0 On_Hardware_Interrupt GoTo DENE_2 komutunu çalıştırıyor.
INT0 ve TMR0 için hangi interrupt komutlarını kullanmalıyım ?
Tecrübesi olan arkadaşların yardımını bekliyorum.
       

T0CON=%11000111 
INTCON=%11110000
INTEDG0=0
TMR0IP=0

 On_Hardware_Interrupt GoTo DENE_2
 On_Low_Interrupt   GoTo    DENE_1
 
GoTo    BASLA
'************TMR0 KESMESI*************************
Low_Int_Sub_Start
DENE_1:
Toggle  PORTB.3

TMR0IF =   0   'TIMER 0 BAYRAGI

Resume
Context Restore
Low_Int_Sub_End

'************INT0 KESMESI*************************
High_Int_Sub_Start
DENE_2: 
 Toggle  PORTB.4

 INT0IF =   0   'DIŞ KESME BAYRAĞI
 
 Resume
 Context Restore
 High_Int_Sub_End
'*************************************************
 
BASLA:
DelayMS 300
Toggle  PORTB.2
GoTo    BASLA

muhittin_kaplan


pcb


muhittin_kaplan

#3
Alıntı Yap' This program uses TIMER1 and TIMER3 to demonstrate the use of interrupt priority. 
' TIMER1 is configured for high-priority interrupts and TIMER3 is configured for low-priority interrupts. 
' By writing to the PORTD LEDS, it is shown that a high-priority interrupts override low-priority interrupts.

' Connect three LEDs to PORTD pins 0,1, and 7
' LEDs 0, 7 flash in the background using interrupts, while the LED connected to PORTD.1
' Flashes slowly in the foreground

' Note the use of assembler commands without the ASM-ENDASM directives
 
DEVICE = 18F452
XTAL = 4
       
SYMBOL TIMER1 = TMR1L.WORD     ' Create a WORD variable from two hardware registers
SYMBOL TIMER3 = TMR3L.WORD     ' Create a WORD variable from two hardware registers

SYMBOL IPEN = RCON.7
SYMBOL TMR1IP = IPR1.0   
SYMBOL TMR3IP = IPR2.1 
SYMBOL TMR1IF = PIR1.0 
SYMBOL TMR3IF = PIR2.1 
SYMBOL TMR1IE = PIE1.0 
SYMBOL TMR3IE = PIE2.1 
SYMBOL GIEH = INTCON.7   
SYMBOL GIEL = INTCON.6       
SYMBOL TMR1ON = T1CON.0
SYMBOL TMR3ON = T3CON.0
       
' Declare interrupt Vectors

ON_INTERRUPT GOTO TMR1_ISR     ' Point to the HIGH priority interrupt subroutine   
ON_LOW_INTERRUPT GOTO TMR3_ISR ' Point to the LOW priority interrupt subroutine

GOTO OVER_INTERRUPTS           ' Jump over the interrupt subroutines       
'---------------------------------------------------------------------------
' HIGH PRIORITY INTERRUPT
TMR1_ISR:                     
CLEAR TMR1IF                   ' Clear the Timer1 interrupt flag.
CLEAR PORTD.0                  ' Turn off PORTD.0 to indicate high priority interrupt has overridden low priority.
SET PORTD.7                    ' Turn on PORTD.7 to indicate high priority interrupt is occurring.
BTFSS TMR1IF                   ' Poll TMR11 interrupt flag to wait for another TMR1 overflow.
BRA $ - 2 
CLEAR TMR1IF                   ' Clear the Timer1 interrupt flag again.
CLEAR PORTD.7                  ' Turn off PORTD.7 to indicate the high-priority ISR is over.
RETFIE FAST
'---------------------------------------------------------------------------
' LOW PRIORITY INTERRUPT
TMR3_ISR: 
CLEAR TMR3IF                   ' Clear the TMR3 interrupt flag.
TIMER3 = $F000                 ' Load TMR3 with the value $F000
SET PORTD.0                    ' Turn on PORTD.0 to indicate low priority interrupt is occurring.
BTFSS TMR3IF                   ' Poll TMR3 interrupt flag to wait for another TMR3 overflow.
BRA $ - 2
TIMER3 = $F000                 ' Load TMR3 with the value $F000 again.
CLEAR TMR3IF                   ' Clear the Timer3 interrupt flag again.
CLEAR PORTD.0                  ' Turn off PORTD.0. to indicate the low-priority ISR is over.     
RETFIE 
'---------------------------------------------------------------------------
' MAIN PROGRAM STARTS HERE
OVER_INTERRUPTS:
LOW PORTD                      ' Setup PORTD for outputs

'Set up priority interrupts.
IPEN = 1                       ' Enable priority interrupts.
TMR1IP = 1                     ' Set Timer1 as a high priority interrupt source
TMR3IP = 0                     ' Set Timer3 as a low priority interrupt source
TMR1IF = 0                     ' Clear the Timer1 interrupt flag
TMR3IF = 0                     ' Clear the Timer3 interrupt flag
TMR1IE = 1                     ' Enable Timer1 interrupts
TMR3IE = 1                     ' Enable Timer3 interrupts
GIEH = 1                       ' Set the global interrupt enable bits
GIEL = 1
 
'TIMER1 setup
T1CON = 0
TIMER1 = 0                     ' Clear TIMER 1
TMR1ON = 1                     ' Turn on Timer1
   
'TIMER3 setup
T3CON = 0
TIMER3 = $F000                 ' Write $F000 to Timer3
TMR3ON = 1                     ' Turn on Timer3
   
' Flash the LED on PORTB.1
WHILE 1 = 1
HIGH PORTD.1   
DELAYMS 300
LOW PORTD.1
DELAYMS 300
WEND
help den örnek
dikkat ettiyseniz aynı tipte iki kesme..

pcb

manuel de görmüşdüm bunu, assembler bilmediğim için denemedim, ayarları INT0-TMR0 ile değiştirsem çalışır mı denicem tekrar bilgi veririm.
İlginiz için teşekkürler.

BTFSS TMR3IF                   ' Poll TMR3 interrupt flag to wait for another TMR3 overflow. ASM
BRA $



muhittin_kaplan


pcb

Kullanılan interruptlar da her ne kadar kesme önceliği belirtiliyorsa da yinede RCON register da ki
IPEN set edilerek kurduğumuz interrupt önceliklerini aktif etmek gerekiyormuş.
Yukarıdaki programa RCON ilave edildiğinde program doğru çalıştı.

Symbol IPEN = RCON.7    ' Interrupt Priority Enable bit
IPEN    =   1

Yardımı olan herkese teşekkürler