16F88 ile 4 motorun akım kontrolü

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

. Kağan

4 adet mini motorun çektikleri akımı kontrol edip, en küçük olanını temel alarak diğer motorlardan belirlenen farktan fazla akım çekenleri bir led yakarak belirlemek istiyorum. Yazdığım kodlar aşağıda. Nerede hata var acaba?


@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLR_OFF & _PWRTE_ON  & _WRT_PROTECT_OFF

ADCON1 = %10000101  ' 1024 (10 BİT) hesaplanacak, AN0 VE AN1 ANOLOG, DİĞERLERİ DİJİTAL
OSCCON = %01100000  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
ANSEL = 3           ' AN0 VE AN1 analog, DİĞERLERİ DİJİTAL   
CMCON = 7           ' KOMPARATÖRLER KAPALI   
TRISA = %00000011   ' A0 ve A1 GİRİŞ DİĞERLERİ ÇIKIŞ
TRISB = %00000000   ' HEPSİ ÇIKIŞ
PORTA = 0           'PORTA SIFIRA ÇEK
PORTB = 0           'PORTB SIFIRA ÇEK

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

        ULN2003_1       VAR PORTB.0  ' ULN SWICH ENTEGRESİ TETİKLEME (ÇIKIŞ) UÇLARI
        ULN2003_2       VAR PORTB.1
        ULN2003_3       VAR PORTB.2
        ULN2003_4       VAR PORTB.3
       
        LED_SOL_ON      VAR PORTB.4  ' UYARI LEDLERİNİN ÇIKIŞ UÇLARI
        LED_SAG_ON      VAR PORTB.5   
        LED_SOL_ARKA    VAR PORTB.6
        LED_SAG_ARKA    VAR PORTB.7 
       
        OLCUM_GIRIS    VAR     PORTA.0    ' OLCUM_A,B,C,D AKIM ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.0 ve GİRİŞE AÇIK OLACAK.
        BATT_OLCUM     VAR     PORTA.1    ' PİL SEVİYESİ ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.1 ve GİRİŞE AÇIK OLACAK.
        BASLATMA       VAR     PORTA.7    ' İŞLEME BAŞLAMAK İÇİN KONTROL EDİLECEK PORT (PULL DOWN KULLANILIYOR)

        OLCUM_A       VAR WORD        ' HESAPLAMA İŞLEMLERİNDE KULLANILACAK TERİMLER
        OLCUM_B       VAR WORD
        OLCUM_C       VAR WORD
        OLCUM_D       VAR WORD
        FARK_A        VAR BYTE
        FARK_B        VAR BYTE
        FARK_C        VAR BYTE
        FARK_D        VAR BYTE
        EN_KUCUK      VAR WORD
        B_K           VAR BYTE
       
        OLCUM         VAR WORD
        BATT          VAR WORD
         
     
        SAYI          VAR BYTE        ' DIŞARDAN ALINACAK VERİLERİN ADLANDIRMALARI
        TEMP          VAR BYTE
        I             VAR BYTE
        C             VAR BYTE
        Z             VAR BYTE
        R             VAR BYTE

      KAPA_SAY      VAR WORD    ' PIC UYKU MODUNA GEÇME SÜRESİ SAYIMI
      ZAMAN         VAR WORD    ' ZAMAN HESAPLAMA             
   
      INPUT         OLCUM_GIRIS    'PORTA.0 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ
      INPUT         BATT_OLCUM     'PORTA.1 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ
     
     
     
        ULN2003_1     = 0     ' ULN2003 AYARLAMA - SIFIRLANIYOR
        ULN2003_2     = 0
        ULN2003_3     = 0
        ULN2003_4     = 0
       
             
        SAYI            = 0   
        TEMP            = 0
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 0
        C               = 0
        Z               = 0
        R               = 0
       
        OLCUM_A         = 0
        OLCUM_B         = 0
        OLCUM_C         = 0
        OLCUM_D         = 0
        FARK_A          = 0
        FARK_B          = 0
        FARK_C          = 0
        FARK_D          = 0
        EN_KUCUK        = 0
        B_K             = 0
       
        BATT_OLCUM      = 0
       
             
        KAPA_SAY        = 0
        ZAMAN           = 0
             
'***********************************************   
   
    LED_SONDUR:                ' TÜM LEDLERİ SÖNDÜR.
   
         LED_SOL_ON   = 0
         LED_SAG_ON   = 0
         LED_SOL_ARKA = 0
         LED_SAG_ARKA = 0
         
'***********************************************     
   
    KAPALI:                   'BEKLEMEDE KAPANMA SÜRESİ
          SLEEP   65000       '65000 ms UYKUYA GEÇ. A BUTONU (PORTA.5 MCLR) BASILINCAYA KADAR.
         
'***********************************************   

   ZAMANLAMA:
           
          IF  ZAMAN = ZAMAN + 1   THEN    'ZAMANI BİR ARTTIR ve 15 SN OLUNCA SIFIRLAYIP "KAPALI" ETİKETİNE GİT.
            IF ZAMAN = 15000 THEN         '15 SANİYE
                ZAMAN = 0
                    GOTO KAPALI
            ENDIF
          ENDIF 
         

'*******************************************************************************           
     MAIN: 

      ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 200
            FOR I = 0 TO 180         '180 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 1 , OLCUM_A
                    PAUSE 10
            NEXT I
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 100
           
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 200
            FOR I = 0 TO 180           '180 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 1 , OLCUM_B
                    PAUSE 10
            NEXT I
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 100
           
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 200
            FOR I = 0 TO 180
                ADCIN 1 , OLCUM_c       '180 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                    PAUSE 10
            NEXT I
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 100
           
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 200
            FOR I = 0 TO 180
                ADCIN 1 , OLCUM_d        '180 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                    PAUSE 10
            NEXT I
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 100
           
           
           
            LOW  ULN2003_1        'ULN2003'ÜN TÜM UÇLARINI SIFIR YAP.
            LOW  ULN2003_2
            LOW  ULN2003_3
            LOW  ULN2003_4
           
            PAUSE 200
'*******************************************************************************           
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************           
               
     'ÖLÇÜM_A:         
                IF OLCUM_A > 0 THEN
                IF OLCUM_B > 0 THEN
                    IF OLCUM_A <= OLCUM_B THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    IF OLCUM_A <= OLCUM_C THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    IF OLCUM_A <= OLCUM_D THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
                B_K = 0
            ENDIF
           
'*******************************************************************************           
               
     'ÖLÇÜM_B:
     
            IF OLCUM_B > 0 THEN
                IF OLCUM_A > 0 THEN
                    IF OLCUM_B <= OLCUM_A THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    IF OLCUM_B <= OLCUM_C THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    IF OLCUM_B <= OLCUM_D THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                B_K = 0
            ENDIF
           
'*******************************************************************************           
             
     'ÖLÇÜM_C:
     
            IF OLCUM_C > 0 THEN
                IF OLCUM_A > 0 THEN
                    IF OLCUM_C <= OLCUM_A THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_B > 0 THEN
                    IF OLCUM_C <= OLCUM_B THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    IF OLCUM_C <= OLCUM_D THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_C    ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
                B_K = 0
            ENDIF

'********************************************************************************
             
     'ÖLÇÜM_D:
     
            IF OLCUM_d > 0 THEN
                IF OLCUM_A > 0 THEN
                    IF OLCUM_d <= OLCUM_A THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_B > 0 THEN
                    IF OLCUM_d <= OLCUM_B THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_c > 0 THEN
                    IF OLCUM_d <= OLCUM_c THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_d    ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
                B_K = 0
            ENDIF
       
       '************************************************************************
 
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
 
     
                IF OLCUM_A > 0 THEN
                    FARK_A = OLCUM_A - EN_KUCUK
                ELSE
                    FARK_A = 0
                ENDIF
               
                IF OLCUM_B > 0 THEN
                    FARK_B = OLCUM_B - EN_KUCUK
                ELSE
                    FARK_B = 0
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    FARK_C = OLCUM_C - EN_KUCUK
                ELSE
                    FARK_C = 0
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    FARK_D = OLCUM_D - EN_KUCUK
                ELSE
                    FARK_D = 0
                ENDIF
       
       
'*******************************************************************************
           
      ' BURADAN SONRA DEĞERLENDİRME SOMUT RAKAMLAR ve SONUCA DÖNÜŞÜYOR.
           
                 
                IF FARK_A > 10 THEN
                HIGH LED_SOL_ON
                PAUSE 20000
                LOW LED_SOL_ON
                   ENDIF
                   
                IF FARK_B > 10 THEN
                HIGH LED_SAG_ON
                PAUSE 20000
                LOW LED_SAG_ON
                   ENDIF
                   
                IF FARK_C > 10 THEN
                HIGH LED_SOL_ARKA
                PAUSE 20000
                LOW LED_SOL_ARKA
                   ENDIF
                   
                IF FARK_D > 10 THEN
                HIGH LED_SAG_ARKA
                PAUSE 20000
                LOW LED_SAG_ARKA
                   ENDIF
         
'*******************************************************************************                       
               
        GOSUB LED_SONDUR
 
GOTO MAIN
 
   



Teşekkürler

ete

Bir hata varda bulamıyormusun yoksa genel amlamda hatalarınımı görmek istiyorsun. ?
Programda hata bolca var aslında.
1. Çıkış olarak ayarladığın bir pine kendin değer vermemelisin. Olcum_Giris ve batt_olcum pinleri giriş olarak ayarlanmış hemde lüzumsuz yere iki defa birisi trisa ile diğeride input komutu kullanılarak birisi yeterdi. Sonra olcum_giris=0 şeklinde giris pinine değer vermeye kalkmışsın.

2. If zaman=zaman+1 then  şeklinde bir komut kullanımı olmaz önce zaman=zaman+1 yapar sonra zaman değerini karşılaştırırsın.

3. Adc okumasını 180 defa yapmamın ne gibi bir espirisi var sence? Bunların ortalamasını alsan bir espirisi olabilirdi ama sen almamışsın. Bu durumda program 180 inci okumayı alıp kullanıyor 0-179 arasındaki okumalar hiç bir şekilde kullanılmıyor. Zaten ortakama alsanda yine olmayacak idi. Word değişkeni sınırları (65535) dolayısıyla toplam 63 adet adc değerini toplamana izin verir.
Her okuma arasına 10 ms de gecikme koymuşsun. 180 x 10=1800 ms lik bir gecikmeye sebep olur bu okuma işlemi. Bu kadar uzun gecikmeleri program arasına koymak bir çok sorun çıkartır. Her okuma arasını 20 us yapsan yeterli olurdu. Düşünsene program adc okuma işlemlerini bitirip yorumlama kısmına gelmesi 8 snden fazla sürüyorki bu hiçde normal bir iş değil. 1 sn bile sürmemeli bu işlem. Anlayacağın bir sürü lüzumsuz pause var programda.

4. Yorum kısmında da mantık hataları var bana göre. If olcumA>0 then ile karşılaştırmaya başlamakla if olcumB>0 then ile başlama arasında fark yoktur. Burada daha akıllıca mantık kullanmak gerekir. Mesela,
If olcumA>olcumB and olcumB>0 then şeklinde bir komut ile A, B den büyük ve B de sıfırdan büyükse (otomatikman a da sıfırdan büyük olmak zorundadır) şeklinde bir karşılaştırma daha akıllıca olurdu.  Benzer şekilde ıf olcumB>olcumA and olcumA>0 then şeklinde kullanmak gerekir.

Şimdilik görebildiklerim bunlar.

Ete

. Kağan

Dediğiniz gibi, genel anlamda hatalarımı görmek istemiştim. Teşekkürler düzelteceğim.

. Kağan

#3
Merhaba ETE,

4. Yorum kısmında,

'ÖLÇÜM_A:          
                IF OLCUM_A > 0 THEN
                IF OLCUM_B > 0 THEN
                    IF OLCUM_A <= OLCUM_B THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    IF OLCUM_A <= OLCUM_C THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    IF OLCUM_A <= OLCUM_D THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
                B_K = 0
            ENDIF


satırlarının yerine

'ÖLÇÜM_A:          
               
               
                If OLCUM_A>=OLCUM_B and OLCUM_B>0 THEN B_K = B_K + 1
                ELSE
                    B_K = B_K + 1
                ENDIF
               
                IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
                B_K = 0
            ENDIF


satırlarını kullanmamı mı önerdiniz?


Yazdıklarım zaten çok karışık geliyor, baya kafa yordum ama şimdi dediğinizi anlamadım. Önerdiğiniz kodu yazarmısınız? Acemilik kusura bakmayın. :)

ete


If OLCUM_A>=OLCUM_B and OLCUM_B>0 THEN B_K = B_K + 1
ELSE
B_K = B_K + 1
ENDIF

BU kullanım şekli zaten yanlış. Üstelik her iki konumdada yapılan iş aynı (B_K=B_K+1) o halde else ye ne gerek varki
Doğrusu;

If (OLCUM_A<=OLCUM_B) and (OLCUM_A>0 THEN B_K = B_K + 1
şeklinde yazılsa şu anlama gelir OlçümB>= OlcümA ve OlçümA da sıfırdan büyük ise B_K=B_K+1

Ete

. Kağan

#5
Önerdiğiniz düzeltmeleri yaptım Erol bey,

Aşağıda kodu veriyorum. Vaktiniz olursa tekrar göz atabilirmisiniz?

Teşekkürler.



@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLR_OFF & _PWRTE_ON  & _WRT_PROTECT_OFF

ADCON1 = %10000101  ' 1024 (10 BİT) hesaplanacak, AN0 VE AN1 ANOLOG, DİĞERLERİ DİJİTAL
OSCCON = %01100000  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
ANSEL = 3           ' AN0 VE AN1 analog, DİĞERLERİ DİJİTAL   
CMCON = 7           ' KOMPARATÖRLER KAPALI   
TRISA = %00000011   ' A0 ve A1 GİRİŞ DİĞERLERİ ÇIKIŞ  'PORTA.0 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ 'PORTA.1 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ
TRISB = %00000000   ' HEPSİ ÇIKIŞ
PORTA = 0           ' PORTA SIFIRA ÇEK
PORTB = 0           ' PORTB SIFIRA ÇEK

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

        ULN2003_1       VAR PORTB.0  ' ULN SWICH ENTEGRESİ TETİKLEME (ÇIKIŞ) UÇLARI
        ULN2003_2       VAR PORTB.1
        ULN2003_3       VAR PORTB.2
        ULN2003_4       VAR PORTB.3
       
        LED_SOL_ON      VAR PORTB.4  ' UYARI LEDLERİNİN ÇIKIŞ UÇLARI
        LED_SAG_ON      VAR PORTB.5   
        LED_SOL_ARKA    VAR PORTB.6
        LED_SAG_ARKA    VAR PORTB.7 
       
        OLCUM_GIRIS    VAR     PORTA.0    ' OLCUM_A,B,C,D AKIM ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.0 ve GİRİŞE AÇIK OLACAK.
        BATT_OLCUM     VAR     PORTA.1    ' PİL SEVİYESİ ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.1 ve GİRİŞE AÇIK OLACAK.
        BASLATMA       VAR     PORTA.7    ' İŞLEME BAŞLAMAK İÇİN KONTROL EDİLECEK PORT (PULL DOWN KULLANILIYOR)

        OLCUM_A       VAR WORD        ' HESAPLAMA İŞLEMLERİNDE KULLANILACAK TERİMLER
        OLCUM_B       VAR WORD
        OLCUM_C       VAR WORD
        OLCUM_D       VAR WORD
        FARK_A        VAR BYTE
        FARK_B        VAR BYTE
        FARK_C        VAR BYTE
        FARK_D        VAR BYTE
        EN_KUCUK      VAR WORD
        B_K           VAR BYTE
        ORTALAMA      VAR WORD
       
        OLCUM         VAR WORD
        BATT          VAR WORD
         
     
        SAYI          VAR BYTE        ' DIŞARDAN ALINACAK VERİLERİN ADLANDIRMALARI
        TEMP          VAR BYTE
        I             VAR BYTE
        C             VAR BYTE
        Z             VAR BYTE
        R             VAR BYTE

      KAPA_SAY      VAR WORD    ' PIC UYKU MODUNA GEÇME SÜRESİ SAYIMI
      ZAMAN         VAR WORD    ' ZAMAN HESAPLAMA             
   
        SAYI            = 0   
        TEMP            = 0
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 0
        C               = 0
        Z               = 0
        R               = 0
       
        OLCUM_A         = 0
        OLCUM_B         = 0
        OLCUM_C         = 0
        OLCUM_D         = 0
        FARK_A          = 0
        FARK_B          = 0
        FARK_C          = 0
        FARK_D          = 0
        EN_KUCUK        = 0
        B_K             = 0
       
        BATT_OLCUM      = 0
       
             
        KAPA_SAY        = 0
        ZAMAN           = 0
             
'***********************************************   
   
    LED_SONDUR:                ' TÜM LEDLERİ SÖNDÜR.
   
         LED_SOL_ON   = 0
         LED_SAG_ON   = 0
         LED_SOL_ARKA = 0
         LED_SAG_ARKA = 0
         
'***********************************************     
   
    KAPALI:                   'BEKLEMEDE KAPANMA SÜRESİ
          SLEEP   65000       '65000 ms UYKUYA GEÇ. A BUTONU (PORTA.5 MCLR) BASILINCAYA KADAR.
         
'***********************************************   

   ZAMANLAMA:
           
          ZAMAN = ZAMAN + 1              'ZAMANI BİR ARTTIR ve 15 SN OLUNCA SIFIRLAYIP "KAPALI" ETİKETİNE GİT.
            IF ZAMAN = 15000 THEN         '15 SANİYE
                ZAMAN = 0
                    GOTO KAPALI
            ENDIF
         
         

'*******************************************************************************           
     MAIN: 

      ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
                     
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 100
            FOR I = 0 TO 10         '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 1 , OLCUM_A
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/10
                    PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 100
       '************************************************************************     
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10           '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 1 , OLCUM_B
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/10
                    PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 100
       '************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10             '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 1 , OLCUM_C       
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/10
                    PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 100
       '************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10              '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/10
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 100
       '************************************************************************             
           
           
            LOW  ULN2003_1        'ULN2003'ÜN TÜM UÇLARINI SIFIR YAP.
            LOW  ULN2003_2
            LOW  ULN2003_3
            LOW  ULN2003_4
           
            PAUSE 100
'*******************************************************************************           
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************           
               
     'ÖLÇÜM_A:         
               
               
                If (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_A<=OLCUM_C) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_A<=OLCUM_D) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
               
           
'*******************************************************************************           
               
     'ÖLÇÜM_B:   
     
                If (OLCUM_B<=OLCUM_A) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_B<=OLCUM_C) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_B<=OLCUM_D) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
     
                   
'*******************************************************************************           
             
     'ÖLÇÜM_C:
     
     
                If (OLCUM_C<=OLCUM_A) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_C<=OLCUM_B) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_C<=OLCUM_D) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
'********************************************************************************
             
     'ÖLÇÜM_D:
     
                If (OLCUM_D<=OLCUM_A) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_D<=OLCUM_B) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_D<=OLCUM_C) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
       
       '************************************************************************
 
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
 
     
                IF OLCUM_A > 0 THEN
                    FARK_A = OLCUM_A - EN_KUCUK
                ELSE
                    FARK_A = 0
                ENDIF
               
                IF OLCUM_B > 0 THEN
                    FARK_B = OLCUM_B - EN_KUCUK
                ELSE
                    FARK_B = 0
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    FARK_C = OLCUM_C - EN_KUCUK
                ELSE
                    FARK_C = 0
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    FARK_D = OLCUM_D - EN_KUCUK
                ELSE
                    FARK_D = 0
                ENDIF
       
       
'*******************************************************************************
           
      ' BURADAN SONRA DEĞERLENDİRME SOMUT RAKAMLAR ve SONUCA DÖNÜŞÜYOR.
           
                 
                IF FARK_A > 10 THEN
                HIGH LED_SOL_ON
                PAUSE 20000       '20 SN BEKLE
                LOW LED_SOL_ON
                   ENDIF
                   
                IF FARK_B > 10 THEN
                HIGH LED_SAG_ON
                PAUSE 20000       '20 SN BEKLE
                LOW LED_SAG_ON
                   ENDIF
                   
                IF FARK_C > 10 THEN
                HIGH LED_SOL_ARKA
                PAUSE 20000        '20 SN BEKLE
                LOW LED_SOL_ARKA
                   ENDIF
                   
                IF FARK_D > 10 THEN
                HIGH LED_SAG_ARKA
                PAUSE 20000        '20 SN BEKLE
                LOW LED_SAG_ARKA
                   ENDIF
         
'*******************************************************************************                       
               
        GOSUB LED_SONDUR
 
GOTO MAIN
 
   


ete

Hala bir çok kusur ve hata var.
Basic Programları satır takip eder. Şayet satırda bir yönlendirme komutu (GOTO , GOSUB) yok ise sürekli bir sonraki satıra geçer.
Bu mantığa göre yazdığın programı en baştan bir takip edermisin neler oluyor. Sence mantıklımıdır?
Yazdıklarına bakınca programın ana çalışma kısmına en azından 65 sn sonra geçeceğini görebilmen gerekir.

Bir döngü 0 to 10 diye kurulmuş ise kaç defa döner sence? Elinle bir say istersen 0-10(dahil) 11 olacağını göreceksin.
Peki ortalama alırken 11 tane adc okumasını toplaman gerekirken sen ortalama hesabında kaça bölmüşsün?

IF satırlarını değerlendiremiyorum çünki ne gibi bir mantık yürüttüğünü bilemiyorum.
Onları lafla açıklarsan doğruluklarını yada nasıl olması gerektiklerini görebilirim.

Ete



. Kağan

#7
Bir düzenleme daha yaptım, ana programdan önce yazdıklarımı en sona koydum.


@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLR_OFF & _PWRTE_ON  & _WRT_PROTECT_OFF

ADCON1 = %10000101  ' 1024 (10 BİT) hesaplanacak, AN0 VE AN1 ANOLOG, DİĞERLERİ DİJİTAL
OSCCON = %01100000  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
ANSEL = 3           ' AN0 VE AN1 analog, DİĞERLERİ DİJİTAL   
CMCON = 7           ' KOMPARATÖRLER KAPALI   
TRISA = %00000011   ' A0 ve A1 GİRİŞ DİĞERLERİ ÇIKIŞ  'PORTA.0 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ 'PORTA.1 ÖLÇÜM İÇİN ANALOG GİRİŞ PİNİ
TRISB = %00000000   ' HEPSİ ÇIKIŞ
PORTA = 0           ' PORTA SIFIRA ÇEK
PORTB = 0           ' PORTB SIFIRA ÇEK

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

        ULN2003_1       VAR PORTB.0  ' ULN SWICH ENTEGRESİ TETİKLEME (ÇIKIŞ) UÇLARI
        ULN2003_2       VAR PORTB.1
        ULN2003_3       VAR PORTB.2
        ULN2003_4       VAR PORTB.3
       
        LED_SOL_ON      VAR PORTB.4  ' UYARI LEDLERİNİN ÇIKIŞ UÇLARI
        LED_SAG_ON      VAR PORTB.5   
        LED_SOL_ARKA    VAR PORTB.6
        LED_SAG_ARKA    VAR PORTB.7 
       
        OLCUM_GIRIS    VAR     PORTA.0    ' OLCUM_A,B,C,D AKIM ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.0 ve GİRİŞE AÇIK OLACAK.
        BATT_OLCUM     VAR     PORTA.1    ' PİL SEVİYESİ ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.1 ve GİRİŞE AÇIK OLACAK.
        BASLATMA       VAR     PORTA.7    ' İŞLEME BAŞLAMAK İÇİN KONTROL EDİLECEK PORT (PULL DOWN KULLANILIYOR)

        OLCUM_A       VAR WORD        ' HESAPLAMA İŞLEMLERİNDE KULLANILACAK TERİMLER
        OLCUM_B       VAR WORD
        OLCUM_C       VAR WORD
        OLCUM_D       VAR WORD
        FARK_A        VAR BYTE
        FARK_B        VAR BYTE
        FARK_C        VAR BYTE
        FARK_D        VAR BYTE
        EN_KUCUK      VAR WORD
        B_K           VAR BYTE
        ORTALAMA      VAR WORD
       
        OLCUM         VAR WORD
        BATT          VAR WORD
         
     
        SAYI          VAR BYTE        ' DIŞARDAN ALINACAK VERİLERİN ADLANDIRMALARI
        TEMP          VAR BYTE
        I             VAR BYTE
        C             VAR BYTE
        Z             VAR BYTE
        R             VAR BYTE

      KAPA_SAY      VAR WORD    ' PIC UYKU MODUNA GEÇME SÜRESİ SAYIMI
      ZAMAN         VAR WORD    ' ZAMAN HESAPLAMA             
   
        SAYI            = 0   
        TEMP            = 0
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 0
        C               = 0
        Z               = 0
        R               = 0
       
        OLCUM_A         = 0
        OLCUM_B         = 0
        OLCUM_C         = 0
        OLCUM_D         = 0
        FARK_A          = 0
        FARK_B          = 0
        FARK_C          = 0
        FARK_D          = 0
        EN_KUCUK        = 0
        B_K             = 0
       
        BATT_OLCUM      = 0
       
             
        KAPA_SAY        = 0
        ZAMAN           = 0
             

'*******************************************************************************           
     MAIN: 

      ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
                     
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 100
            FOR I = 0 TO 10         '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 1 , OLCUM_A
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/11
                    PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 100
           
'*******************************************************************************     
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10           '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 1 , OLCUM_B
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/11
                    PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 100
'*******************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10             '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 1 , OLCUM_C       
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/11
                    PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 100
'*******************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 10              '10 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/11
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 100
'*******************************************************************************             
           
           
            LOW  ULN2003_1        'ULN2003'ÜN TÜM UÇLARINI SIFIR YAP.
            LOW  ULN2003_2
            LOW  ULN2003_3
            LOW  ULN2003_4
           
            PAUSE 100
'*******************************************************************************           
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************           
               
     'ÖLÇÜM_A:         
               
               
                If (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_A<=OLCUM_C) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_A<=OLCUM_D) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
               
           
'*******************************************************************************           
               
     'ÖLÇÜM_B:   
     
                If (OLCUM_B<=OLCUM_A) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_B<=OLCUM_C) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_B<=OLCUM_D) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_B   ' OLCUM_B İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
     
                   
'*******************************************************************************           
             
     'ÖLÇÜM_C:
     
     
                If (OLCUM_C<=OLCUM_A) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_C<=OLCUM_B) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_C<=OLCUM_D) and (OLCUM_C>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_C   ' OLCUM_C İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
'********************************************************************************
             
     'ÖLÇÜM_D:
     
                If (OLCUM_D<=OLCUM_A) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
         
                If (OLCUM_D<=OLCUM_B) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                         
                If (OLCUM_D<=OLCUM_C) and (OLCUM_B>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0         
                         
                             
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_D   ' OLCUM_D İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
       
       '************************************************************************
 
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
 
     
                IF OLCUM_A > 0 THEN
                    FARK_A = OLCUM_A - EN_KUCUK
                ELSE
                    FARK_A = 0
                ENDIF
               
                IF OLCUM_B > 0 THEN
                    FARK_B = OLCUM_B - EN_KUCUK
                ELSE
                    FARK_B = 0
                ENDIF
               
                IF OLCUM_C > 0 THEN
                    FARK_C = OLCUM_C - EN_KUCUK
                ELSE
                    FARK_C = 0
                ENDIF
               
                IF OLCUM_D > 0 THEN
                    FARK_D = OLCUM_D - EN_KUCUK
                ELSE
                    FARK_D = 0
                ENDIF
       
       
'*******************************************************************************
           
      ' BURADAN SONRA DEĞERLENDİRME SOMUT RAKAMLAR ve SONUCA DÖNÜŞÜYOR.
           
                 
                IF FARK_A > 10 THEN
                HIGH LED_SOL_ON
                PAUSE 20000       '20 SN BEKLE
                LOW LED_SOL_ON
                   ENDIF
                   
                IF FARK_B > 10 THEN
                HIGH LED_SAG_ON
                PAUSE 20000       '20 SN BEKLE
                LOW LED_SAG_ON
                   ENDIF
                   
                IF FARK_C > 10 THEN
                HIGH LED_SOL_ARKA
                PAUSE 20000        '20 SN BEKLE
                LOW LED_SOL_ARKA
                   ENDIF
                   
                IF FARK_D > 10 THEN
                HIGH LED_SAG_ARKA
                PAUSE 20000        '20 SN BEKLE
                LOW LED_SAG_ARKA
                   ENDIF
         
     
        GOSUB LED_SONDUR
 
GOTO MAIN

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

   
    LED_SONDUR:                ' TÜM LEDLERİ SÖNDÜR.
   
         LED_SOL_ON   = 0
         LED_SAG_ON   = 0
         LED_SOL_ARKA = 0
         LED_SAG_ARKA = 0
         
'***********************************************     
   
    KAPALI:                   'BEKLEMEDE KAPANMA SÜRESİ
          SLEEP   65000       '65000 ms UYKUYA GEÇ. A BUTONU (PORTA.5 MCLR) BASILINCAYA KADAR.
         
'***********************************************   

   ZAMANLAMA:
           
          ZAMAN = ZAMAN + 1              'ZAMANI BİR ARTTIR ve 15 SN OLUNCA SIFIRLAYIP "KAPALI" ETİKETİNE GİT.
            IF ZAMAN = 15000 THEN         '15 SANİYE
                ZAMAN = 0
                    GOTO KAPALI
            ENDIF



Yapmak istediğim şu;

- 4 tane mikro motor var.

- Bu motorlar eşit akım çekiyor. Çektikleri akim ma seviyesinde ve bu akımı ölçmek için sparkfun dan şu devreyi satın aldım, gelmesini bekliyorum.https://www.sparkfun.com/products/8883

- Bu devreden bir tane kullanacağım. Fakat ULN2003 ile sıra ile motorlara enerji verip yüklerinin değişip değişmediğini çektikleri akımı ölçerek bulmak istiyorum. Motorlar ULN2003 den gelen eksi ve aynı kaynaktan gerilim bölücü ile alınan +1 V ile besleniyor.

-ACS712 (Düşük akım sensörü) motorların + beslemesinden çekilen akımı ölçüyor.

1- Program sıra ile motorlara gerilimi göndererek çektikleri akım değerlerini alıyor.
2- Daha sonra en küçük akımı çeken motoru buluyor.
3- En az akım çeken motor referans kabul ediliyor ve diğerleriyle arasına 10 ma tolerans veriliyor.
4- 10 ma den daha fazla farkla akım çeken motorları gösteren ledler 20 sn süre ile yanıyor ve daha sonra sönüyor.
5- 15000 ms den daha uzun süre mclr ucundan uyarılmadıysa uykuya geçip 65000 ms (yada tekrar uyarılıncaya kadar) uykuda kalıyor.
6- Mclr ucundan uyarılınca tekrar ölçüm yapmaya başlıyor. İşlemleri yapıyor, sonucu ledler ile 20 sn gösteriyor, 15 dk uyarılmazsa PIC uykuya geçiyor.

Birde bu sistem 9v pil ile çalışacak ve pil geriliminin 5,5 V altına düştüğünde tüm ledlerin flaş yapmasını ve uyarmasını istiyorum. Daha bu kısmına başlayamadım. :)

İşte bunu yapmaya çalışıyorum. Saatlerce uğraştım. :(
Ama bana çok zor geliyor.



pwm3434

#8
bu  bahsettiğin pile, maximun 5 voltluk bir gerilim bölücü yapıp ve  bu  5  voltluk ucu pıc'in anolog  girişinde digitale  cevir.bu  digital  bilgi  ile  de  ne  yapmak  istiyorsan  yap.

. Kağan

pwm3434 teşekkürler.

Sayın ETE,

İf'lerle ilgili bilgiler verdim. Yardımınızı bekliyorum. Pic programı yazmak birçok bilgi ve mantık becerisi gerektiriyor. İf' lerle ilgili programımı değerlendirir ve yardımcı olursanız sizin için çok dua ederim.  Şimdiden teşekkürler.

ete

If satırlarının yanına açıklamalar koymuşsun ama hiç birisi yazılan koda uymuyor. Neye göre değerlendireceğim?
Kafandan ne geçtiğini bilmiyorumki değerlendireyim. Ya açıklamların yanlış yada yada yazdıkların yanlış.
Bir IF komutu nasılkullanılır açıklayayım.
Şayet bir şeyi değerlendirirken yalnızca bir işlem yapılacak ise,
IF BK>0  THEN AL=4 gibi burada AL=4 yalnızca tek işlemdir ve hemen THEN ifadesinden sonra yapılacak işlem yazılabilir. Bu durumda ENDIF kullanılmaz.
Ama birden fazla işlem var ise THEN yanına bir şey yazılmaz yazılacak şartlar alta yazılır ve işlem ENDIF ile biter
IF BK>0 THEN
AL=4: BL=0
CD=2
ENDIF

Değerlendirilecek konu iki konumlu ise o zaman ELSE kullanılması uygun olur. Bu durumda THEN yanına bir şey yazılmaz.
IF BK>0 THEN
   AL=2
ELSE
  AL=0
ENDIF   şeklinde olmalıdır.

ETe

. Kağan

Hiçbiri mi uymuyor? Durumum bu kadar ümitsiz yani. :(

ete

#12
Beraber değerlendirelim istersen;
 'ÖLÇÜM_A:  
               
                If (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN B_K = B_K + 1
                    IF B_K = 3 THEN EN_KUCUK = OLCUM_A   ' OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA.
               
                         B_K = 0
                       
               

Şimdi bu satırlar ne yapar acaba?  If (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN B_K = B_K + 1 satırı;
OLCUMA, OlcumB y eeşitse yada küçükse ve OlcümA da sıfırdan büyük ise BK değerini bir artır
IF B_K = 3 THEN EN_KUCUK = OLCUM_A  satırında ise BK=3 ise ENKUCUK=OLCUMA olsun demişsin.
Peki açıklama ne diyor? "OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA. "
işlem ile açıklama uyuyormu sence
Alta ise BK=0 yazmışsın. Yukarıda yaptıklarının hepsini yerle bir ediyor bu son yazdığın. Hiç bir şarta bağlı olmaksızın BK=0 demişsin. O halde yukarıdaki satırlara ne gerek var madem sonradan BK=0 diyeceksin öyle değilmi.
BK=0 olma durumunu bir şarta bağlayacaksın gibime geliyor ama o satırı yanlış kullanıyorsun gibi bir his var içimde. Ama asıl amacını bilemediğim için doğrusunu yorumlayamıyorum maalesef.
Diğer Ölçüm lerde aynı mantıkla yazılmış. Bence değişmeleri gerek.

Ete


. Kağan

 "OLCUM_A İÇİN, EĞER B_K DEĞERİ 3'DEN KÜÇÜKSE B_K'yı SIFIR SAY VE İŞLEME ALMA. "   -  İşte bu yapmak istediğim. BK=0 yazmaktaki kastım, bir dahaki işlem(değerlendirme) için BK yı sıfırla demek istiyorum. Ama yanlış diyorum anlaşılan.

Sonraki işlem için BK yı sıfırlamam gerekmiyor mu?

ete

Ne yapmak istediğini hala anlamış değilim. Tekrar bakalım,
(IF (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN B_K = B_K + 1 )   bu satır bağımsız bir satırdır.
OLCUMA<=OLCUMB ve OLCUMA>0 ise BK=BK+1 yapılır. BK il aşamada sıfır olduğunu varsayalım ve bu satırda BK=1 olduğunu varsayalım.
Program bir alt satıra geçecek orada da bağımsız olarak şu satır var;
(IF B_K = 3 THEN EN_KUCUK = OLCUM_A ) yani BK=3 ise ENKUCUK=OLCUMA oldu.  Bu da tamam diyelim.
Sonra bu komut satırı gelecek oda bağımsız    B_K = 0  ve BK=0 yapılacak. Bu durumda BK=3 nasıl olabilirki imkansız bir şey. Anladığım kadarı ile bu 3 satır aynı şarta bağlanacak ama nasıl nasıl diy esoruyorum burada yapılmak isteneni bilmediğim için.  Mesela şöyle olsa;
IF (OLCUM_A<=OLCUM_B) and (OLCUM_A>0) THEN
    B_K = B_K + 1
    IF B_K=3 THEN
        EN_KUCUK=OLCUM_A
        B_K=0
    ENDIF
ENDIF
sorun olmaz dı sanıırm. Şimdi bu yazdıklarım ne yapıyor ona bakalım.
ÖlçümA<=OlçümB ve OlçümA>0 ise, yada bu şart yerine geliyorsa aşağıdakileri yap yoksa hiç birine dokunma demekir.
   BK değerini bir artır
   Şayet BK=3 olmuş ise Önce ENKUCUK=OLCUMA yap sonra BK yı sıfırla

Sonra program bir döngü şeklinde BASLA====>GOTO BASLA çalışıyorsa bu satırlar bir kere değerlendirilecektir.
İkinci döngüse yeniden değerlendirilir ama Sen BK değerini bir çok yerde kullanıyor ve sıfırlıyorsun o halde BK değeri ikinci döngüde nasıl aynı amaçla değerlendirilecek burası muamma işte. Bana kalırsa her ölçüm için BKA BKB BKC BKD gibi ayrı değişken kullanman daha doğru olur. Böylece değişken değeri ikinci - üçüncü döngüde bozulmamış olur.
Ete

Powered by EzPortal