ÇOKLU ZAMAN SAYACI

Başlatan kado17, 23 Mart 2015, 20:17:09

kado17

.

kado17

Bilginiz ve ilginiz icin tesekkur ederim yardım edebilir iseniz allah sizden cok razı olsun

ete

Programın genel amacını anlamadım. Ancak bazı kusurları var onlara değineceğim.
Birinci kusur;
FOR I=0 to SURE  şeklinde bir döngü kurup sonra o döngü içinde SUREAYAR alt etiketine gidip SURE değerini değiştirmen yada değiştirebilemn büyük hata. Döngü bileşenleri o döngü içinde değiştirilmemelidir. Bunu ya daha önce yap yada hiç yapma.
Zaten döngüyü kurmadan önce GOSUB SUREAYAR şeklinde ayar kısmına gidiyorsun. Bu şekilde çalışmak bence yanlış.

İkinci kusur;
OUTPUT PORTB.2
HIGH PORTB.2
şeklindeki komut dizisi de anlamsız. Çünkü HIGH PORTB.2 komutu çalışınca önce o pini çıkış yapar sonra pine HIGH değerini verir zaten. Bu durumda OUTPUT PORTB.2 komutu orada fazlalık oluyor. Onları silebilirsin. Aynı pini INPUT yaparken INPUT PORTB.2 demen gerekiyor. Ama output yaparkan kullanma yada HIGH PORTB.2 yerine PORTB.2=1 yazarsan output komutuda kalabilir.

Bunların dışında baktım program nasıl kısaltılabilir diye ama ana mantığı bilmeyince bir şey yapmak pek mümkün değil.
Ancak bazı kısaltmalar yapılabilir. Mesela;

IF PORTB.3=1 AND KANAL2=0 THEN '2İNCİ KANAL
   low PORTB.5 
   OUTPUT PORTB.3
   HIGH PORTB.3
   KANAL2=1
   KANAL2SURE=1
ENDIF

yerine,
IF PORTB.3=1 AND KANAL2=0 THEN '2İNCİ KANAL
   PORTB.5=0 
   HIGH PORTB.3
   KANAL2=1
   KANAL2SURE=1
ENDIF

yazman bile sana bir sürü bit bazında süre kısaltması sağlayacaktır.
Mesela;
IF KANAL2SURE=1 THEN
   ANASAYAC2= ANASAYAC2+1
   ANASAYAC2= ANASAYAC2//1001
ENDIF

yerine,

   ANASAYAC2= ANASAYAC2+KANAL2SURE
   ANASAYAC2= ANASAYAC2//1001
yazabilirsin. Zira Kanal2Sure=0 iken komut hiç bir şey yapmaz ama 1 iken istediğini yapar. Böylece bir if komutundan kurtulmuş olursun.
Basit şeyler ama toplamda programda epeyce kısaltma yaratabilir.

Programda daha fazla kısaltma yapamaz isen işlemci frekansını artırarak sorunu bir nebze aşabilirsin.

Ete

İlyas KAYA

Her çıkış için ayrı bir buton girişi mi var ?

- 1nci butona bastık , 1 nci led yandı , 10 dk boyunca
- 2 nci butona bastık , 2 nci led yandı , 5 dk boyunca
..
.

- Süreler birbirinden bağımsız olacak

gibi.

Adım adım program algoritmasını açıklarsanız ve kodlardan şema çıkarmak yerine var ise isis şeması eklerseniz daha iyi olacaktır.

Saygılar.


Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

kado17

.
#4
.

kado17


İlyas KAYA

Ledlerden önceki butonlar manuel olarak ledi yakmak için mi ?

Eğer öyle ise ve PIC sıfır verirken butona basılır ise ne olacak ? PIC kısa devreye düşer.
Butonları ne amaç ile kullandınız ?

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

kado17

butonlar ledleri yakmak icin evet similasyonda start yazan tusa basın sonrada herhangi bir ledin baglı oldugu butona basın led ayarlanann süre kadar yanacak yazılımda hata yaptıgım yerler varmı amacım onların düzeltilebilmesi

İlyas KAYA

Giriş ve çıkışları rastgele mi yaptınız yoksa pcb de böyle olduğu içinmi bu şekilde bağlantı var ?

Yani yerleri değişse bir sorun teşkil eder mi ?
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

kado17

evet yerleri değişir ise büyük sorun olur aynı bu şekli ile yazılım hatalarını gidermeliyim

ete

Tamamen farklı bir algoritma ile programın bir kısmını değiştirdim. Çok vakit alacağı için hepsini değiştirmedim. Onu sen yaparsın artık.

Baş tarafa bakarsan nasıl yaptığımıdA anlayacaksın. Sistemim şu,
KANAL isimli bir word değişkenim var. Hangi kanalı aktif etmiş isem ona ait bit'i set ediyorum.
Bir tane SAYAC isimli dizi değişkenim var dizi boyutu 12 yani bu 12 adet sayac değerini tutacaktır.
Birde KAPAT isimli word değişkenim var. Buda saymış bitmiş kapatılacakların kaydını tutuyor.
TMR1 sayacı ile 25 ms lik bir gecikme yaratıyorum. Bu süre zarfında bütün yapılması gerekenleri kontrol ediyorum.
Süre bitince bir zaman sayacını bir artırıyorum. 40 adedi bana 1 sn lik süreyi tamamlatacak.
1 sn süre geçince  ;
FOR I=0 TO 11
  SAYAC[I]=SAYAC[I]+KANAL.0[I]
  IF SAYAC[I]=SURE THEN
    KAPAT.0[I]=1
    SAYAC[I]=0
  ENDIF
NEXT

şeklinde bir döngü ile 12 adet kanalın hangisi aktif ise ona ait sayacı bir artırıyorum ve süreleride test ediyorum. Süresi dolan var ise ona ait KAPAT bitini set edip işimi bitiriyorum.
Bu şekilde sistem şıkış şıkır çalışıyor. Bunu aktif ettiğim kanallardan hem görüyorum hemde simulasyonda watch window dan sayac değerlerinide izleyip doğru çalıştıklarınıda görüyorum. Zamanı TMR1 sayacı tuttuğu için hiç bir zaman sayacında en ufak bir sapmada olmuyor.
Göreceğin üzere bir dizi değişkeni ve bir kaç ilave değişkenle bütün işi halletmiş oldum hemde hassas bir şekilde.
İşte algoritma budur.  İncele bakalım ve programıda tamamlayıp çalıştır bakalım nasıl çalışıyor.

Ete

@ __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC

DEFINE OSC 4
ADCON1 = 7
TRISA=%00000
TRISB=%11011111
TRISC=%11111111
TRISD= %00000000
TRISE=%11111

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

SURE  VAR WORD 56
KAPAT VAR WORD 58
I     VAR WORD

KANAL VAR WORD 60
ZAMAN VAR BYTE 62
SAYAC VAR BYTE[12]63

TRANSISTOR var  PORTB.5
SURE=0

PAUSE 500
ZAMAN=0

LABEL:
      GOSUB SUREAYAR
      TMR1H=$9E:TMR1L=$5F:T1CON=%00000001:PIR1.0=0'25 ms gecikme yaratacağız

      WHILE PIR1.0=0
        GOSUB KONTROL
'--------------------------------1. kanal--------------------------------------
            IF PORTB.2=1 AND KANAL.0=0 THEN '1İNCİ KANAL'                               
               HIGH PORTB.2               
               KANAL.0=1
               PORTB.5=0
            ENDIF

            IF KAPAT.0=1 THEN
               LOW PORTB.2
               INPUT PORTB.2
               SAYAC[0]=0
               KAPAT.0=0
               KANAL.0=0
            ENDIF
'**********************1KANAL SONU**********************************************   
'----------------------KANAL2---------------------------------------------------
            IF PORTB.3=1 AND KANAL.1=0 THEN '2İNCİ KANAL               
               HIGH PORTB.3
               KANAL.1=1
               PORTB.5=0 
            ENDIF

            IF KAPAT.1=1 THEN
              LOW PORTB.3
              INPUT PORTB.3
              KAPAT.1=0
              KANAL.1=0 
            ENDIF
'********KANAL SONU*********
'----------------------KANAL3---------------------------------------------------   
          IF PORTB.0=1 AND KANAL.2=0 THEN '3İNCİ KANAL
             PORTB.5=0   
             HIGH PORTB.0
             KANAL.2=1
          ENDIF

          IF KAPAT.2=1 THEN
            LOW PORTB.0
            INPUT PORTB.0
            KAPAT.2=0
            KANAL.2=0
          ENDIF
'   ********KANAL SONU*********
   
'----------------------KANAL4---------------------------------------------------   
          IF PORTB.1=1 AND KANAL.3=0 THEN '4İNCİ KANAL
            PORTB.5=0
            HIGH PORTB.1
            KANAL.3=1   
          ENDIF

         IF KAPAT.3=1 THEN
           LOW PORTB.1
           INPUT PORTB.1
           KAPAT.3=0
           KANAL.3=0
         ENDIF   
'********KANAL SONU*********
'----------------------KANAL5---------------------------------------------------

          IF PORTB.6=1 AND KANAL.4=0 THEN '5İNCİ KANAL
             PORTB.5=0
             HIGH PORTB.6
             KANAL.4=1
          ENDIF

          IF KAPAT.4=1 THEN
            LOW PORTB.6
            INPUT PORTB.6
            KAPAT.4=0
            KANAL.4=0
          ENDIF
   
'********KANAL SONU*********
'----------------------KANAL6---------------------------------------------------
          IF PORTB.7=1 AND KANAL.5=0 THEN '6İNCİ KANAL
            PORTB.5=0
            HIGH PORTB.7
            KANAL.5=1
          ENDIF

          IF KAPAT.5=1 THEN
            LOW PORTB.7
            INPUT PORTB.7
            KAPAT.5=0
            KANAL.5=0
          ENDIF
   
'********KANAL SONU*********
'----------------------KANAL7---------------------------------------------------
            IF PORTC.0=1 AND KANAL.6=0 THEN '7İNCİ KANAL
              PORTB.5=0
              HIGH PORTC.0
              KANAL.6=1
            ENDIF

            IF kapat.6=1 THEN
              LOW PORTC.0
              INPUT PORTC.0
              kapat.6=0
              KANAL.6=0
            ENDIF
   '********KANAL SONU*********
'----------------------KANAL8---------------------------------------------------

           IF PORTC.1=1 AND KANAL.7=0 THEN '8İNCİ KANAL
             PORTB.5=0
             HIGH PORTC.1
             KANAL.7=1
           ENDIF

           IF kapat.7=1 THEN
             LOW PORTC.1
             INPUT PORTC.1
             kapat.7=0
             KANAL.7=0
           ENDIF
   '********KANAL SONU*********

'----------------------KANAL9---------------------------------------------------   
          IF PORTC.2=1 AND KANAL.8=0 THEN '9İNCİ KANAL
            PORTB.5=0 
            HIGH PORTC.2
            KANAL.8=1
          ENDIF

          IF KAPAT.8=1 THEN
            LOW PORTC.2
            INPUT PORTC.2
            KAPAT.8=0 
            KANAL.8=0
          ENDIF
   '********KANAL SONU*********
'----------------------KANAL-10---------------------------------------------------
            IF PORTC.3=1 AND KANAL.9=0 THEN '10İNCİ KANAL
               PORTB.5=0
               HIGH PORTC.3
               KANAL.9=1
            ENDIF

            IF KAPAT.9=1 THEN
              LOW PORTC.3
              INPUT PORTC.3
              KAPAT.9=0 
              KANAL.9=0
            ENDIF
   '********KANAL SONU*********
'----------------------KANAL-11---------------------------------------------------

            IF PORTC.4=1 AND KANAL.10=0 THEN '11İNCİ KANAL
               PORTB.5=0
               HIGH PORTC.4
               KANAL.10=1 
            ENDIF
             
            IF KAPAT.10=1 THEN
              LOW PORTC.4
              INPUT PORTC.4
              KAPAT.10=0
              KANAL.10=0
            ENDIF 
   '********KANAL SONU*********
'----------------------KANAL-12---------------------------------------------------

           IF PORTC.5=1 AND KANAL.11=0 THEN '12İNCİ KANAL
             PORTB.5=0
             HIGH PORTC.5
             KANAL.11=1
           ENDIF 

           IF KAPAT.11=1 THEN
             LOW PORTC.5
             INPUT PORTC.5
             KAPAT.11=0
             KANAL.11=0
           ENDIF 
        wend
'-------------------------------------------
        ZAMAN=ZAMAN+1:T1CON=0
        IF ZAMAN<40 THEN LABEL '25 MS LİK GECİKMEDE BU SATIR

        ZAMAN=0
        FOR I=0 TO 11
          SAYAC[I]=SAYAC[I]+KANAL.0[I]
          IF SAYAC[I]=SURE THEN
            KAPAT.0[I]=1
            SAYAC[I]=0
          ENDIF
        NEXT
        T1CON=0
        GOTO LABEL
   

KONTROL:
        IF PORTB.4=1  THEN
          HIGH PORTB.5 'TRANSİSTÖR İLETİMDE
        ENDIF
        RETURN

SUREAYAR: 'SÜRE AYARLAMALARI YAPILIYOR
          IF PORTE.1=0 AND PORTE.2=0 THEN  'SURE=1500  '25 DAKİKA    00     
            SURE=10
          ENDIF
          IF PORTE.1=1 AND PORTE.2=0 THEN  'SURE=2100 '35 DAKİKA     01
            SURE=20
          ENDIF                   
          IF PORTE.1=0 AND PORTE.2=1 THEN  'SURE=2400 '40 DAKİKA     10
            SURE=30
          ENDIF
          IF PORTE.1=1 AND PORTE.2=1 THEN  'SURE=2700  '45 DAKİKA    11
            SURE=40
          ENDIF
         
          RETURN

END


NOT: Programın tamamını düzelttim. Devre şeması ile birlikte ilişiktedir.

kado17


ete

Şema neden kayboldu birden bire?
Yeniden koyarmısın o şemayı.

Ete

kado17

sema ekte hocam

ete

Deneme yapınca Kanal-12 de sorun olduğunu gördüm. Ufak bir kusur varmış düzelttim.
Bu arada süre değerleri ile oynadım. Sırası ile bit durumlarına göre 10-20-30-40 değerlerini alıyor sen kendine göre düzeltirsin.

Ete

Powered by EzPortal