 | Elektrotekno.com Elektronik ve Teknoloji Merkezi
| | Yazar | Mesaj | silver__ | | Tarih: 08.03.2008, 23:34 Mesaj konusu: pıc 16f877 yardım !! | |
| arkadaşlar, bitirme ödevimde bir akıllı ev kontrolü tasarlıyorum. bunun için kontrolü 16f877 ile yapacam.
yalnız öğrenmek istediğim ve yeterli kaynak bulamadığım bir konu var.
Kesmeler..
bildiğim kadarıyla yazılmış bir alt programda (mesela güvenlik alt programı olsun) sensörden işaret gelene kadar program normal işleyişinde çalışıyor. sensörden "hırsız girdi" uyarısı gelince program çat diye kesiliyor ve bizim güvenlik alt programı çalışıyor. o tamamlandıktan sonra program kaldığı yerden devam ediyor.
(doğru mu acaba yazdığım bilen arkadaşlar anlatabilir mi doğrusunu)
hal böyle iken bir sorun ortaya çıkıyor. kesme anında eş zamanlı kontrol edilmesi gereken diğer sensörlerden gelebilecek işaretler yok mu sayılıyor. yani aynı zamanda hem "güvenlik" alt programım hem de "ısıtma" alt programım kesme yaparak devreye girebilir mi. yoksa her seferinde bir kesme mi çalışır. bu olayı nasıl sağlarım.
kesmeler nedir. ne işe yarar nasıl kullanılır.
yardımcı olana bol dua ederim :)
-----------------------------------------------------
|
|
silver__ | | Tarih: 09.03.2008, 20:45 Mesaj konusu: | |
| yok mu cevap arkadaşlar... :roll:
|
|
ertanuysal | | Tarih: 10.03.2008, 11:09 Mesaj konusu: | |
| silver__ yazmış: yok mu cevap arkadaşlar... :roll:
Konu belki arkadaşlara basit geldiği için yanıt alamamış olabilirsin.
Kesmeler ( Interrupts) bir alt programdır. Şöyle açıklayalım:
Herhangi bir mikroişlemciye program yüklediğimizde yüklediğimiz programın kodları, işlemcinin PROGRAM BELLEĞİ' ne yerleşir. İşlemci Reset' ten serbest bırakıldığında, bu program belleğindeki komutları saymaya ve icra etmeye başlar. Aslında bir bakıma işlemcilerin bu davranışı çok akıllı bir davranış şekli değildir. O an program belleğinde ne ile karşılaşırsa onu yürütmekle yükümlü bir aygıt olarak düşünebiliriz işlemcileri.
Fakat gerçek Dünya' yı göz önüne alalım. Gerçek dünyada herşeyin belirli lineer bir akışı yoktur. Arada bir belki o anki herşeyden önemli başka bir işi yapmamız gerekir. Örneğin hergün işe gidip geliyoruz. saat 18:00' da servisten inmemiz gerekiyor. O gün trafik kazası geçirirsek ne olacak? Elbetteki eve gitmeyi düşünmeyip canımızın peşinde hastaneye koşacağız. İşte bu gerçek Dünya senaryoalrını işlemci ortamında gerçekleyebilmek için kesmelere ihtiyacımız vardır.
Bu kesmelerinde bir "program belleği başlangıç adresi" ne ihtiyaç duyduğunu tahmin edebiliriz. İşte bu kesme alt programları başlangıç adresleri, işemcinin teknik .pdf' inden de görebileceğin gibi sabitlenmiştir. Örneğin 16f84 işlemcilerinin kesme adresi 0X04 olarak sabitlenmiştir. Programcı normal fonksiyon yazar gibi bir fonksiyon yazar ve yazdığı bu fonksiyona kullandığı işlemcinin "kesme fonksiyonu ile normal fonksiyonu ayırmak için" nasıl bir etiket veriyorsa o etiket ile isimlendirir ve .asm dilinde yazıyorsa, kesmenin başlangıç adresini de verir ( C' de yazarken buna ihtiyaç yoktur) ve kesmemiz için alt program yazılmış olur.
Diyelim kesmemizi Pic' in RB0 high interrupt' ına bağladık ve yukarıda anlattığım gibi bir kesme fonksiyonunu başarı ile tanımladık. Bu durumda RB0 pinini 0V' tan 5V' a her geçirdiğimizde bir interrupt tetiklemesi oluşacaktır. Bu tetikleme yazdığımız alt kesme fonksiyonuna dallanmaya neden olacak ve program kodu kesme alt programını bitirip ana programa geri dönecektir.
Kesme alt rutinine girişte ise o anki register değerlerimize dikkat etmemiz gerekiyor. Diyelimki genel bir register' ı kesme alt rutininde de kullanıyoruz. Bu durumda kesmeye girmeden önceki değerini geçici bir yerde saklamamız, kesme bitiminde bu değerleri geri almamız gerekir.
Örn :
PIC için
w = 10 olsun
kesmenin en başında
temp_w = w // diyerek register içeriğini saklayıp
kesmenin sonunda
w = temp_w // diyerek register' ın içeriğini tekrar yerine koymamız gerekir.
Bunun gibi önemli register içeriklerini özellikle asm kodu yazarken saklamamız neredeyse zorunludur.
İkinci olarak kesme alt programlarımız içerisinde geleneksel olarak uzun uzadıya kod yazmamalıyız. Kesme alt programlarında genellikle istediğimiz işe ait tanımladığımı bir bayrak ( FLAG) set edilir ve bu bayrak, ana while döngümüzde( SUPER LOOP ) kontrol edilerek istenilen kesme işinin yapılması sağlanır.
Örn:
main()
...
...
while{
....
....
if (MY_FLAG) {
//kesmede yapılmasını istediğini burada yap
MY_FLAG = 0;
}
}
}
intterupt_isr(void)
{
MY_FLAG = 1;
}
Umarım yardımcı olmuştur.
Herkese kolay gelsin
|
|
tyildizak | | Tarih: 10.03.2008, 12:38 Mesaj konusu: | |
| Sorulan tam olarak bu değil, bir görevin gerçekleştirilmesi tamamlanamadan başka bir kesme olursa ne olacak?
1. Yapılmakta olan iş bitene kadar yeni kesme kabul etmeyeceksiniz, bu durumda örneğin "hırsız girdi" sinyalini kaçırabiliriz, büyük problem!!
2.@ertanuysal'ın önerdiği şekilde yaptığımızda:
ertanuysal yazmış:
kesme alt programlarımız içerisinde geleneksel olarak uzun uzadıya kod yazmamalıyız. Kesme alt programlarında genellikle istediğimiz işe ait tanımladığımı bir bayrak ( FLAG) set edilir ve bu bayrak, ana while döngümüzde( SUPER LOOP ) kontrol edilerek istenilen kesme işinin yapılması sağlanır.
Anadöngüde bir iş yapılırken hoop! yeni kesme geldi, iş yarım kaldı. Örneğin "hırsız girdi" mesajını telefon hattıyla yollarken... Yine büyük problem!!!
Anadöngüde önemli bir işi gerçekleştirirken kesme kabul etmesek , sonuç yine 1. maddedeki gibi oluyor....
O halde ne yapmak gerekir?
Çözüm 1; Pic18 serisi işlemci kullanarak, "hırsız girdi" sinyalinin harici kesmesini "high priority" (yüksek öncelikli) olarak konfigüre edeceksiniz , bu olasılık 18 serisinde mevcut. Fakat çok sayıda eşit öncelikli kesme varsa bu da iş görmüyor.
Çözüm 2; RTOS kullanacaksınız(Real time operating system / gerçek zamanlı işletim sistemi)
Bu şekilde arka planda bir işletim sistemi çalışacak, birçok işi birarada gerçekleştirebileceksiniz:
http://tr.wikipedia.org/wiki/FreeRTOS
En güvenlisi budur, Çok sayıda kesme kaynağı bulunan sistemlerde hiçbir kesmenin atlanmayacağından, hiçbir işin yarım kalmayacağından ancak rtos kullanarak kesin emin olursunuz.
|
|
silver__ | | Tarih: 10.03.2008, 22:18 Mesaj konusu: | |
| genel verdiği bilgi için ertanuysal'a,
özelde ise tyildizak'a teşekkür ederim. aradığım cevabı buldum.
@tyildizak : hocam peki 16f serisinde yüksek öncelikli kesme diye birşey yok mu bildiğin. ben rastlamadım ama 16f877 ile işe başladım . çok ciddi bir önemi yok şu an için ama programı geliştirirken sorun çıkartabilir sanırım. önerin var mı?
|
|
tyildizak | | Tarih: 11.03.2008, 10:54 Mesaj konusu: | |
| 16f serisinde rastlamadım, araştırmak lazım. 18f serisi kullanırsanız, örneğin 18f452 olabilir, Burada interrupts konusu biraz karışık olmakla beraber başa çıkılamayacak gibi görünmüyor, datasheet'te güzelce açıklanmış. Fakat örnek derseniz, şu an için elimde yok.
|
|
arci | | Tarih: 11.03.2008, 14:16 Mesaj konusu: | |
| cevap cok basit kesme alt programına gırıldıgınde GIE=0 olur yanı dıger kesmelere izin verilmez yenı bır kesme gelemez kısacası
ARCI
|
|
silver__ | | Tarih: 11.03.2008, 22:00 Mesaj konusu: | |
| teşekkür ederim ARCI, kesme geldiğinde diğer kesmelere izin verilmediğini biliyorum. sorun da bu zaten. aynı anda iki kesme algılayabilmek istiyorum ben. yani başka bir tabirle, aynı anda iki saykıl çalıştırmak istiyorum. bu da 18f serisinde var galiba.
|
|
arci | | Tarih: 12.03.2008, 23:32 Mesaj konusu: | |
| aynı anda iki kesmeye algılatamassın, ama dspic serılerınde kesmelere oncelık(priority) verebılırsın, 2 kesme aynı anda gelırse oncelıklı olan calısır. 2 kesmenın aynı anda calısması ıcın multıtaskıng calısma yontemlerını arastır bence
|
|
tyildizak | | Tarih: 13.03.2008, 15:57 Mesaj konusu: | |
| Birden fazla işlemci kullanılabilir, büyük kolaylık olur.
|
|
|
|