interrupt içinde delay fonksiyonu neden çalışmıyor ...

Başlatan picman, 17 Aralık 2008, 15:51:10

picman

arkadaşlar basci dili ile yazdığım bir kayan yazı programı var . daha önce de sizinle paylaşmöıştım. ben bu programını c diline dönüştürdüm birde klavye ekleyeyim dedim . programda interrupt fonksiyonu içiğnde delay fonksiyonunu çağırdığımda hata veriyor . bunun sebebi nedir bilgisi olan varmı acaba ....
Bilgi paylaştıkça artar..

arslan74

Alıntı yapılan: "picman"arkadaşlar basci dili ile yazdığım bir kayan yazı programı var . daha önce de sizinle paylaşmöıştım. ben bu programını c diline dönüştürdüm birde klavye ekleyeyim dedim . programda interrupt fonksiyonu içiğnde delay fonksiyonunu çağırdığımda hata veriyor . bunun sebebi nedir bilgisi olan varmı acaba ....

Bir fonsiyonu hem ana döngüde hemde interrupt altında çağıramassınız. Öyle yaparsanız program sacmalar. Ayrıca interrpt altında gecikme yapmak pek doğru bir yaklaşım olmaz. Gecikme olaylarını ana döngü içinde yapmanız daha doğru olacaktır.

Selamlar,

picman

ben şimdi ayrı olarak keyboard.h adında bir kütüphane dosyası hazırladım bu kütüphane dosyasında keyboard_read adlı bir fonksiyonum var onun içinde vardı delay fonksiyonu . yani ben klavyeye bastığımda rb0 interrupt oluyor keyboard_read fonksiyonu da interrupt alt programı içindeydi neyse delay fonksiyonlarını çıkardım şimdi derlendi program bakalım nasıl olacak.  yada şöyle yapsam keyboard_read fonksiyonunu direk interrupt alt programında kullanmak yerine ayrı bir fonksiyon hazırlasam keyboard read konksiyonunu da onun içinde kullansam interrupt alt programında da yeni oluşturduğum fonksiyonu çağırarak kullansam olurmu yine aynı hata yı verirmi...


birde başka bir soru sorayım ben geriye değer döndüren bir fonksiyonda programın herhangi biryerinde karşısına döndüreceği değeri yazmadan sadece "return" ifadesi kullansam ne olur . program fonksiyondan çıkarmı yada bir fonksiyondan çıkmak için c de bir komut var mı . mesele pc programlama dili olan delphi de bir procedure veya fonksiyondan çıkmak için "exit;" ifadesi kullanılıyor c de de böyle birşey var mı . yada "break" deyimi fonksiyondan çıkışı sağlar mı ....
Bilgi paylaştıkça artar..

Tagli

Alıntı yapılan: "picman"birde başka bir soru sorayım ben geriye değer döndüren bir fonksiyonda programın herhangi biryerinde karşısına döndüreceği değeri yazmadan sadece "return" ifadesi kullansam ne olur . program fonksiyondan çıkarmı yada bir fonksiyondan çıkmak için c de bir komut var mı . mesele pc programlama dili olan delphi de bir procedure veya fonksiyondan çıkmak için "exit;" ifadesi kullanılıyor c de de böyle birşey var mı . yada "break" deyimi fonksiyondan çıkışı sağlar mı ....
Bildiğim kadarıyla bu mümkün değil. Ama bu tür bir çıkış için bir kontrol değeri belirliyebilir ve çıkışta bu değer ile fonksiyonun neresinde ve neden çıktığını anlayabilirsin. Döndükten sonra bu değere göre program farklı işlemler yapabilir.

Aklıma gelen bir yöntem daha var: 18 serisi PIC'lerde hardware stack'teki değerleri POP'layabiliyorsun (yani yığın işaretçisi aşağıya kayıyor). Bunu yapıp sonra da programı istediğin yere GOTO ile götürebilirsin. Hi-Tech'i bilmediğim için kesin bir yorum yapamam ama eğer derleyici böyle bir destek vermiyorsa programına ASM kodu gömmen gerekebilir. Burda dikkat edilmesi gereken önemli bir nokta daha var: Normalde 18 serisi PIC'lerde bu yığın 31 derinliğe sahiptir ve yanlış bilmiyorsam program bu değerlere müdahele edebilir (yani call vs. gibi şeyler dışında). Bu şekilde yığın genişletilebilir, mesela dolduğu zaman bu 31 değer RAM'de bir yere kopyalanır, boşalınca RAM'den geri çağrılır. Derleyicinin bunu yönetmek için kullandığı kod parçacığı senin ASM kodu olarak gömdüğün kısımla çakışıp sorunlara neden olabilir. Tabi bu sadece bir ihtimal, sadece göz önünde bulundur diye yazıyorum.
Gökçe Tağlıoğlu

picman

ilgin için teşekkür ederim ben daha önce pbp kullanıyordum  onda bir alt programdan geri gelmek için alt programın her hangi bir yerimde return ifadesini kullanmak yeterliydi. ama ilk dediğin mantıklı geldi bana bir değer verip sonra o değeri test edip işlem yapabilirim . ama benim merak ettiğim değer vermeden sadece return yazsam ne olur acaba . şu anda inter net kafedeyim ev deolsaydım bu soruyu sormadfan denerdim ama şu an imkanım yok. sence sadece return yazsak ne olur ... geriye gelişi güzel bir değer mi döner ...
Bilgi paylaştıkça artar..

Tagli

Bence derleme hatası verir. C ile hiç PIC programlamadım ama bilgisayarda dediğim gibi oluyor.
Gökçe Tağlıoğlu

arslan74

Alıntı yapılan: "picman"

birde başka bir soru sorayım ben geriye değer döndüren bir fonksiyonda programın herhangi biryerinde karşısına döndüreceği değeri yazmadan sadece "return" ifadesi kullansam ne olur . program fonksiyondan çıkarmı yada bir fonksiyondan çıkmak için c de bir komut var mı . mesele pc programlama dili olan delphi de bir procedure veya fonksiyondan çıkmak için "exit;" ifadesi kullanılıyor c de de böyle birşey var mı . yada "break" deyimi fonksiyondan çıkışı sağlar mı ....

Merhaba,

Eğer fonksiyonun geri dönüş değeri ile ilgilenmiyorsanız ozaman yapmanız gereken tek şey geri dönüş değerini görmezlikten gelirsiniz. Ama geri dönüş değerini kullanmiyorum diye geri donüş değeri kullanmadan return yapma sececeğine sahip değilsiniz.
Eğer geri dönüş değerini hiçbir zaman kullanmak istemiyorsanız o zaman geri dönüş değerini void yaparsnız.

"return val" ile geri dönmek en mantıklısı. hatalı durumlarda eksi değeri ile geri dönersiniz, doğru çalıştığında arti bir değerle geri dönerseniz durumu daha iyi anlaşılır hale getirirsiniz.

exit() fonksiyonu işletim sistemine ait bir fonksiyon kodu dur. exit()' le ana programı istediğiniz yerde sonlandırmak için kullanılır. Oysa siz bir işletim sistemine sahib değilsiniz. Bütün kodunuz bir sonsuz döngü içinde gecmek zorunda.

Yalın kodla, işletim sistemi için yazılan kodlar arasındaki fakı iyi bilmeniz gerek.

Selamlar

Ziya

kesmede bir flag aktifle ve çık. Ana programda sürekli o flagi kontrol et. flag aktif ise klavyeni okut.

Klavyeye bastığımda rb0 aktif olup kesmeye gidiyor diyorsun. O zaman kesmesini kullanma ve rb0 harici kesmesinin flagini ana programda sürekli takip et ve aktif olunca kalavyeyi okut. Okutma işleminden sonra flag sıfırlanıyormuydu hatırlamıyorum. b0 bacağının değerini de okutman gerekebilir. Flag otomatik sıfırlanmıyor ise kendin sıfırla.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Tagli

Geçenlerde klavye okumayla ilgili bir kod yazmıştım. Klavyeden yanlış hatırlamıyorsam 11 bitlik paketler geliyor. Ben clock'un her düşüşünde RB0 kesmesine gittim ve gelen her biti iki register kullanarak kaydırdım. Aslında start, stop ve parity önemli olmadığından tek register da kullanabilirsin. Kesme içinde bir de bit sayacı var ve bu sayaca göre o sırada hangi bitin geldiği belirlenebiliyor. Bu şekilde bahsettiğim bu 3 özel biti fark edip ona göre işlem yapmak ve 11 bit de alınınca sayacı sıfırlamak mümkün oluyor. 11 bitin alımından sonra kendi tanımladığım ve klavyeden veri geldiğini gösteren bir biti de işaretliyordum. Ana program sonsuz bir döngü içinde bu biti kontrol ediyor ve eğer işaretliyse scan code'ları içeren bir tabloya gidip dönen değere göre sonraki işlemlere geçiyordu. Yani klavye alımının her biti ayrı kesmelere sebep oluyor...

Benim yazdığım program ASM dilinde idi ama sanırım aynı mantığı her dilde uygulayabilirsin. Kesme içinde delay kullanman da gerekmez.

Bu arada, RB0 bayrağı kendisi sıfırlanmaz, kesme sonunda senin sıfırlaman gerekir.
Gökçe Tağlıoğlu

picman

arkadaşlar verdiğiniz cevaplar için teşekkürler ben klavyeden veri okuma işlemini başardım proje tam manası ile kullanılabilir duruma galdiğinde sizinle paylaşıcam. yapmaya çalıştığpım şey klavye kontrollü bir kayan yazı uygulaması aslında bunun la alakalı formda ve internette bir sürü örnek var fakat ben kendim yapmayı istedim başardım da . neyse proje bittiğinde formda sizinle paylaşırım . sizlere de çalışmalarınızda başarılar..
Bilgi paylaştıkça artar..