armega328 + i2c kilitlenme

Başlatan papsukkal, 21 Şubat 2022, 15:13:49

papsukkal

Merhabalar herkese.

Projemde Atmega328p ve iki adet i2c modül kullanıyorum. Bunlar DS1306 ekran ve MPU6050 sensor.

i2c modüllerden herhangi birisinde fiziksel iletişim kopukluğu olduğunda, örneğin SCL,SDA ve özellikle besleme hatlarında (+,-) kısa süreliğine de olsa temassızlık durumunda işlemci kilitleniyor. İşin ilginç tarafı bu şekilde işlemci kilitlendiğinde WDT de kilitleniyor ve devreye giremiyor. Farklı kütüphaneler ile denedim. Farklı modüller ile denedim. Hatta tamamen farklı bir kod ile denedim. Hep aynı sonucu alıyorum.

i2c hattındaki yaşanan bir sıkıntının işlemciyi böyle kilitlemesinin sebebi ne olabilir? Bu durumda nasıl bir tedbir alabilirim? Bu sıkıntıyı yaşayan oldu mu? Tecrübelerinizi paylaşır mısınız?

fahri-

WDT kilitlenmez. Muhtemelen işlemciniz kilitlenmiyor. Çalışıyor ama programınızdaki bir yerde ya beklemeye giriyor ya da döngüye giriyor.
WDT resetlemeyi programın neresinde yapıyorsunuz?
WDT resetlediğiniz yerde bir portu onoff yaparsanız anlarsınız işlemcinin kitlenip kitlenmediğini.

Kabil ATICI

Beslemede olasılık sistemi üzerine çalışmaz. Sistemin kararlı çalışması için bağlantıların kararlı olması şarttır. Onun için kabloları lehimlemek şarttır. Yoksa değdi, değmedi olasılık üzerine  her türlü sorun ortaya çıkar ki, modüllerin yanması işten bile değildir. Modülleri kararlı bir bağlantı şarttır. O yüzden çoğunlukla kendi PCB çizimimi kullanma eğilimim vardır. Hatta gerektiğinde modülleri kullanabileceğim pcb çizimimi kullanırım.

Bu arada DS1306 i2c değil. Söz ettiğiniz DS1307 olabilir.

kullandığınız kütüphanelerden kaynaklanan bir durum olabilir. İşlemci kilitlenmese bile sürekli olarak i2c işlemlerini yerine getirmek için döngülere girmiş olabilir. Bu tür durumlar için örneğin başlangıçta 10 kere dener (i2c başlama durumundan sonraki id kodu ) başarısız olursa, bir hata sinyali üretmesi istenir. Aralarda da veri geldi onayı gibi bilgiler için de aynısı olabilir. Ama bunun için kütüphaneyi iyi irdelemek ve gerektiğinde değişiklik yapabilmek gerekiyor.

Her bir haberleşme için öngörülen kablo bağlantısı için belirtilen bağlantı uzunluğu vardır. Bu konuyu dikkate almak gerekiyor. Yoksa veri kaybı kaçınılmaz.

kolay gelsin!
ambar7

papsukkal

#3
İşlemcinin çalıştığını port üzerindeki ledden kontrol ediyorum. WDT resetlemeyi loop fonksiyonunda yapıyorum. Bir buton ile  while(1) döngüsüne alıyorum wdt çalışıyor. Özellikle SCL ya da SDA hattını şaseye çektiğimde bu kilitlenmeyi yaşıyorum.

ds1306 değil ssd1306 yanlış yazmışım.

Kabil Hocam ekran kart dışında çalışacak. İhtimaller üzerinde çalışırken bu sorunu gördüm.

z

Eger yaziliminizda bir olayi bekleyen dongu varsa bu dongu icine muhakkak timeout duzenegi kurun.

Donguden ciktiginizda timeouttan dolayimi ciktiniz yoksa beklenen olay gerceklesti de mi ciktiniz test edin.
Boyle yaparsaniz hic bir yaziliminiz kitlenmez.

Yani isin can alici kismi Time Out.

Muhtemelen soyle bir sey oluyor.

Bir donguye girip bir flagin set yada reset olmasini bekliyorsunuz. Bu esnada bahsettiginiz kisadevre vs oluyor ve donanim hataya dusup bir flagi set ediyor. Fakat siz kendi ilgilendigiiz flagin konum degistirmesini bekliyorsunuz.

Seri iletisim yapan donanimlarin bir cok hata flagi olur. Onlara bakmayip sadece data geldimi gitti mi diye donguye girerseniz yasadiginiz tipte kilitlenmeler olmasi cok dogal.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

papsukkal

Z Hocam böyle de olsa WDT devreye girip işlemciyi resetlemesı gerekmez mi?

Kabil ATICI

Ana karttan uzak bağlantılarda, kilitli konnektör kullanmak (bağlantı kararlılığı için), uzak modüller için ek kondansatör kullanmak(100u veya üzeri), gerektiğinde ekranlı kablo kullanmak çözüm olabilir. Hiç olmazsa, modüllerin kablo bağlantıları doğrudan lehimlenebilir. Kararlı bir bağlantı için.



Kolay gelsin.
ambar7

kimlenbu

WD resetleme işini sadece tek bir yerde yapın. Bir döngü içerisinde vs kesinlikle wd reset işlemi yapmayın. Bütün sonsuz döngülere (while) mutlaka timer veya değişken ile kilitlenme durumunda çıkabilecek bir yapı kurun.

Ayrıca endüstriyel bir sistemse harici, wdt özelliği olan voltage supervisor kullanın. İşlemci ile iletişim kesilirse basar reseti. Power on reset kısmı da daha stabil olur.

z

Alıntı yapılan: papsukkal - 21 Şubat 2022, 17:08:13Z Hocam böyle de olsa WDT devreye girip işlemciyi resetlemesı gerekmez mi?

Watch dog reset atmasin diye cogu dongude wdt yi resetlemek gerekebiliyor. Cunku beklenen flag wdt peryodundan daha uzun surede aktif olabilir.

Sonucta bu konulara iyi kafa yormak lazim. Muhtemelen arkadas da bir yerde wdt yi resetliyor ve bir seylerin olusmasini bekliyordur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhendisbey

While döngülerinde özellikle sonsuz döngü olayları meydana gelebilir. Ya da loop içerisinde takılı kalan bir algoritma kurmuş olabilirsiniz.

MCU kitlenir mi? Daha önce stellaris serisinde başıma geldi. Kesmede kullandığım kod uzun olduğu için kesme içerisinde tekrar kesme gelince kilitleniyordu. Debug modunda hatayı gösteriyordu.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

JOKERAS

I2C Komutu ACK (Acknowledge) barındırır.ACK Slave cihazdan gelir.
Data veya Clock farketmez,hatlardan herhangi birinin kesilmesi durumunda doğal olarak
ACK gelmez.ACK gelmiyorsa ya Device bozulmuştur,yada hatta problem vardır.

Data Clock hatlarına Temassızlık veya her iki hattı kısa devre yaptığınızı düşünün.
Bu durumda Data transferi bozulacak.Eğer bir data bozulmuş ise ACK oluşmayacak.
Her veri gönderip aldığınızda ACK sorgu döngüsünden geçirin.
ACK yoksa Sistem Bloke olur.İşlemci donanımsal değil yazılımsal olarak Bloke olur.
Sanırım sizin durumda bu.

Bu sorun  WDT'ile de çözülebilir, başka türlüde.
En pratik yol Faul durumunda Bir Timerı Başlatıp Time Out sayarsınız.
Belirlediğiniz sürede olayı beklersiniz.Time Out Taşınca koda ekleyeceğiniz
Goto ile I2C Rutinlerinin En başına Goto Etiketine dallanarak Filmi başa sarıp
Denersiniz.Filmi başa sarmak önemli.I2C'de kaldığınız yerden devam etme lüksünüz yok.
Çünkü Fail durumunda Slave Cihaza yüklediğiniz veya okuduğunuz veriler çöp olur.


WDT ile çalışmak için Kodu optimize etmeniz gerekir,WDT çok hızlı taşar,Taştığı Anda Reset
olur ama tekrar taşar yine Reset olur.Bunu adım adım Kodu optimize ederek, gerektiği noktalarda akışta
WDT Timerı Silerek yapmak durumundasınız.Uğraşı gerektirir.
Ayrıca WDT ile yazdığınız kod bloklarında yapacağınız değişiklikler tüm akışı ahengi bozar.

elektronik

Geçenlerde aynısı başıma geldi işlemci olarak  Atmega328p (arduino mini pro) kullandım DS1307, ADXL345 ve 24C16. Devre birde motor kontrol ediyor.
Atölye ortamında günlerce denedim hiçbir sorun çıkmadı sahaya götürüp montaj yaptım güzel çalışıtı birgün sonra müşteri arayıp sistem durdu dedi baktım kilitlenmiş reset attım çalıştı sonraki gün yine aynı durum olabilir dedim yine reset attım geldim ama yine kilitlenmiş devreyi getirdim atölyede bağladım motoru çalıştırdım ne yaptıysam sorun çıkmadı. sonra i2c uçlarına tornavida ile temes ettiğimde devre kilitlendi. bu sefer kilitlenmesine sevindim. arduinonun hazır kütüphanelerini kullanmıştım yazılıma müdahale etmedim arduino nun hazır kütüphaneleri bana çok karmaşık geliyor. sorun şuymuş ADXL345 ivme sensörünü sonradan devreye eklemiştim ve data uçlarını 2-3 cm kablo ile bağlamıştım bu kablodan motor gürültüsü alıyormuş sonra kartı yeniden çizdim ADXL345 sensörünüde karta dahil edince sorun kalmadı aylardır sorunsuz çalışıyor. buda içime sinmedi PIC işlemci kullanarak aynı devreyi yeniden yaptım data uçlarına aynı şekilde donununca bile kilitlenme olmadı şu an sorunsuz çalışıyor.

papsukkal

Alıntı yapılan: Kabil ATICI - 21 Şubat 2022, 17:27:37gerektiğinde ekranlı kablo kullanmak çözüm olabilir.

Ekranlı kablo kullanmam gerekecek. Ama sıkıntı yaşamayacağım anlamına gelmez. İhtimalleri azaltır.

Alıntı yapılan: kimlenbu - 21 Şubat 2022, 17:30:58WD resetleme işini sadece tek bir yerde yapın. Bir döngü içerisinde vs kesinlikle wd reset işlemi yapmayın. Bütün sonsuz döngülere (while) mutlaka timer veya değişken ile kilitlenme durumunda çıkabilecek bir yapı kurun.

Ayrıca endüstriyel bir sistemse harici, wdt özelliği olan voltage supervisor kullanın. İşlemci ile iletişim kesilirse basar reseti. Power on reset kısmı da daha stabil olur.

Yapı dediğiniz gibi. Benim sıkıntım wdt nin reset yapması değil reset yapmaması. Harici wdt kullanmayı ben de düşündüm ancak dahili wdt ile wdt anında cihaz durumunu eeproma kaydediyorum. wdt ile resetlendiğinde cihaz son durumu okuyup kaldığı yerden işine devam ediyor. yani reset çalışmayı etkilemiyor. Harici reset kullandığımda her seferinde mudahale etmek gerekebilir.

Alıntı yapılan: z - 21 Şubat 2022, 18:00:55Muhtemelen arkadas da bir yerde wdt yi resetliyor ve bir seylerin olusmasini bekliyordur.

yani I2C haberleşmesi tamamlansın diye kütüphanede biryerlerde wdt resetleniyordur mu demek istedin hocam? Bu mantıklı geldi. Eğer böyle bir durum varsa en kötü farklı bir kütüphane ile sorun çözülebilir. Bunu inceleyeceğim.

Alıntı yapılan: elektronik - 21 Şubat 2022, 21:36:50PIC işlemci kullanarak aynı devreyi yeniden yaptım data uçlarına aynı şekilde donununca bile kilitlenme olmadı şu an sorunsuz çalışıyor.


Ben de software pinler ile I2C yapısı oluşturmayı araştırıyorum şu anda. Hardware pinleri kullanmadığımda bu sorunu yaşamayacağımı düşünüyorum.