Ynt: PROTON DA KESME ON_INTERRUPT

Başlatan a4tech33, 20 Mart 2015, 09:03:28

a4tech33

günaydın degerli hocalarım öncelikle muhittin hocanın 2. konusu olan kesmeyi tamamiyle okudum. profosyonel olmadıgım icin pek anlayamadım benım bu konuyuda ögrenmem gerekli. yazıları okurken kendime sordugum ilk soru hangi durumlarda programın kesme etiketine dallandığı yani ne olunca her işi bırakıp verdiğimiz komutu işliyor. siz birbirinize yazılan yazıları profosyonel oldugunuz için anında anlıyorsunuz sizden bir ricam bu konuyu cok basite indirgenmiş sekilde bana (basit bir örnekle de olabilir) bana anlatırmısınız. şimdiden teşekkür ederim maxim hocama saygılar:)

mesaj birleştirme:: 21 Mart 2015, 09:24:04

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03.03.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F876
Xtal =20
On_Interrupt basla
Symbol T0IE INTCON.5
Symbol T0IF INTCON.2
Symbol GIE INTCON.7
Symbol PS0 OPTION_REG.0
Symbol PS1 OPTION_REG.1
Symbol PS2 OPTION_REG.2
'1=WDT , 0=OSCILLATOR
Symbol PSA OPTION_REG.3
'0=INTERNAL CLOCK , 1=EXTERNAL PORTA.4
Symbol T0CS OPTION_REG.5
Symbol LED PORTC.3
GoTo OVER_INTERRUPT


Declare LCD_DTPin =PORTB.4
Declare LCD_RSPin =PORTB.1
Declare LCD_ENPin =PORTB.3
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
All_Digital 1
PORTA=0
PORTB=0
Dim sny As Byte
Dim dkk As  Byte
Dim saat As Word
Cls
dkk=0
saat=0
sny=0



basla:


sny=sny+1
If sny=60 Then
sny=0
Cls
dkk=dkk+1
EndIf



If dkk=60 Then
saat=saat+1
Cls
dkk=0
EndIf
If saat=24 Then
saat=0
PORTC.3=1
DelayMS 400
PORTC.3=0
DelayMS 400
EndIf

Print At   1,10,"sny:" ,16, Dec sny
DelayMS 150
Print At   2,1,"dkk:" ,16, Dec dkk
DelayMS 150
Print At   1,1,"saat:" ,16, Dec saat
DelayMS 150
T0IF=0
Context Save

GoTo basla

OVER_INTERRUPT:
GIE=0
PSA=0
PS0=1
PS2=1
T0CS=0
TMR0=0
T0IE=1
GIE=1

INF:
Low LED
DelayMS 200
High LED
DelayMS 200
GoTo INF
End

bu programım



http://www.upload.gen.tr/d.php/www/vAtbm/Adsiz.jpg.html
buda isis cizimim
amacım saatim saat gibi işlerken bu ledi yakıp söndürmek programa zarar vermeden dondurmadan

mesaj birleştirme:: 20 Mart 2015, 10:10:28

Device = 16F876
Xtal =20
All_Digital True
   

Declare LCD_DTPin =PORTB.4
Declare LCD_RSPin =PORTB.1
Declare LCD_ENPin =PORTB.3
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
All_Digital 1
PORTA=0
PORTB=0
Dim sny As Byte
Dim dkk As  Byte
Dim saat As Word
Cls
dkk=0
saat=0
sny=0
    Dim BUTON As PORTB.0
    Dim LED As PORTC.3
    Symbol GIE = INTCON.7      'Tüm kesme işlemlerine izin verme biti INTCON                  'saklayıcısının 7. biti
    Symbol INTE = INTCON.4   'RB0/INT ucundan gelen kesmeye izin verme biti                   'INTCON saklayıcısının 4. biti
    Symbol INTF = INTCON.1    'RB0/INT harici kesme bayrağı INTCON                      'saklayıcısının 1. biti
    All_Digital 1         'bütün portlar dijital
   
     
     On Interrupt GoTo INT       'interrupt durumunda INT etiketine git   
     GIE=1            'Tüm kesme işlemlerine izin ver
     INTE=1            'RB0/INT ucundan gelen kesmeye izin ver
     High LED         'LED'i yak



basla:
Context Save


sny=sny+1
If sny=60 Then
sny=0
Cls
dkk=dkk+1
EndIf



If dkk=60 Then
saat=saat+1
Cls
dkk=0
EndIf
If saat=24 Then
saat=0
EndIf


Print At   1,10,"sny:" ,16, Dec sny
DelayMS 150
Print At   2,1,"dkk:" ,16, Dec dkk
DelayMS 150
Print At   1,1,"saat:" ,16, Dec saat
DelayMS 150
Disable
Context Restore


GoTo basla


INT:
    GIE=0            'diğer kesme işlemlerine izin verme
    INTE=0            'RB0/INT ucundan gelen kesmeyi sıfırla      
    INTF=0            'RB0/INT harici kesme bayrağını sıfırla      
    Toggle LED         'INTERRUPT GELDİĞİNDE LED'İ tersle
    INTE=1            'RB0/INT ucundan gelen kesmeye izin ver
    GIE=1             'diğer tüm kesme işlemlerine izin ver
    Resume   basla         'ana programa dön
    Enable            'diğer interruptlara izin ver
   
   
GoTo INT


UĞRAŞTIM YAPTIM:=) TESEKKUR EDERİM PORTB.0 BTNDEN KOMUT GELİNCE YAPIYORMUS SORDUGUM 1. SORUNUN CEVABINIDA BULMUS OLDUM :) GENE TESEKKUR EDERİM

Maxim

On Interrupt GoTo INT
dersen yazılım interruptı kullanmış oluyorsun (picbasic gibi)
mesela, normal döngü içerisine delayms 2000 yazarsan işlemci 2 saniye bekler, interrupt durur.

On_hardware_Interrupt GoTo INT
dersen (bunun kullanımı daha farklı)
bu gerçek intterrupttır, normal döngü içerisinde ne yaparsan yap interruptın devam eder.

a4tech33

hocam smdi sizin dediğinizi yaptm toggle led yerine hıgh led delayms 200 low led delayms200 yaptm butona basıyorum seri sekilde sayıcı duruyor butona basmayı bırakıyorum saymaya dewam ediyor

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03.03.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F876
Xtal =20
All_Digital True
   

Declare LCD_DTPin =PORTB.4
Declare LCD_RSPin =PORTB.1
Declare LCD_ENPin =PORTB.3
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
All_Digital 1
PORTA=0
PORTB=0
Dim sny As Byte
Dim dkk As  Byte
Dim saat As Word
Cls
dkk=0
saat=0
sny=0
    Dim BUTON As PORTB.0
    Dim LED As PORTC.3
    Symbol GIE = INTCON.7      'Tüm kesme işlemlerine izin verme biti INTCON                  'saklayıcısının 7. biti
    Symbol INTE = INTCON.4   'RB0/INT ucundan gelen kesmeye izin verme biti                   'INTCON saklayıcısının 4. biti
    Symbol INTF = INTCON.1    'RB0/INT harici kesme bayrağı INTCON                      'saklayıcısının 1. biti
    All_Digital 1         'bütün portlar dijital
   
     
   On_Hardware_Interrupt GoTo INT       'interrupt durumunda INT etiketine git   
     GIE=1            'Tüm kesme işlemlerine izin ver
     INTE=1            'RB0/INT ucundan gelen kesmeye izin ver
     High LED         'LED'i yak



basla:
Context Save


sny=sny+1
If sny=60 Then
sny=0
Cls
dkk=dkk+1
EndIf



If dkk=60 Then
saat=saat+1
Cls
dkk=0
EndIf
If saat=24 Then
saat=0
EndIf


Print At   1,10,"sny:" ,16, Dec sny
DelayMS 150
Print At   2,1,"dkk:" ,16, Dec dkk
DelayMS 150
Print At   1,1,"saat:" ,16, Dec saat
DelayMS 150
Disable
Context Restore


GoTo basla


INT:
    GIE=0            'diğer kesme işlemlerine izin verme
    INTE=0            'RB0/INT ucundan gelen kesmeyi sıfırla      
    INTF=0            'RB0/INT harici kesme bayrağını sıfırla      
    High LED
    DelayMS 200
    Low LED
    DelayMS 200           'INTERRUPT GELDİĞİNDE LED'İ tersle
    INTE=1            'RB0/INT ucundan gelen kesmeye izin ver
    GIE=1             'diğer tüm kesme işlemlerine izin ver
    GoTo   basla         'ana programa dön
    Enable            'diğer interruptlara izin ver
   
   
GoTo INT



bu sekilde yaptm

rb0a bir buton baglı bastıgımda kesmeye gidiyor kesme olunca sayma kısmı duruyor neden olabilir??

ferit06

Proton IDE nin help menüsünde Proton Manual var oradan INterrupt ları incele...

senin yazdığın program kurallar uygun değil

Maxim

ben programdan pek bişey anlamadım
öncelikle interrupt içerisinde bekleme yani delayms komutu kullanılmaz
timer kurmak lazım

led yakıp sönmeyi normal loopa almak lazım
yani basla etiketinin altına

F.T

proton donanımsal interrupter inde genelde takılma oluyor .girdimi çıkmıyor gibi durumlar oluyor.acaba takılma yaşamayanlar nasıl yapıyor bu işi neye dikkat etmek lazım.bu işin püf noktası nedir.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

t2

#6
interrupt içinde iş yapilirken ilgili bayrak sifirlanir. O iş bitene kadar aynı  interrupt tekrar oluşmasın diye önlem alınır.

Veya hepsi beraber kapatılır açılır.
Global interrupt  disable..  enable ..

Takılma oluyor girdi mi çıkmıyorsa, bu durum, programı yapan kişinin becerisini gösterir.

F.T

dediklerinin hepsini yapıyorum.ama bu tip sorunlarla karşılaşıyom.baya becerikliyim demekki. :)
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

t2

Global int.disable yapınca,
interrupt tekrar nasıl oluşuyor?

mufitsozen

Alıntı yapılan: t2 - 21 Mart 2015, 08:58:35
Global int.disable yapınca,
interrupt tekrar nasıl oluşuyor?

Onu anlamak icin bu islerde tekamul edip,  becerinin tavan yapmasi lazim!  :P :P :D
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

ferit06

Alıntı yapılan: F.T - 21 Mart 2015, 00:51:20
dediklerinin hepsini yapıyorum.ama bu tip sorunlarla karşılaşıyom.baya becerikliyim demekki. :)

Kullandığınız işlemci hangisi? Automatic Context Saving özelliği olan bir işlemci mi? Eğer öyle ise  kesme alt programını ana programdan önceye yazıyorsunuz ve context save  yapmıyorsunuz çıkışta ise retfie kullanıyorsunuz.

Aksi takdirde mükerrer context save nedeniyle kesme programından çıkışta doğru adrese yönlenemiyorsunuz.

canbulut

#11
arkadaslar bende interrupta girmiyor. ,
Int kesmesini düzgün şekilde kullanamıyorum.Ana rutinde mesela 5sn'lik bekleme yapıyorsam 5 sn'nin içinde diyelim ki 2.75 saniye anında kesme geliyorsa onu yapmıyor. Flagi tutuyor. 5.SN'den sonra kesme rutinine giriyor. Benim istediğim şey bu değil. Kesme DelayMS 5000 anında işliyorken kaçta olursa olsun kesmeye girebilsin oradaki işleri yapabilsin.Proton+'dada aynı sorun varmı? Kullandığım Proton IDE lite

Programım şu şekilde

BASLA:
PAUSE 5000
TOGGLE LED1
GOTO BASLA
;
DISABLE
KESME:
TOGGLE LED2
INTCON.1=0
RESUME
ENABLE

Maxim

bu bir sorun değil çünkü sizin yazmaya çalıştığınız kod picbasic yazılımsal kesme
hatta kodunuz eksik sanırım.

protonda 2 tip kesme var
software ve hardware

On Interrupt Goto KESME dersen yazılım interrupt oluyor
On_Hardware_Interrupt Goto KESME dersen donanım interrupt oluyor

hardware interrupt yapısına protonun help dosyasından bakın istediğiniz orada
yani 5 saniye bekleme yaparken arkada kesme devamlı çalışsın.

canbulut

#13
teşekkürler hocam