avatar_Mucit23

İşlemci Ara sıra donuyor ve Kendi kendine reset atıyor

Başlatan Mucit23, 25 Nisan 2012, 19:53:42

Mucit23

Merhabalar Ete hocam

Bir adet RFID kartlar için kredi yükleme cihazı yaptım. Ticari bir Proje idi. Yaptığım sistemi anlatayım.

Bir adet oyun salonu var. Oyun salonunda 50'ye yakın oyun makinası var (Langırt, Buz hokeyi, Araba yarışı vs vs...) Kasada bir adet Programlayıcı Cihaz kullandım.
Makinalar üzerinde ise okuyucu cihazlar var.

Gelen müşteri İlk önce RFID kartlara İstediği kadar Kasadaki Cihaz vasıtası ile İstediği kadar kredi yükletiyor. Sonra İstediği makinaya gidip kartı okutarak makinaya start veriyor. Buraya kadar Problem yok. Kart okuyucular çok iyi çalışıyor. Yanlız Kasadaki kredi yüklenen Cihazda İşlemci içerisindeki yazılım Ara sıra donuyor veya Reset atıyor kendine. Sebebini bilmiyorum. Yazılımımı kontrol ettim muhtemelen ya gözümden kaçan nokta var yada farklı sebeblerden dolayı işlemci donup o sırada WDT Reset atıyor. WDT açık yani donmasındansa reset yemesi daha iyi olur.

Bunun yanı sıra Bazen donma olmasa bile Menülerden çıkarken felan LCD Ekranda (4X20LCD) Satırlarda kaymalar yaşanıyor. Yani Satırın yarısı Sola kaymış olarak görünüyor. Genellikle 4. Satır.

Bu gözlemelerim herzaman olmuyor nadiren ara sıra rastlanıyor. Mesela çok hızlı işlemler yapıyorum. Hızlı hızlı menüye girip çıkıyorum. Hızlı hızlı farklı işlemler yapıyorum bir bakıyorsun işlemci reset yedi veya komple dondu. Bunun Sebebini araştırıyorum.

Yazılımı Pic Basic İle yazdım. Kullandığım işlemci İse 18F452. Yazdığım Programın boyutu 30Kb civarında.  Programın hepsini vermem benim için pek uygun olmaz ama mesela sigorta ayarlarımı verebilirim.

    __CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
    __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
    __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
    __CONFIG _CONFIG3H, _CCP2MX_ON_3H
    __CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H


Açıkçası Sigortalar pek özenmedim. Bu yüzden (inş) Sigortalarla alakalı olabileceğini düşünüyorum.

Daha önce hiç bu tür gizemli reset durumları ile karşılaştınızmı. Yani sorunu nerelerde aramalıyım. Bi fikriniz varmıdır.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Gizemli reset sorunu ayrı bir şey ekran kaymaları ayrı şey diye düşünürüm.
Muhtemelen stack taşması oluyordur. Bir yerlerde bir kusurun olması gerekir.
Ben programdan şüphelenirdim. İyice adım adım takip etmen gerekiyor.
Gosubla gidilen yerden goto ile dönmüş olabilirsin. Yada tersi Goto ile gidip return ile dönmüş olabilirsin.
İç içe geçmiş fazla sayıda Gosub kullanmış olabilirsin.

Reset atan program çok gördüm ama donup kalma veya ekranın kayması enteresan . Daha önce rastlamadım maalesef.
_WDT_ON_2H & _WDTPS_128_2H komut satırında WDTPS_128 olarak zaten en yükek değere ayarlanmış . Belkide kısaltırsan donma olmayacak ama anında reset yiyecektir program.

Bu tür şeylere anlık voltaj düşmeleride sebep olabilir. Bu nedenle denemek amacı ile ,
  __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L satırı yerine
  __CONFIG _CONFIG2L, _BOR_OFF_2L  &  _PWRT_ON_2L  şeklinde değiştirip bir deneyiver bakalım.
Başkada bir şey aklıma gelmiyor maalesef.

Ete

3mZ

ETE Hocam ben stack taşması diye düşünüyorum.Hatırlarsanız bir lokanta kontrol devresi yapmıştım gosub ile gidip return ile dönüldüğünden dolayı reset atıyordu fakat herangi bir donma söz konusu değildi vede ekran kayması.

Mucit23 bence bu programın eğer isis simulen varsa hata izleme bölümünden stack taşması olup olmadığına bakabilirsin. Birde asıl devrede tam olarak hangi işlemi yaptığında resetliyor ona göre program satırlarına az çok yaklaşırsın.

3M

Mucit23

Hocam işte sorun orada. Reseti nereden yediğini hiç bilmiyorum. Yani dediğim gibi herzaman olmuyor ama bazen oluyor. Bunu çözmeye çalışıyorum

Hocam Geliriminde düşeceğini sanmıyorum. İşlemci Beslemesinde 5.01V civarı gelirim var. Yani ideal bir gelirim var. Ayrıca Devreyide 12V 1A SMPS adaptör ile besliyorum.

İsiste nasıl stack taşması olacağını nasıl öğrenirim. Tüm Registerleri takip etmek istiyorum. Bu tür işlerle ilgili Registerler nelerdir. Şöyle söyliyeyim. Eğer Stack Taşması oluyor ise ben bunu registerleri izleyerek nasıl anlayabilirim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

İsisde simulasyon yaparken stack taşması oluyor ise en altta sola doğru hata rakamı sürekli artar ve sanırım oraya yazıda çıkıyor. Dolayısıyla çalışırken ekran altını takıp etmen gerekiyor.
Voltaj düşmesi olarak gözle görülür düşmelerden bahsetmiyorum. Anlık sistemden akım çekilmesi ile sistem reset atabilir bunuda BOR sigortası yapar. Açık ise restet atar kapatılırsa atmayabilir.

Ete

Mucit23

Hocam Stack taşması olsa herhalde isiste simülation log penceresinde görünürdü

adult upload image
Simülation log penceresi böyle
Sadece 9 adet bir hata verdi. Oda İşlemciye Bağlı Dta bacağıyla ilgili. RTC den saat okunuyor.

Sigortalarla oynamayı deneyeyim. Bor 'i kapatıp deneyeyim.
Başka da aklıma bir problem gelmiyor. Ben yine Programa bakacağım ama Program çok fazla. Yani şurada donuyor şurada reset atıyor diyemiyorumki ilgili alanı gözden Geçiyerim. Tıkandım kaldım.   ???
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Evet haklıısn stack taşması gözükmüyor.

Program uzun gözüküyor. Ayrıca fazlaca değişken de kullandı isen bank seçim problemi olabilir.
İstersen ayarlardan "Disable Cross Boundary" seçeneğini aktif et. yani varsa  bunu bildirsin. Derleme esnasında bir bak bakalım. Daha sonrada değişken adreslerine bakman gerekiyor. Branch komutu kullanmış isen sorun çıkabilir. Onun yerine BRANCHL kullanman gerekiyor.
Şimdi aklıma gelmiyor ama  bank seçimine bağlı bir sorun da olabilir. Şimdiye kadar hiç başıma gelmedi ve Basic Bank seçimini otomatik yapar diye biliyorum ama Branch komutunda özel durum olduğunu biliyorum.
BPB260 manual inde yalnızca Branch komutuna dikkat edin diyor. Zira branch ile dallanılacak etiketlerin ilk 1K lık hafıza diliminde olması gerekiyormuş. Şayet farklı ise BRANCHL yi kullanın diyor. Bunda etiketler her hangi bir yerde olabilir diyor.

Ete


Mucit23

Hocam Hiç branch komutuyla felan işim olmadı. Kullnmıyorum.
Yazılımda epeyce değişken olduğunu söyliyebilirim. Çünkü birden fazla farklı sistem şifreleri giriş şifreleri barındırıyor.Bir sürü sayaclar, yardımcı kayıtçılar var.
Hesapladım bunların hepsi 110 küsür byte ediyor. Ram kullanımı böyle.

Ayrıca dediğiniz gibi ayarlardan Disable cross boundary seçeneğini aktif ettim. Derlemede farklı bir sonuçla karşılaşmadım. Sıfır hatayla problemsiz bir şekilde derleniyor program.

Branch komutuyla hiç işim olmadı. Bu yüzden Bank seçimiyle alakalı olacağını düşünmüyorum.

Nedense herzaman olmuyor işte. Normal kullanımda çok güzel çalışıyor ama mesela ben sırf cihazı bozmak için çok hızlı işlemler yapıyorum. Hızlı hızlı menüye girip çıkıyorum hızlı hızlı menüler arası geziyorum. Şifre değiştiriyorum diğer gizi menülere giriyorum. Yani hızlı hızlı birçok işlem yapıyorum hoop! bakıyorsun birden reset yedi veya dondu. Fişi çek tak düzeliyor.

Ha işlemci yüksek Bir frekansdada çalışmıyor. 4MHz hızda çalışıyor. Aslında PLLyi açıp 16Mhz yede çıkartıp denedim ama pek gözle görülür bir fark görmediğim için yine 4Mhz yi kullandım. Zaten hızgerektiren bir işlem yok. 4Mhzde Reset yemesi dışında hiç bir problem yok sistemin.

Anlamadım gitti bu işi.

Hocam İsiste Watch window ile registerleri izleyerek bir fikir edinebilirmiyiz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mutlaka programda bir kusur olmalı. Öyle bir an geliyorki işlemci çaresiz kalıyor. Bunu bulmak zorundasın. Programa sen hakimsin.
Ben olası problem noktalarını söylüyorum sadece. Bir diğer konu mesela byte değişkeninin word değişkenine eşitlenmesi durumu da zaman zaman problemler yaratabilir. Bu alsında hesaplarda sorun çıkartır ama nerden bileceksin bunlarıda bir kontrol et istersen. Yada terside olabilir. Word değişkeninin Byte değişkenine eşitlenmesi de sorun olabilir.

Ete

Mucit23

Bakayım hocam. Akşam oturum baştan sonra inceleyip Elden geçireceğim. Sanırım şimdilik başka yapabileceğim bişeyde yok gibi.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam Şimdi Programa biraz baktım. RFID modüllerden kullanıyorum. Bu modülü okumak için ard arda yapılması gereken birden fazla işlem var.
Kart yazma rutini şöyle

İlk önce kart varmı yokmu ona bakılıyor.
Kart varmı yokmu sorgula
  Cevap geldimi bak
    Kart alıgılandı cevabı geldiyse kart sorgulama işlemini bitir ve Key Yükleme işlemine geç.
    kart yok cevabı gelirse ilgili işlemiş yap

Key Yükleme işlemi ise şöyle

Kart şifresini Yükle(Load Key)
  Gelen cevaba Bak.
    Eğer Key doğru bir şekilde yüklendi cevabu gelirse key yükleme işlemini bitir ve Kart Yazma işlemine geç
    Eğer Key yüklenmedi ise İlgili Hatayı ver
Tekrar kart yükleme işlemine git

Kart yazma işlemi ise böyle Burada kartın ilgili adreslerine datalar yazıyorum.

Kartın ilgili adresine dataları yaz.
  Gelen cevaba bak
    Eğer kart yazma işlemi olumlu bir şekilde tamamlanırsa kart yazma işlemini bitir ve çık
    Eğer kart yazma işlemi olumsuz bir şekilde sonuçlanırsa ilgili hatayı ver.
Tekrar kart yazma işlemine git
 
Kart okuma işlemide aynı sadecekart yazma yerine kart okuma işlemini yapıyorum. Kart okuma işleminde ise yine kartın igili adreslerinde data okuyorum.

Şimdi hocam bu işlemlerin ardı ardına yapılması gerekiyor. Bu yüzden bu işlemler sırasında birden fazla iç içe gosub komutu var. Herzaman olmuyor işte ama bazen demekki rastlanıyor.

Ben bu Gosub yerine Goto kullanıp alt programdanda yine Goto ile dönmek istiyorum. Fakat mesela Gosub kullandığımız zaman program ilgili alt programa gidip oradaki işlemleri yapıp return komutu ile En son hangi gosub komutunu işlemiş ise o gosub komutunun altından yazılımı işlemeye devam ediyor.
Şimdi ben Goto kullandığım zaman alt programdan gönebilmem için Goto komutunun altına bir etiket yazmam gerekiyorki hani alt programda tekrar goto şu etikete diyip Alt programa gitmeden önce kullandığım goto komutunun altından devam edeyim.

Bu şekilde şu kart okuma ve yazma rutinlerinde birden fazla iç içe gosup komutundan kurtulmuş olacağım. Doğrusu böyle olurmu sizce?

Ben biraz uğraşayım hocam. Sizinde program önerilerinizi alabilirim. (Şu işlemleri şöyle yapsan daha iyi olur gibi) 
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

3mZ

mucit23:

Bir ticari termostat projemde max6675 kullanmıştım. Okuma işlemini ana döngüde ard arda yaptığım için pic donmuyor fakat okuma bölümü donuyordu. Bir TMR0 kesmesinde sayaç oluşturdum ve okuma hızını yavaşlattım. Neden kesmeye ihtiyaç duydun dersen program arap saçıydı for-next yaptığımda başka işlerini yapamıyordu işlemci bence bahsettiğin satırları yavaşlat 2 kat zamana çıkart çünkü iç içe gosub-return programı alt üst ediyor bazen. Ayrıca isiste çalışan çoğu devre asıl devrede sorun çıkartıyor.

Benim görüşüm eğer kart takılı ise ilgili menülere yönlendirmen programın diğer kısımlarında yazılımda ne var bilmiyorum ama ben olsam ana döngüde sadece kartın olup olmadığına bakarım.

3M

Mucit23

İç içe girmiş gosubları azaltmayı deneyeceğim. Yani bir alt program içerisinde birden fazla gosub kullanmıyacağım. Şimdi bakıyorum Bazı yerlerde 2 adet iç içe gosub var. yani alt programdan başka bir alt programa gidiyor.
Bunların hepsini goto ya çevirmeye çalışıyorum.

Normalde zaten dediğini yapıyorum ana döngüde kart varmı yokmu süreklü ona bakıyorum. Eğer kart yok ise diğer işlemlere hiç başlamıyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Birde şunları sorayım hocam

Bir Program içerisinde gosub komutunun aşağıdaki gibi kullanımında bir sakınca varmıdır

GOSUB X_isini_yap
GOSUB Y_isini_yap
GOSUB Z_isini_yap
             .
             .
             .

Ayrıca OSC ile ilgili bazı bilmediklerim daha var.

Farzedelim Biz 16Mhz de çalışmak istiyoruz. İşlemcinin OSC pinlerine 4 Mhz kristal bağlayıp PLL yi aktif ettikten sonra frekansımızı 16Mhz ye çıkartıyoruz.

Burada iki sorum var.
Sigortlarda OSC tipini XT olarak seçmiştik. Ama PLL yi açınca OSC frekansımız 16Mhz ye çıktı. Bu durumda OSC frekansımız 8 Mhz den yüksek olduğu için OSC tipini HS yapmamız gerekirmi?

1. Sorum buydu Diğer sorum ise şudur.
Yine Aynı şekilde Farzedelim 10Mhz kristal bağlayıp PLL ile 40Mhz ye çıkardık. Bu durumda OSC tanımlaması için DEFINE OSC 40 yazmamız gerekir yoksa Bağladığımız kristalin değerini Yazmamız gerekiyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Yazılımda ise iç içe girmiş gosubları düzenledim. Ayrıca BOR u da kapadım. Şimdi deneme imkanım yok Hafta sonu yedek bir kart yapacağım. Onun üzerinde yazılımı deneyeceğim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal