Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

interrupt

Başlatan teknikelektronikci, 15 Mart 2006, 17:00:23

teknikelektronikci

sayın arkadaşlar ve üstadlar bi şifreli hırsız alarm devresi projesinde bir hatam oldu ve bu hatayı donanımsal olarak düzeltmem zor bunu yazılımsal olarak düzeltebilirmiyim acaba yrd için şimdiden teşekürler

problem şu:  pic 16f628a kullanıyorum ve basic pro kullandığım dil.

devrede ben rb1 e bağlayacağım yolu kalkımışım int/rb0 a ,int/rb0 a bağlayacağım yolu rb1 e bağlamışım rb0 da interrupt olarak kullanılıyor bu problemni yazılımsal olarak düzeltebilirmiyim programı ben yazmadım zaten o kadar bilgim yok basic de (daha yeni öğreniyom ) yrd olursanız sevinirim teşekürler
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

seco06

Olmaz dostum.İlkönce interrupt olayını öğrenmen gerekli , neden olmadığını kolay bi şekilde anlayacaksın.Birde hangi dili kulanırsan kullan pic te bulunan yazmaçları kullanmak aynı şekilde olur.şimdi gelelim neden olmayacağına:
1-RB0/INT KESMESİ:
En çok kullanılanlardan birisi PortB.0 pininde meydana gelen lojik seviye değişikliğinin oluşturacağı kesme dir. Option Yazmaçının 6. biti önceden ayarlanarak kesmenin sıfırdan – bir konumuna geçişte mi yoksa bir konumundan – sıfır konumuna geçişte mi oluşturulacağı belirlenir.
OPTION_REG.6=0 olur ise RB0 da düşen kenarda kesme oluşur.
OPTION_REG.6=1 olur ise RB0 da yükselen kenarda kesme oluşur.
Düşen veya yükselen kenar terimi bir clock palsının kenar şekli olarak anlaşılmalıdır.

Kesme işleminin aktif edilebilmesi için INTCON (interrupt control registeri) yazmaçı kullanılır.
Örneğin RB0 kesmesinin aktif hale getirilebilmesi için;
INTCON.4=1 yapılmalı ve daha sonra ;
INTCON.7=1 değeri 7 nolu bite verilerek tüm kesmeler açılmalıdır.
Bu iki değer tek bir komutlada verilebilir. Şöyle,
INTCON=%10010000

Bu kesme aktif hale getirildikten sonra şayet bir kesme oluşur ise INTCON yazmaçı nın 1 nolu biti  0 konumundan 1 konumuna geçer. Bu bit şayet tekrar 0 konumuna program içinde getirilmez ise yeniden bir kesme oluşmaz. Bu nedenle programın KESME bölümünde bu bit sıfırlanmalıdır.

RB0/INT Kesme kullanımını toparlamak gerekir ise;

RB0/INT kesmesini kullanmak için yapılması gerekenler sırası ile;

-   Programın baş kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştuğunda programın gideceği yer (KESME) belirlenir.
-   RB0 pini giriş olarak ayarlanacak
-   Gerekir ise Option Yazmaçının 7. biti 1 veya 0 yapılarak pullup dirençleri isteğe göre ayarlanacak.
-   Option Yazmaçının 6 biti 1 veya 0 olarak ayarlanarak kesmenin düşen kenar veya yükselen kenardamı olacağına karar verilecek.
-   Intcon yazmaçına   INTCON=%10010000  değeri verilerek kesme aktif hale getirilecek.
-   Kesme bölümüne başlarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.
-   Kesme bölümünde INTCON.1=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.
-   Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi sağlanır.
-   En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir.

2-PORTB (RB4-RB7)  DEĞİŞİKLİK KESMESİ :
Bu kesme tipinde RB4-RB7 bacaklarının mevcut konumlarında oluşacak bir değişiklik sonucunda da kesme oluşturulmaktadır. Bu kesme PORTB nin RB4-RB7 arası bacaklarının tamamının giriş yapılması halinde geçerlidir. Bacaklardan birisi çıkış yapılır ise kesme iptal olur.
Kesme bir kere aktif hale getirilir ise bu 4 adet bacak değeri sürekli pic tarafından okunur. Okunan değer bir önceki ile karşılaştırılır. Şayet fark var ise kesme oluşur.
Kesme de oluşan RBIF bayrağının silinmesi için PortB nin bir kere programcı tarafından mutlaka okutulması gerekir. Aksi taktirde bayrak silinemez ve sürekli kesme oluşur. Tabiiki yalnızca PortB nin okunması bayrağı silmeye yetmeyecektir. Ayrıca RBIF bayrağının kesme bölümünde silinmesi de gerekir.

RB PORT (Rb4-Rb7)  Değişiklik Kesmesinin Oluşması İçin Gerekenler :

Programın baş kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştuğunda programın gideceği yer (KESME) belirlenir.
-   RB4-RB7 pinleri mutlaka giriş olarak ayarlanacak
-   Intcon yazmaçının 3 biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme aktif edilir.   INTCON=%10001000   değeri verilerek kesme aktif hale getirilecek.
-   Kesme bölümüne başlarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.
-   Kesme Bölümünde DURUM=PORTB şeklinde port değeri okunacak
-   Kesme bölümünde INTCON.0=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.
-   Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi sağlanır.
En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir

3-TMR0 KESMESİ :
Ram belleğin 01 adresinde bulunan özel bir yazmaçdır.  Genellikle adı üstünde zamanlayıcı   olarak kullanılır. 8 bitlik bir sayıcıdır. Yazılabilir okunabilir. Programlanabilen bir özel bölücüsü (prescaler) vardır. Harici veya dahili clock palsları ile sayım yapabilir. Sayma yönü daima artan yöndedir.
Bu sayıcı veya zamanlayıcı 255 değerini aştığı zaman değeri tekrar sıfır olur ve bu anda bir kesme oluşturulabilir.  Bu sayıcının diğer önemli bir özelliği ise arka planda yani ana programdan bağımsız çalışmasıdır. Ana program çalışırken veya kesme oluştuğu andan itibaren saymasına devam eder.

OPTION Yazmacının ilk üç biti frekans bölme (prescaler) ayarlaması için kullanılır. Bu üç bitin aldığı değerlere göre bölücünün aldığı değerler aşağıda gösterilmiştir. Bu bölücü aynı zamanda WDT içinde kullanıldığından tabloda WDT için bölücü değerleride gösterilmiştir.


Bitler   TMR0   WDT
000   1/2   1/1
001   1/4   1/2
010   1/8   1/4
011   1/16   1/8
100   1/32   1/16
101   1/64   1/32
110   1/128   1/64
111   1/256   1/128

Tablodan da anlaşılacağı üzere  sinyal kaynağından gelen palsların TM0 sayıcısını 1/1 yani direkt saydıracağı bir konum mevcut değildir. Özellikle dışarıdan bir sinyal kaynağından gelen palsların sayılmasında lazım olacak olan bu husus için OPTION yazmacının 3. biti 1 (bir) yapılarak frekans bölme işlemi WDT için yapılır. Bu bir nevi aldatmadır. Bölme WDT için yapılınca Frekans bölücü TM0 için Bay-Pass edilmiş yani atlanmış olur. Dolayısıyla gelen sinyaller 1/1 olarak Timer0 tarafından sayılır.

TM0 sayısının kullanılması için bazı parametrelerin önceden ayarlanması gerekiyor. Bunlar sırası ile;
1.   Sayıcının sayabilmesi için gerekli olan clock sinyalinin kaynağı ne olacaktır?. Bu kaynak dahili osilatör olabileceği gibi standart olarak PortA.4 /TOCKI bacağı kullanılarak dışarıdan bir sinyal kaynağı ile beslenebilir. Bu seçim OPTION yazmacının 5. biti olan TOCS biti ile yapılır.
TOCS biti = 0 ise sinyal kaynağı dahili osilatör dür.
TOCS biti = 1 ise sinyal kaynağı PortA.4 pinin den giren harici sinyal kaynağıdır.

2.   Harici sinyal kaynağı seçilir ise, sayacın düşen kenarda mı yoksa yükselen kenarda mı sayma işini yapacağı OPTION yazmacının 4. biti olan TOSE biti ile ayarlanır.
TOSE Biti = 0 ise düşen kenarda sayma
TOSE Biti = 1 ise Yükselen kenarda sayma yapılır.

3.   Frekans bölme işlemi TMR0 için mi yoksa WDT için mi geçerli olacaktır? Bunu seçmek için OPTION yazmacının 3. biti olan PSA biti kullanılır.
PSA Biti = 0 ise Frekans Bölme TMR0 için geçerli,
PSA Biti = 1 ise Frekans Bölme WDT için geçerli olur.

4.   Son olarak da Frekans bölme kullanılacak ise değeri ayarlanır. Bunun içinde OPTION yazmacının ilk 3 bitinin kullanıldığını söylemiştik. Tabloda verdiğimiz değerlerden biri seçilerek OPTION yazmacına yazılır.

5.   Programın baş kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştuğunda programın gideceği yer (KESME) belirlenir.

6.   INTCON yazmacının 5. biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme aktif edilir.  

7.   Kesme bölümüne başlarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.

8.   Kesme bölümünde INTCON.2=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.

9.   Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi sağlanır.

10.   En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir.

seco06

Senin alarm devrende (daha doğrusu birçok alarm devrelerinde olduğu gibi) picin dış olaylarda ani bir değişimi hissedip ona göre picin içinde bir alt programa dallanması gerekli.Böylece alarmı ve ya herhangi birşeyi olumsuz bir olayda aktif edecek ve de hırsız veya istenmeyen bir olayı (yangın , herhangi bir şeyin kırılması vb.) sana haber verecek.Bu yüzden picte bu interrup olayını (hangi dili kullanırsan kullan) öğrenmelisin.bir çok alanda bu yazmaç kullanılır.Saat yaparken bunu mutlaka kullanırsın.Başarılar 8)

teknikelektronikci

yavvvv üstaddd elerine sağlık bilgine sağlık birde ilgine sağlık toparlarsam çok teşekür ederim böyle bilgiyi başka yerde bulmam herhalde zor olur.... tekrar teşekürler kolay gelsinn
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

stlg

Sevgili teknikelektronikci
Arkadasım bir alarm uygulamasında kesmeyi kullanmak cokda onemli değil zaten hantal olan algılayıcıları pinleri sıra ile kontrol ederek algılayabilirsin ve bu şekilde algılayıcıları ayrı ayrı pinlere girerek kontrol edebilirsin eger kesme kullanırsan bu algılayıcılardan ayrı ayrı bir devre uzerinden kesme olusturmalısın ki bence bu gereksiz yani senin uygulamanda programa mudahale edebilirsen bu iki pini yer degiştirebilirsin kolay gelsin

          ALLAHA EMANET OLUNUZ
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

teknikelektronikci

cevabınız için teşeküğrler sayın stlg
ben şimdi şaşırdım kaldım acaba ne yapsam diye ama inşallah dediğniz gibi olur bende devreme müdahale etmem teşekürler kolay gelsin
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

seco06

Tabiki herşeyi yapabilirsin.Pic hayal dünyanla bütünleştimi herşey olur.Senin sorun interrup ile ilgili idi.Portları değiştirmen için (Bir önceki arkadaşın önerisi) hardware olarak ta devreni değiştirmelisin.Birde şu varki kesme de kendine göre avantaj sağlar.Şöyleki , eğer bir işin çok ani vede hızlı olmasını istiyorsan kullanmanı tavsiye ederim.Eğer çok da önemli değilse kullanmasan da olur.Tabiki devreni incelemk gerekir uygun çözümü bulmak için.Başarılar 8)

vatandas30

arkadaşlar kesmeyle ilgili benim de sorum olacak.
klavye kontrollü bir kayan yazı yaptım. kesme kullanmadım. klavyeyi algılaması geç oluyor tabii ki. burada RB0 kesmesini kullanmak istiyorum. klavyenin herhangi bir tuşuna basıldığında hemen kesme alt programına gidecek. ama burada klavyeden ne kadar karakter tuşlanırsa tuşlansın enter tuşunun kodu gelinceye kadar çıkmayacak ve enter tuşunun kodu geldiğinde de ana programa dallanacak. bu yapılabilir mi?

stlg

Sevgili vatandas30
Arkadasım tabi yapılabilir bu kesme oluştugunda global kesmeyi kapatırsın ve işlemlerin bitinceye kadar burada kalır işlemlerin bitince global kesmeyi aktifleştirip yeniden eski programına donusturebilirsin yada her tusa bastıgında kesme oluşur, enter  tuşu ilede işlemleri bitirebilirsin tuşlarla kesme oluşturmak senin yazma hızından fazla olacagı icin tuş bilgilerini kacırmak diye birşey soz konusu değil kolay gelsin
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

vatandas30

@stlg
cevabın için teşekkür ederim.
aslında burada sormak istediğim birşey daha var. kesme alt programına dallandığında illa ki resume ile mi devam etmesi lazım. yani kesme alt programının sonuna resume komutunu koymak zorunda mıyız. çünkü ben kesmeden sonra işlemlerim bitince kaldığı yerden devam etmesini istemiyorum. bir de karakterleri picin epromuna kayıt ediyorum. ana programda da buradan okutuyorum. programıma bu kesme kısmını dahil edince çalışmadı. yazma ve okumada da kesme oluşuyor mu. eğer oluşuyorsa bunları "disable " ile mi kapatmam lazım.

vatandas30

[code]
ADCON1=7
option_reg=%00000000
INTCON=%10010000          'RB0 KESMESİ AKTİF
ON INTERRUPT GOTO program   'kesme olunca program etiketine git
DATAPIN1 VAR PORTA.0
CLOCKPIN1 VAR PORTA.1
TRISA=%00111111
TRISB=%11111111
TRISC=%00000000
.
.
.
'*******klavye okuma bölümü****************
disable
program:
    gosub klavye_oku
.
.
.
.
.
if kr=255 or rx_byte=$5A then '256 karakter oldu mu-entere basıldı mı
write 0, kr
pause 10
kr=0
read 0, uz
pause 10                  
INTCON.1=0
goto start      'ana programa git
endif
goto program
resume  
enable

vatandas30

ADCON1=7
option_reg=%00000000
INTCON=%10010000          'RB0 KESMESİ AKTİF
ON INTERRUPT GOTO program   'kesme olunca program etiketine git
DATAPIN1 VAR PORTA.0 
CLOCKPIN1 VAR PORTA.1
TRISA=%00111111 
TRISB=%11111111
TRISC=%00000000
.
.
.
'*******klavye okuma bölümü****************
disable
program:
     gosub klavye_oku 
.
.
.
.
.
if kr=255 or rx_byte=$5A then '256 karakter oldu mu-entere basıldı mı
write 0, kr
pause 10
kr=0
read 0, uz
pause 10                   
INTCON.1=0
goto start      'ana programa git
endif 
goto program
resume   
enable


arkadaşlar kullandığım işlemci 16f877. RB0 kesmesini kullanmak istiyorum. programın ilgili bölümü yukarıdaki gibi. ama çalışmıyor. hatamı bulamadım. yardımlarınızı bekliyorum. (yanlışlıkla iki defa göndermişim, kusura bakmayın)

vatandas30

16f877 de RB0 kesmesi yok mu yoksa. program kesmesiz çok güzel çalışıyor. kesme işini dahil ettiğimde hiç çalışmıyor.