avatar_ete

Zaman Ayarlı Start-Stop Rölesi

Başlatan ete, 04 Eylül 2011, 10:40:25

ete

Alıntı YapHocam saygılar bu devrenin eski versiyonunu kullanıyordum.5 dakikayı 15 dakika maximuma çıkarmaya çalıştım,ve farkettimki bton start yapıyor stop yapmıyor,
Sebebi ne acaba?. Böyle bir şey olamaz diye genelleme yapabilirim.
Alet ne emir verirsen onu yapar. Yapmıyor ise yaptıramıyorsundur. Biraz sesli düşünelim.
Maksimum 15 dakika min ise 1 dakika lık süre vereceğiz pot ayarlayarak. Formülün sonunda 1 dakika ekleyeceğimiz için 14 dak üzerinden hesabımızı yapacağız.
14/1024=0,013671875  çıkıyor. Bunu 256 ile çarpalım 3,5 çıkıyor. Bunu 35 olarak kullanalım sonucu 10'a böleceğiz.
O halde formül, SURE=((HAM+1)*/35)/10+1 şeklinde olacaktır.
Pot değerine bağlı olarak bu formül sistemin ne kadar süre çalışacağını belirleyecek.
BASLA ile Goto BASLA arasındaki program satırları süre hesabını yapıp tuşa basılıp basılmadığını kontrol ediyor. Basıldığını kolayca tespit edebilecek demektir. Zira başka işi yok gibi zaten. Basılır basılmaz program SAYDIR isimli etikete gidecek.
Bu etiket altında sistem , TMR1 sayacını kullanarak 500ms lik zaman dilimleri yaratıyor ve her 120 adetlik dilim 1 dakika ediyor. Sonuçta bu dakikaları sayarak SURE değerine ulaşılıp ulaşılmadığını kontrol ediyor. Arada da sadece Tuşa basılıyormu onu kontrol ediyor. O halde burada da hemen hemen bir işi yok programın. Zira TMR1 sayacı geri planda sayıyor biz sadece zaman aşımı olmuşmu diye TMR1 sayaç kesme bayrağına (PIR1.0) bakıyoruz. Bu durumda durdurma komutununda çok verimli çalışması gerekir.
Çalışmamazlık yapıyor ise mutlaka SAYDIR etiketi altındaki while wend komutundan sonra bir gecikme istiyordur. Zira tuş titremesi buna sebep oluyor ve programın hemen başa dönmesine sebep oluyordur. Bu nedenle tedbir olarak;
SAYDIR:
       WHILE TUS=0:WEND
       ZAMAN=SURE:DAK=999
yerine
SAYDIR:
       WHILE TUS=0:WEND
       ZAMAN=SURE:DAK=999
       pause 100
yazmak sorunu çözecektir.

Bu sistemde zaten fazladan buton kullanımından kaçmak istiyorduk. Bir buton daha eklemek bana mantıklı gelmedi.
Tek butonu çalışır hale getirmek daha mantıklı bence. Sen yukarıdakileri dene bence.

Ete

onurinci

hocam
çok sağolun verdiğiniz formülle 15 dakikayı yakaladım,ve stop butonunda önerdiğiniz değişikliği yapınca buttonda ki stop sorunuda çözüldü klavyenize sağlık,
mutfaktaki aspiratör'ün elektronik devresi yandı çat çat butonlar var ben minik bir yayı yerinden çıkararak bas bırak yaptım bordun üzerinde damlacık işlemci var ve bu gitmiş,deldim pot taktım içinde ssr röle var sistem ellerinize sağlık gayet güzel çalıştı,ve cihazın üzerinde tek buton sağlam aç kapa timing yapabiliyoruz,o yüzden ikinci bir button ile sürekli çalışma modu isteğinde bulunmuştum,neyse bir delik daha delip sadece SSR'yi uyarırım..
hocam o zaman bu URL'deki stop butonunuda düzeltip tekrar yükler iseniz ,indiren'de stop sorunu ile uğraşmaz..iyi günler dilerim..   http://etepic.com/index.php?action=dlattach;topic=53.0;attach=4474

yanuma000

#47
 RAW    VAR WORD 56    sn 59 saydıktan sonra 1 üst dakikaya mı yol veriyor
WPU.2=1          bu ne işe yarıyor 


bunların açıklaması nedir diye sorsam kusura bakmayın  saygılarımla

onurinci

 RAW    VAR WORD 56    sn 59 saydıktan sonra 1 üst dakikaya mı yol veriyor
WPU.2=1          bu ne işe yarıyor 




WPU.2=1 12F675 'te dahili PullUp'tan GPIO 2'yi içeriden aktif ediyor,yani dışarıdan direnç koymaya gerek kalmıyor..

RAW    VAR WORD 56 buradaki 56 sanıyorum simulasyonda registerlerin aldığı değeri gözlemleyebilmek için,hocam daha net açıklayabilir...

yanuma000


ete

#50
RAW değişkenini sormuyorsundur her halde. yanında yer alan 56 rakamı onun 56 nolu hafızaya (aslında 56-57 nolu adreslere)  yerleştiğini gösteriyor. Bu özelliği zaman zaman kullanıyoruz zira bu sayede simulasyonda değişkenin aldığı değerleri izleyebilme imkanımız oluyor. Gerçek devrede hiç bir işe yaramaz.

Ete

yanuma000


tiviki

ekte verdiğiniz devrenin süresini 0 ile 10 saniye arasında ayar yapacak şekilde olan programı varsa rica etsem paylaşabilirmisiniz?

ete

#53
Program deneysel amaçlı ve algoritma göstermek amacı ile yazıldı. Farklı süreler için versiyonu mevcut değil maalesef. Süre için formül verdim aklı eren uygular istediği süreyi uygular.
Ete

tiviki

Aklı eren arkadaşlara rica ederim yardımcı olabilirlermi acaba

muyat

Tekrar bi şey sormak istiyorum bu konuyla ilgili.
Güncellenen dosyayı yeniden indirdim...
Fakat watch window ekranından geçen süreyi göremiyorum.
Watch window ekranından izlemem için ne yapmam gerekli?

ete

#56
İzlemek istediğin değişkenin adını, yanında yer alan hafıza rakamını ve tipini bir yere not et. Sonra simülasyonu çalıştırıp pause tuşuna bas. Yukarıda debug butonuna tıkla ve açılan ek, adres kısmına hafıza adresini yaz ve değişken tipini seçip paus u kaldır. Böylece program çalışırken ilgili değişkenin aldığı değerleri izleyebilirsin.
Ete

muyat

Hocam bi soru daha sorayım
Butona basınca 0-6 saniye arasında röle çektircez diyelim.Ve potansiyometre tam orta konumda veya potansiyometre sürekli sabit bir konumda olsun diyelim.Saniyelerin kesinlikle her defasında dogru ölçüm yapmasını istiyoruz diyelim.
Potansiyometrenin pozisyonu sürekli sabit kalsa bile tmr1 kullanmazsam çıkıştaki sürenin her defasında milisaniye bile olsa değişme ihtimali var mıdır? Çünkü ben net ve her defasında aynı sonucu almak istiyorum.
Veben bu işlemi TMR1 kullanmadan da yapıyorum (sitede 12f675 10k pot konusundaki bilgilerle)
Ama bir ara fırsat bulursam çıkışa kronometre takıp hem normal yolla,hem de TMR1 ile yapılan yazılım arasındaki farkı görmeye çalışacagım.
Yani asıl soru şu:Karmaşık olmayan sade bir yazılımda TMR1 kullanmazsak süre şaşırabilir mi?



ete

#58
Timer kullanmadan süre her zaman aynı olmayanilir. Tabiiki ms cinsinden olur farklılık. Burada şöyle düşünmek gerekir. Timer kullanmadan yaptığın taktirde komut gecikmeleri devreye girecek ve sürenin bailangıç ve bitişi seni kontrolünden çıkacaktır. Ama Timer kullanınca kontrol senin elinde olacak komut gecikmesine bakılmaksızın timer gibi net süre değeri veren bir ölçüm birimine bakarak süre tayini yapacaksın.
Ete

muyat

#59
Hocam
Programa şöyle bi tekrar inceleyim dedim...
Diyelimki ben maksimum sürem 5 saniye istiyorum diyelim.
Sizin eklediginiz kodlarda sadece 120 sayısını 1 yaptıgımda 1 adet kesme 500 ms yapıyor.
sure=((raw+1)*/225)/100+1 ' burdaki 100 degerini 225 olarak değiştirdigimde sure maksimum degerde 10 çıkıp 500 ile çarpılarak
500x10=5000 yani 5 saniye elde edebiliyoruz fakat 500 milisaniyelik zaman dilimleri halinde oluyor bu.
Peki benim çok hassas bir devrem var ve 100 milisaniye bile önemli dersem o zaman nasıl yapacagız?Yani kesme kullanarak 100 milisaniyelik zaman dilimini nasıl elde ederiz bu durumda?




@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF 

DEFINE OSCCAL_1K 1 

DEFINE OSC 4

DEFINE ADC_BITS 10   
'DEFINE ADC_CLOCK 1   
DEFINE ADC_SAMPLEUS 10
CMCON = 7

RAW    VAR WORD 56
SURE   VAR WORD 58
ZAMAN  VAR WORD 60
DAK    VAR WORD 62
X      VAR BYTE 64
SN     VAR BYTE 65


symbol TUS=GPIO.2
SYMBOL LED=GPIO.1
SYMBOL ROLE=GPIO.5

OPTION_REG.7=0
GPIO=0
TRISIO=%00000101
ANSEL =%01010001
ADCON0.7=1
WPU.2=1
ROLE=0
PAUSE 300
BASLA:     
        ADCIN 0,RAW

        sure=((raw+1)*/225)/100+1 '
       
        IF TUS=0 THEN
           TOGGLE ROLE
           pause 100       
           IF ROLE=1 THEN
             LED=1
             GOTO SAYDIR
           ELSE
             ROLE=0:LED=0 
           ENDIF   
        ENDIF
       
        GOTO BASLA
           
SAYDIR:
       WHILE TUS=0:WEND
       ZAMAN=SURE:DAK=999
       pause 100
       
SAYBIR:
       T1CON=%00110101:PIR1.0=0:SN=0
SAYIKI:
       TMR1H=$0B:TMR1L=$DC:PIR1.0=0 
       WHILE PIR1.0=0
         IF TUS=0 THEN
            ROLE=0:LED=0
            WHILE TUS=0:WEND
            pause 100
            GOTO BASLA
         ENDIF                         
        WEND
        SN=SN+1:IF SN<1 THEN SAYIKI
        ZAMAN=ZAMAN-1:IF ZAMAN>0 THEN SAYBIR   
        ROLE=0:LED=0
GOTO BASLA


Powered by EzPortal