Pic Basic 16f628A ile sayıcı devresinde tek buton ile displayi on/off sorunu

Başlatan eylül6, 07 Eylül 2015, 00:35:59

eylül6

    Merhaba arkadaşlar,
her ne kadar yeni başlamış olsamda, Picbasic dilinde yazdığım 0-3 arasında sayan bir sayıcı devrem ve yazdığım kodlarım  var. Projemde 16f628A ile herhangi bir BCD sürücü olmadan direk olarak 0-3 arasında saydırıp ve her arttırıp azalmada  çıkış olarak 2 röle çalıştırıyorum.
   
    Sayı 0 iken röleler kapalı,
    sayı 1 iken röle 1 aktif röle 2 pasif ,
    sayı 2 iken röle 1 pasif röle 2 aktif,
    sayı 3 iken hem röle 1 hem röle 2 aktif.
   
    Sizlere sorum şudur ki; ben istiyorum ki bu display devreye enerji verdiğimde hiç yanmasın.Devredeki en üst buton olan power butonuna bastığımda  display açılsın ve normal olarak 0 yazsın.Sonrasında Arttırma ve eksiltme işlemlerini yapayım. İşim bittikten sonra aynı butona yani POWER butonuna bastığımda sayıyı resetleyeyim ve displayi kapatayım.
   Aslında ben bunların hepsini  programda yaptırabiliyorum.
   Tek sorunum power butonuna bastığımda displayi açıyorum fakat butona tekrar bastığımda displayi kapatamıyorum. Kapatma işleminde bir yerde hata yapıyorum fakat hatamı bulamadım. Butonu on off olarak kullanmak için programda nasıl yazabilirim?????? Yardımcı olursanız çok sevinirim. Fikirlerinizi bekliyorum...

     pic basicte yazdığım ve microcode studio da derlediğim program şu şekilde ;

   
@ __Config    _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF &  _CP_OFF & _MCLRE_OFF
    define osc 4
    cmcon=7  

i   var byte
deb var bit

'****************************************************************   
 
        
    trisa=255
    PortA=%00111
    TrisA=%00111
    PortB=%00000000
    TrisB=%00000000
    porta.3 = 0
    porta.4 = 0
    
    TUSA VAR PORTA.0
    TUSB VAR PORTA.1
    TUSC VAR PORTA.2
   
 i=0
               
     pause 100
 

         IF porta.2=0 THEN   
           TOGGLE portb=0   
          
               WHILE porta.2=0
               WEND
          
    
           ENDIF      
               
     basla: 
    
                         
              
          
 if porta.0=1 and deb=0 then
      pause 500
    
            
          IF i=1   THEN 
         porta.3=1
          porta.3=0
          else
          porta.3=1
        
         ENDIF
               
          IF i=0   THEN 
          porta.4=0 
          porta.4=0
          else
          porta.4=1
          endIF
           
         i=i+1
        if i>4 then i=3
        deb=1
            endif
     
             
              
             
    if porta.1=1 and deb=0 then
    pause 500
    IF i=2   THEN 
        porta.3=1
        else
        porta.3= 0
        endIF
             
         
        IF i<3 then   
        porta.4=0
        else
        porta.4=0
        porta.4=1
        
        endIF
               
            i=i-1
            if i>-1 then i=0
            deb=1                                  
            endif
               
             
                 
             
          IF PORTA.2=1 and deb=0 then
       
           
          porta.3=0
           porta.4=0
           i=0
           endIF
     
     if PORTA.2=1 and deb=0 then
        i=0
        deb=1
        ENDIF  
               
                  
       

      if porta.0=0 and porta.1=0 and porta.2=0 then deb=0
             lookup i,[%111111,%000110,%01011011,%01001111],portb
                   
        
         goto basla
    
        
  
    end



mehmet

Switch-case ile yapınız. Dört röle için
iki de kapatma için düşünün. Altı seçenek.
Butonlara basınca artırma/eksiltme
yaptırınız. Seçeneklerinizi de bu altı duruma
göre ayarlayınız.

Belki de farklı iki ana durum ile yapılabilir.
Power-off ve power-on seçenekleri altında
başka seçeneklere dallanabilir.   
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

ete

Aşağıdaki programı bir deneyin bakalım.
Prensip olarak sistemin açık yada kapalı olduğunun bilgisini tutatn DURUM isimli bir bit değişkeni kullandım.
BASLA etiketinden hemen sonra POWER tuşuna basılıp basılmadığını kontrol ediyorum. Şayet sistem açık ise DURUM=1 olmalı kapalı ise sıfır.
Bu durumda ilk açılışta da röleler kapalı ve PORTB=0 verilir ise dispaly kapalı kalacaktır.
Böylece en başta yalnızca POWEr butonu kontrol edilecek sistem kapalı ise diğer buton kontrollerinin yapılmasınada gerek olmayacaktır.
Şayet isistem açılmış ise otomatikman I=0 olarak açılacak ve ekranda sıfır rakamı görülecektir.
Artır yada azalt tuşlarına basarak I değerini 0-3 aralığında değiştirebileceksiniz. Programda I nın aldığı değerleri ekrana verirken paralel olarak röleleride istediğiniz şekilde açıp kapatacaktır. Programı denemedim ama çalışması gerekir.

    @ __config _BODEN_OFF & _BOREN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
    define osc 4
    cmcon=7 

'****************************************************************   
        
    PortA=%00000111
    TrisA=%00000111
    PortB=%00000000
    TrisB=%00000000
    porta.3 = 0
    porta.4 = 0

    I   var byte
    DEB var bit
    DURUM VAR BIT
       
    symbol ARTIR=PORTA.0
    SYMBOL AZALT=PORTA.1
    SYMBOL POWER=PORTA.2
    SYMBOL ROLEA=PORTA.3
    SYMBOL ROLEB=PORTA.4
   
    i=0
    DURUM=0
    PORTB=0
    pause 200
    
   BASLA:
   
           IF POWER=0 THEN
              TOGGLE DURUM
              IF DURUM=0 THEN
                 ROLEA=0:ROLEB=0
                 PORTB=0:I=0
              endIF                
              WHILE POWER=0:WEND
              PAUSE 50
           ENDIF                 
             
           IF DURUM=0 THEN BASLA
           
           IF ARTIR=0 THEN
             I=I+1
             IF I=4 THEN I=0
             WHILE ARTIR=0:WEND
             PAUSE 50
           ENDIF
           
           IF AZALT=0 THEN
             I=I-1
             IF I=255 THEN I=3
             WHILE AZALT=0:WEND
             PAUSE 50
           ENDIF
           
          SELECT CASE I
          CASE 0
          ROLEA=0:ROLEB=0
          PORTB=%00111111
          
          CASE 1
          ROLEA=1:ROLEB=0
          PORTB=%00000110
          
          CASE 2
          ROLEA=0:ROLEB=1
          PORTB=%001011011
          
          CASE 3
          ROLEA=1:ROLEB=1
          PORTB=%01001111
          
          END SELECT
          
          GOTO BASLA
                              
    end


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eylül6

Ete hocam verdiğiniz kodu derleyip denedim. Simule ettiğimde ilk olarak  display  off durumda fakat butona bastıgımda display yanmadı henüz ugrasıyorum... İlginiz için teşekkür ederim.

mesaj birleştirme:: 07 Eylül 2015, 16:29:41

çok basit bir hata yaptığımın farkındayım ama takıldım kaldım yaklasık 3 haftadır sadece bu konu uzerinde ugrasıyorum hiçbir sonuç elde edemedim. tek buton ile on off yapmak bu kadar mı karışık olur yaa..... :-[

ete

Çalışması gerekirdi. Verdiğin şema 16F84A olarak verilmiş program 16F628A ya göre düzenlendî.
Simulasyon sosyası olsa bende denerdim.
Ete

Programı deniyorum sorunsuz çalışıyor.
Dosyalar aşağıdaki linkten yüklenebilir.

https://dl.dropboxusercontent.com/u/25364674/TUS_SIL_ETE.rar

PORTA.0 da bağlı olan tuş Artır,
PORTA.1 deki Azalt
PORTA.2 deki ise POWER aç kapa tuşu olarak çalışmaktadır

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eylül6

Size ne kadar teşekkür etsem azdır. Destek ve ilginiz için çok teşekkür ederim. Bu arada haklıymışsınız dediğiniz gibi çalışması gerekiyormus ben butonlara +, dirençlere - veriyormuşum.Desteğiniz sayesinde hem programda hem devrede hatalarımı görmüş oldum.