interrupt hatası nerede_?

Başlatan Pros_PektuS, 07 Aralık 2002, 20:28:46

Pros_PektuS

Aşağıda yazdığım kodda derleme

sırasında herhangi bir hata ile karşılaşmamama rağmen program çalışma sırasında kesmeyi gerçekleştirmiyor.  Nerede hata

yapıyorum acaba_?
mantık:
portA'nın 1. bitinde bağlı buton basılı ise portb.1 aktif olacak.
değilse portb.6 aktif

olacak.
herhengi bir anda RA4/TOCKI ucunda bağlı butona basılırsa kesme gerçekleşip sadece portb.4 aktif olacak.
amaç

sadece kesme komutunun nasıl kullanıldığını öğrenmek. kodun extra bi özelliği yok.
kod

şöyle:

OPTION_REG=%00100101
intcon=%11110000
on interrupt GoTo

dur
TRISA=%10001
TRISB=%00000000
PORTB=0
basla:
IF PORTA.0=1 Then


PORTB=1
Else
PORTB=64
EndIF
GoTo basla
bitti:
PORTB=16
GoTo

bitti
dur:
PORTB=0
Resume bitti
End
Soz soylemek icin once duymak, dinlemek gerek. Sen de soze, dinlemek yolundan gir.                                                          Hz. MEVLANA

james

pic te 4 çeşit kesme var.
1-rb0 int ucundan harici

kesme
2-tmr0 sayıcı kesmesi
3-portb on interrupt
4-eprom write complete interrupt

senin yapmak istediğin

harici kesmeye girer.butonu ra4 e değilde portb.0 a bağlaman lazım.
ARAMIYORUM , BULUYORUM

Pros_PektuS

Orhan Altınbaşak'ın kitabında harici kesme

yada sinyal ucu olarak bu gösteriliyo.
tmr0 zamanlayıcı kesmesi için harici sinyal ucuymuş ra4
RA+/TOCKI pini harici

kesme için kullanılamazmı_?
yada şöyle soriim ra4 ile rb0 arasında kesme açısından ne fark vardır.
Soz soylemek icin once duymak, dinlemek gerek. Sen de soze, dinlemek yolundan gir.                                                          Hz. MEVLANA

bigbey

Alıntı yapılan: "Pros_PektuS"Aşağıda yazdığım kodda derleme sırasında herhangi bir hata ile karşılaşmamama

rağmen program çalışma sırasında kesmeyi gerçekleştirmiyor.  Nerede hata yapıyorum acaba_?
mantık:
portA'nın 1.

bitinde bağlı buton basılı ise portb.1 aktif olacak.
değilse portb.6 aktif olacak.
herhengi bir anda RA4/TOCKI ucunda bağlı

butona basılırsa kesme gerçekleşip sadece portb.4 aktif olacak.
amaç sadece kesme komutunun nasıl kullanıldığını öğrenmek.

kodun extra bi özelliği yok.
kod

şöyle:

OPTION_REG=%00100101
;**************
intcon=%10010000
;**************

on

interrupt GoTo dur
TRISA=%10001
TRISB=%00000000
PORTB=0
basla:
IF PORTA.0=1 Then


PORTB=1
;**************
INTCON,1=1
;**************
Else
PORTB=64
EndIF
GoTo

basla
bitti:
PORTB=16
GoTo bitti
dur:
PORTB=0
Resume

bitti
End


Sevgili Arkadaş,
İnterrupt konusunda yazdğın yazılımı inceledim.Sistem

içinde bir interrupt'un doğabilmesi için sebep gerreklidir.INTCON registerine bakıldığında istenen interrupt'ların kurulması

gerekmekte ve yapılan işleme göre Interrupt kesme isteğinin doğduğuna dair bir flag (bayrak) aktif olmalıdır ki program interrupt

vektörüne gitsin.
Senin yazılımında interrut kurulu ama istek halinde flag (I) oluşmuyor yani sen portb,0
interrup'ını

kullanıyorsun bu nedenle Intcon registerinin portb,1 bitini set edersen o an interrupt oluşur ve program count PCL interrupt

vektörüne gider.
Aşağıda program üzerinde belirttim. Sonuçtan beni bilgilendirisen sevinirim.
Ben pic Basic

kullanmıyorum. Assembly kullanıyorum..

Ayrıca senin yazdığın programda hiçbirşey değişmeden ra4'de basarken

rb0'a da logıc1 ver program interrupt üretecektir.

Mail: altinbekir@hotmail.com


   list

p=16f877
__config(_CP_OFF & _PWRTE_OFF & _XT_OSC & _WDT_OFF & _BODEN_OFF &

_LVP_OFF)

STATUS   EQU   0X03
INTCON   EQU   0X0B
TRISA   EQU   1X05
TRISB   EQU

   1X06
PORTA   EQU   0X05
PORTB   EQU   0X06


       ORG     0X000          


   GOTO   SETUP

   ORG   0X004
   BCF   INTCON,GIE
   GOTO   INT
   BSF   INTCON,

GIE   
   RETFIE

PROGRAM
   BTFSC   PORTA,1
   CALL   PORT1
   CALL   PORT2


   BTFSC   PORTA,4
   BSF   INTCON,1   ;BURADA INTERRUPT

DOĞUYOR
   GOTO   PROGRAM
PORT1
   MOVLW   B’00000010’
   MOVWF   PO

RTB
   RETURN
PORT2
   MOVLW   B’01000000’
   MOVWF   PORTB
   RETU

RN
INT
   MOVLW   B’00010000’
   MOVWF   PORTB
   GOTO   INT
SETUP


   MOVLW   0XFF
   BSF   STATUS,5
   MOVWF   TRISA
   CLRF   TRISB
   BCF   STATUS,5


   BSF   INTCON,7      ;GIE  SET
   BSF   INTCON,4      ;RB0 INTERRUPT

SET
   GOTO   PROGRAM
                    END
TA6R

james

ra4 ün kesme ile bi alakası yok.ra4 normal giriş çıkış ve

harici saat sinyal girişi(tmr0 sayıcısı için)olark kullanılabilir.
rb0 ı kesme olark kullanman içinde intcon.4=1 yapman

lazım.kesme alt programında da intcon.1=0 yapman gerekiyor.bi daha ki kesmelere olanak vermek için
ARAMIYORUM , BULUYORUM

Pros_PektuS

Sağolun arkadaşlar.
Aşağıdaki kodu yazınca oldu

ancak proteusda yaptığım denemelerde portb.4 (kesme olunca aktif olan çıkış) kısa bir süre aktif olup tekrar lojik sıfıra düşüyo.

bunun nedenini anlayamadım. kesme mantığı bunumu gerektiriyor_?
Birde kodun

başına
OPTION_REG=%00000101
ifadesini ekleyince  gene kesme olmuyo.
Baktım her bitin anlamına, bana göre

hata yok. yada varda benmi göremiyorum _!!!???


;**************
intcon=%10010000
;**************


on interrupt GoTo dur
TRISA=%00000
TRISB=%11000001
PORTB=0
basla:
PORTB.3=1


GoTo basla
Disable interrupt
dur:
PORTB.4=1
intcon.1=0
Resume
Enable

interrupt
End
Soz soylemek icin once duymak, dinlemek gerek. Sen de soze, dinlemek yolundan gir.                                                          Hz. MEVLANA

Pros_PektuS

Option_reg değerini %00001110 yapınca

oldu.
3. biti 0 (yani önbölücüyü tmr0 ) olarak ayarlayınca kesme olmuyo. 1 olarak (yani önbölücünün WDT olarak) kalması

gerekiyo.
Ve proteusda deneme yapanlar için söylüyorum; ilk 3 biti(sırası ile 2-1-0 için) lojik 100 dan düşük tutarsanız kesme

çalışıyo olmasına rağmen proteus bunu bazen görüntüleyip bazen görüntülemiyo.
Birde soru:
kesme olunca aktif olan

çıkış kısa bir süre lojik 1 olup tekrar lojik 0'a düşüyo. bunun nedenini anlayamadım. kesme mantığı bunumu gerektiriyor_? ben

kesme olduğpunda o çıkışın sürekli aktif kalmasını istiyorum. bunu nasıl yapabiliriz_?
Soz soylemek icin once duymak, dinlemek gerek. Sen de soze, dinlemek yolundan gir.                                                          Hz. MEVLANA

james

senin program sanıyorum kendi kendine reset atıyor.o da

wdt nin olaya girmesinden dolayı.aktif olan çıkışın lojik 0 a düşmesi bu yüzden .yoksa kesmenin mantığında böle bi şey

bulunmuyor.bence birde boardda dene eğer elemanların varsa
ARAMIYORUM , BULUYORUM

james

pic basic

kodları

option_reg =

$ff
intcon=%10010000
trisb=1
on interrupt goto yak
portb=0

basla :  portb.4=1
       goto

basla
       disable
       
yak: pause 10  
   portb.7=1
   intcon.1=0
   resume
   enable
   

end

assembler kodları

clrf    PORTB
                     
     

                bsf       STATUS,5
                   movlw  01h      ;portb 0 giriş diğerleri çıkış
                       movwf  

TRISB
                       movlw  0ffh
                       movwf  OPTION_REG
                  bcf   STATUS,5
         

       bcf   INTCON,1
                       bsf   INTCON,7       
                       bsf   INTCON,4        

      


   devam      bsf   PORTB,4
         goto   devam

   yak      bcf    

INTCON,1
         bsf   PORTB,7         
         retfie
end


r
kesmenin alçalan kenarda veya yükselen kenarda olması farketmez.birisi butonu aşaya itince birisi butonu bırakınca

oluşur.

programlar kesinlikle çalışıyor.

kolay gelsin
ARAMIYORUM , BULUYORUM

bigbey

Alıntı yapılan: "Pros_PektuS"Option_reg

değerini %00001110 yapınca oldu.
3. biti 0 (yani önbölücüyü tmr0 ) olarak ayarlayınca kesme olmuyo. 1 olarak (yani

önbölücünün WDT olarak) kalması gerekiyo.
Ve proteusda deneme yapanlar için söylüyorum; ilk 3 biti(sırası ile 2-1-0 için)

lojik 100 dan düşük tutarsanız kesme çalışıyo olmasına rağmen proteus bunu bazen görüntüleyip bazen görüntülemiyo.
Birde

soru:
kesme olunca aktif olan çıkış kısa bir süre lojik 1 olup tekrar lojik 0'a düşüyo. bunun nedenini anlayamadım. kesme

mantığı bunumu gerektiriyor_? ben kesme olduğpunda o çıkışın sürekli aktif kalmasını istiyorum. bunu nasıl

yapabiliriz_?

Sayın arkadaş,
interrup mantığı birinci interrupt doğduğunda ilgili interrupt

bitene kadar ardından başka bir interrupt gelmemesi gerekir.Bu nedenle interrupt vektoründe INTCON,GIE
global interrupt

disable edilir.istenen interrupt işlemi bitene kadar başka bir interrupt gelse dahi kabul edilmez.(karışıklık olmaması için.)sen RB0 dan

interrupt verdiğinde 004 adresinde interrup'ı disable etmezisen program 004 adresinde bir saykıl sonra tekrar interrupt geldi

olarak algılar ve stack' a 2 interrupt isteğini kayıt eder ve bu 4 MHz lik bir çalışmada 1 usn lik bir zamanda tekrarlanır.8 stack

hareketinden sonra stack overflow olur ve daha önceden dallandığın bir adres var ise bu adresler kaybolur bu nedenle her interrupt

gelişinden sonra başkaca bir interrupt kabul edilmez.ilk interrupt işlemi bitene kadar.

Başarılar dilerim.
Bekir

ALTIN
TA6R

baba

interrupt için ayrıntıda bir düzeltme
interrupt

oluştuğunda intcon,gie otomatik sıfırlanır ancak retfie (return-from-interrupt) komutu ,intcon'a değer atama ya da gie bayrağını

(bitini) kurma ile tekrar kurulabilir.interrupt vektor de bcf intcon,gie demeye gerek yok doğrudan interrupt rutinine

sıçrayabilirsiniz.

kolay gelsin
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

kesmez

ccs c compiler ile böyle bir problem olmaz .


yani sanırım ..
çünkü bu compiler da interrupt ın ismini yazıyorsunuz yani register

kurmuyorsunuz..
yanılıyormuyum.... :idea:
"İnned dine indallahil İslam" (2-19)

bigbey

Alıntı yapılan: "baba"interrupt için ayrıntıda bir

düzeltme
interrupt oluştuğunda intcon,gie otomatik sıfırlanır ancak retfie (return-from-interrupt) komutu ,intcon'a değer

atama ya da gie bayrağını (bitini) kurma ile tekrar kurulabilir.interrupt vektor de bcf intcon,gie demeye gerek yok doğrudan

interrupt rutinine sıçrayabilirsiniz.

kolay gelsin

Sayın arkadaş,
Yazdığınız not doğru

değildir.Interrupt registeri içinde GIE biti mutlaka kullanıcı tarafından software olarak set veye reset edilmelidir.Interrupt oluşup

program count Interrupt vektörüne gittiğinde kesinlikle GIE bitinde hardware donanımsal olarak hiçbir değişiklik olamaz.ancak

kullanıcı bir interrupt işlemi bitmeden başka bir interrupt gelmesini istemiyorsa interrupt vektörü içinde GIE bitini disable (iptal)

etmelidir. Size bir örnekle açıklama yapıyorum. Intcon,GIE ve Intcon,INTF bitleri ile
external interrupt Rb0 kullanmaya

kaltığınızda interrup oluştuğunda vektor 004 adresinde GIE yi siz kendinin Disable etmez iseniz RB0 dan gelecek olan bilgi devam

ettiği sürece interrup vektörunden proram count'un çıkmadığını görürsünüz. ve 8 defa tekrarlandığında STACK registerinde

overflow error oluşturursunuz. yani stak taşacağı için eğer daha önceden bir stack bilginiz var ise bu adresin kaybolduğunu

göreceksiniz.

Microchip'ten alıntı "Interrupt flag bits are set when an interrupt condition occurs, regardless of the

state of its correspondingenable  bit or the global enable bit, GIE (INTCON <7>). User software should ensure the appropriate

interrupt flag bits are clear prior to enabling an interrup."

Saygılarımla,
Bekir ALTIN
TA6R

baba

konuyu uzatmak için yazmıyorum ama sizin kaybınız en

fazla 1us olur (4MHz'de).nasıl isterseniz öyle olsun ben kullanmıyorum.(yığın taşması -stack overflow-da olmuyor hani)kullanıcı

tarafından (ihtiyaca göre) kurulup silinebilir  tmm ancak kesme geldiğinde otomatik

sıfırlanır.
diyor kitap...

When an interrupt is responded to, the GIE is

cleared

to disable any further interrupt, the return address

is
pushed into the stack and the PC is loaded with 0004h.
Once in the interrupt service routine the source(s) of
the

interrupt can be determined by polling the interrupt
flag bits. The interrupt flag bit(s) must be cleared in soft-ware
before

re-enabling interrupts to avoid RB0/INT
recursive interrupts.
..
...
RETFIE konusunda zaten bir sorun yok.Bu

komut GIE yi kurar.

The “return from interrupt” instruction,

RETFIE, exits
interrupt routine as well as sets the GIE

bit
, which
re-enable RB0/INT interrupts.
regardless of the status of their
corresponding mask bit

or the GIE

bit.
..
...
....


http://www.microchip.com/download/lit/pline/picmicro/families/16c62x/40300b.pdf

nsayfa 107

yanlışım varsa öğrenmeye açığım.

kolay gelsin
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

bigbey

Alıntı yapılan: "baba"konuyu uzatmak için

yazmıyorum ama sizin kaybınız en fazla 1us olur (4MHz'de).nasıl isterseniz öyle olsun ben kullanmıyorum.(yığın taşması -stack

overflow-da olmuyor hani)kullanıcı tarafından (ihtiyaca göre) kurulup silinebilir  tmm ancak kesme

geldiğinde otomatik sıfırlanır.
diyor kitap...

When an interrupt is responded

to, the GIE is cleared

to disable any further interrupt, the

return address is
pushed into the stack and the PC is loaded with 0004h.
Once in the interrupt service routine the

source(s) of
the interrupt can be determined by polling the interrupt
flag bits. The interrupt flag bit(s) must be cleared in

soft-ware
before re-enabling interrupts to avoid RB0/INT
recursive interrupts.
..
...
RETFIE konusunda

zaten bir sorun yok.Bu komut GIE yi kurar.

The “return from interrupt” instruction,

RETFIE, exits
interrupt routine as well as sets the GIE

bit
, which
re-enable RB0/INT interrupts.
regardless of the status of their
corresponding mask bit

or the GIE

bit.
..
...
....


http://www.microchip.com/download/lit/pline/picmicro/families/16c62x/40300b.pdf

nsayfa 107

yanlışım varsa öğrenmeye açığım.

kolay gelsin


DÜZELTME

VE ÖZÜR...

Sevgili arkadaş senin anlattığın konu aynen doğrudur. Ben bu güne kadar yanlış biliyormuşum.benim bir

önceki mesajımıokuyan üyelerede buradan duyurulur...

Teşekkürler,
Bekir ALTIN
TA6R