pic12f675 eeprom sorunu elektrik kesintisi

Başlatan yerkirazi, 01 Ocak 2016, 18:14:28

yerkirazi

Sayın arkadaşlar lütfen aşağıdaki yazılım hakkında yardım ederseniz sevinirim.
elektrikler kesildiğinde sayac kaldığı yerden devam etsin istiyorum.
Yazılımda bir hata varsa düzeltebilirmisiniz lütfen,saygılarımla.

'* Name : UNTItlED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 09.06.2013 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
DEFINE OSC 4
DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor

CMCON = %00000111
ANSEL= 0 ' a/d converter iptali için.
TRISIO = %00111011 ' 2. bit çıkış-- diğerleri giriş.
'-------------------------------------------------------------------------------
@ device pic12f675
@ device pic12f675, wdt_on
@ device pic12f675, protect_on
@ device pic12f675, mclr_off
@ device pic12f675, intrc_osc_noclkout
'-------------------------------------------------------------------------------
sayac var byte
durum var byte
yaz var bit
symbol role=gpıo.2
symbol elektrik=gpıo.1
sayac=0


read 1,durum
if durum=255 then
durum=0
gosub sayacyaz
endif
elektrik=durum

basla:
sleep 65500
sayac=sayac+1
if sayac=720 then goto roleac
yaz=1
goto basla

roleac:
pause 100
high role

sayacyaz:
durum=sayac
write 1,durum
yaz=0
return

end



ete

Programda çok hata var. Amacı nedir bu programın?
SAYAC değişkeni WORD tipinden seçilmiş Ama DURUM=SAYAC şeklinde byte değişkeni word değişkenine eşitlenme gibi ters durumlar var.
Ayrıca sayac sürekli sayıyor diyelim ne yapacak sonunda?
SAYAC=10 ise git röle aç demişsin. Madem 10 gibi sayılarda röle açılacak o halde neden sayac değişkeni word tipinden seçilmiş.?
Röle açmaya giden program röleyi açtıktan sonra SAYACYAZ etiketine geliyor ama orad aişini bitirince RETURN komutunu görüyor. Oraya GOSUB ile gelmediği için RETURN ile bir yere dönemeyecektir. Buda hataya sebep verir.
Çok hata var hangi birisini düzeltelim?
Baş tarafında bir iki eksik vardı onları ekledim ama mantığı bilmeyince elim kolum bağlandı.

Ete

yerkirazi

Sayln erol hocam yardimlariniz icin cok tesekkurler.Amacim  rolenin belli bir

zaman sonra cekmesi.Fakat elektrik kesintisinden etkilendigi icin role zamaninda
acmiyor.Saygilarimla.

ete

Basit bir senaryo var ortada. Sayac her 1 sn de bir bir artırılıyor ve değeri 10 olunca gidip röleyi açıyor.
Yani her 10 sn de bir röle açıkmı bakılmış oluyor.
Şöyle bir düşünürsek elektrik kesintisi bu işi nasıl etkiler. Her halde sıkıntı sayac değerini n 10'a yaklaştığı konumda elektrik kesilirse yeniden geldiğinde tekrardan sayacın sıfırdan başlaması gecikmeye sebep olacaktır.
Bu durumda yapılması gereken şey her sayaç artırıldığında sayac değerini kayda almak olmalı diye düşünürüm.
programdaki word tipindeki değişkenleri kaldırıp onları byte yapmak en doğrusu. Hiç bir değişken byte sınırlarını aşmıyor çünki.
ayrıca ıvır zıvır değişkenleride kaldırmak doğru olur herhalde. Mesela, DURUM değişkeni ne işe yaradığı belli değil. Elektrik var veya yok algılayabilmek için birde pin kullanmışsın. Peki algoritma içinde bu pinin görevi nedir?. Elektrik var ise şunu yap yok ise şunu yap demek gerekirdi. Bana kalırsa bu pine de gerek yok.
yapılması gereken,
İlk açılışta , READ 10,SAYAC ,DURUM
IF SAYAC=255 then SAYAC=0 şeklinde komut ilavesi ile en son kayıtlı sayac değerini epromdan okuyacaksın. Bu arada sayac değişkenin byte cinsinden olmalı.
IF DURUM=255 then DURUM=0şeklinde röleninde kapalı olduğunu belirtmek gerekecek.

BASLA satırından itibaren,

SAYAC=SAYAC+1

IF SAYAC=10 and ROLE=0 then
   ROLE=1
   SAYAC=0
   DURUM=1
ENDIF
GOSUB SAYAC_YAZ
Pause 1000

SAYAC_YAZ alt ptogramında hem sayac değerini hemde rölenin açık yada kapalı olup olmadığını yazmak gerekir
O halde SAYAC_YAZ kısmında,
WRITE 10,SAYAC,DURUM
RETURN.
şeklinde bunları yazıp return ile geri dönmek yeterli olacaktır.
Bu şekilde işlem tamamdır. Şimdi en başa dönersek; READ 10,SAYAC,DURUM şeklinde okuma yaptık epromdan.
SAYAC değeri ile pazla ilgilenmemize gerek yok. Ama Durum değişkeni bizee rölenin açık yada kapalı olduğunu söylecek idi. O halde değerlendirmek için;
IF DURUM=1 then ROLE=1 demek doğru olacaktır. Bu satırda basla satırından öncesine yerleştirilmelidir.
Hepsi bu kadar.

Ete

yerkirazi

Saygıdeğer hocam erol bey,çok teşekkürler.
Ben yazılımı örnek değerler olarak verdim.
Asıl amacım 30 gün sonra
röle çeksin ve bırakmasın.Röle su deposu pompasını çalıştıracak.
Sayac değeri elektrik kesildiğinde kaldığı yerden devam etsin istiyorum
Yani sayac 6 olduğunda elektrik kesilirse sayac 6
eeprom 'a kaydedilsin.
Elektrik geldiğinde sayac 6 olarak başlayıp
sayac 7 diye saysın.Sonunda röleyi çekip bırakmasın.
Elektrik kesilip gelse bile röle devamlı çekili kalsın.
Benim denemelerimde,
elektrikler geldiğinde herşey sıfırdan tekrardan başlıyor.
Saygılarımla.

ete

Mesajımı iyi okumamışsın. Yeniden ve dikkatli oku. İstediğin her şey orada mevcut.
Tek eksik çekmiş rölenin ne zaman ve nasıl bırakacağı.

Ete

POWER

ete hocam,
sayac değerini her saniye yazmak eepromu kısa zamanda deforme etmezmi?Çünkü benim anladığım 0........10sn boyunca  sayacın değeri eeproma yazılması lazım.çünkü elektrik kesintisinin zamanı belli değil.bence devreye pil ilavesi gerek.kesinti olduğu anı picin algılayıp o andaki sayac değerini eeproma yacak kadar picin pilden çalışması lazım.bu işin başka yöntemi varmıdır bilmiyorum?

ete

Bir işi yapmanın türlü yolu var. Kimi kolay yolu seçer kimide zor yolu seçer yada olması gereken yolu seçer.
Bu konuda kimseyi ayıplamam. Artık bu tür uyarıları yüzlerce kez yaptığımı yani yeterince yaptığımı düşünüyorum.
bazı şeyler denemeyince insanın aklına oturmuyor. Bu nedenle dene gör politikası genelde çok işe yarıyor.
Denersin ve baktınki aksayan yerler var o zaman nedir bu işin doğrusu dersin ve yeniden araştırır ve doğruyu bulursun.

Ete

Powered by EzPortal