D

buton ile zamanı belirleme

Başlatan dark_cruze, 29 Haziran 2014, 17:27:55

dark_cruze

merhabalar forumda ögrendiklerim ile aşağıda 24 saatten geri sayan bir kronometre  programı oluşturdum.ısıste sorunsuz çalışıyor.ama şöyle bir eklenti yapmak istedim ve çalıştıramadım.A portunun 1.bitine bağlı bir butona bastığımda belirlediğim dakika kadar mesala 30 dk dan geriye doğru sayım yapmasını istiyorum.yardımcı olabilir misiniz




@ DEVICE PIC16F84A, XT_OSC
@ DEVICE PIC16F84A, WDT_OFF
@ DEVICE PIC16F84A, PWRT_OFF
@ DEVICE PIC16F84A, PROTECT_OFF
PORTA=1
PORTB=0
TRISA=%11111111
TRISB=%00000000
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
ON INTERRUPT GoTo KESME
OPTION_REG=%10000101   
INTCON=%10100000
TMR0=0
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
SAYAC VAR BYTE
CLEAR
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2
SN=0
DAK=0
SAAT=24
SAYAC=60
IF PORTA.1=1 THEN
DAK=30 AND SN=0 AND SAYAC=0
ELSE
BASLA:
      LCDOUT $FE,$84,DEC2 SAAT,":",DEC2  DAK,":",DEC2 SN
      GOTO BASLA
      ENDIF
DISABLE
KESME:
      SAYAC=SAYAC-1
      IF SAYAC=0 then
        SAYAC=60
        SN=SN-1
        IF SN=255 THEN
          SN=59
          DAK=DAK-1
          IF DAK=255 THEN
            DAK=59
            SAAT=SAAT-1
            IF SAAT=255 THEN
              SAAT=0
              INTCON=0
              LCDOUT $FE,1
            ENDIF
          ENDIF
        ENDIF     
      ENDIF
INTCON.2=0
RESUME
ENABLE
END

ete

Konu yine aynı konu. Bir çok kez anlattım ama nafile demekki. Üstelik verdiğin kodlarda tamamen benim önceden bu amaçla yazdığım kodlar. Kendinden bir şey katmamışsın. İşin mantığını son kez açıklıyorum.
Her şeyden önce saat saymaya tuşa basıldıktan sonra başlaması gerekir. Bu amaçla, kesme başlangıçta açık olmamalıdır.
Tuşa basılınca zaman set edilecek ve aynı zamanda kesme açılacaktır.

Sayma işi tamamlanınca da kesme kapatılmalıdır.
Bir iki kelime ile açıkladığım işin mantığını birazcık programlama bilen birisi hemen uygulaması gerekir. Aslında işin büyüğü yapılmış durumda açıklamalarımı iyice okuyup uygulama yapmak zor olmasa gerek.

Ete

dark_cruze

hocam tuşa basmadan zaten çalışıyor ve geri sayıyor olacak.sadece tuşa bastığımda saymayı bırakıp  belirlediğim dakikadan geri sayacak,orada takıldım.Birde mesala güç kesildiğinde sıfırlamaması ve kaldığı yerden devam etmesi için ne yapmalıyım.daha önceki yorumları okudum ama tam anlayamadım.

ete

Tuş kontrolünü yinede BASLA satırından sonrasına alman gerekir.
Güç kesildiğinde bilgilerin kaybolmaması için en azından her dakika değiştiğinde bilgiler kayıt edilmelidir.
BASLA satırından evvel geçerli bir kayıt varmı ona bakılmalı varsa o değerlerden sayac başlamalıdır.

READ 10,SAAT:IF SAAT=255 THEN SAAT=0
READ 11,DAK:IF DAK=255 THEN DAK=0

BASLA:
      IF PORTA.1=1 then
        SAAT=0:DAK=30:SN=0:SAYAC=0
      ENDIF

      LCDOUT $FE,$84,DEC2 SAAT,":",DEC2  DAK,":",DEC2 SN
      IF ESKIDAK=DAK THEN BASLA
      ESKIDAK=DAK
      WRITE 10,SAAT,DAK
      GOTO BASLA


Saniyeleri kayıt etmedim. En azından bir güç kesilmesi yaşanırsa en fazla 1 dakikalık kayıp yaşanır.
Saniyeleride kayıt etmek istersen benzer şekilde edebilirsin.
Ancak kayıt mekanizması daha farklı olmalı aşağıdaki şekilde olabilir.

LCDOUT $FE,$84,DEC2 SAAT,":",DEC2  DAK,":",DEC2 SN
      IF ESKISN=SN THEN BASLA
      ESKISN=SN
      WRITE 10,SAAT,DAK,SN
      GOTO BASLA

Bu durumda başlangıç satırından evvel gelen READ komutlarına aşağıdaki de ilave edilmeli
READ 12,SN:IF SN=255 THEN SN=0

Ete

dark_cruze

sağolun hocam gerçekten çok  işime yaradı.

dark_cruze

#5
hocam dediklerinizi uygulayarak böyle birşey oluşturdum ama yine ne yazikki başarılı olamadım :( .ayrıca kristal ve pullup dirençleri ile uğraşmamak için 16F628a kullandım bu sefer.Son bir kez daha yardımcı olurmusunuz hatam nerede..
@ __config _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF& _INTRC_OSC_NOCLKOUT
PORTA=0
PORTB=0
TRISA=%11111111
TRISB=%00000000
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG PORTB
define LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
ON INTERRUPT GoTo KESME
OPTION_REG=%10000101   
INTCON=%10100000
TMR0=0
CMCON=7
SN VAR BYTE 56
DAK VAR BYTE 57
SAAT VAR BYTE 58
SAYAC VAR BYTE 59
ESKIDAK VAR BYTE
ESKISAAT VAR BYTE
CLEAR
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2
pause 100
'--------------saat başlangıç değerleri--------------------------
SN=59
DAK=3
SAAT=1
SAYAC=60
'-----------------------------------------------------------------
READ 10,SAAT:IF SAAT=255 THEN SAAT=0
READ 11,DAK:IF DAK=255 THEN DAK=0
BASLA:
      IF PORTA.1=1 then
        SAAT=2:DAK=5:SN=0:SAYAC=60
        write 10,saat,dak
      ENDIF
         LCDOUT $FE,$84,DEC2 SAAT,":",DEC2  DAK,":",DEC2 SN

GOTO BASLA
DISABLE
KESME:
      SAYAC=SAYAC-1
      IF SAYAC=0 then
        SAYAC=60
        SN=SN-1
        IF SN=255 THEN
          SN=59
          DAK=DAK-1
          IF DAK=255 THEN
            DAK=59
            SAAT=SAAT-1
            IF SAAT=255 THEN
              SAAT=0
              INTCON=0
              LCDOUT $FE,1
            ENDIF
            write 10,saat
          ENDIF
          write 11,dak
        ENDIF     
      ENDIF
INTCON.2=0
RESUME
ENABLE
END

ete

Okulda mantık okumadığın belli oluyor. Aslında sana lazım olan mantık dersi okulda okutulanda değil biraz kafanı çalıştırsan ne olup bittiğini anlayacaksın ama aklın başka yerlerde yada oruç tutuyorsun ve dikkatini toparlayamıyorsun.  Olayları daha iyi anlamak için basla satırından itibaren programı satır satır inceleyelim.
İlk satırda PortA.1 de bağlı tuşa basılmışmı kontrol ediliyor basılmadığını varsayalım.
Daha sonra saat değerleri ekrana veriliyor bunuda geçelim.
If eskisaat=saat then basla diye bir komut satırı geliyor. Şimdi programın başından beri eski saate bir değer vermedik o halde değeri sıfırdır. Saat değeride başlangıçta sıfırdır o halde program bu satırda Basla etiketine atlayacaktır. Bu arada açılışta dak=2 değeri verildiği için kesme saati saymaya devam edecek ve 2 dakika sonra değerler tam sıfırlanacaktır.  Dikkat edersen program kayıt satırına hiç geçemedi bile bu kadarlık bir satır takibini mantığını kullanarak yapamıyormusun? Çok kolay gördüğün gibi. Tek yapman satır satır programı irdelemek.
Yanlışım nerede demişsin gördün umarım nerede olduğunu.
Ete

dark_cruze

şimdi dediğinizden şunu anladım; saat değeri olmadığı için kaydedecek bir şey bulamıyor,0 olarak algıladığı içinde direk basla etiketine geçiyor.write olan bölüme geçemiyor.ben forumda daha önce paylaştığınız saat programlarında read-write komutularının kullanımı inceledim,ama karmaşık gelince de işin mantığını bu yüzden anlayamadım.

ete

Bütün yapman gereken basla satırından sonra gelen ,
If eskisaat=saat... Satırından itibaren , goto basla satırına kadar olan bölümü silmen.
Sonra kesme etiketi altında yer alan 3 adet endif satırlarına gelip,
Birinci endif ile ikinci arasına,
Write 10, saat
İkinci endif ile üçüncü arasına ise ,
Write 11,dak
Yazmaktan ibaret bunları yap ve dene bakalım çalışacakmıdır. Ayrıca bu değişiklikleri de irdelemeye çalış.

Ete

dark_cruze

hocam dediklerinizi aynen uygladım,ama sonuc yine değişmedi.gücü kestiğimde yine sıfırladı ve başa döndü?

ete

Elbette saat dolmadan saat değeri kayıt olmayacak. Dakika dolmadan da dakika değeri kayıt olmayacak. Bunları engellemek için Tuşa basıldığında değerleri bir kere kayıt ettirmek en doğrusu olacaktır.
Tuş kontrolünü aşağıdaki şekilde değiştir.
      IF PORTA.1=1 then
        SAAT=2:DAK=5:SN=0:SAYAC=60
        write 10,saat,dak
      ENDIF
gerisi çalışıyor denedim.
Bu arada sayac değeri 70  olmamalı. Yaklaşık 58 den sıfıra ulaşması durumunda 1 sn ye geçmiş olmaktadır. Bu rakamıda 70 değil 58 yapmalısın. Yada 60 da bırak.
Her neyse çalışan programı senin yukarıda verdiğin kodla değiştirdim gerekirse oradan alırsın.

ete


Powered by EzPortal