kesme programı ile geckme nsl?

Başlatan savas1980, 25 Temmuz 2006, 09:38:11

savas1980

selam arkadaşlar elimde 16F628A ile yapılmıs bir devre var pici programladım fakat takıldıgım biyer var.  pic in MCLR sine bastıgım zaman giris ve cıkıslar aynen kalıcak ve yaklasık 3 dakika beklemeye alcak fakat yani bir hareket oldugu zaman 3 dakikayı beklemeden yeniden devreye giricek. Bunu ben donguyle yaptım fakat busefer dısardan bir giris oldugu zaman bile devre tepki vermiyor..Picin dahili osc sini kullanıyorum bu istedigimi kesme kullanarak nsl gerceklestirebilirim yardıncı olrsanız cok sevinirim.

z

İki kişi konuşurken üçüncü kişiye ..ok yemek düşer derler ya.  Interrup felsefesinde bu biraz farklıdır.

İki kişi konuşurken (İşlemci ve muhatabı (*)), üçüncü bir kişi araya girerek pardon dediğinde (int ürettiğinde) , eğer konuşmayı yürüten (işlemci) bu tür pardonlara izin vermişse (int enable) konuşmasına hemen ara verip yan odaya geçer (int servis rutini) en son konuşmalarını unutmamak için bir kağıda kısa notlar düşer (context saving)  buyurun diyerek 3 kişiyinin derdini dinler (int flag'ına bakar) ve konu öncelikli bir konu ise 3 kişinin derhal işini (interrupt kodlarını işletir) yapar. İş bitiminde daha önce son konuşmasında kaldığı yeri unutmamak üzere not aldığı kağıdı okur ve eski odasına geri döner. (Eski odası ana programı koşturduğu oda)

3.kişinin pardon demesi ile yan odaya geçiş zamanı işlemcinin reaksiyon zamanını belirler.

Şimdi gelelim senin projende bu iş nasıl olacak.

Timerı örneğin her 1ms de taşacak şekilde kuracaksın. Yani Timer Counter içine öyle bir sayı yükleyeceksin ki Timer, kendine gelen clk frekansında sayarken 1 ms sonra FF den 0'a dönecek. İşte bu anda int üretilecek.

Başlangıçta (reset sonrası yada int üretimine (pardonlara izin verme) ihtiyaç duyulan noktada)  int üreten mekanizmayı aktif hale getireceksin. (Timer int enable.) Pardonlara izin vermek istemediğin konuşmalarda da int enable durumunu yasaklıyacaksın. Bunların her biri PIC registerlerinde flaglarla tanımlanır.

Her 1 ms de int geldikçe hemen timer counter'a 1 ms sonra tasmaya neden olacak sayı yüklenir. Ayrı bir sayaç (yazılımsal sayaç) 1 ms artışları  bir öncekine ilave ederek başlangıçtan itibaren kaç ms olduğuna bakar. (Mesela 3dk yı beklemek demek,  3*60*1000 ms oldumu diye bakmak demektir) Bu işlem çok kısa sürede yapılacağı için ana program çok kısa kesintiye uğrar.

Eğer 3 dk tamam ise burada ne yapmak isterseniz onu yaparsınız. (Zil çalmak lamba yakmak vs)

Hazır kod veremesem de olayın mantığı budur.

(*) Muhatap işlemcinin yürütmekte olduğu kodlar anlamında kullanıldı

MCR ile sistemi hareket ettirmek biraz riskli, zira mclr, koşturulan kodu derhal keseceğinden olur olmaz yerlerde rcl den reset atmak yazılımın istendiği gibi çalışmasını engeller. Bu tip projelerde çok dikkatli kod yazmak lazım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

savas1980

Açıklayıcı ve aydınlatıcı açıklaman için teşekkürederim  :D .Pekii böyle birseyi kesme kullanmada yapabilirmiyim? veya PORTA.5 i giriş olarak kullanarak bu mumkunmu ? Ben daha yeni başladıgm için anlattıklrını yapmak benim için cok zorlayıcı geldi eger yardımcı olursanız cok sevinirim. Şimdiden teşekkürler

z

Aslında yukarıdaki muhabbeti bir kaç kez okursan mantığı kavrarsın. Arkadaşlar örnek bir kod verdiklerinde incelersen olay kafanızda tam olarak şekillenir.

Bahsettiğiniz işlemi int kullanmadan yapmak çok zor. Yaparsınız ancak zamanlamayı tam tutturamazsınız ve bayağı özel kodlama gerekir.

Interrupt uygulamaları aslında hiç zor değil. Bütün mesele int üreten kaynağın kesinti isteğini işlemciye bildirecek mekanizmayı kurmak bu sadece 2 - 3  satılık koddan ibarettir.

En önemli mesele ana programdan interrupt programına geçildiğinde, interrupt programının değerlerini değiştireceği register içeriklerini saklamaktır. Wreg ve Status Reg (Cary, Zero vs ıvır zıvır hayati flaglar)

İnterrupt rutininde istediğiniz gibi kod yazın, int programına ilk girişte sakladığınız reg içeriklerini  tekrar reglere geri yükleyin (böylece ana  programa geri döndüğünüzde reglerde sanki hiç bir şey olmamış gibi davranılsın)

İnterrupt programından ana programa geri dönüşün RET yerine RETFIE ile olduğunu unutmayın. Zaten int routine'ini subroutine'den ayıran tek fark context saving'i saymazsak budur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

savas1980

Yardımlarınız icin teşekkürler eğer elinde ornek olan arkadaslar bir iki tanesini gosterirse cok iyi olur. iyi günler