avatar_ete

Zaman Ayarlı Start-Stop Rölesi

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

ete

100 ms lik dilimler için en güzeli PicMulticalc programına sorun gerekli parametreleri ondan almak. Ama bizde şöyle bir hesap yaparak bulabiliriz parametreleri,
Sayılacak süre 100 ms. Bu aynı zamanda 100.000us dir. 4Mhz işlemci frekansında her bir komut çevrimi 1us olduğuna göre bu 100.000 sayıma denk gelirki bu max sayma değeri olan 65535 den büyük olduğu için sayma işleminde en azından 1/2 bölme oranını kullanmamız gerekecktir. Bu durumda sıylacak miktar 50.000 olacaktır. Sayacın belirli bir sayıdanbaşlayarak 50000 sayıp 65535 e ulaşması gerekiyorki kesme yaratabilsin. O halde 65535-50.000=15535 den saymaya başlaması gerekecektir.
Bu durumda 1/2 bölme oranı ile 15535 den başlayıp 50.000 sayarsa geçecek süre 100000 us yani 100 ms olacaktır.

İşin diğer kısmında ise bu sefer 1 sn lik süreyi aşabilmek için bu dilimlerden 10 adet kullanmak gerekecektir. Önceki hesabımızda 2 dilim 1 sn ederken şimdi 10 dilim 1 sn edecektir. Pot ile süre hesabında bulunacak değerleri en azından 5 misli artırmak gerekir.

Ete

mali4242

Burada led  röleyle birlikte sabit yanıyor. acaba kodda değişiklik yaparak flash yaparak yanmasını sağlayabilir miyiz?

mali4242

Alıntı yapılan: mali4242 - 12 Kasım 2024, 17:44:15Burada led  röleyle birlikte sabit yanıyor. acaba kodda değişiklik yaparak flash yaparak yanmasını sağlayabilir miyiz?

mümkünmüş. led flash yapacak, 5. pin low oldu zaman çalışmaya başlayacak ve 1-15 saniye zaman aralığında olacak şekilde değiştirildi.

'@ DEVICE pic12F675
'@ DEVICE pic12F675, WDT_ON
'@ DEVICE pic12F675, PWRT_ON
'@ DEVICE pic12F675, PROTECT_OFF
'@ DEVICE pic12F675, MCLR_off
'@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT
@ __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_SAMPLEUS 10
CMCON = 7

RAW    VAR WORD
SURE  VAR WORD
ZAMAN  VAR WORD
SN    VAR BYTE
FLAG  VAR BIT ' Durum değişkeni

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
FLAG = 0
PAUSE 300

BASLA:
    ADCIN 0, RAW
    ' Potansiyometre değeri 0-1023 arasında, süreyi 1-15 saniye arasında ayarlıyoruz
    SURE = (RAW / 68) + 1  ' Bu formül ile süre 1 ila 15 saniye arasında olur

    ' 5. pin high ise flag sıfırlanır, LED ve ROLE kapatılır
    IF TUS = 1 THEN
        LED = 0
        ROLE = 0
        FLAG = 0
        GOTO BASLA
    ENDIF

    ' 5. pin low ve flag sıfır ise sayma başlar
    IF TUS = 0 AND FLAG = 0 THEN
        ROLE = 1
        FLAG = 1 ' Sayma başladığında flag 1 yapılır
        ZAMAN = SURE
        GOTO SAYDIR
    ENDIF

    GOTO BASLA

SAYDIR:
    T1CON = %00110101
    PIR1.0 = 0
    SN = 0

SAYIKI:
    TMR1H = $0B
    TMR1L = $DC
    PIR1.0 = 0

    WHILE PIR1.0 = 0
        ' Sayma sırasında buton kontrolü yapılmıyor
    WEND

    ' LED'in yanıp sönmesi
    LED = 1
    PAUSE 100  ' LED yanık kalma süresi
    LED = 0
    PAUSE 100  ' LED sönük kalma süresi

    SN = SN + 1
    IF SN < 2 THEN SAYIKI ' 2 kesme 1 saniye yapıyor

    ZAMAN = ZAMAN - 1
    IF ZAMAN > 0 THEN GOTO SAYDIR

    ' Süre bittiğinde ROLE ve LED'i kapat, flag değiştir
    ROLE = 0
    LED = 0
    PAUSE 100
    GOTO BASLA

ete

Daha güzeli olabilir. SAYIKI etiketi altında zaten TMR1 sayacı ile zaman sayılıyor. O led'in en azından her saniye yada 500ms de bir flash yaptırılması o kısımda mümkün olabilir. Wend satırından sonra oraya koyduğun pause ler sistemin doğru zaman saymasını engelleyecek nitelikte her sefer 200 ms şaşacaktır zaman sayacı.
O kısımda Sn değeri her 500 ms de bir artıyor. Zaman değeri ise her sn de bir artıyor. Bu aralıklarda istediğin yere yani sn artırımından sonrasına veya zaman artırımından sonrasına Led=1-Led komutunu yerleştirirsen ve o eklediğin komutları kaldırırsan istediğin olacak zamanda şaşmayacaktır.

Ete

mali4242

#64
Alıntı yapılan: ete - 13 Kasım 2024, 08:19:59Daha güzeli olabilir. SAYIKI etiketi altında zaten TMR1 sayacı ile zaman sayılıyor. O led'in en azından her saniye yada 500ms de bir flash yaptırılması o kısımda mümkün olabilir. Wend satırından sonra oraya koyduğun pause ler sistemin doğru zaman saymasını engelleyecek nitelikte her sefer 200 ms şaşacaktır zaman sayacı.
O kısımda Sn değeri her 500 ms de bir artıyor. Zaman değeri ise her sn de bir artıyor. Bu aralıklarda istediğin yere yani sn artırımından sonrasına veya zaman artırımından sonrasına Led=1-Led komutunu yerleştirirsen ve o eklediğin komutları kaldırırsan istediğin olacak zamanda şaşmayacaktır.

Ete
şu şekilde mi hocam?
'@ DEVICE pic12F683
'@ DEVICE pic12F683, WDT_ON
'@ DEVICE pic12F683, PWRT_ON
'@ DEVICE pic12F683, PROTECT_OFF
'@ DEVICE pic12F683, MCLR_off
'@ DEVICE pic12F683, INTRC_OSC_NOCLKOUT
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF

DEFINE OSC 4  ' Dahili osilatör frekansı 4 MHz

DEFINE ADC_BITS 10
DEFINE ADC_SAMPLEUS 10
CMCON0 = 7  ' PIC12F683'te komparatör kapatma ayarı

RAW    VAR WORD
SURE   VAR WORD
ZAMAN  VAR WORD
SN     VAR BYTE
FLAG   VAR BIT ' Durum değişkeni

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
FLAG = 0
PAUSE 300

BASLA:
    ADCIN 0, RAW
    ' Potansiyometre değeri 0-1023 arasında, süreyi 1-15 saniye arasında ayarlıyoruz
    SURE = (RAW / 68) + 1  ' Bu formül ile süre 1 ila 15 saniye arasında olur

    ' 5. pin high ise flag sıfırlanır, LED ve ROLE kapatılır
    IF TUS = 1 THEN
        LED = 0
        ROLE = 0
        FLAG = 0
        GOTO BASLA
    ENDIF

    ' 5. pin low ve flag sıfır ise sayma başlar
    IF TUS = 0 AND FLAG = 0 THEN
        ROLE = 1
        FLAG = 1 ' Sayma başladığında flag 1 yapılır
        ZAMAN = SURE
        GOTO SAYDIR
    ENDIF

    GOTO BASLA

SAYDIR:
    T1CON = %00110101
    PIR1.0 = 0
    SN = 0

SAYIKI:
    TMR1H = $0B
    TMR1L = $DC
    PIR1.0 = 0

     LED = 1
    PAUSE 100  ' LED yanık kalma süresi
    LED = 0
    PAUSE 100  ' LED sönük kalma süresi
    WHILE PIR1.0 = 0
         
         ' Sayma sırasında buton kontrolü yapılmıyor
    WEND

    ' LED'in yanıp sönmesi
   

    SN = SN + 1
    IF SN < 2 THEN SAYIKI ' 2 kesme 1 saniye yapıyor

    ZAMAN = ZAMAN - 1
    IF ZAMAN > 0 THEN GOTO SAYDIR

    ' Süre bittiğinde ROLE ve LED'i kapat, flag değiştir
    ROLE = 0
    LED = 0
    PAUSE 100
    GOTO BASLA

ete

Açık ve net bu işi bilmiyorsun. Bilgin eksik.
Bir timer-1 döngüsü geri planda işlemcinin clok palsleri ile sayar. 16bitlik sayac olduğu için değeri 65535 i aştığı anda PIR1.0 bitini otomatik 1 yapar yani set eder.
Şimdi sen o sayac döngüsü içine pause yerleştirirsen bütün işi berbat etmiş olursun. Sayac değeri 65535 i aşsa bile bayrak set edilemeyebilir. Çünki bir başka kural daha var. Basic komutu olan Pause işlenir iken kesme, flag bitleri gibi şeylere bakılamaz. Bu kadar bilgi yeterli anlayabiliyor isen.
Benim anlatmak istediğim timer-1 döngüsü (while -wend arası) zaten bir zaman sayacı daha doğresu belirli bir zamanın geçmesi burada bekleniyor. Program wend komutunu geçerse anlaki 500ms dolmuştur.
O halde  programa tekrar dönelim ve bundan nasıl yararlanacağımıza bakalım.
SAYIKI:
	    TMR1H = $0B
	    TMR1L = $DC
	    PIR1.0 = 0
	 
	    WHILE PIR1.0 = 0
	        ' Sayma sırasında buton kontrolü yapılmıyor
	    WEND
	 'şayet gereken kodu buraya eklersem led her 500ms de bir flash yapacaktır.
             Led=1-Led  'buda flash yapmasını sağlayacak komut toggle komutunun bir başka şekli.
	 
	    SN = SN + 1
	    IF SN < 2 THEN SAYIKI ' 2 kesme 1 saniye yapıyor
	 
'Şayet gereken kodu bu aralığa yazarsam led her 1 sn de bir flash yapacaktır.
'eklemen gereken kod yine aynı aşağıdaki şekilde. Hepsi bu kadar.
'            Led=1-led birisinden biri açık olacak o nedenle bunu kapadım.
	    ZAMAN = ZAMAN - 1
	    IF ZAMAN > 0 THEN GOTO SAYDIR
Sistem nasıl çalışıyor anlatayım yinede.
While PIR1.0=0
Wend
aralığında program PIR1.0=1 oluncaya kadar wend satırını geçmeden arada bekler.
Tam 500ms sonra PIR1.0=1 olur ve program wend satırını geçer. İşte o anda 500ms lik süre geçmş olacaktır. Led konum değiştirir 1 iken sıfır olur yada sıfır iken 1 olur.
Anlayacağın her 500ms sonunda led konum değiştirir. Böylece pause kullanmadan o lede konum değiştirtmiş olursun ki bunda flash yaptırma deniliyor.


Ete

mali4242

Alıntı YapAçık ve net bu işi bilmiyorsun. Bilgin eksik.

benim böyle bir iddiam olmadı zaten. önce sordum, cevap veren olmayınca imkanlar dahinlinde yardım alarak bişey yaptım ve yükledim. hatta özellikle mesajımda değiştirdim bile demedim "değiştirildi" yazdım.

ete

İddian olduğu için söylemedim o lafı zaten. Eksikliğini gör ve tamamla diye söyledim.
Ete

mali4242

Alıntı yapılan: ete - 15 Kasım 2024, 10:34:41İddian olduğu için söylemedim o lafı zaten. Eksikliğini gör ve tamamla diye söyledim.
Ete


çok gereksiz bir laf ve kırıcı hitap.
mesela siz ATM8 işlemciye program atma başlığında sormuşsunuz ama kimse sizinle alakalı böyle yorum yapmamış çünkü gerek yok. konuyu bilen yazmış, bilmeyen bakmış öğrenmiş.
her neyse, iyi günler.

ete

Bana göre gereksiz tepki ve alınganlık alınacağın kelimelere bakacağına işin özüne baksan daha iyi olmazmıydı sana cevap vermiş ve çözümüde sunmuşmuyum sen ona bak neden laflara bu kadar takıntılısın. Art niyetle söylesem çözümde sunmazdım öyle düşün. İşe odaklan yan unsurlara değil. Asıl kusurunda bu olsa gerek.

Ete

Powered by EzPortal