üç adet TMR0 bağımsız saydırıp işlem yapmak

Başlatan devreci22, 09 Mayıs 2017, 22:10:41

devreci22

3 tane butonum var butonlara bağlı 3 adet ledlerim var bunları  bağımsız aktif edebilmem için 3 tane sayac ekledim  tmr0 dan süreyi alıp belirlediğim süre sonunda ilgisi ledi kapatmak istiyorum bir türlü algoritmayı başaramadım yardımcı olabilir misiniz ?
bunları istediğim zaman çalıştırıp ve her çalışan için ayrı ayrı zaman tutup önceden belirlediğm süre sonunda kapanmalarını kurmak istiyorum
saygılarım la ;
program ekte
'@ DEVICE pic16F877
'@ DEVICE pic16F877, WDT_on
'@ DEVICE pic16F877, PWRT_ON
'@ DEVICE pic16F877, PROTECT_OFF
'@ DEVICE pic16F877, XT_OSC
'@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
ADCON1=7
'OPTION_REG.7=0             'verildiğinde pullup dirençleri aktif olur
DEFINE LCD_DREG     PORTD   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTD   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     3       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RWREG    PORTD   'LCD RW Bacağı hangi bite bapğlı
DEFINE LCD_RWBIT    2       'LCD RW Bacağı hangi bit bağlı
DEFINE LCD_RSREG    PORTD   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    1       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
    TRISA=%00000000         'TRISA=31    GİRİŞ ayarlandı
    TRISB=%00000111       'TRISB=240   PORTB 4567 GİRİŞ diğerleri çıkış
    TRISC=%00000000       'TRISC=0     ÇIKIŞ ayarlandı
    TRISD=%00000000       'TRISD=0     ÇIKIŞ ayarlandı
    TRISE=%00000000            'TRISE=7     GİRİŞ ayarlandı
    PORTA=0
    PORTB=0
    PORTC=0
    PORTD=0
    PORTE=0
'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000101    'Pull up dirençleri AKTIF- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
'-----------------------------------------------------------------
     SAYAC   VAR   BYTE
     SN      VAR   BYTE
     DAK    VAR    BYTE
     SAAT   VAR    BYTE
     GUN    VAR    BYTE
     SN1    VAR    BYTE
     SN2    VAR    BYTE
     DAK1   VAR    BYTE
     PAUSE 200

BASLA:
    IF PORTB.0=0 THEN PORTC.3=1
        IF SN1=8 THEN PORTC.3=0
    IF PORTB.1=0 THEN PORTC.4=1
   
    IF PORTB.2=0 THEN PORTC.5=1
     
    LCDOUT $FE,$84,DEC2 SN,":",DEC2 sn1
GOTO BASLA

     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
               
                            IF PORTB.0=0 THEN SN1=SN1+1
                            IF PORTB.1=0 THEN SN2=SN2+1
               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 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
                           GUN=GUN+1     'gün değeri bir artırılıyor
                           
                           IF PORTB.2=0 THEN DAK1=DAK1+1
                           
                     endIF
                  ENDIF
            ENDIF
         ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END

ete

Şemanız ve program dediklerinizle uyuşmuyor. Tekrar kontrol edin.
Şemada ne denilen adte kadar buton var Programda da alakasız şeyler var.
Lütfen biraz mantığınızı çalıştırın.
Önce ilgli led yakılacak yakıldığı anda saaycı sıfırlanacak ki sayılan değer üzerine gelsin.
Sonra hangi led aktif ise ona ait sayacı her saniye artışında bir artırmak ve istenilen sayıya gelip gelmediğini kontrol etmek gerekir.
Buda demektir ki her led için bir aktivasyon bayrak değişkeni tutacaksın. Her biri için birde sayac değişkeni tutacaksın.
Led aktif ise aktivasyon bayrağı set edilecek . Saat sayan kısımda ise sn arttığı zaman 1 nolu led aktif ise sayacını bir artır, led2 aktif ise sayacını bir artır , led3 aktif ise sayacını bir artır diyeceksin.
Ana program kısmında ise sayaclar istenilen sayıya ulaştımı kontrol edip ulaşanlar için gereğini yapacaksın hepsi bu.


Ete

devreci22

#2
merhaba hocam 1 buton için yazmaya tekrar çalıştım ama nafile  :(
'@ DEVICE pic16F877
'@ DEVICE pic16F877, WDT_on
'@ DEVICE pic16F877, PWRT_ON
'@ DEVICE pic16F877, PROTECT_OFF
'@ DEVICE pic16F877, XT_OSC
'@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
ADCON1=7
'OPTION_REG.7=0             'verildiğinde pullup dirençleri aktif olur
DEFINE LCD_DREG     PORTD   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTD   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     3       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RWREG    PORTD   'LCD RW Bacağı hangi bite bapğlı
DEFINE LCD_RWBIT    2       'LCD RW Bacağı hangi bit bağlı
DEFINE LCD_RSREG    PORTD   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    1       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
    TRISA=%00000000         
    TRISB=%00000111     
    TRISC=%00000000     
    TRISD=%00000000     
    TRISE=%00000000           
    PORTA=0
    PORTB=0
    PORTC=0
    PORTD=0
    PORTE=0
'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000101    'Pull up dirençleri AKTIF- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
'-----------------------------------------------------------------
     SAYAC   VAR   BYTE
     SN      VAR   BYTE
     DAK     VAR    BYTE
     SAAT    VAR    BYTE
     GUN     VAR    BYTE
     SN1     VAR    BYTE
     SN2     VAR    BYTE
     DAK1    VAR    BYTE
     BAYRAK  VAR     BIT
     BAYRAK1 VAR    BIT
     BAYRAK2 VAR    BIT
     
     PAUSE 200

BASLA:
    IF PORTB.0=0 THEN PORTC.3=1
        SN1=0:BAYRAK=1
            IF SN1=10 THEN PORTC.3=0
            BAYRAK=0
         
    IF PORTB.1=0 THEN PORTC.4=1
   
    IF PORTB.2=0 THEN PORTC.5=1
     
    LCDOUT $FE,$84,DEC2 SN,":",DEC2 sn1
GOTO BASLA

     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
         IF PORTC.3=1 AND BAYRAK=1 THEN SN1=SN1+1
         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

                            IF PORTB.1=0 THEN SN2=SN2+1
               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 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
                           GUN=GUN+1     'gün değeri bir artırılıyor
                           
                           IF PORTB.2=0 THEN DAK1=DAK1+1
                           
                     endIF
                  ENDIF
            ENDIF
         ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END

aRci

'@ DEVICE pic16F877
'@ DEVICE pic16F877, WDT_on
'@ DEVICE pic16F877, PWRT_ON
'@ DEVICE pic16F877, PROTECT_OFF
'@ DEVICE pic16F877, XT_OSC
'@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
ADCON1=7
'OPTION_REG.7=0             'verildiğinde pullup dirençleri aktif olur
DEFINE LCD_DREG     PORTD   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTD   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     3       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RWREG    PORTD   'LCD RW Bacağı hangi bite bapğlı
DEFINE LCD_RWBIT    2       'LCD RW Bacağı hangi bit bağlı
DEFINE LCD_RSREG    PORTD   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    1       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
    TRISA=%00000000         'TRISA=31    GİRİŞ ayarlandı
    TRISB=%00000111       'TRISB=240   PORTB 4567 GİRİŞ diğerleri çıkış
    TRISC=%00000000       'TRISC=0     ÇIKIŞ ayarlandı
    TRISD=%00000000       'TRISD=0     ÇIKIŞ ayarlandı
    TRISE=%00000000            'TRISE=7     GİRİŞ ayarlandı
    PORTA=0
    PORTB=0
    PORTC=0
    PORTD=0
    PORTE=0
'-----------------------------------------------------------------

OPTION_REG=%00000101    'Pull up dirençleri AKTIF- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'-----------------------------------------------------------------
     SAYAC   VAR   BYTE
     SN      VAR   BYTE
     DAK    VAR    BYTE
     SAAT   VAR    BYTE
     GUN    VAR    BYTE
     SN1    VAR    BYTE
     SN2    VAR    BYTE
     DAK1   VAR    BYTE

     B1Syc  var    word
     B1Hdf  var    word
     B2Syc  var    word
     B2Hdf  var    word
     B3Syc  var    word
     B3Hdf  var    word
     Say    var    byte
     symbol Say1   =  portc.3
     symbol Say2   =  portc.4
     symbol Say3   =  portc.5
     
     PAUSE 200
portc = 0
b1syc      = 0     '1. buton sayac değieni
b1hdf      = 10    '1. buton 10sn olara ayarlandı
b2syc      = 0     '2. buton sayac değieni
b2hdf      = 150   '2. buton 150sn olara ayarlandı
b3syc      = 0     '3. buton sayac değieni
b3hdf      = 100    '3. buton 100sn olara ayarlandı

BASLA:
    IF PORTB.0=0 and say.0 = 0 THEN say.0 = 1: b1syc = b1hdf * 63:high say1
    IF say.0 = 1 and b1syc = 0 THEN say.0 = 0: low say1
   
    IF PORTB.1=0 and say.1 = 0 THEN say.1 = 1: b2syc = b2hdf * 63:high say2
    IF say.1 = 1 and b2syc = 0 THEN say.1 = 0: low say2
   
    IF PORTB.2=0 and say.2 = 0 THEN say.2 = 1: b3syc = b3hdf * 63:high say3
    IF say.2 = 1 and b3syc = 0 THEN say.2 = 0: low say3
   
    LCDOUT $FE,$80,"B1=",DEC4 b1syc,$fe,$89,"B3=",DEC4 b3syc,$fe,$c0,"B2=", dec4 b2syc,$fe,$c9,"S=",bin3 say
GOTO BASLA

     DISABLE
KESME:

            if say.0 = 1 and b1syc > 0 then b1syc = b1syc - 1
            if say.1 = 1 and b2syc > 0 then b2syc = b2syc - 1
            if say.2 = 1 and b3syc > 0 then b3syc = b3syc - 1

         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END

devreci22

merhaba
sayıcı kısmı buton her basıldığında değer verdiğimiz süreden nasıl başlatabilirim
başka butona bastığım da aktif edilen diğer led ler sönüyor

aRci

paylaşdığınız devrede ledleri 4,7v da çalısaca seilde voltaj ayarını değiştirin yada led lere seri direnc ekleyin deneme yaptığımda ledler birbirini kapatmıyor.

sayım yaparen aynı butona terar basıldığında sayıma terar başdan mı başlamasını istiyorsunuz.

o zaman programda buton basılıdığı satırları aldaki şeilde tekrar düzenlemeniz yeter.her buton kontrol satırında orneğin

1. buton ontrolunde say.0 değişkeni sayımın başlamasını sağlayan bayrak biti var sayın.
IF PORTB.0=0 and say.0 = 0 THEN say.0 = 1: b1syc = b1hdf * 63:high say1

"IF PORTB.0=0 and say.0 = 0 THEN" burada butona basıldı ve sayım yapmıyorsa kontrolu var.say.0 ı buradan cıkartır ve sadece butona basıldı ontrolu yapman yeterli

IF PORTB.0=0 THEN say.0 = 1: b1syc = b1hdf * 63:high say1


devreci22

Başta ete hocamız ve saygıdeğer arkadaşlarımız   Bilgi ve emeğinizi esirgemeden yardımlar ınız  için teşekkür ederim akşam deneyeceğim inşallah

Powered by EzPortal