16F88 ile 4 motorun akım kontrolü

Başlatan . Kağan, 03 Şubat 2014, 22:01:26

. Kağan

#15
Şimdi biraz daha anladım. Yani,

IF (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN
    B_KA = B_KA + 1
    IF B_KA=3 THEN
        EN_KUCUK=OLCUM_A
        B_KA=0
    ENDIF
ENDIF

IF (OLCUM_A<=OLCUM_C) and (OLCUM_A>0) THEN
    B_KA= B_KA + 1
    IF B_KA=3 THEN
        EN_KUCUK=OLCUM_A
        B_KA=0
    ENDIF
ENDIF

IF (OLCUM_A<=OLCUM_D) and (OLCUM_A>0) THEN
    B_KA = B_KA + 1
    IF B_KA=3 THEN
        EN_KUCUK=OLCUM_A
        B_KA=0
    ENDIF
ENDIF

Şeklinde yazdığımda BKA değerini kullanarak OLCUM_A YI değerlendirmiş ve bitirmiş oluyorum. B değeri içinde B_KB kullanarak aynı satırları kopyalamam gerekiyor bu durumda. Doğrumu?

Ayrıca motor akım kontrolünü 1 kez yaptıktan sonra ledleri yakarak sonucu gösterecek daha sonra program duracak. Tekrar mclr den +5v verilince yine kontrol yapacak.

. Kağan

IF (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN
    B_KA = B_KA + 1
    IF B_K=3 THEN
        EN_KUCUK=OLCUM_A
        B_K=0
    ENDIF
ENDIF

IF (OLCUM_A<=OLCUM_C) and (OLCUM_A>0) THEN
    B_KA= B_KA + 1
    IF B_KA=3 THEN
        EN_KUCUK=OLCUM_A
        B_KA=0
    ENDIF
ENDIF

IF (OLCUM_A<=OLCUM_D) and (OLCUM_A>0) THEN
    B_KA = B_KA + 1
    IF B_KA=3 THEN
        EN_KUCUK=OLCUM_A
        B_KA=0
    ENDIF
ENDIF

'*******************

IF (OLCUM_B<=OLCUM_A) and (OLCUM_B>0) THEN
    B_KB = B_KB + 1
    IF B_KB=3 THEN
        EN_KUCUK=OLCUM_B
        B_KB=0
    ENDIF
ENDIF

IF (OLCUM_B<=OLCUM_C) and (OLCUM_B>0) THEN
    B_KB= B_KB + 1
    IF B_KB=3 THEN
        EN_KUCUK=OLCUM_B
        B_KB=0
    ENDIF
ENDIF

IF (OLCUM_B<=OLCUM_D) and (OLCUM_B>0) THEN
    B_KB = B_KB + 1
    IF B_KB=3 THEN
        EN_KUCUK=OLCUM_B
        B_KB=0
    ENDIF
ENDIF

'*******************

IF (OLCUM_C<=OLCUM_A) and (OLCUM_C>0) THEN
    B_KC = B_KC + 1
    IF B_KC=3 THEN
        EN_KUCUK=OLCUM_A
        B_KC=0
    ENDIF
ENDIF

IF (OLCUM_C<=OLCUM_B) and (OLCUM_C>0) THEN
    B_KC= B_KC + 1
    IF B_KC=3 THEN
        EN_KUCUK=OLCUM_C
        B_KC=0
    ENDIF
ENDIF

IF (OLCUM_C<=OLCUM_D) and (OLCUM_C>0) THEN
    B_KC = B_KC + 1
    IF B_KC=3 THEN
        EN_KUCUK=OLCUM_C
        B_KC=0
    ENDIF
ENDIF

'**********************

IF (OLCUM_D<=OLCUM_A) and (OLCUM_D>0) THEN
    B_KD = B_KD + 1
    IF B_KD=3 THEN
        EN_KUCUK=OLCUM_D
        B_KD=0
    ENDIF
ENDIF

IF (OLCUM_D<=OLCUM_B) and (OLCUM_D>0) THEN
    B_KD= B_KD + 1
    IF B_KD=3 THEN
        EN_KUCUK=OLCUM_D
        B_KD=0
    ENDIF
ENDIF

IF (OLCUM_D<=OLCUM_C) and (OLCUM_D>0) THEN
    B_KD = B_KD + 1
    IF B_KD=3 THEN
        EN_KUCUK=OLCUM_D
        B_KD=0
    ENDIF
ENDIF


Şeklinde yazınca en küçük değeri bulmuş oluyoruz. Doğrumu?

ete

#17
Bütün bunları 4 adet ölçüm değerinin en küçüğünü bulmak içinmi, yapıyorsun?
Öyle ise şöyle yap,
ENKUCUK=255
IF OLCUMA<ENKUCUK THEN ENKUCUK=OLCUMA
IF OLCUMB<ENKUCUK THEN ENKUCUK=OLCUMB
IF OLCUMC<ENKUCUK THEN ENKUCUK=OLCUMC
IF OLCUMD<ENKUCUK THEN ENKUCUK=OLCUMD

Bu iflerin sonunda en küçük hangisi ise onu en küçük yapmış olursun. AMa kimden en küçük değer alındı bilemezsin.
Onuda bilmek istersen ikinci bir değişken kullanırsın. A dan geliyorsa ,KIMDEN=0 , B den geliyorsa KIMDEN=1...D den geliyorsa KIMDEN=3 olur yada yaparsın.

Ete


. Kağan

#18
Sıfırdan büyük olma şartını da eklemek gerekiyor. Eğer değer 3 den küçükse büyüklük değerlendirmesine almaması gerekiyor. Yani o motor hiç akım çekiyorsa yada 3 den az çekiyorsa en küçük olamaz.  Yani motorun biri devreden çıkarıldıysa onu en küçük kabul etmemeli.

. Kağan

Birde şunu sorayım. Niçin enküçük=255 yazdınız.

ete

EN küçük olan ya 255 değerini taşıyor ise onuda değerlendirebilmek için.
En küçük yapmak istediğin sayıyı en büyük değer verirsen her küçük olan onun yerine geçer.
Doğrusu budur.
Ete

ete

3 den büyük olma gereği de var ise çok zor değil bu şartı da ilave edersin.
IF OLCUMA>3 and OLCUMA<ENKUCUK THEN ENKUCUK=OLCUMA
bu kadar basit.

Ete

. Kağan

En küçük değerin  hangisine olduğunu bilmem gerekmiyor. En küçük değeri bulmanın sebebi diğerleriyle arasındaki farkı bularak aradaki farkı 10 dan büyük olanları led ile işaretlemek.

. Kağan

Buraya kadar anladım.  Peki en küçük değeri bulmaya Çalıştığım kısımı değerlendirirmisiniz.

ete

Değerlendirdim ya,  bir sürü koda , if satırına ne gerek var diyorum değerlendirmem bu. Yalnızca 4 adet olcüm değerin var iken bir kaç satırlar en küçük bulunuyor işte nasıl douğunuda gösterdim neyi değerlendireceğim başka anlamadım.
Ete


. Kağan

Pardon yanlış söyledim.
En küçük değerle diğerlerinin arasındaki farkın bulundu satırları demeliydim. Fark eğer 10 dan büyükse  led yak kısmına geliyor artık.

ete

O kısım daha akıllıca yazılabilirdi.
Dikkat edersen ledin birisi yandığı zaman diğeri ancak 20 sn sonra yanabiliyor.
Halbuki hepsini test edip gerekirse yakıp en sonda 20 sn beklemek bence hepsi için geçerli olabilirdi.
   IF FARK_A > 10 THEN  LED_SOL_ON=1 
                 
                IF FARK_B > 10 THEN  LED_SAG_ON=1
                   
                IF FARK_C > 10 THEN   LED_SOL_ARKA =1
 
                IF FARK_D > 10 THEN   LED_SAG_ARKA =1

                IF LED  LED_SOL_ON=1 OR LED_SAG_ON=1 OR LED_SOL_ARKA =1 OR LED_SAG_ARKA =1 THEN
                    PAUSE 20000
                    LED_SOL_ON=0:LED_SAG_ON=0:LED_SOL_ARKA =0: LED_SAG_ARKA =0
                ENDIF
         
Şeklinde anında bütün yanacak olanlar yanar ve hepsi 20 sn sonra söner. Sönme kısmına artık yanıyorsa söndür demedim çünki nasıl olsa hepsi sönecek.
Ama 20 sn beklemeyi ledlerden her hangi birisi yanmış ise verdim aksi halde bekleme yapmaksızın program geri dönecektir.

Ete


. Kağan

Benim 1000 karakterlik program kuşa döndü. :) Teşekkürler Ete.  Şu an Şehirlerarası otobüsten gsm  den yazıyorum hemde saat geç oldu. Seni de daha fazla  yormayayım. Çalışma masama döndüğümde derleyip toplayıp yeniden deneyeceğim. Görüşmek üzere hayırlı geceler.

. Kağan

#28
Düzeltme: Sorunu halletiğim için sorumu sildim.

efsanepoldem

    IF   LED_SOL_ON=1 OR LED_SAG_ON=1 OR LED_SOL_ARKA =1 OR LED_SAG_ARKA =1 THEN   heralde böyle yazacaktın.

Powered by EzPortal