16F88 ile 4 motorun akım kontrolü

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

. Kağan


. Kağan

#31

@ __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.
       

        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
        I             VAR BYTE
       
       
   
        SAYI            = 0   
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 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
       
             

'*******************************************************************************           
     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 50         '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/51
            LOW ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU KAPAT         
                    PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 10
           
'*******************************************************************************     
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50           '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 0 , OLCUM_B
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/51
            LOW ULN2003_2               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50             '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 0 , OLCUM_C       
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/51
            LOW ULN2003_3               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 10

'*******************************************************************************           
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************           
               
    EN_KUCUK=255
            IF OLCUM_A<EN_KUCUK THEN EN_KUCUK = OLCUM_A        '4 DEĞERDEN EN KÜÇÜK OLANI BUL
            IF OLCUM_B<EN_KUCUK THEN EN_KUCUK = OLCUM_B
            IF OLCUM_C<EN_KUCUK THEN EN_KUCUK = OLCUM_C
            IF OLCUM_D<EN_KUCUK THEN EN_KUCUK = OLCUM_D
       
'************************************************************************
 
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
  ' EN KÜÇÜKTEN DAHA BÜYÜK OLANLARI BUL
     
                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.
      ' HANGİLERİ EN KÜÇÜK DEĞERDEN 3 BÜYÜKSE O LEDLERİ YAK.
           
              IF FARK_A > 3 THEN  LED_SOL_ON=1
                 
              IF FARK_B > 3 THEN  LED_SAG_ON=1
                   
              IF FARK_C > 3 THEN   LED_SOL_ARKA =1
 
              IF FARK_D > 3 THEN   LED_SAG_ARKA =1

              IF 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     
               
GOTO MAIN

'***********************************************
PIL:

        ADCIN 1, BATT_OLCUM        'AN1 DEN GİREN 5V BATT_OLCUM'E YAZ
       
        IF BATT_OLCUM < 683 THEN     'EĞER BATT_OLCUM 633 DEN (9 VOLTTAN 6 VOLTA) AŞAĞI DÜŞERSE
            HIGH LED_SOL_ON        'TÜM LEDLERİ FLAŞ YAPTIR.
            PAUSE 300
            toggle LED_SOL_ON
           
            HIGH LED_SAG_ON
            PAUSE 300
            toggle  LED_SAG_ON
           
            HIGH LED_SOL_ARKA
            PAUSE 300
            toggle LED_SOL_ARKA
           
            HIGH LED_SAG_ARKA
            PAUSE 300
            toggle  LED_SAG_ARKA
        ENDIF
       
       
        GOTO MAIN
'***********************************************   

 


kontrol voltajları gönderiliyor fakat değerlendirme aşamasını doğru yapamıyor. b4-b5-b6-b7 pinlerine bağlı ledlerin hepside yanıp 20 sn. sonra sönüp tekrar yanıyor. 1-2 yada 3 tane led yanmalı. yada hiçbiri yanmamalı. Çünkü kıyaslamada en küçük olanı temel alıyor.

Bir bakabilirmisin acaba ETE kardeş.

ete

Ortalama isimli değişkeni her adc döngüsünün başında ve döngüden evvel sıfırlaman lazım. Aksi halde hep bir önceki değerden devam edip yanlış değer hesaplıyor.
Ete

. Kağan

#33
  ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
                     
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 100
            FOR I = 0 TO 50         '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/51
            LOW ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU KAPAT         
                    PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 10
           
'*******************************************************************************     
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50           '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 0 , OLCUM_B
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/51
            LOW ULN2003_2               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50             '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 0 , OLCUM_C 
                ORTALAMA = 0     
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/51
            LOW ULN2003_3               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 10


Böyle mi?

ete

Birincisi söylediklerime fazla dikkat etmiyorsun ikincisi hadi etmedin mantıkla bulacağın şeyi mantığını çalıştırmadığın için bulamıyorsun!!!.

Açıklamama bakarsan "döngüden evvel" diye bir tabir kullanmışım. O halde bunun anlamı döngü başlamadan evvel Ortalama=0 yapman anlamına geliyor. Zaten seninyaptığın gibi döngü içinde Ortalama=0 yaparsan ne anlamı kalıyorki hiç bir ortalama hesabı yapamazsın bu şekilde değer hep sıfır olur çünki.

        FOR I = 0 TO 50         '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I

Döngü içinde sürekli olarak Ortalama=0 dersen bir ortalama değeri hesaplayabilme imkanın varmıdır?

Bir ortalama alma işlemi nasıl yapılır. ? elinde 3 tane sayı var bunların ortalamasını alacaksın sayılar 253 - 340 ve 565
Başlangıçta Ortalama=0 olmalı ki sayıların toplamı doğru çıksın. Hatanı göresin diye detaylı anlatıyorum.
Bu 3 sayının ortalaması üçünün toplanıp 3'e bölünmesi ile bulunur değilmi.? Bizde döngü ile bunu yapıyoruz.

Ortalalma=Ortalama + Sayı  burada ilk sayı olan  ortlamaya eklenecek Ortalama=0+253=253 oldu
İkinci döngüde, Ortlama=253+340=593
Üçüncü döngüde ise Ortlama=593+565=1158 oldu

Bir sonraki işlemde Ortalama=0 demez isem ne olur ona bakalım. Aynı döngüye yeniden geldiğimizi farz edelim.
Ortlama değeri bir önceki işlemde 1158 olarak bekliyor sıfırlamadık.
Ortalama=1158+253=... şeklinde tamamen alakasız bir sayı hesaplanacak. Neden alakasız ortalama değerini sıfırlamadın çünki.

Ortalama=0 komutunu  nereye koyacağını yalnızca açıkladım. Sen bulacaksın mantığınla nereye koyacağını. Aslında söyledim de yerini ama görebilmen gerekiyor.

Ete

. Kağan

Baş tarafa diğer dataların sıfırlandığı yere
       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.
       

        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
        I             VAR BYTE
             
   
        SAYI            = 0   
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 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
        ORTALAMA        = 0
        BATT_OLCUM      = 0


ekledim.

ete

Bu işi sana öğreteceğim azmettim.
Elimizde 3 adet sayı var Bunlar
SAYI(0)=45
SAYI(1)=28
SAYI(2)=80
bunların ortalaması ORT=45+28+80=153 ve 153/3=51 olarak hesaplanır.
Bunu programla yapınca şöyle yapıyoruz.
FOR I=0 to 2
  ORT=ORT+SAYI(I)  (Sayı her döngüde farklı değer alıyor I değerine bağlı olarak)
Next
Bunu adım adım açıklarsak
I=0 iken (birinci döngü)
ORT=ORT+SAY[0]=0+45=45  yani ORT=45 oluyor
I=1 olunca ki ikinci döngüde oluyor.
ORT=bir önceki ORT değeri + SAYI(1)=45+28=73 oluyor  yani ORT=73 oldu
I=2 olunca (son döngüde)
ORT=73+80=153 oluyor ve işlem (döngü) bitiyor.

Şimdi ortalama almak için ORT/3 diyoruz yani 153/3=51 olarak buluyoruz. Buraya kadar anladın umarım.

Peki farzedelim program iş yapmaya devam ediyor ve  yeniden 3 sayı değeri aldı ve bir sonraki işlem olarak bunların ortalamasını bulacağız.
Sayılarımız SAYI(0)=20  , SAYI(1)=60  , SAYI(2)=10 olsun
FOR I=0 to 3
  ORT=ORT+SAY(I)
Next
döngüsü ile yapmaya devam ediyoruz.
Dikkat!!!!!!!!!    "ORT" değerini henüz sıfırlamadığımız için değeri 153 olarak bekliyor
I=0 iken
ORT=ORT+SAYI(0)=153+20=173 oldu
I=1 iken
  ORT=ORT+SAY(1)=173+60=233 oldu
I=2 iken
  ORT=233+10=243  oldu
Ortalama=ORT/3 idi 243/3=81 bulundu sence bu doğrumu? 20+60+10=90 eder ve ortalaması ise 90/3=30 etmesi gerekmezmi neden 81 çıktı? elbette bu işlemi yaparken döngü kurmadan evvel ORT=0 demediğimiz için böyle çıktı sonuç
Çünki bir önceki hesapta kullanılan ORT değerini yeni ortalama değerinde hesaba kattı. O halde doğrusu ne olması gerek?
ORT=0
For I=0 to 3
  ORT=ORT+SAY(I)
Next
şeklinde olmalıdır. Şİmdi anladınmı ORT=0 nereye koyulması gerekiyor. Her ortalama alma döngüsünün başına ORTALAMA=0 koymaz isen önceki işlemden kalan Ortalama değeri yeni işlemde hesaba katılır ve sonuç yanlış çıkar. Senin hata budur.
Bu kadar büyük bir hesap hatasını görmen gerekir. Üstelik tabiri caiz ise gözünün içine sokuyorum yine görmüyorsun telaşlandın yada kafan başka yerde olsa gerek. Biraz ara ver ve sakin kafa ile düşün istersen.

Her zaman söylerim işin mantığını kavrayın ezberden iş yapmayın kopya almayın. Mantık kavranırsa benzer durumlarde ne yapacağınızı kolaylıkla kararlaştırabilirsiniz. Yazdığınız programa hakim olmazsanız bu gibi durumların ortaya çıkması son derece doğaldır.

Ete



. Kağan

Anlayışın için teşekkür ederim ETE.

Söylediğin gibi kafam başka şeylerlede meşgul. Bir taraftan proje (TKDK) yazıyorum. Kafam çok karışıncada bulmaca çözer gibi PİC ile uğraşıyorum. Sanırım bundan olsa gerek. Aslında mantık problemlerini severim ve başarılıyımdır. Ama  bu işler tecrübe gerektiriyor. Mantığını anlamayı gerektiriyor. Çok açıklayıcı anlatmışsın tekrar teşekkür ederim.

Bende bu işi öğrenmeye kararlıyım ve azimliyim. Bazen sizleri deli eder gibi sorular soruyorum kusura bakmayın. Size göre çok basit olan bazı konuları kurmakta (kafam çok meşgul olduğundan) zorlanıyorum.

Tekrar anlayışınız için hepinize teşekkür ederim.

. Kağan

#38
 HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                 ORTALAMA =0
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 10


Yani doğrusu yukarıdaki mi?

Alıntı yapılan: kaganayanoglu - 27 Şubat 2014, 08:20:56
  ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
                     
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 100
            FOR I = 0 TO 50         '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/51
            LOW ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU KAPAT         
                    PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 10
           
'*******************************************************************************     
           
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50           '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 0 , OLCUM_B
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/51
            LOW ULN2003_2               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50             '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 0 , OLCUM_C 
                ORTALAMA = 0     
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/51
            LOW ULN2003_3               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = 0
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2
         
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
            PAUSE 10


Böyle mi?

mesajımda yazdığım gibi olduğunu söylemişsin. Yani her ölçümden önce sıfırlanacak. Böyle yaptığımda değerlendirmeye geçmiyor. Sürekli 4 portu tarıyor.

. Kağan

#39
Birde ortalama ile işimiz bittikten sonra diğer işlemi etkilemesin diye sona koysak olurmu?

  
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
               
                ADCIN 1 , OLCUM_D
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                ORTALAMA =0
                    PAUSE 2
               
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0


Ayrıca birde şunu merak ediyorum. 100 milisaniyelik gecikmede 50 kez değer alıp ortalamasını hesaplayabilir mi? Pic için bu süre yeterlimi? Böyle bir işin yapılması için gerekli süre nasıl hesaplanır.

ete

#40
Hala anlamadığın ortada. Matematikten sana sıfır veriyorum!!!!

Doğrusu;
HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
             ORTALAMA =0
           FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D               
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2

şeklindedir
Her döngüden evvel diyorum Döngü kimdir biliyormusun?
FOR I=0 to 50   komut satırı bir 0-50 arasında döngü işlemidir. Bundan evvel demek ise bu komut satırından evvel Ortalama=0 şeklinde bir komut satırı vermek demektir. Anlatıyorum. Ortalama isimli değişkeni döngüye girmeden evvel sıfırlamaz ise üzerinde değer kalır ve döngü içinde bunu hesaba dahil eder diyorum anla artık lütfen.

Sona koyarsan BASLA satırından sonraki ilk döngün yanlış çalışır.

Ete

. Kağan

#41
Alıntı yapılan: ete - 27 Şubat 2014, 17:38:27

Her döngüden evvel diyorum Döngü kimdir biliyormusun?
FOR I=0 to 50   komut satırı bir 0-50 arasında döngü işlemidir.

Döngü kimdir bilmiyordum. Döngüden kastedilenin

HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 100
             ORTALAMA =0
           FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D               
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                    PAUSE 2


tamamı olduğunu düşünüyordum. 

Peki süre konusundaki ikinci soruma ne dersiniz.

Ayrıca ortalama=0 yazmadan önce uçları bir kez taradıktan sonra 20 sn bekliyor, bazen sonuç ledini yakıyor ve sonra tekrar tarıyordu. Şimdi ise sürekli tarıyor ve sonuç ledini asla yakmıyor.

ete

#42
Programın tamamını görmeden ve şema olmadan hiç bir şeyi anlamam mümkün değil maalesef.
Hatta varsa simulasyon dosyasınıda versen iyi olur.
Yukarıdaki mesajlarından birinde programın tamamını vermişsin oraya baktım da sonuç ledi diye bir şey göremedim.

Bir ADC okuma işlemi mikro saniyelerle ölçülen bir işlemdir. Dolayısıyla 50 tane ADC okuması ve ardından ortalama alma taş çatlasa 1 ms de bitirilebilecek bir. Ama sen programa o kadar fazla gereksiz Pause ler doldurmuşsunki bunlar epeyce bir geceikme yaratıyordur. Her yere kanun var gibi Pause 100 yapıştırmışsın neden?

Ete

. Kağan

#43

@ __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.
       

        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
        I             VAR BYTE
             
   
        SAYI            = 0   
        OLCUM           = 0
        OLCUM_GIRIS     = 0
        I               = 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
       
             

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

      ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR. ULN2003 KODLANIYOR.
                     
           
            HIGH ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU TETİKLE     
            PAUSE 200
                ORTALAMA =0
            FOR I = 0 TO 50         '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                ORTALAMA = ORTALAMA + OLCUM_A
                NEXT I
                OLCUM_A = ORTALAMA/51
            LOW ULN2003_1           'ULN2003'ÜN 1 NOLU UCUNU KAPAT         
                PAUSE 2
       
           
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
           
            PAUSE 10
           
'*******************************************************************************     
       
            HIGH ULN2003_2             'ULN2003'ÜN 2 NOLU UCUNU TETİKLE
            PAUSE 200
                ORTALAMA =0
            FOR I = 0 TO 50           '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 0 , OLCUM_B
                ORTALAMA = ORTALAMA + OLCUM_B
                NEXT I
                OLCUM_B = ORTALAMA/51
            LOW ULN2003_2          'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                PAUSE 2
       
           
            IF OLCUM_B < 10 THEN OLCUM_B = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_3              'ULN2003'ÜN 3 NOLU UCUNU TETİKLE
            PAUSE 200
                ORTALAMA =0
            FOR I = 0 TO 50             '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 0 , OLCUM_C 
                ORTALAMA = ORTALAMA + OLCUM_C
                NEXT I
                OLCUM_C = ORTALAMA/51
            LOW ULN2003_3               'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                PAUSE 2
         
           
            IF OLCUM_C < 10 THEN OLCUM_C = 0
           
            PAUSE 10
'*******************************************************************************             
           
            HIGH ULN2003_4               'ULN2003'ÜN 4 NOLU UCUNU TETİKLE
            PAUSE 200
                ORTALAMA =0
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 1 , OLCUM_D
                ORTALAMA = ORTALAMA + OLCUM_D
                NEXT I
                OLCUM_D = ORTALAMA/51
            LOW ULN2003_4                'ULN2003'ÜN 1 NOLU UCUNU KAPAT 
                PAUSE 2
               
           
            IF OLCUM_D < 10 THEN OLCUM_D = 0
           
'*******************************************************************************           
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************           
               
    EN_KUCUK=255
            IF OLCUM_A<EN_KUCUK THEN EN_KUCUK = OLCUM_A        '4 DEĞERDEN EN KÜÇÜK OLANI BUL
            IF OLCUM_B<EN_KUCUK THEN EN_KUCUK = OLCUM_B
            IF OLCUM_C<EN_KUCUK THEN EN_KUCUK = OLCUM_C
            IF OLCUM_D<EN_KUCUK THEN EN_KUCUK = OLCUM_D
       
'************************************************************************
 
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
  ' EN KÜÇÜKTEN (10 FARK GÖZETİLEREK) DAHA BÜYÜK OLANLARI BUL
     
                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.
      ' HANGİLERİ EN KÜÇÜK DEĞERDEN 3 BÜYÜKSE O LEDLERİ YAK.
           
              IF FARK_A > 3 THEN  LED_SOL_ON=1
                 
              IF FARK_B > 3 THEN  LED_SAG_ON=1
                   
              IF FARK_C > 3 THEN   LED_SOL_ARKA =1
 
              IF FARK_D > 3 THEN   LED_SAG_ARKA =1

              IF 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     
               
GOTO MAIN

'***********************************************
PIL:

        ADCIN 1, BATT_OLCUM        'AN1 DEN GİREN 5V BATT_OLCUM'E YAZ
       
        IF BATT_OLCUM < 683 THEN     'EĞER BATT_OLCUM 633 DEN (9 VOLTTAN 6 VOLTA) AŞAĞI DÜŞERSE
            HIGH LED_SOL_ON        'TÜM LEDLERİ FLAŞ YAPTIR.
            PAUSE 300
            toggle LED_SOL_ON
           
            HIGH LED_SAG_ON
            PAUSE 300
            toggle  LED_SAG_ON
           
            HIGH LED_SOL_ARKA
            PAUSE 300
            toggle LED_SOL_ARKA
           
            HIGH LED_SAG_ARKA
            PAUSE 300
            toggle  LED_SAG_ARKA
        ENDIF
       
       
        GOTO MAIN
'***********************************************   

 

   


Kodun tamamı bu.

Uyarı ledleri kodun başında
  
        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 


baştaki tanımlama satırlarında.

Ekte dosyayı verdim.

. Kağan


Powered by EzPortal