TIMER0 kesmesinde EEprom'a veri yazmak:

Başlatan ziyaretci, 19 Ocak 2016, 14:25:39

ziyaretci

Merhaba;

Ticari bir uygulamamda dahili eeprom'a timer kesmesinde veri yazıyorum. Belli bir girişte istenilen sinyal varsa.

Sorun şu ki; devre bazen kilitlenip kalıyor. 1-2 haftadır arıza tespiti yapmaya çalışıyorum. En son şu tespit edildi; sistem kilitlendi ve yaklaşık 10 saniye sonra düzgün çalışmaya başladı. Herhangi bir aç kapa olmadan.

Hiç bu durumla karşılaşanınız oldu mu? Biraz uçuk olabilir ama sadece tahminlerinizi merak ediyorum.


birkan

Merakımı mazur görün. Acaba Timer0 ile ne kadar sıklıkta eeproma veri yazıyorsunuz? Ben dahili erprom a sadece cihaz enerjisi kesildiğinde kapasitörde depolanan elektrikle veri yazıyorum. O şekilde bile sık yazdığımı düşünüyorum da. Neticede eeprom ların yazma ömürleri kısıtlı.

ziyaretci

#2
Alıntı yapılan: birkan - 19 Ocak 2016, 15:05:38
Merakımı mazur görün. Acaba Timer0 ile ne kadar sıklıkta eeproma veri yazıyorsunuz? Ben dahili erprom a sadece cihaz enerjisi kesildiğinde kapasitörde depolanan elektrikle veri yazıyorum. O şekilde bile sık yazdığımı düşünüyorum da. Neticede eeprom ların yazma ömürleri kısıtlı.

Aynen sizin kullandığınız gibi kullanıyorum.

mesaj birleştirme:: 19 Ocak 2016, 15:41:07

Fakat sürekli değil makine günde en fazla 5 defa kapanıyor.

Salih

Bende uçuk bir yöntem önereyim. Belirli bir eeprom adresine, belirli program yerlerinde belirli sayılar yazdırsanız.
Devre kilitlendiğinde, eepromu okuyarak, kilitlenme esnasında programın hangi işlem yapmaya çalıştığını
öğrenebilirsin.

Karamel

erkan ustadim.

simdi ben daha microprocessor lecture ina daha katilamadim okulda. 3. sinifta katilacagim insallah ama simdiye kadar benim anlayabildiklerim ve ogrenebildiklerime gore. interrupt icersinde eeprom a veri yazip okuyan gibi uzun sure alan function lari kullanmamak gerekiyor?

neden boyle?

diyelim ki timer icersinde 10 msn de giriyorsunuz. atiyorum eeprom 15 msn de yaziliyor. siz daha eeproma kayiti duzgunce yapmadan. microcontroller yeniden timer interruptina girmeye calisiyor yada overflow flag ini silmiyorsaniz tim function icersinde recursive oluyor? yada oraya birdaha hic girmiyor? vs vs.

tim icersine girer gitmez. timer i durdursaniz. islemleri yapsaniz. sonra flag i silip. timer i calistirsaniz. bu seferde. timer in kararliligini bozmus oluyoruz. homogenious olmuyor.

yani. yazdiklarinizdan anladigim kadari ile. programlamada hardware ile pek uyusmayan bir programlama hatasi oldugu ortaya cikiyor. sorunuzu tam olarak yanitlayamamis olabilirim. daha fazla detay verirseniz. cozume daha kesin adimlarla gidebiliriz... ::)

RaMu

Tam olarak senaryo nasıl ve
Timer kesmesi kısmını paylaşabilir misin?

Eğer timer kesmesinde elektrik kesilmiş mi diye kontrol edip,
kesilmişse eeprom şu adrese şunu yaz diyorsan;

Kesinlikle en az Eeproma yazmanın tamamlanabileceği kadar süreye sahip olabilmen lazım,
Eeproma yazma tamamlanınca
eğer fazladan süren kalıyorsa ve
bu süre içerisinde tekrar timer0 kesmesi gelebilirse
doğal olarak tekrar eeproma elektrik kesildi yazmaya çalışacaksın,
muhtemelen bu yazma yarıda kalacak veya
yeterli gerilim olmadığı için eeproma hatalı veri yazılabilecek.

Yani elektrik kesildi durumu eeproma kaydedildikten sonra
-evet, elektrik tekrar geldi ve iyi durumda
-veya elektrik gitmemiş yanlış anlamışım
şeklinde bir kontrol olması lazım.

Daha başka şeylerde var.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dursuncemal

hangi islemciyi kullaniyorsunuz? su siralar uzun aradan sonra yeni yeni tekrar yazmaya basladim 18f2520 de benzer bir sorun yasadim      islemci patates mi deyi turkiye temsilcisine arkadasimi gonderdim  su bu konuda siralar cok sikayet aldiklarını soylediler   hic ugrasmadan external kullandim.
:=

birkan

Ben elektriğin kesildiğini external interrupt ile tespit edip eeprom a yazıyorum. Bu şekilde yapmaya çalışsanız sorun yaşamazsınız

ziyaretci

@Salih :
Aklımda hocam, devrede lcd var, ram bellek'de aynı işlevi görür. Ama daha bu şekilde bir tespit yapmadım. Kilitlenmenin beslenme kaynaklı olduğunu düşünerek.

@Karamel :

Hocam; timer0 kesmesi ile 13ms'de bir ilgili pini kontrol ederek eğer elektrik kesilmiş ise verileri yazdırıyorum. External 'da bir çözüm evet. Fakat şuan kesintiyi timer dışına çıkardım. Her main döngüsünde kontrol ediyorum. Test etme imkanım olmadı daha. Anca birkaç gün içinde.

@RaMu :

Hocam bu anlattıklarınız üzerinden timer kesmesinde yaşanabilecek bu aksaklıklar programı belli bir süre kilitleyip, konu açıklamasında da belirttiğim gibi 10-15 saniye sonra işlemlerin tekrar devam etmesine yol açar mı? Yani bu durum bazen 15 dakika sonra bazen 2 saat sonra meydana geliyor.

Değiştirmeden önceki timer kesmesi kısmı aşağıda:
#int_timer0
VOID kesme(){  


if(input(pin_d4)){
kyt_dldrln[0] = make8(doldurulan,0);
kyt_dldrln[1] = make8(doldurulan,1);
kyt_dldrln[2] = make8(doldurulan,2);
kyt_dldrln[3] = make8(doldurulan,3);

write_eeprom(13,kyt_dldrln[0]);
write_eeprom(14,kyt_dldrln[1]); 
write_eeprom(15,kyt_dldrln[2]); 
write_eeprom(16,kyt_dldrln[3]);

write_eeprom(20,1); 

output_high(led_sari);

 }

if(zmn1==38){zmn1=0; l++;}
if(menu_anahtar==1){zmn1++;}

if(zmn2==8){zmn2=0; l1++;}
if(b_aktif==1){zmn2++;
if( l1==1 ){if(ses==1)output_high(buzzer);output_high(led_yesil);}else
if(l1==2 ){output_low(led_yesil); if(ses==1)output_low(buzzer);l1=0;}
}else if(d_aktif==1){output_high(led_yesil); d_aktif=0;}
zmn3++;
if(zmn3==19){zmn3=0; l2++;}
if(l2==1)agirlik_ekran_bas=1;else if(l2==2){agirlik_ekran_bas=0;l2=0;}
ZMN4++;
if(zmn4==50){zmn4=0; l4++;}
if(l4==1)ana_ekran_bas_onay=1; else if(l4==2){ ana_ekran_bas_onay=0; l4=0;}
if( l==1){output_high(led_sari);}else if(l==2){output_low(led_sari);l=0;}
if(input(ana_depo_sensor) && menu_anahtar==0){output_low(ana_bant);} else if(menu_anahtar==0) { output_high(ana_bant);}

set_timer0(0); 
}


@dursuncemal :

Hocam 16F serisinden 877A kullanıyorum. Şuan elektrik kesintisini main döngü başında kontrol ediyorum.

@birkan :

Artık bir daha ki tasarımlarda ext int ile deneyeceğim.

Mucit23

CCS için şöyle bir tanımlama kullanılabilir

#device WRITE_EEPROM = NOINT

18F'de daha önce benzer bir durum başıma geldi. Kesme arka planda çalışırken ana programda eeproma birşeyler yazmaya çalıştığımda kesme sekteye uğruyordu. Benzer bir sorun olabilir.

RaMu

#int_timer0
VOID kesme(){ 
if(input(pin_d4)){.....

bence bu kontrol yetersiz
pin_D4 deki bilgi çok çok temiz olsa bile
yani donanımsal olarak 1 - 0 veren bir düzenek kurulmuş olsa bile
her ihtimali göz önüne almak lazım.

Kodun sonuna bakınca
yani eeproma durum kaydedilip
kesmeden çıkılan yere;
kesmeden çıkılırken pin_d4 ün ne durumda olduğu kontrol edilmiyor,
yani,
kesmeden çıkıp tekrar kesmeye geri dönebilir ve
halen pin_d4 geçerli durumda olabilir.

Neyse daha detaylı bakmak lazım, bu bilgilerle yanlış yorum yapılabilir.

Genel olarak:
kyt_dldrln[0] = make8(doldurulan,0);

Kısmında yanlış hatırlamıyorsam CcsC saçmalayabiliyor,
make8 in karşısında direk bir ram değişkeni görmek isteyebiliyor. (Not: yanlış hatırlamıyorsam)

Aynı durum aşağıdada geçerli:
write_eeprom(13,kyt_dldrln[0]);


Birde
timer kesmesiin içi çok uzun gibi, ama çok zaman harcayan işler yok sanırım, detaylı bakmadım.

Timer kesmesinden çıkmadan hemen önce
timer kesmesinide sıfırlaman faydalı olabilir,

....
-clear interrupts (timer_0) gibi birşeydi-
set_timer0(0);
}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ziyaretci

Alıntı yapılan: Mucit23 - 19 Ocak 2016, 22:12:34
CCS için şöyle bir tanımlama kullanılabilir

#device WRITE_EEPROM = NOINT

18F'de daha önce benzer bir durum başıma geldi. Kesme arka planda çalışırken ana programda eeproma birşeyler yazmaya çalıştığımda kesme sekteye uğruyordu. Benzer bir sorun olabilir.
Tavsiyelerinizi dikkate alıp değiştireceğim hocam. Verdiğiniz bilgiler için teşekkür ederim.

Varsa bu konuda tecrübesi, yaşanmışlığı olan paylaşırsa sevinirim.

dursuncemal

#12
ben eeproma yazmayi elektrik kesintisinde hic kullanmadim. bu yuzden kesin sorun sudur dıyemem ama; sorum su  eletrik in kesildigi  sinyalini beslemenin neresinden aliyorsun!!!  zira      if(input(pin_d4)  sorusu icin cok gec olabilir.

maindede sorsan timer interrupta da sorsan.hicbiri ext int ten daha hizli ve mantikli olamaz.  besleme ni seri bir diyotla verirsen daha uzun sure islem yapabilirsin.

1: brovn out isini bozabilir yazdiktan sonra reset atar   if(input(pin_d4) icide islem  yapacak takatin bitene kadar donup durur programın hangi asamada calismayı kesecegi bilinmez.
2:sleep ise yararmi bilmiyorum denemede fayda var
3:yazma bittikten sonra!!!!!! global int i kapat ki programin birdaha interrupta gelmesin  yoksa calisacak voltaj oldukca pic calismaya devam eder ve  hangi asamada calismayı kesecegi bilinmez sikinti olur.
4:bir bit yada bayt tanimla yazma bittikten sonra  bir daha yazdirma
5:yazmadan sonra sonsuz gonguye gir
                                       tabi butun bunlar icin bronout kapali olmali simdilik aklima gelenler bunlar
877 hic kullanmadim. ama  yaptigin ise gore  hafiza yettigi surece kudretli bir islemci oldugunu biliyorum.
!!!!!!!!!!!!!!!!      daha cok cin mali makineleri gozleme imkanim oldu  atmelde kullansalar pic te kullansalar  cok basit makinelerde bile eepromu external kullaniyorlar son 5 yıldır dıkkat etigim bir bir konudur.

mesaj birleştirme:: 20 Ocak 2016, 03:12:57

Alıntı yapılan: erkantr67 - 19 Ocak 2016, 23:11:50
Tavsiyelerinizi dikkate alıp değiştireceğim hocam. Verdiğiniz bilgiler için teşekkür ederim.

Varsa bu konuda tecrübesi, yaşanmışlığı olan paylaşırsa sevinirim.

vala butun interruplari kapatip yazdim olmadi ki yillardir internal kullaniyorum hic sorun olmamisti      microchip  turkiye temsilcisine arkadasimi gonderdim  bu konuda   sikayet aldiklarını soylediler   hic ugrasmadan ext kullandim.

ama su siralar yeni bir isim var biraz vaktim olacak ustune giderim her nekadar   sikayet aldiklarını soyleseler bile acikcasi ccs den pirelendim.ıyıce tembellestirdi beni nerden bulastım  bilmiyorum.
:=

ziyaretci

Alıntı yapılan: dursuncemal - 20 Ocak 2016, 03:03:10
ben eeproma yazmayi elektrik kesintisinde hic kullanmadim. bu yuzden kesin sorun sudur dıyemem ama; sorum su  eletrik in kesildigi  sinyalini beslemenin neresinden aliyorsun!!!  zira      if(input(pin_d4)  sorusu icin cok gec olabilir.

maindede sorsan timer interrupta da sorsan.hicbiri ext int ten daha hizli ve mantikli olamaz.  besleme ni seri bir diyotla verirsen daha uzun sure islem yapabilirsin.

1: brovn out isini bozabilir yazdiktan sonra reset atar   if(input(pin_d4) icide islem  yapacak takatin bitene kadar donup durur programın hangi asamada calismayı kesecegi bilinmez.
2:sleep ise yararmi bilmiyorum denemede fayda var
3:yazma bittikten sonra!!!!!! global int i kapat ki programin birdaha interrupta gelmesin  yoksa calisacak voltaj oldukca pic calismaya devam eder ve  hangi asamada calismayı kesecegi bilinmez sikinti olur.
4:bir bit yada bayt tanimla yazma bittikten sonra  bir daha yazdirma
5:yazmadan sonra sonsuz gonguye gir
                                       tabi butun bunlar icin bronout kapali olmali simdilik aklima gelenler bunlar
877 hic kullanmadim. ama  yaptigin ise gore  hafiza yettigi surece kudretli bir islemci oldugunu biliyorum.
!!!!!!!!!!!!!!!!      daha cok cin mali makineleri gozleme imkanim oldu  atmelde kullansalar pic te kullansalar  cok basit makinelerde bile eepromu external kullaniyorlar son 5 yıldır dıkkat etigim bir bir konudur.

Elektrik kesintisini algılamada herhangi bir sıkıntı yaşamıyorum. SMPS 150-200ms süre tanıyor bu işlem için. Yazma işlemi bittikten sonra bir daha yazdırmıyorum. Bunun için sizin dediğiniz gibi bir değişkeni kullanıyorum.

@RaMu hocanın dediği gibi eeprom'a veri yazmaya başlamadan timer kesmesini sizin dediğiniz gibi global ile kapatıyorum artık. İşlem bittikten sonra tekrar açıyorum.   Ext int'i neredeyse vurgulamayan yok. Bir dahaki tasarım da ext kullanacağım.

  İşte tek sorunum programın belli belirsiz kilitlenmesiydi. Belli bir süre sonra tekrar devam etmesi. Buradaki şüphem timer kesmesinde eeproma veri yazmamdı. Yukarıda da bu şüpheyi destekleyen cevaplar aldım. Bakalım test ettikten sonra sonucu buraya yazarım. Umarım sorun çözülür.

dursuncemal

#14
degisken tam cozum olmayabilir en temizi  @RaMu hocanın dediği ben simdi farkettim gozden kaciirmısım   @RaMu hocanın dediği nin yaninda benimki sacmalik oldu cünku reset yersen degisken ise yaramaz ama ccs ye biraz calismak lazim.resetle nerden geldigi ile bilgi alina biliyor duruma gore hareket edilebilir.

supenizle ilgili lcdyi kullanin gezdiginiz fonksiyonlari lcdden takip edin yakalarsiniz sanirim.

mesaj birleştirme:: 20 Ocak 2016, 17:37:20

siz kesintiyi diret 220 den algiliyorsunuz sanirim.

mesaj birleştirme:: 20 Ocak 2016, 03:49:40

birde hocam eeproma yazarken yada okurken dogru yazdigina  veya okuduguna  dair basit bir saglama yapmak lazim.
:=