Krokodil, on-off tuşu ve eprom problemi...

Başlatan Logan, 19 Haziran 2007, 22:23:21

Logan

İyi geceler arkadaşlar. Dahili eprom ile ilgili problemi çözemedim.Son olarak sistemde ufak bir değişiklik yaparak sorunu tam manasıyla anlamaya çalıştım. Protoboarda krokodilden besleme verdiğimiz zaman ilk olartak on-off tuşu ile açmamız gerekiyor. Bir önceki programda sistem voltajı alır almaz ilk olarak eprom belleği okuyor ve ondan sonra on-off tuşu döngüsüne giriyordu. Bu değişikliği yapınca ne olursa olsun ben bu tuşa basmadan hiçbir şekilde epromdan okuma yapmayacaktı. Fakat bu da çözüm olmadı. Yine değişen bir şey olmadı ve bütün dataları "0" olarak okudu. @cenkishan'ın belirttiği gibi galiba sistem geçici olarak eprom kaydı yapıyor. Eğer o gün elektrikler kesilmeseydi ben hala sistemin kesinlikle sorunsuz çalışıyor olduğunu zannedecektim. Üretim ve işletme müdürü, önümüzdeki hafta içerisinde baskı devresini bitirmem için yoğun baskı uyguluyorlar. Bu sebeple harici eprom kullanmaya karar verdim. Hi-Tech'in kendi sample klasörü içerisinde bulunan örnekler, hardware olarak tasarlanmış. Ne yazık ki benim ne bunları oturup inceleyebilecek, ne de sıfırdan yenisini yazabilecek zamanım var. Elinde herhangi bir bacaktan harici eprom okuma yazma programı olan arkadaşlar varsa ve benimle paylaşırsa çok sevinirim.  :)  Hepinize iyi geceler, iyi çalışmalar...
İmza.

lamercik

uzun süredir buraya bakıyorum ve ilk defa bir soruya cevap vermek istedim.  dahili eprom yazma vede okuma  fonksiyonları aşağıdaki gibidir.


void EEPROM_WRITE(addr, value)
while(WR)continue;
EEADR=(addr);
EEDATA=(value);
EECON1&=0x7F;
CARRY=0;
if(GIE)CARRY=1;
GIE=0;
WREN=1;
EECON2=0x55;
EECON2=0xAA;
WR=1;
WREN=0;
if(CARRY)GIE=1

void EEPROM_READ(addr) ((EEADR=(addr)),(EECON1&=0x7F),(RD=1),EEDATA)
               

bu iki fonksiyonu kullanarak istediğin gibi eprom belleğe okuma vede yazma işlemi yapabilirsin. örnek olarak şöyle tarif edeyim
EEPROM_WRITE(0,5);  bu komutu kullandığın zaman eprom belleğin 0.ıncı adresine 5 bilgisini yazmış olursun.
i=EEPROM_READ(0);  komutunu kullandığın zaman ise i değişkenine eprom belleğin 0.ıncı adresindeki bilgiyi yüklemiş olursun.

konuyu açan arkadaşın  yazdıklarından anladığım kadarıyla elektrik gidip gelince eprom bellek kendisini sıfırlıyor ama elektriği krokodilden  kesince bilgilere bişey olmuyor.
birkere kesinlikle elektrik problemi değil senin karşılaşmış olduğun bu sorun. büyük bir ihtimalle program içerisinde belirli zamanlarda eproma yazma işlemi gerçekleştiriyorsun ve elektriği düğmesinden kapadığın zamanda ise (powerin çıkışındaki kondansatörün deşarj olmasından dolayı) elektik düşmesi oluyor ve o andada senin program yazma işlemi gerçekleştiridiği için lojik 1 seviyesine çıkamoyor vede doğal olarak tüm blgilerini sıfır yapıyor.

diğer bir ihtimal vede büyük olasılık ise  sen programda boş belleği okumaya çalışıyorsun. yani ilk elektrik verdiğin anda eprom belleği okumaya çalışıyorsan yada belleğe hiç bişey yazmadan okutma işlemi gerçekleştiriyorsan yine aynı hata ile karşılaşırsın.

sorunu şu şekilde aşabilirsin;
mikroişlemciyi ilk programladığında  eprom bellekten bilgi okutmayı herhangi bir karşılaştırma  ile yapman gerekmektedir.  yani önce bakacaksın eprom bellek boşmu dolumu  eğer boş ise oraya istediğin değeri yazacaksın  yok dolu ise o veriyi alıp kullanacaksın.
örnek verecek olursak

i=EEPROM_READ(0);
if((i>=0)&&(i<=9)) i=i;
else i=0;

bu durumda ne olacaktır. okumuş olduğun veri 0-9 aralığında ise o değeri alıp kullanacaksın  yok o aralık dışında bir değer ise i değişkenine 0 değerini vermiş olacaksın.

umarım anlaşılır bir şekilde anlatım yapabilmişimdir...

Logan

@lamercik, bahsi geçen eprom problemini @cenkishan'ın verdiği örnek kod ile çözdüm. Fakat senin anlattıklarında gayet mantıklı ve açıklayıcı geldi. Program yaklaşık 3800 satır ve normal çalışma esnasında power supply'i kapatınca nasıl tepki verdiğini anlamak çok güç. Kapanma esnasında eprom belleğe yazma yapmıyorum. Sadece menüye girdikten ve değerleri değiştirdikten sonra çıkarken sadece bir kereye mahsus kayıt yapıyor. Neyse problemi çözdüm ve harici eprom kullanmaktan vazgeçtim. Bunu geçelim. Sakıncası yoksa şunu sorabilir miyim; neden uzun zamandır siteye girdiğiniz halde herhangi bir mesaja cevap yazmadınız :) Amacım sizi sorgulamak değildir sadece merak ettiğim için soruyorum. Eminim ki bu konuda fikriniz olduğu gibi bunun gibi daha birçok konuda bilgi sahibisinizdir.İyi günler, iyi çalışmalar...
İmza.

lamercik

bugune kadar yazmadım ama bundan sonra da yazmayacağım diye bir cümle kurmadım. vakit buldukça ve bildiğim konular olduğu sürece bundan böyle acizhane cevap vermeye çalışacağım.

JOKERAS

selam;konu bayağı geçmiş ama okuyunca bir yorum yapmak geldi
içimden...
kod tarafını pek anlamam benim aklıma gelen şu,
sizin yazdığınız kod'da bir hata olmuş olsa krokodilin birini
çıkartıp taktığınızdada eeprom bilgileri silinmesi gerekirdi,
ama anlattığınız duruma göre böyle bir sorun yok.


power'i anahtarından açıp kapattığınızda böyle bir sorun oluyor
bu sorun MCU veya gömülü sistmelerin tümü için geçerli olan
bir sorundur diye tahmin ediyorum.
mesela siz anahtarı açtığınızda SMPS devresi yaklaşık 50khz'lik bir osilatör
ile çalışır,bu çalışma anında SMPS 'in start normlarına ulaşmaya çalıştığı
o çok kısa anda,kararsız olan voltaj içerisinde "ripil"oluşur
işte oluşan bu "ripil"'ler MCU osilatör'ünde bir iki saykılda kararsızlık
yaratabilir.!
--------------------------------------------------------------------------
birde şöyle bir durum olabilir,yüksek frekanslı çalışan SMPS devrelerinde
mikro düzeyde "static"elektriklenme olur bunu bizler gözle göremeyiz
MCU'lar gibi çok hassas çalışan devreler üzerinde bayağı etki yaratırlar
bunlarda MCU osilatör'ünü çalışmasını çok kısa bir anda değiştirebilir,
kararını bozabilir,çünkü şebekeden izole edilerek yerel çalışan bağımsızlaştırılmış devrelerdir,onun için bu yerel hale gelmiş devre
ile şebeke/toprak arasına yaklaşık 10Mohm bir direnç ve bu direnç'e
paralel 22nf bir kondansatör bağlayarak burada türemiş yada türeyecek olan statik elektirik doğmadan şebekeye aktarılmış olur.
------------------------------------------------------------------------------
birde şöyle bir durum olabilirmi.?MCU'ya giren VCC ile  reset
aynı zaman aralığında olması MCU'nun reset adresini şaşırmasına
neden olabilirmi diye düşündüm.
onun için reset ucuna verilen reset voltajına 1 saniyelik bir gecikme uygulanmış olsa daha sağlıklı olmazmı diye düşünüyorum.

dediğim gibi kod işinden pek anlamam ama benim aklıma
bunlar geldi..
hoşçakalın.