Basic zamanlama sorunu

Başlatan yerkirazi, 12 Ocak 2016, 13:17:57

yerkirazi

'****************************************************************
PORTA=0:portb=0
TRISB=%10000000   'PortB yarısı giriş yarısı çıkış yapıldı.
TRISA=%00011111   'PortA ilk 5 bit giriş yapıldı
'-------------------------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628A                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek açık
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-------------------------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-------------------------------------------------------------------------------
SAYAC  VAR BYTE
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
SYMBOL CIKIS1=PORTB.1 
'--------------------------------------A--------------------------------------
BASLA:  Sayac=0

ROLEKONTROL:   

           DURUM=PORTB
           
              IF SAYI=1  then
                If durum.1=0 THEN
                PORTB=DURUM | %00000010
                PAUSE 65500
                SAYAC=SAYAC+1
                'IF sayac=120 THEN PORTB=DURUM | %00000000  'bu şekilde yaptım olmadı.
                IF sayac=120 THEN LOW CIKIS1 'bu mu doğru.
                goto ROLEKONTROL
              ENDIF
           endif

EXIT :
        SAYAC=0
        DURUM=PORTB
        PORTB=DURUM & %11111111
        RETURN     
       
End

Sayın arkadaşlar,yukarıdaki yazılımda zamanlama sorununu çözemedim.
CIKIS1=PORTB.1  bağlı rölenin girilen 1 sayısıyla çekip, iki saat sonra bırakmasını istiyorum.
röle çekiyor ama 2 saat sonra bırakmıyor.Devamlı çekili kalıyor.
Lütfen yardım edebilirmisiniz.
Saygılarımla.

LÜTFEN KODLARI , KOD EKLE # BUTONU İLE PAYLAŞINIZ

ete

Programında Pause komutunun sağlıklı çalışabilmesi için hangi frekansta çalıştığını ;
DEFINE OSC x  şeklinde komut ile programa belirtmen gerekiyor. Burada X yerine direk çalışma frekansını MHZ cinsinden yazman gerekiyor .

Değişken tanımlamalarından sonra programa 300 ms lik bir açılış gecikmesi vermen gerekiyor.

Program bir döngüdür. Bir yerde son bulmaz. Bir takım işler yapıldıktan sonra tekrar program başa yönlendirilmelidir. Sen bu yönlendirmeyi yapmamışsın. Programa bakacak olursak;
SAYI=1 değil ise program otomatikman EXIT isimli etikete atlayacaktır. Bu arada EXIT bir basic komutudur. Bunu etiket ismi olarak kullanmaman gerekiyor. Oraya CIK veya benzeri bir şey yazman daha doğru olur.
Bu EXIT isimli alt programda son komut satırı RETURN olarak gözüküyor. Bu komut başka bir yerden GOSUB ile gelindiği zaman programı geldiği yere yollamak için kullanılır. Sende hiç bir GOSUB komutu yok. Bu nedenle oradaki RETURN komutu da yanlış kullanılmış. Bu şekilde programın stack hatası vermesi gerekir. Ama gerçek devrede sen bu hatayı göremezsin. Çakılır kalır.

SAYI değişkeni nasıl 1 olabiliyor programdan anlayamadım. Dolayısıyla röleyi nasıl çektirebildiğinide anlayamadım.
Ama genel anlamda programdaki kusurlar giderildikten sonra bakmak lazım.

Rölenin set edilmesi doğru. Reset edeilmeside doğru ama çalıştıramadığın ve programda kapalı olan yer şöyle olmalıydı,
IF sayac=120 THEN PORTB=DURUM & %11111101  Bu komut PORTB.1 pinini sıfır ile AND işlemine sokar ve  1 AND 0=0 olacağı için o pini LOW a çekmiş olrsun. Diğer pinlerin konum değiştirmemesini sağlamak amacı ile onları "1" olarak kullanmak ve yalnızca PortB.1 pinine karşılık gelen biti "0" almak gerekir.

Ete

yerkirazi

#2
Sayın Erol hocam yardımınız için çok teşekkürler.
cep telefonun 1 tuşuna bastığımda SAYI=1 oluyor.

             
  IF SAYI=1  then
                If durum.1=0 THEN
                PORTB=DURUM | %00000010
                PAUSE 65500
                SAYAC=SAYAC+1
                IF sayac=120 THEN PORTB=DURUM & %11111101 'bu şekilde yaptım olmadı.
                goto ROLEKONTROL
              ENDIF
           endif


Yukarıdaki örneği yaptım olmadı.

LÜTFEN KODLARI "KOD EKLE #" DÜĞMESİNİ KULLANARAK EKLEYİNİZ !!!!

yerkirazi

#3
Sayın Erol hocam yardımınız için çok teşekkürler.
cep telefonun 1 tuşuna bastığımda SAYI=1 oluyor.

               
IF SAYI=1  then
                If durum.1=0 THEN
                PORTB=DURUM | %00000010
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PAUSE 65500
                PORTB=DURUM & %11111101
                goto ROLEKONTROL
              ENDIF
           endif


Yukarıdaki örneği PAUSE 65500 yazılımını alt alta 60 adet yazarsam oluyor.
Fakat bu işlemi daha fazla yazdığımda PIC hafızası doluyor.
Başka yazılım yapamıyorum.
Saygılarımla

LÜTFEN KODLARI "KOD EKLE #" DÜĞMESİNİ KULLANARAK EKLEYİNİZ !!!!

yerkirazi

#4
Sayın Erol hocam bu aşağıdaki yazılımı da denedim,
Maalesef başarılı olamadım.
Saygılarımla.

'****************************************************************
PORTA=0:portb=0
TRISB=%10000000   'PortB yarısı giriş yarısı çıkış yapıldı.
TRISA=%00011111   'PortA ilk 5 bit giriş yapıldı
'-------------------------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628A                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek açık
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-------------------------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-------------------------------------------------------------------------------
SAYAC  VAR BYTE
SN          VAR   BYTE
DAK        VAR   BYTE
SAAT     VAR   BYTE
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
SYMBOL CIKIS1=PORTB.1 
'--------------------------------------A--------------------------------------
BASLA:  Sayac=0
             SN=0
             DAK=0
             SAAT=0

ROLEKONTROL:   

           DURUM=PORTB
           
              IF SAYI=1  then
                If durum.1=0 THEN
                PORTB=DURUM | %00000010
                SN=SN+1            'saniye değeri bir artırılıyor
            IF SN=60 THEN         'saniye 60 olmuş ise 1 dakika süre geçti o halde
               SN=0            ' saniye sıfırlanıyor
               DAK=DAK+1           ' dakika değeri bir artırılıyor
                  IF DAK>=60 THEN  PORTB=DURUM & %11111101 'dakika 60 olmuş ise 1 saat süre geçti
                goto ROLEKONTROL
              ENDIF
           ENDIF
         ENDIF

EXIT :
        SAYAC=0
        SN=0
        DAK=0
        SAAT=0
        DURUM=PORTB
        PORTB=DURUM & %11111111
        RETURN     
       
End



LÜTFEN KODLARI "KOD EKLE #" DÜĞMESİNİ KULLANARAK EKLEYİNİZ !!!!

İlyas KAYA

Programınızda herhangi bir döngü yok. Enerji verilir verilmez if satırlar işler ve bakar ki şartlar sağlanmamış bir alt komuta iner.

ENDIF lerin en sonuna;  Goto ROLEKONTROL ekleyin.

ETE hocanın dediklerini hiç okumamışsınız. Yine bildiğiniz gibi yapmışsınız.

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

ete

#6
Yerkirazı,
Bildiğini okumakda ısrar ediyorsun. KOd tag kullan demiştim yine kullanmadan bir araba kod yazmışsın. Neden acaba;
Bak İlyas ne söylüyor!!!! Hiç mi önemi yok söylediklerimin.

Diğer yandan 1-2 saatlik zaman saydırabilmek için elinde bir sürü alternatif mevcut.
Birincisi kesme kullanarak saat yaratırsın. Bu saat sürekli dakikaları sayar sonrada saatleri sayar.
1000Ms=1sn 60sn=1 dak 60 dak=1 saat bu eşitlikleri unutma.
Bir döngü ile  0 to 59 arasında çalıştırp 1 dakikalık süreyi geçirebilirsin. Onun sonunda dakikayı bir artırır ve 60 olmuşmu bakarsın.
Senin yazdığın kodlarda hiç bir gecikme yaratan komut gözükmüyor. Kim süre geçirtecek?
Şöyle olabilirdi;

SAYDIR:
FOR I=0 to 29       'bu kod 1 dakikalık süre sayar.
   pause 2000
next
DAK=DAK+1
IF DAK=60 then
  saat=saat+1
  DAK=0
  if saat=2 then bitir 'iki saat geçince ne bitirilecek ise oraya gitmelisin
endif
GOTO SAYDIR. ' 2 saat geçinceye kadar bu kod çalışır

Gördünmü ne kadar basit

Ete

yerkirazi

#7
Sayın arkadaşlar yardımlarınız için çok teşekkürler.
Aşağıdaki yazılımda zamanlama işlemini yapabiliyorum.
Fakat 1nolu röleyi zamanladığımda
2nolu röleyi zamanlayamıyorum.


SAYDIR:
IF durum.1=1 THEN
yazılımı eklediğimde 1 nolu ve 2nolu röleyi açabiliyorum
Fakat zamanlama işlemi olmuyor.
Saygılarımla.

PORTA=0:PORTB=0
TRISB=%00000000   'B portu tamamı çıkış yapıldı.
TRISA=%00111111   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628A de komparatör pinleri iptal hepsi giriş çıkış                                 
'-----------------------------------------------------------------
DEFINE OSC 4 'for 4 Mhz

SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
I               VAR BYTE
DAK    VAR BYTE
SAAT   VAR BYTE
SANIYE VAR BYTE
DAKIKA VAR BYTE
SAAT1  VAR BYTE
YAZ    VAR BIT
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL BUZZER=PORTB.4
'--------------------------------------------------------------------------
PAUSE 200
CLEAR
read 0,SAYI:PAUSE 10
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER

READ 10,DURUM
IF DURUM=255 THEN
   DURUM=0
   GOSUB ROLEYAZ
ENDIF

PORTB=DURUM
'--------------------------------------ANA--------------------------------------
BASLA: 
       
        I=0
        DAK=0
        SAAT=0
        SANIYE=0
        DAKIKA=0
        SAAT1=0     
'--------------------------------------ROLEKONTROL--------------------------------------
ROLEKONTROL:   
                IF YAZ=1 THEN GOSUB ROLEYAZ
                gosub SES1:GOSUB SES1
                IF SAYI=12 THEN ACMA   '# tuşuna basılınca acma etiketine git
                IF SAYI=11 THEN KAPAT  '* tuşuna basılınca kapat etiketine git
                GOTO ROLEKONTROL
               
ACMA:     
   
           DURUM=PORTB 
           
           IF SAYI=1 THEN
              IF durum.1=0 THEN
                GOSUB SES1
                PORTB=DURUM | %00000010 '#1 ,1 saat zamanlı 1 nolu röle açma
                YAZ=1   'elektrik kesildiğinde röle konumu eeprom'a yazılır
               GOTO SAYDIR
                PAUSE 1000
                GOTO ROLEKONTROL
                ENDIF
              ENDIF
              'ENDIF
           
           IF SAYI=2 THEN
              IF durum.1=0 THEN
                GOSUB SES1
                PORTB=DURUM | %00000010 '#2  ,2 saat zamanlı 1 nolu röle açma
                YAZ=1
                GOTO SAYDIR0
                PAUSE 1000
                GOTO ROLEKONTROL
                ENDIF
              ENDIF       
                 
           IF SAYI=3 THEN
              IF durum.1=0 THEN
                GOSUB SES1:GOSUB SES1
                 PORTB=DURUM | %00000100  '#3 ,1 saat zamanlı 2 nolu röle açma
                 YAZ=1   'elektrik kesildiğinde röle konumu eeproma yazılır
               GOTO SAYDIR1
                PAUSE 1000
                 GOTO ROLEKONTROL
              ENDIF   
             ENDIF

           IF SAYI=4 THEN
              IF durum.1=0 THEN
                 GOSUB SES1:GOSUB SES1
                 PORTB=DURUM | %00000100 '#3 ,2 saat zamanlı 2 nolu röle açma
                 YAZ=1
                 GOTO SAYDIR2
                PAUSE 1000
                GOTO ROLEKONTROL
              ENDIF   
           ENDIF
               
           IF SAYI=8 THEN
              IF durum.1=0 THEN
                 GOSUB SES1
                 PORTB=DURUM | %00000010 '#8 zamansız 1 nolu röle açma
                 YAZ=1
                 goto ROLEKONTROL
              ENDIF   
           ENDIF

            IF SAYI=9 THEN
              IF durum.2=0 THEN
                 GOSUB SES1:GOSUB SES1
                 PORTB=DURUM | %00000100 '#9 zamansız 2 nolu röle açma
                 YAZ=1
                 goto ROLEKONTROL
              ENDIF   
           ENDIF
           
        GOTO ROLEKONTROL

KAPAT:     
         
           durum=PORTB
           
           IF SAYI=0 THEN
              GOSUB SES3
              PORTB=DURUM & %10000001  '*0 tüm röleler kapanır
              YAZ=1
              GOTO ROLEKONTROL
           ENDIF   

           IF SAYI=8 THEN
              IF durum.1=1 THEN
                 GOSUB SES1
                 PORTB=DURUM & %11111101 '*8 bir nolu röle kapanır
                 YAZ=1
                 goto ROLEKONTROL
              ENDIF
           ENDIF   
             
           IF SAYI=9 THEN
             IF durum.2=1 THEN
                GOSUB SES1:GOSUB SES1
                PORTB=DURUM & %11111011  '*9 iki nolu röle kapanır
                YAZ=1
                goto ROLEKONTROL
             ENDIF
           ENDIF

             GOTO ROLEKONTROL

SAYDIR:
                 IF durum.1=1 THEN  ' bunu yazdığımda, istediğim zaman 1 ve  2 nolu röleyi kapatıp açabiliyorum.1 nolu röle aktif olup  zamanı sayarken, iki nolu röleyi aktif edip zamanlamak istiyorum. Fakat  zamanı sayıp röleyi kapatmıyor.       
                FOR I=0 to 59'bu kod 1 dakikalık süre sayar.   
                pause 2000
                next
                DAK=DAK+1
                IF DAK=60 then 
                saat=saat+1 
                DAK=0 
                if saat=1 then ROLEKAPAT 'Bir saat geçince ne bitirilecek ise oraya gitmelisin
                endif
                GOTO SAYDIR
                pause 1000
                endif
                GOTO ROLEKONTROL
                           
SAYDIR0:       
                FOR I=0 to 59'bu kod 1 dakikalık süre sayar.   
                pause 2000
                next
                DAK=DAK+1
                IF DAK=60 then
                saat=saat+1 
                DAK=0 
                if saat=2 then ROLEKAPAT 'iki saat geçince ne bitirilecek ise oraya gitmelisin
                endif
                GOTO SAYDIR0
                pause 1000

                GOTO ROLEKONTROL
               
SAYDIR1:           
                FOR SANIYE=0 to 59'bu kod 1 dakikalık süre sayar.   
                pause 2000
                next
                DAKIKA=DAKIKA+1
                IF DAKIKA=60 then
                saat1=saat1+1 
                DAKIKA=0 
                if saat1=1 then ROLEKAPAT1 'Bir saat geçince ne bitirilecek ise oraya gitmelisin
                endif
                GOTO SAYDIR1
                pause 1000               

               GOTO ROLEKONTROL
               
SAYDIR2:             
                FOR SANIYE=0 to 59'bu kod 1 dakikalık süre sayar.   
                pause 2000
                next
                DAKIKA=DAKIKA+1
                IF DAKIKA=60 then 
                saat1=saat1+1 
                DAKIKA=0 
                if saat1=2 then ROLEKAPAT1 'iki saat geçince ne bitirilecek ise oraya gitmelisin
                endif
                GOTO SAYDIR2
                pause 1000
               
               GOTO ROLEKONTROL

ROLEKAPAT:
                IF durum.1=1 THEN     
                PAUSE 200
                PORTB=DURUM & %11111101
                YAZ=1
                GOTO ROLEKONTROL
                RETURN

                GOTO ROLEKONTROL
                 
ROLEKAPAT1:
                IF durum.2=1 THEN     
                PAUSE 200
                PORTB=DURUM & %11111011
                YAZ=1
                GOTO ROLEKONTROL
                ENDIF
                RETURN

                GOTO ROLEKONTROL

                   
SAYIAL:
                   SAYI=0
                   SAYI.0=PORTA.4
                   SAYI.1=PORTA.3
                   SAYI.2=PORTA.2
                   SAYI.3=PORTA.1
                   IF SAYI=10 THEN SAYI=0
                   RETURN   

ROLEYAZ:
        DURUM=PORTB & %11111111
        WRITE 10,DURUM
        YAZ=0
        RETURN       
               
SES1: SOUND BUZZER,[83,15,30]:pause 80:RETURN

         
CIKIS : 
       
        I=0
        SAAT=0
        DAK=0
        SAAT1=0
        SANIYE=0
        DAKIKA=0       
        GOSUB SES1
        GOTO BASLA
        RETURN     

End

Burak

Peki bir soruda ben sorayım sana ... KOD TAG , (# butonunu) kullanmak bu kadar mı zor ???? Kaç mesajdır ikaz alıyorsun umarım en azından bunun farkındasındır ... !!!!!!

Burak
Ω Gens Una Sumus Ω

yerkirazi

Sayın Burak GÜNAY bey arkadaşım,sitenin acemisiyim.
Özür dilerim.Kod ekle butonunu daha yeni gördüm.
Kusura bakmayın.
Saygılarımla.

ete

Burak o ikazı yapmasa o kod tag butonunu öğrenmeyecektin galiba.  Her neyse, biraz dikkat ve özveri gösrmeniz gerekiyor.
Kurallar hepmiz için var. yalnızca bir kişiye mahsus şeyler değiller.

Benim verdiğim örneği yine yanlış kullanmışsın. Bunun sorun ile alakası yok ama bir yanlışlığıda düzeltmem gerek.
Ben sana SAYDIR etiketi altında kod örneği verdim ama bak bakalım oraya döngü kaça kadar kurulmuş.
Biraz kafayı çalıştır. 1000ms=1sn ise  2000 ms=? sn eder?
Sen ne yapmışsın 60 tane 2000 ms kullanmışsın bu 2 dakika eder ama sen DAK=DAK+1 ile 1 dak olarak kullanmışsın.
Döngü 0-59 arasında olursa Pauseus 1000 demen lazım. Döngün 0-29 arasında olursa Pauseus 2000 kullanman lazım.

Gelelim soruna,
İstediğin şu sanırım, Birden fazla rölem olsun bunları istediğim zaman çalıştıryım ve her çalışan için ayrı zaman tutup önceden belirlediğim süre sonunda kapansınlar.
Bu, tek bir saat ve bu saat den zaman sayan röle adedi kadar sayaç demektir. Bu durumda yapman gereken şey KESME yöntemi ile saat bilgisini elde etmek ve her röle için ayrı bir sayaç kullanmak. DAK=DAK+1 olan yerde ;
- 1 nolu röle aktif ise dak1=dak1+1
- 2 nolu röle aktif ise dak2=dak+1
- 3 nolu röle aktif ise dak3=dak3+1 şeklinde aktif olan rölelere ait sayaçları dakika artışında artırman gerekir.

Saat projeleri içinde basit saat olması gerek. Bu saat kesme yöntemi ile saat palslerini elde eder. Oradan yararlanabilirsin.

Rölelerin aktifliğini PORTB pinlerinden anlayabiliyorsun. Ondan sonrasıda dak adedi istenen seviyeye gelimişmi gelmemişmi kontrol etmeye kalıyor.

Bu arada 1 nolu rölenin açma komutuda yanlış ona da bak. Hem1 hem 2 nolu röle nin açma komutları aynı olmuş.

Ete

yerkirazi

#11
Sayın Erol bey hocam yardımlarınız için çok teşekkürler.
Böyle mi yapmalıyım.Saygılar.

PORTA=0:PORTB=0
TRISB=%00000000   'B portu tamamı çıkış yapıldı.
TRISA=%00111111   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628A de komparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000      'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0                                 
'-----------------------------------------------------------------
DEFINE OSC 4 'for 4 Mhz
SAYAC VAR BYTE
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
SN     VAR BYTE
DAK    VAR BYTE
SAAT   VAR BYTE
DAK1 VAR BYTE
DAK2 VAR BYTE
YAZ    VAR BIT
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL BUZZER=PORTB.4
'-------------------------------------------------------------
PAUSE 200
CLEAR
read 0,SAYI:PAUSE 10
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER

READ 10,DURUM
IF DURUM=255 THEN
   DURUM=0
   GOSUB ROLEYAZ
ENDIF

PORTB=DURUM
'--------------------------------------ANA----------------------
BASLA: 
       
        SN=0
        DAK=0
        SAAT=0
        DAK1=0
        DAK2=0 
'--------------------------ROLEKONTROL-------------------
ROLEKONTROL:   
         IF YAZ=1 THEN GOSUB ROLEYAZ
        gosub SES1:GOSUB SES1
        IF SAYI=12 THEN ACMA   '# tuşuna basılınca acma etiketine git
        IF SAYI=11 THEN KAPAT  '* tuşuna basılınca kapat etiketine git
        GOTO ROLEKONTROL
               
ACMA:     
   
           DURUM=PORTB 
           
           IF SAYI=1 THEN
            IF durum.1=0 THEN
             GOSUB SES1
            PORTB=DURUM | %00000010 '#1 ,1 saat zamanlı 1 nolu röle açma
            YAZ=1 'elektrik kesildiğinde röle konumu eeprom'a yazılır
              DAK1=DAK1+1
             IF DAK1=1 then ROLEKAPAT
                PAUSE 100
                GOTO ROLEKONTROL
                ENDIF
              ENDIF
              'ENDIF
           
           IF SAYI=2 THEN
              IF durum.1=0 THEN
                GOSUB SES1
              PORTB=DURUM | %00000010 '#2  ,2 saat zamanlı 1 nolu röle açma
                YAZ=1
                DAK1=DAK1+1
                IF DAK1=2 then ROLEKAPAT
                PAUSE 100
                GOTO ROLEKONTROL
                ENDIF
              ENDIF       
                 
           IF SAYI=3 THEN
            IF durum.1=0 THEN
             GOSUB SES1:GOSUB SES1
             PORTB=DURUM | %00000100 '#3 ,1 saat zamanlı 2 nolu röle açma
              YAZ=1 'elektrik kesildiğinde röle konumu eeproma yazılır
              DAK2=DAK2+1
              IF DAK2=1 then ROLEKAPAT1
              PAUSE 100
               GOTO ROLEKONTROL
              ENDIF   
             ENDIF

           IF SAYI=4 THEN
              IF durum.1=0 THEN
              GOSUB SES1:GOSUB SES1
              PORTB=DURUM | %00000100 '#3 ,2 saat zamanlı 2 nolu röle açma
              YAZ=1
               DAK2=DAK2+1
                IF DAK2=2 then ROLEKAPAT1
                PAUSE 100
                GOTO ROLEKONTROL
              ENDIF   
           ENDIF
               
           IF SAYI=8 THEN
            IF durum.1=0 THEN
             GOSUB SES1
            PORTB=DURUM | %00000010 '#8 zamansız 1 nolu röle açma
              YAZ=1
             goto ROLEKONTROL
              ENDIF   
           ENDIF

            IF SAYI=9 THEN
              IF durum.2=0 THEN
              GOSUB SES1:GOSUB SES1
               PORTB=DURUM | %00000100 '#9 zamansız 2 nolu röle açma
               YAZ=1
               goto ROLEKONTROL
             ENDIF   
           ENDIF
           
        GOTO ROLEKONTROL

KAPAT:     
         
           durum=PORTB
           
           IF SAYI=0 THEN
              GOSUB SES3
              PORTB=DURUM & %10000001  '*0 tüm röleler kapanır
              YAZ=1
              GOTO ROLEKONTROL
           ENDIF   

           IF SAYI=8 THEN
            IF durum.1=1 THEN
             GOSUB SES1
             PORTB=DURUM & %11111101'*8 bir nolu röle kapanır
             YAZ=1
             goto ROLEKONTROL
              ENDIF
           ENDIF   
             
           IF SAYI=9 THEN
             IF durum.2=1 THEN
             GOSUB SES1:GOSUB SES1
             PORTB=DURUM & %11111011'*9 iki nolu röle kapanır
             YAZ=1
             goto ROLEKONTROL
             ENDIF
           ENDIF

             GOTO ROLEKONTROL

ROLEKAPAT:
   
                PAUSE 200
                PORTB=DURUM & %11111101
                YAZ=1

                GOTO ROLEKONTROL
                 
ROLEKAPAT1:
   
                PAUSE 200
                PORTB=DURUM & %11111011
                YAZ=1

                GOTO ROLEKONTROL

                   
SAYIAL:
                   SAYI=0
                   SAYI.0=PORTA.4
                   SAYI.1=PORTA.3
                   SAYI.2=PORTA.2
                   SAYI.3=PORTA.1
                   IF SAYI=10 THEN SAYI=0
                   RETURN   

ROLEYAZ:
        DURUM=PORTB & %11111111
        WRITE 10,DURUM
        YAZ=0
        RETURN       
               
SES1: SOUND BUZZER,[83,15,30]:pause 80:RETURN


DISABLE
KESME:
  SAYAC=SAYAC+1'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
   IF SAYAC=61 then'61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
    SAYAC=0  'sayaç sıfırlanıyor
    SN=SN+1  'saniye değeri bir artırılıyor
    IF SN=60 THEN 'saniye 60 olmuş ise 1 dakika süre geçti o halde
    SN=0    ' saniye sıfırlanıyor
    DAK=DAK+1  ' dakika değeri bir artırılıyor
    IF DAK=60 THEN 'dakika 60 olmuş ise 1 saat süre geçti
    DAK=0      ' dakika sıfırlanıyor
    SAAT=SAAT+1' saat değeri bir artırılıyor
    IF SAAT=24 THEN SAAT=0'saat 24 olmuş ise 1 gün geçti
    ENDIF
    ENDIF
    ENDIF
    INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor
    RESUME
    ENABLE
       
CIKIS : 
       
        SAYAC=0
        SN=0
        SAAT=0
        DAK=0
        DAK1=0
        DAK2=0       
        GOSUB SES1
        GOTO BASLA
        RETURN     

End

ete

Böylemi yapmalıyım dediğine göre sonuç alamıyorsun. Zira yapıp denemiş olsan öyle yapıp yapmayacağınıda bilirdin.
Programcılığın çok kötü. Maalesef aklını çalıştırmıyorsun sanırım daha başka şeyler için saklıyorsun aklını.

Dakika değeri ne zaman artırılır.?  Kesme ile zaman tuttuğun zaman dakika değerini ne zaman artırıyorsun? Tabiiki SN=60 olduğunda 1 dakika geçmiş olacağı için Dak değerinide artırıyorsun. Peki diğer artırılması gereken dakikalarda (Dak1 -Dak2 ...) orada artırılması gerekemezmi sence?

Ama sen ne yapmışsın. Rast gele yerlere Dak1=Dak1+1 komut satırını ilave etmişsin. Bu durumda o Dak1 1 dakika doluncamı artar yoksa program her oradan geçişte mi artar. Bunu düşünmen gerekirdi. Bir komut yazarken programa ne gibi etkisi olacak bunun üzerinde kafa yorman gerekiyor.

Ete


ete

Mademki röleler saat bazında kapanacak o zaman dakika saymaya gerek yok. Saat saymak daha avantajlı olacak.
Bu nedenle aşağıdaki kodlarda istediğini yapmaya çalıştım. Üstelik programa koyduğun açıklamalara bakılırsa röleler hem 1 saat hemde 2 saat sonra kapatılacak şekilde açılabiliyor. Bunuda dikkate alarak kapanması gereken sürede kapanacak şekilde ayarladım.
İki saat değişkenimiz var SAAT1 ve SAAT2 , 2 adet Süre değişkenimiz var. BUnlar rölelerin hangi sürede kapanacağının bilgisini tutuyor. SURE1 ve SURE2. Saat sayaçları aklına estiği zaman saymıyor. Saat1 sayacı Röle1 çekili ise sayacak, aynı şekilde Saat2 sayacıda röle2 çekili ise sayacak. Diğer konumlarda saymayacaklar.
Sayma işi saat artışı olduğu yerde kesme içinde ama saatin dolup dolmadığı ise ana program bölümünde Rolekontrol altında bakılıyor.
Bu şekilde çalışması gerekir.

Anlamadığım bir şey var. SAYI nasıl oluyorda otomatik telefondan hangi tuşa basarsan o sayı olabiliyor. ?
Programda SAYIAL diye bir alt program var. Ancak oraya yönlendirirsen SAYI=1 veya SAYI=2 olabilir. Yada sayı=basılan tuş olabilir. AKsi halde SAYI değeri havada kalır. Programda ise GOSUB SAYIAL diye bir komut göremedim. BU şekli ile bu program çalışmaz kesinlikle. Üstelik O  SAYIAL alt programına kafana estiği zamanda gidemezsin. KOd çözücünün bir Valid Bilgi çıkışı olması gerekir. O çıkış şayet HIGH olmuş ise telefondan bir sayı tuşuna basılmış anlamına gelir. Senin ip ucun o olmalıdır. O çıkış 1 ise hemen SAYIAL alt programına gidip SAYI değerini alman gerekir. Sende böyle bir şey yok.

Anlaşılan hem elektronik bilgin kısıtlı hemde programcılığın çok az. Peki neden böyle işlere kalkışıyorsun acaba sormadan edemeyeceğim.

Ete

PORTA=0:PORTB=0
TRISB=%00000000   'B portu tamamı çıkış yapıldı.
TRISA=%00111111   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628A de komparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000      'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0                                 
'-----------------------------------------------------------------
DEFINE OSC 4 'for 4 Mhz
SAYAC VAR BYTE
SURE1  VAR BYTE
SURE2  VAR BYTE
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
SN     VAR BYTE
DAK    VAR BYTE
SAAT   VAR BYTE
SAAT1  VAR BYTE
SAAT2  VAR BYTE
YAZ    VAR BIT
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL BUZZER=PORTB.4
'-------------------------------------------------------------
PAUSE 200
CLEAR
read 0,SAYI:PAUSE 10
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER

READ 10,DURUM
IF DURUM=255 THEN
   DURUM=0
   GOSUB ROLEYAZ
ENDIF

PORTB=DURUM
'--------------------------------------ANA----------------------
BASLA: 
        SN=0
        DAK=0
        SAAT=0
        SAAT1=0
        SAAT2=0 
'--------------------------ROLEKONTROL-------------------
ROLEKONTROL:   
            IF YAZ=1 THEN GOSUB ROLEYAZ
            gosub SES1:GOSUB SES1
            IF SAYI=12 THEN ACMA   '# tuşuna basılınca acma etiketine git
            IF SAYI=11 THEN KAPAT  '* tuşuna basılınca kapat etiketine git
           
            IF SAAT1=SURE1 THEN
              PORTB=PORTB & %11111101
              SAAT1=0:SURE1=0
            ENDIF 

            IF SAAT2=SURE2 THEN
               PORTB=PORTB & %11111011
               SAAT2=0:SURE2=0
            ENDIF
               
            GOTO ROLEKONTROL
               
ACMA:               
           DURUM=PORTB             
           IF SAYI=1 THEN
             IF durum.1=0 THEN
               GOSUB SES1
               PORTB=DURUM | %00000010 '#1 ,1 saat zamanlı 1 nolu röle açma
               YAZ=1 'elektrik kesildiğinde röle konumu eeprom'a yazılır             
               SURE1=1:SAAT1=0
               PAUSE 100
               GOTO ROLEKONTROL
             ENDIF
           ENDIF
                       
           IF SAYI=2 THEN
              IF durum.2=0 THEN
                GOSUB SES1
                PORTB=DURUM | %00000010 '#2  ,2 saat zamanlı 1 nolu röle açma
                YAZ=1
                SURE1=2:SAAT1=0               
                PAUSE 100
                GOTO ROLEKONTROL
                ENDIF
           ENDIF       
                 
           IF SAYI=3 THEN
             IF durum.3=0 THEN
                GOSUB SES1:GOSUB SES1
                PORTB=DURUM | %00000100 '#3 ,1 saat zamanlı 2 nolu röle açma
                YAZ=1 'elektrik kesildiğinde röle konumu eeproma yazılır               
                SURE2=1:SAAT2=0
                PAUSE 100
                GOTO ROLEKONTROL
              ENDIF   
           ENDIF

           IF SAYI=4 THEN
              IF durum.4=0 THEN
                 GOSUB SES1:GOSUB SES1
                 PORTB=DURUM | %00000100 '#3 ,2 saat zamanlı 2 nolu röle açma
                 YAZ=1
                 SURE2=2:SAAT2=0             
                 PAUSE 100
                 GOTO ROLEKONTROL
              ENDIF   
           ENDIF
               
           IF SAYI=8 THEN
            IF durum.1=0 THEN
             GOSUB SES1
            PORTB=DURUM | %00000010 '#8 zamansız 1 nolu röle açma
              YAZ=1
             goto ROLEKONTROL
              ENDIF   
           ENDIF

            IF SAYI=9 THEN
              IF durum.2=0 THEN
              GOSUB SES1:GOSUB SES1
               PORTB=DURUM | %00000100 '#9 zamansız 2 nolu röle açma
               YAZ=1
               goto ROLEKONTROL
             ENDIF   
           ENDIF
           
        GOTO ROLEKONTROL

KAPAT:               
           durum=PORTB
           
           IF SAYI=0 THEN
              GOSUB SES3
              PORTB=DURUM & %10000001  '*0 tüm röleler kapanır
              YAZ=1:SAAT1=0:SAAT2=0:SURE1=0:SURE2=0
              GOTO ROLEKONTROL
           ENDIF   

           IF SAYI=8 THEN
            IF durum.1=1 THEN
             GOSUB SES1
             PORTB=DURUM & %11111101'*8 bir nolu röle kapanır
             YAZ=1:SAAT1=0:SURE1=0
             goto ROLEKONTROL
              ENDIF
           ENDIF   
             
           IF SAYI=9 THEN
             IF durum.2=1 THEN
             GOSUB SES1:GOSUB SES1
             PORTB=DURUM & %11111011'*9 iki nolu röle kapanır
             YAZ=1:SAAT2=0:SURE2=0
             goto ROLEKONTROL
             ENDIF
           ENDIF

             GOTO ROLEKONTROL

ROLEKAPAT:
   
                PAUSE 200
                PORTB=DURUM & %11111101
                YAZ=1

                GOTO ROLEKONTROL
                 
ROLEKAPAT1:
   
                PAUSE 200
                PORTB=DURUM & %11111011
                YAZ=1

                GOTO ROLEKONTROL

                   
SAYIAL:
                   SAYI=0
                   SAYI.0=PORTA.4
                   SAYI.1=PORTA.3
                   SAYI.2=PORTA.2
                   SAYI.3=PORTA.1
                   IF SAYI=10 THEN SAYI=0
                   RETURN   

ROLEYAZ:
        DURUM=PORTB & %11111111
        WRITE 10,DURUM
        YAZ=0
        RETURN       
               
SES1: SOUND BUZZER,[83,15,30]:pause 80:RETURN

CIKIS :       
        SAYAC=0
        SN=0
        SAAT=0
        DAK=0     
        GOSUB SES1
        GOTO BASLA
        RETURN     


DISABLE
KESME:
  SAYAC=SAYAC+1'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
   IF SAYAC=61 then'61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
     SAYAC=0  'sayaç sıfırlanıyor
     SN=SN+1  'saniye değeri bir artırılıyor
     IF SN=60 THEN 'saniye 60 olmuş ise 1 dakika süre geçti o halde
       SN=0    ' saniye sıfırlanıyor
       DAK=DAK+1  ' dakika değeri bir artırılıyor
       IF DAK=60 THEN 'dakika 60 olmuş ise 1 saat süre geçti
         DAK=0      ' dakika sıfırlanıyor
         SAAT=SAAT+1' saat değeri bir artırılıyor
         IF SAAT=24 THEN SAAT=0'saat 24 olmuş ise 1 gün geçti
         IF PORTB.1=1 THEN SAAT1=SAAT1+1 '1 NOLU RÖLE AKTİF İSE SAAT DEĞERİNİ ARTIR   
         IF PORTB.2=1 THEN SAAT2=SAAT2+1 '2 NOLU RÖLE AKTİF İSE SAAT DEĞERİNİ ARTIR         
       ENDIF
     ENDIF
   ENDIF
   INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor
   RESUME
   ENABLE       
End

yerkirazi

Saygıdeğer Ete hocam yardımlarınız için çok teşekkürler.
ALLAH razı olsun.
Kendimi geliştirmek için bu yazılımla uğraşıyorum.
Sizin yazılımınızı defalarca denedim zamanlama olmadı.
İstediğimde röleleri açıp kapatabiliyorum,ama zamanlama işlemi olmadı.
Sagılarımla.

Powered by EzPortal