I2C write zaman aşımı kontrolü varmıdır

Başlatan safaka123, 03 Ekim 2013, 09:49:28

safaka123

I2C haberleşme de debugger ile isis te kontrol ederken tek taraflı kontrol edersem alınacak kısım sadece adres oluyordu sonrasında yaptığım saat devresine bağladım bütün data verilerininde alındığını gördüm. Olay isisin desteklemediği entegre olduğu için slave entegreyi koymamamdan. bu durumda program hala ack sinyalini beklediğinden diğer verileri gönderemeyip programı durduruyor. Burada slave entegresini koymamak tabiki hatalı. Fakat gerçekte slave entegresi herhangi bir sebepten bozulsa ack göndermese program hata ledi bile yakamayacak olması. Bu durumda seri port kullanımındaki gibi bir timeout zamanının belirlenebilmesi ve hata ledini yakabilmesi mümkünmü mümkünse ufak bir komut örneği ile açıklarmısınız.  I2C read komutunda da nasıl yapılır, bunun içinde örnek bir komut yada küçük program örneği verebilirmisiniz. picbasic olursa iyi olur ama ASM olarak da verirseniz takip etmeye çalışırım. Teşekkürler.

yldzelektronik

Basic çok iyi bilmem ancak wdtnin çözüm olabileceğini düşünüyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

z

Zaman aşımı, beklenen bir olay gerçeklene kadar beklemek yerine belli bir zaman diliminde olayın gerçekleşmesini beklemek zaman doldu ise hata döndürmek demektir.

Bu amaçla;


      
               Sayaç=0
               Hata=0 
Dongü:
               Olay gerçekleştimi?
               Gerçekleştiyse İşlemi yap ve çık
               Sayaç=Sayaç+1
               Sayaç, max bekleme değerini aştımı
               Aştıysa Hata=1 ve çık
               Goto Döngü


Benzeri mantık yürütebilirsin.

Burada Sayaçı döngü içinde artımak yerine her 1 ms de bir artırmakla zaman aşımını ms cinsinden kontrol edebilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

safaka123

Cevaplarınıza teşekkürler.
wdt için kaynak araştırdım avantajı çok mutlaka, fakat dezavantajı biz amatörler pause ları dağıtırız sonrasında wdt devreye girer ve istemediğimiz olayda yada beklemediğimiz olayda resetler diye düşünüyorum. ( :) her lcdout  dan sonra pause verdiğim zamanlar ustalardan birinin uyarısıyla artık vermiyorum picbasic te Bunun gibi) Fakat kullanabilirim.

(Z) senin önerini kullanamıyorum. zira bir diğer komuta bile gidemiyor.
Bunun yanısıra gördüğüm olayda I2C komutu verme pozisyonunda takılı kalıyordu. bu da zaman aşımını kontrol etmemi imkansızlaştıracak
gibi.

Fakat kontrol I2C de timeout parametresi gibi bir olay yoksa TMR0 kesmesini bu amaç için kullanabilirim. I2C den önce enable yapıp sonrasında kesme aktif olduğunda kesmeden sonra değişken kullanıp I2C nin sonlanmasını sağlarım diyorum. Tabiki teorik olarak Bu durumda  I2C komutundan normal çıkıldığında yada error koduyla çıkıldığında disable yapıp kesmeyi sonlandırabilirim.
Bu mantıklımıdır. Gerçekleşme şansı varmıdır. Tereddütüm kesmeden sonra kaldığı yerden beklemeye devam etmesi bundan dolayı ancak kesme içinde bir led yakma gibi bir durumla kullanıcı uyarılabilir. belki de kesme çalıştığında LCD de hatanın kodunu yada adını yazabilir.





z

Alıntı yapılan: safaka123 - 03 Ekim 2013, 12:48:52

(Z) senin önerini kullanamıyorum. zira bir diğer komuta bile gidemiyor.
Bunun yanısıra gördüğüm olayda I2C komutu verme pozisyonunda takılı kalıyordu. bu da zaman aşımını kontrol etmemi imkansızlaştıracak
gibi.

I2C rutininin kendisini değişiteceksin. Eğer bu hazırda bir komut ise kendi I2C kodunu yaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

safaka123

Teşekkürler böyle düşünmedim. Haklısın. Bazı asm I2C kodlarını inceledim o zaman herşey benim kontrolümde gelişir. gerekirse bu şekilde yapabilirim. Biraz uğraştırır ama gerekirse çözüm olacaktır. Picbasic içinde asm kod eklenebiliyor.