Saat konusunda....

Başlatan oguztkn, 26 Eylül 2013, 01:07:12

ete

Saniye ledlerini çalıştırdım.
Verdiğim Saat.rar dosyasını yeniledim. Oradan yükleyebilirsin.
Şu anda yalnızca Ayar kısmı kaldı. Onuda yapacak bir gönüllü arıyorum.

Ete

oguztkn

#16
evet onu kaldırınca titreme geçti şuan derece stabil güzel çalışıyor saat kısmına bakıyorum

Hocam eklediğiniz son programı yükledim saniye ledleri çalışıyo ama 1 dakka geçti displayler hep sıfır bir de derece ye geçmiyor sadece saniye ledleri yanıp sönüyor

Galiba zaman ver kısmında bir sorun var ama bulamadım zaman oku kısmına girip orda kalıyormuş gibi davranıyor çünkü derece oku kısmına geçse dereceyi gösterir çünkü ilk baştaki for döngüsünü kapatıp ikinci for döngüsü ile deryip yüklediğimde çalışmıştı

ete

Muhtemelen saate ayar verilmediği için saat çalışmıyor. İsiste böyle bir problem olmadığı için her şey çalışıyor. Saate ayar vermen gerekiyor.
Ete

oguztkn

Başla kısmından önce SAAT ve DAK değişkenlerine
SAAT=11
DAK=20  değerlerini verdim ama hala 00:00 saniye ledleri çalışıyor derece kısmına geçmiyor kafamın yatmadığı şu hadi saat ayarı yok yada bir sorun var diyelim o döngüyü tamamlayıp ds ye geçmesi gerekmezmi çünkü onu gösteriyor ilginç bi sorun

ete

Bilmediğin çok şey var. DS1302 inin Saniye registeri 7. biti HALT yani saati durdurma bitidir. Bu fabrikadan "1" olarak ayarlanıp yollanır. Bu biti "0" yapmaz isen saat çalışmaz. Sendeki yaşanan durum budur. Sen saate değer veriyorsun program değişkenlerine değer veriyorsun. Saat entegresine ayar veremiyorsun.
Ne yazıkki saat ayar kısmında ayarlanan değeri saate yazdıracak bölümü henüz yazmamışsın. Onu yaz ve programın başına
SN=0:DAK=xx Saat=xx :GOSUB SAATYAZ şeklinde komut vererek veridğin ayarın RTC ye yazılmasını sağla.
Saniye ye vereceğin yeni değer otomatikman 7. biti sıfırlayacağı için saatinde çalışmaya başlayacaktır.
Saat ve dak değerlerinde xx yerine o andaki saat ve dakika değerini girersen ve RTC de pilde bağlı ise sistem pil bitinceye kadar ayarı unutmayacaktır.

Ete

oguztkn

ayar kısmı için bi kaç birşeyler ekledim ama cevap alamadım şu devre sade 00:00 olarak duruyor önümde bağlantıları tek tek kontrol ettim isis teki bağlantılardan bir farkı yok
ds1302 bacakları PORTC 0-1-2 de bağlı ve bunkar tris lerdeki tanımlamalarıda tamam 2-3 arasında 38.762 khz kristal de bağlı anlayamadığım birşeyler var

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [..........ETE.............]                      *
'*  Notice  : Copyright (c) 2013 [izinsiz kullanılamaz]         *
'*          : All Rights Reserved                               *
'*  Date    : 28.09.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;@ DEVICE pic16F877
;@ DEVICE pic16F877,WDT_OFF
;@ DEVICE pic16F877,PWRT_ON
;@ DEVICE pic16F877,PROTECT_OFF
;@ DEVICE pic16F877,XT_OSC
'*******************************************************************************
;@ DEVICE pic16F877A
;@ DEVICE pic16F877A,WDT_OFF
;@ DEVICE pic16F877A,PWRT_ON
;@ DEVICE pic16F877A,PROTECT_OFF
;@ DEVICE pic16F877A,XT_OSC
CMCON=7
'*******************************************************************************
DEFINE OSC 4
OPTION_REG=%10000001
ADCON1=7
TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000111
'*******************************************************************************
Comm_Pin  VAR PortC.0   ;One-wire Data-Pin "DQ" PortB.0 da
SYMBOL  RTC_DTA = PORTC.2 ;Ds1302 I/O ucu
SYMBOL  RTC_CLK = PORTC.1 ;Ds1302 SCLK ucu
SYMBOL  RTC_RST = PORTC.3 ;Ds1302 RST ucu
symbol  SEC     = PORTE.2 ;Saat ayar set tusu
SYMBOL  ASAGI   = PORTE.0 ;Saat ayar asagi tusu
SYMBOL  YUKARI  = PORTE.1 ;Saat ayar yukari tusu
;*******************************************************************************
SYMBOL  Yesil   = PORTA.0 ;Saniye ledleri yesil icin
SYMBOL  Kirmizi = PORTB.7 ;Saniye ledleri kirmizi icin
;*******************************************************************************
SYMBOL  KD1     = PORTB.2 ;
SYMBOL  KD2     = PORTB.3 ; Displayleri aktif etme uclari
SYMBOL  KD3     = PORTB.5 ;      Kirmizi renk icin
SYMBOL  KD4     = PORTB.6 ;
;*******************************************************************************
SYMBOL  YD1     = PORTB.0 ;
SYMBOL  YD2     = PORTB.1 ; Displayleri aktif etme uclari
SYMBOL  YD3     = PORTB.4 ;      Yesil renk icin
SYMBOL  YD4     = PORTC.7 ;
;*******************************************************************************
;///////////////////////  TARAMA YONTEMI ICIN SEGMENTLER ///////////////////////
'SYMBOL  a     = PORTD.0 ; Segment A
'SYMBOL  b     = PORTD.1 ; Segment B
'SYMBOL  c     = PORTD.2 ; Segment C
'SYMBOL  d     = PORTD.3 ; Segment D
'SYMBOL  e     = PORTD.4 ; Segment E
'SYMBOL  f     = PORTD.5 ; Segment F
'SYMBOL  g     = PORTD.6 ; Segment G
'SYMBOL  nkta  = PORTD.7 ; Segment Nokta
'*************************************************************************
ILK         VAR BIT      ' Busy Status-Bit
GOR         VAR BIT
HAM         VAR WORD 56    ' Sensor HAM okuma degeri
ISI         VAR WORD 58    ' Hesaplanmis ISI degeri
LED         VAR WORD     ' Holds remainder for + temp C display
X           VAR BYTE 
Y           VAR BYTE 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11'   +/- sicaklik isaret biti,1 = olursa eksi sicaklik
NEGAT_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° isareti
SIGN        VAR BYTE     '  ISI degeri icin  +/-  isaret
TEMP        VAR BYTE     ' Div32 bit hesap icin gecici degisken
SAYAC       VAR BYTE
SN          VAR BYTE
DAK         VAR BYTE 60
SAAT        VAR BYTE 61
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte    ' Temporary data holder
OUTBYTE     var byte    ' Second byte to ds1302
REG_ADR     var byte    ' First byte to DS1302
DAKBIR      VAR BYTE
DAKON       VAR BYTE
SAATBIR     VAR BYTE
SAATON      VAR BYTE
BIRLER      VAR BYTE
ONLAR       VAR BYTE
ESN         VAR BYTE
ZZ          var byte
WW          VAR BYTE
SIRA        VAR BYTE
POZ         var byte
;*******************************************************************************
CLEAR                   'Tum degiskenler sifirlandi
low RTC_RST
low RTC_CLK
TMR0=7
PAUSE 200
esn=0:GOR=0
GOSUB ZAMAN_OKU
GOSUB ZAMAN_VER
GOSUB SENSOROKU
PAUSE 750
GOSUB BEKLE
GOSUB SENSOROKU
INTCON=%10100000
ON INTERRUPT GOTO KESME
PORTB=254
PORTA.0=1
;*******************************************************************************
low RTC_RST
low RTC_CLK
POZ=0
Basla:
       ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
       gosub SENSOROKU1     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ     
       goto Basla

SENSOROKU1:
      FOR ZZ=0 to 5
        GOSUB ZAMAN_OKU
        GOSUB ZAMAN_VER
        GOSUB DELAY
        WHILE ESN=SN
          GOSUB ZAMAN_OKU
          GOSUB DELAY
        WEND
        ESN=SN
        IF ILK=0 then
          ILK=1:LED=0
        ENDIF 
      NEXT           
        GOSUB ZAMAN_OKU
        ESN=SN

      for zz=0 to 3 
       GOSUB SENSOROKU
       GOSUB BEKLE
       x=ISI DIG 0:gosub AL:SAATBIR=SAYI
       X=ISI DIG 1:GOSUB AL:SAATON=SAYI
       X=11:gosub AL:DAKON=SAYI
       X=10:GOSUB AL:DAKBIR=SAYI
       GOSUB DELAY
     
       WHILE ESN=SN
         GOSUB ZAMAN_OKU
         GOSUB DELAY
       WEND
       ESN=SN
     NEXT
         
     GOTO BASLA

AL:   
'       LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN'CC
'       LOOKUP X,[64,121,36,48,25,18,2,120,0,16,70,28],SAYI :RETURN'CA
       LOOKUP X,[192,249,164,176,153,146,130,248,128,144,198,156],SAYI :RETURN'CA
DELAY:
      for WW=0 to 255
        PAUSEUS 5
      NEXT
      RETURN   
ZAMAN_VER:
        X=DAK DIG 0:GOSUB AL:DAKBIR=SAYI
        X=DAK DIG 1:GOSUB AL:DAKON=SAYI
        x=SAAT DIG 0:GOSUB AL:SAATBIR=SAYI-128
        X=SAAT DIG 1:GOSUB AL:SAATON=SAYI
        RETURN           
;*******************************************************************************
;------------------AYAR KISMI BURDAN BASLIYOR-----------------------------------
AYAR: 
       low PORTB.0:LOW PORTA.0:SN=0:POZ=1:GOSUB FLASH
       WHILE SEC=0
       WEND
HOUR:  GOSUB ZAMAN_VER
       LOW PORTA.0
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0       
        ENDIF   
        IF ASAGI=0 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF   
        GOSUB GECIKME
        GOTO HOUR
       
MINBIR:
        GOSUB FLASH
        WHILE SEC=0
        WEND
       
MINUTE: GOSUB ZAMAN_VER
       LOW PORTA.0
       IF SEC=0 THEN ara
        IF YUKARI=0 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59             
        ENDIF
        GOSUB GECIKME
        GOTO MINUTE
       
SECBIR: WHILE SEC=0
        WEND

GECIKME:
        FOR X=0 TO 1800
        PAUSEUS 50
        NEXT
        RETURN
ARA:   
        GOSUB FLASH
        HIGH PORTA.0
        WHILE SEC=0 
        wend
        MEM=SN:GOSUB TERSCEVIR:SN=SAYI
        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
        GOSUB ZAMAN_VER
        GOSUB ZAMAN_OKU
        y=0:POZ=0
        goto BASLA
       





;*******************************************************************************
;--------------------Sicaklik Okuma Bolumu--------------------------------------
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI degerini oku
           RETURN
Bekle:
'           OWIN    Comm_Pin, 4, [Busy]    ' Busy degerini oku
'           IF      Busy = 0 THEN Bekle  ' hala mesgulmu?,evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]'iki byte oku ve okumayi bitir.
           ISI = ((HAM*10)/16)/10
           RETURN
   
;*******************************************************************************   
;--------------------Zaman Okuma Bolumu-----------------------------------------
ZAMAN_OKU:   
    ;sayac=1-sayac: 'if sayac=1 then low porta.3   
    high RTC_RST 
    shiftout RTC_DTA, RTC_CLK, 0, [$BF]
    SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU   
    ;SN=0:DAK=15: SAAT=10
    MEM=SN:GOSUB CEVIR:SN=SAYI
    MEM=DAK:GOSUB CEVIR:DAK=SAYI
    MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
    low RTC_RST
    Return
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
         RETURN 

TERSCEVIR:               
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
         RETURN   
;******************************************************************************
FLASH:
      TOGGLE PORTB.2:PAUSE 150:TOGGLE PORTB.2:PAUSE 150
      TOGGLE PORTB.3:PAUSE 150:TOGGLE PORTB.3:PAUSE 150
      TOGGLE PORTB.5:PAUSE 150:TOGGLE PORTB.5:PAUSE 150
      TOGGLE PORTB.6:PAUSE 150:TOGGLE PORTB.6:PAUSE 150
      return
;*******************************************************************************Disable
DISABLE
KESME:
      PORTB=(PORTB & 1)| 254
      SIRA=SIRA+1:IF SIRA=4 THEN SIRA=0
      led=led+1
      if led=500 then
        toggle PORTA.0
        portb.0=~portA.0
        led=0
      endif 
     
      if SIRA=0 then
        PORTD=DAKBIR
        KD4=0
      ENDIF 
     
      if SIRA=1 then
        PORTD=DAKON
        KD3=0
      ENDIF
       
      if SIRA=2 then
        PORTD=SAATBIR
        KD2=0
      ENDIF

      if SIRA=3 then
        PORTD=SAATON
        KD1=0
      ENDIF
     INTCON.2=0
     TMR0=7
     RESUME
     ENABLE     
     end

MS_59

saat ayarı yaptıktan sonra bu ayarları DS1302ye kayıt etmen lazım bikere bu eksik
gecikme etiketindeki X değişkenine 1800 değeri vermişsin ama byte olarak tanımlı en fazla 255 değerini alır rakamlar çok hızlı ilerliyor word olarak değiştir
kopyala yapıştır yaptığın içinde fazlalıklar var (poz ve y değişkenleri gibi)
TRIS registerlerini ayarladıktan sonra port içeriklerini sıfırla porta=0 gibi
ana programda yaptığın değişikleri sil karıştırmışsın çünkü GOSUB SENSOROKU1 ile gidip GOTO basla ile dönmüşsün
IF SEC=0 THEN AYAR satırını saat gösterim göngüsü içine koy
mehmet

oguztkn

#22
Hocam dediğinizi yaptım zaman_yaz kısmını ekledim saat de şuan çalışıyor bir tek ayar kaldı ama titreşim başladı acaba neden acaba ?

Son hali
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [..........ETE.............]                      *
'*  Notice  : Copyright (c) 2013 [izinsiz kullanılamaz]         *
'*          : All Rights Reserved                               *
'*  Date    : 28.09.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;@ DEVICE pic16F877
;@ DEVICE pic16F877,WDT_OFF
;@ DEVICE pic16F877,PWRT_ON
;@ DEVICE pic16F877,PROTECT_OFF
;@ DEVICE pic16F877,XT_OSC
'*******************************************************************************
;@ DEVICE pic16F877A
;@ DEVICE pic16F877A,WDT_OFF
;@ DEVICE pic16F877A,PWRT_ON
;@ DEVICE pic16F877A,PROTECT_OFF
;@ DEVICE pic16F877A,XT_OSC
CMCON=7
'*******************************************************************************
DEFINE OSC 4
OPTION_REG=%10000001
ADCON1=7
TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000111
'*******************************************************************************
Comm_Pin  VAR PortC.0   ;One-wire Data-Pin "DQ" PortB.0 da
SYMBOL  RTC_DTA = PORTC.2 ;Ds1302 I/O ucu
SYMBOL  RTC_CLK = PORTC.1 ;Ds1302 SCLK ucu
SYMBOL  RTC_RST = PORTC.3 ;Ds1302 RST ucu
symbol  SEC     = PORTE.2 ;Saat ayar set tusu
SYMBOL  ASAGI   = PORTE.0 ;Saat ayar asagi tusu
SYMBOL  YUKARI  = PORTE.1 ;Saat ayar yukari tusu
;*******************************************************************************
SYMBOL  Yesil   = PORTA.0 ;Saniye ledleri yesil icin
SYMBOL  Kirmizi = PORTB.7 ;Saniye ledleri kirmizi icin
;*******************************************************************************
SYMBOL  KD1     = PORTB.2 ;
SYMBOL  KD2     = PORTB.3 ; Displayleri aktif etme uclari
SYMBOL  KD3     = PORTB.5 ;      Kirmizi renk icin
SYMBOL  KD4     = PORTB.6 ;
;*******************************************************************************
SYMBOL  YD1     = PORTB.0 ;
SYMBOL  YD2     = PORTB.1 ; Displayleri aktif etme uclari
SYMBOL  YD3     = PORTB.4 ;      Yesil renk icin
SYMBOL  YD4     = PORTC.7 ;
;*******************************************************************************
;///////////////////////  TARAMA YONTEMI ICIN SEGMENTLER ///////////////////////
'SYMBOL  a     = PORTD.0 ; Segment A
'SYMBOL  b     = PORTD.1 ; Segment B
'SYMBOL  c     = PORTD.2 ; Segment C
'SYMBOL  d     = PORTD.3 ; Segment D
'SYMBOL  e     = PORTD.4 ; Segment E
'SYMBOL  f     = PORTD.5 ; Segment F
'SYMBOL  g     = PORTD.6 ; Segment G
'SYMBOL  nkta  = PORTD.7 ; Segment Nokta
'*************************************************************************
ILK         VAR BIT      ' Busy Status-Bit
GOR         VAR BIT
HAM         VAR WORD 56    ' Sensor HAM okuma degeri
ISI         VAR WORD 58    ' Hesaplanmis ISI degeri
LED         VAR WORD     ' Holds remainder for + temp C display
X           VAR BYTE 
Y           VAR BYTE 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11'   +/- sicaklik isaret biti,1 = olursa eksi sicaklik
NEGAT_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° isareti
SIGN        VAR BYTE     '  ISI degeri icin  +/-  isaret
TEMP        VAR BYTE     ' Div32 bit hesap icin gecici degisken
SAYAC       VAR BYTE
SN          VAR BYTE
DAK         VAR BYTE 60
SAAT        VAR BYTE 61
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte    ' Temporary data holder
OUTBYTE     var byte    ' Second byte to ds1302
REG_ADR     var byte    ' First byte to DS1302
DAKBIR      VAR BYTE
DAKON       VAR BYTE
SAATBIR     VAR BYTE
SAATON      VAR BYTE
BIRLER      VAR BYTE
ONLAR       VAR BYTE
ESN         VAR BYTE
ZZ          var byte
WW          VAR BYTE
SIRA        VAR BYTE

;*******************************************************************************
CLEAR                   'Tum degiskenler sifirlandi
low RTC_RST
low RTC_CLK
TMR0=7
PAUSE 200
esn=0:GOR=0
GOSUB ZAMAN_OKU
GOSUB ZAMAN_VER
GOSUB SENSOROKU
PAUSE 750
GOSUB BEKLE
GOSUB SENSOROKU
INTCON=%10100000
ON INTERRUPT GOTO KESME
PORTB=254
PORTA.0=1
PORTC.7=1
;*******************************************************************************
SN=0:DAK=40 :Saat=23 :GOSUB ZAMAN_YAZ
Basla:
     
      FOR ZZ=0 to 14
        GOSUB ZAMAN_OKU
        GOSUB ZAMAN_VER
        GOSUB DELAY
        WHILE ESN=SN
          GOSUB ZAMAN_OKU
          GOSUB DELAY
        WEND
        ESN=SN
        IF ILK=0 then
          ILK=1:LED=0
        ENDIF 
      NEXT           
        GOSUB ZAMAN_OKU
        ESN=SN

      for zz=0 to 2 
       GOSUB SENSOROKU
       GOSUB BEKLE
       x=ISI DIG 0:gosub AL:DAKON=SAYI
       X=ISI DIG 1:GOSUB AL:SAATBIR=SAYI
       X=11:gosub AL:DAKBIR=SAYI
       X=10:GOSUB AL:SAATON=SAYI
       GOSUB DELAY
     
       WHILE ESN=SN
         GOSUB ZAMAN_OKU
         GOSUB DELAY
       WEND
       ESN=SN
     NEXT
         
     GOTO BASLA

AL:   
'       LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN'CC
'       LOOKUP X,[64,121,36,48,25,18,2,120,0,16,70,28],SAYI :RETURN'CA
       LOOKUP X,[192,249,164,176,153,146,130,248,128,144,198,156],SAYI :RETURN'CA
DELAY:
      for WW=0 to 255
        PAUSEUS 5
      NEXT
      RETURN   
ZAMAN_VER:
        X=DAK DIG 0:GOSUB AL:DAKON=SAYI
        X=DAK DIG 1:GOSUB AL:DAKBIR=SAYI
        x=SAAT DIG 0:GOSUB AL:SAATBIR=SAYI;-128
        X=SAAT DIG 1:GOSUB AL:SAATON=SAYI
        RETURN           

;*******************************************************************************
;--------------------Sicaklik Okuma Bolumu--------------------------------------
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI degerini oku
           RETURN
Bekle:
'           OWIN    Comm_Pin, 4, [Busy]    ' Busy degerini oku
'           IF      Busy = 0 THEN Bekle  ' hala mesgulmu?,evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]'iki byte oku ve okumayi bitir.
           ISI = ((HAM*10)/16)/10
           RETURN
   
;*******************************************************************************   
;--------------------Zaman Okuma Bolumu-----------------------------------------
ZAMAN_OKU:   
    sayac=1-sayac: 'if sayac=1 then low porta.3   
    high RTC_RST 
    shiftout RTC_DTA, RTC_CLK, 0, [$BF]
    SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU   
    MEM=SN:GOSUB CEVIR:SN=SAYI
    MEM=DAK:GOSUB CEVIR:DAK=SAYI
    MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
    low RTC_RST
    Return

ZAMAN_YAZ:   
         high  RTC_RST
         SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'YAZMAK İÇİN HAZIRLA
         low RTC_RST:PAUSE 1
         high RTC_RST         
         SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 0]  'YAZ
         low RTC_RST
         PAUSE 10
         return
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
         RETURN 

TERSCEVIR:               
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
         RETURN   
;******************************************************************************
FLASH:
      TOGGLE PORTB.2:PAUSE 150:TOGGLE PORTB.2:PAUSE 150
      TOGGLE PORTB.3:PAUSE 150:TOGGLE PORTB.3:PAUSE 150
      TOGGLE PORTB.5:PAUSE 150:TOGGLE PORTB.5:PAUSE 150
      TOGGLE PORTB.6:PAUSE 150:TOGGLE PORTB.6:PAUSE 150
      return
;*******************************************************************************Disable
DISABLE
KESME:
      PORTC.7=1
      PORTB=(PORTB & 1)| 254
      SIRA=SIRA+1:IF SIRA=4 THEN SIRA=0
      led=led+1
      if led=500 then
        toggle PORTA.0
        portb.0=~portA.0
        led=0
      endif 
     
      if SIRA=0 then
        PORTD=DAKBIR
        KD4=0
      ENDIF 
     
      if SIRA=1 then
        PORTD=DAKON
        KD3=0
      ENDIF
       
      if SIRA=2 then
        PORTD=SAATBIR
        KD2=0
      ENDIF

      if SIRA=3 then
        PORTD=SAATON
        KD1=0
      ENDIF
     INTCON.2=0
     TMR0=7
     RESUME
     ENABLE     
     end

ete

Sonunda saati bana tamamlattın.  Ayar kısmınıda yaptım. Fazlalıkları çıkardım (hepsini çıkarabildimmi emin değilim!)

Simulasyonda titremesiz çalışıyor.  Sendeki, devrede vardır bir sorun. Program İlişiktedir.

Umarım olmuştur.

Ayar kısmına girildiğini saat hanesinin flash yapması ile anlayacaksın. Aynı şekilde SEC tuşu ile dakika kısmına geçildiğinde dakika hanesi flash yapacaktır. Flash yapma hızını simulasyonda ayarlamak çok zor. Bu nedenle rastgele bir değer verdim. Daha doğrusu simulasyon hızına göre bir değer verdim. Muhtemelen gerçek devrede çok hızlı flash yapacaktır. Flash hızını ayarlamak için programda yer alan aşağıdaki satırları bul, hemen ayar kısmının altında yer almaktadır.
GECIKME:
        FOR SURE=0 TO 1000:NEXT
        RETURN
Burada yer alan 1000 rakamını artırırsan flash hızı yavaşlayacak azaltırsan hızlanacaktır. Gerçek devreye göre ayarla ve bize de hangi rakamın uygun olduğunu söyle lütfen.

Programın başında yer alan saate ayar verme satırını sildim. Artık SEC tuşuna basarak ayar vermen gerekecek.
Displayde yer alan saniye ledleri ile birlikte ortada yanan nokta' yıda paralel çalıştırdım.
Dene ve sonucu bildir lütfen.

Ete

oguztkn

Hocam çok teşekkür ederim sonunda çalıştırabildim.Daha öğrenmem gereken çok şeyin olduğunu da bir kez daha anladım.Devrenin videosunu çektim linki aşağıda sadece titreme olayını nasıl en aza indirebilirim birde devre şuan 5 volt  1 amper bir adaptorle çalışıyor acaba voltajı ne kadar yükseltirsem displaylere zarar vermem

Yeşil kırmızı olayını da şöyle bir şey aklıma geldi basla etiketinde sonra 2 adet for döngüsü var 1 i ısı diğeri saat için bir tane xx adında bir bit tanımlasam bunu ilk döngüde 1 ikinci döngüde 0 yapsam kesme hangisinde gelirse aşapıdaki kesme etiketine de bir adet if ile xx=1 se yeşile xx=0 sa kırmızı diye yönlendirsem olurmu acaba ama benim için önemli olan şuan titreşimi en aza indirmek


devrenin linki  :   https://hotfile.com/dl/248266868/f65bd5b/20130930_214145.mp4.html

ete

#25
Öncelikle titreme konusu için bir deneme yapmanı istiyorum.
Programda kesme etiketi altında sonlara doğru ;

     INTCON.2=0
komut satırı var. Bu satırın bir öncesine pauseus 500 ekle. Şöyle

     pauseus 500
     INTCON.2=0
daha sonra derle ve dene bakalım ne olacak.

İKi farklı display kullanmak için öncelikle iki farklı renge ait ortak uçlar farklı transistörlerle sürülmeleri gerekir.
Rengin birisini sürdüğüne göre diğer renge ait ortak uçlar birer transistörle sürülmeli ve bu transistörlerin beys uçlarıda boşta olan Pic pinlerinden dördüne bağlanmalıdır.
Daha sonra bir bit değişkeni kullanarak,
Renk var bit (şeklinde tanımlanır)
Renk=0 ise diyelimki default olduğu için Kırmızı display çalışsın , Renk=1 olduğunda ise Yeşil renk çalışsın diyebiliriz.
Bunları saat ekranında kırmızı ve sıcaklık ekranında ise yeşil olarak kullanmak istersek,
Saat ekran döngüsü başına ve döngüden evvel , Renk=0,
Sıcaklık döngüsü başına ve döngüden evvel , Renk=1
komutlarını yerleştirmen gerekiyor.
İşin gerisi kesme etiketinde ayarlanacak olup yalnızca bir display için olanı yazacağım gerisini kendin yazarsın.

Kesme etiketine bakacak olursak bir display şöyle sürülüyor,
      if SIRA=0 then
        PORTD=DAKBIR
        KD4=0
      ENDIF
Bunu çift renk sürmek için
      if SIRA=0 then
        PORTD=DAKBIR
        If Renk=0 then
             KD4=0     
         else
             YD4=0
        Endif
 
      ENDIF

Tabiiki yeşilleri süren transistörlere ait pinlerin önce HIGH yapılması gerekir. Bu nedenle onları C portuna PortC.4 - C.7 arasına bağlaman daha uygun olur. Bu durumda Kesme etiketi başına;
PORTC=(PORTC & %00001111) | %00001111  komut satırı eklenmelidir.
Bu komut PortC de yer alan ilk dört pinin değerini bozmamak için onu direk olarak alır ve sonda yer alan 4  biti High yapar.

Hepsi bu kadar.

Ete

oguztkn

Hocam yeşil kırmız olayını hallettim.Sadece derece gösterirken ledleri durdurmak istedim ama beceremedim neyse o da nazarlık olsun devrenin son kodu ve videosu aşağıdadır deneye deneye buldum titreşimi engellemeyi


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [..........ETE.............]                      *
'*  Notice  : Copyright (c) 2013 [izinsiz kullanılamaz]         *
'*          : All Rights Reserved                               *
'*  Date    : 28.09.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;@ DEVICE pic16F877
;@ DEVICE pic16F877,WDT_OFF
;@ DEVICE pic16F877,PWRT_ON
;@ DEVICE pic16F877,PROTECT_OFF
;@ DEVICE pic16F877,XT_OSC
'*******************************************************************************
;@ DEVICE pic16F877A
;@ DEVICE pic16F877A,WDT_OFF
;@ DEVICE pic16F877A,PWRT_ON
;@ DEVICE pic16F877A,PROTECT_OFF
;@ DEVICE pic16F877A,XT_OSC
CMCON=7
'*******************************************************************************
DEFINE OSC 4
OPTION_REG=%10000001
ADCON1=7
TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000111
'*******************************************************************************
Comm_Pin  VAR PortC.0   ;One-wire Data-Pin "DQ" PortB.0 da
SYMBOL  RTC_DTA = PORTC.2 ;Ds1302 I/O ucu
SYMBOL  RTC_CLK = PORTC.1 ;Ds1302 SCLK ucu
SYMBOL  RTC_RST = PORTC.3 ;Ds1302 RST ucu
symbol  SEC     = PORTE.2 ;Saat ayar set tusu
SYMBOL  ASAGI   = PORTE.0 ;Saat ayar asagi tusu
SYMBOL  YUKARI  = PORTE.1 ;Saat ayar yukari tusu
;*******************************************************************************
SYMBOL  Yesil   = PORTA.0 ;Saniye ledleri yesil icin
SYMBOL  Kirmizi = PORTB.7 ;Saniye ledleri kirmizi icin
;*******************************************************************************
SYMBOL  KD1     = PORTB.2 ;
SYMBOL  KD2     = PORTB.3 ; Displayleri aktif etme uclari
SYMBOL  KD3     = PORTB.5 ;      Kirmizi renk icin
SYMBOL  KD4     = PORTB.6 ;
;*******************************************************************************
SYMBOL  YD1     = PORTB.0 ;
SYMBOL  YD2     = PORTB.1 ; Displayleri aktif etme uclari
SYMBOL  YD3     = PORTB.4 ;      Yesil renk icin
SYMBOL  YD4     = PORTC.7 ;
;*******************************************************************************

ILK         VAR BIT      ' Busy Status-Bit
GOR         VAR BIT
F           VAR BIT   'FLASH BITI

HAM         VAR WORD 56    ' Sensor HAM okuma degeri
ISI         VAR WORD 58    ' Hesaplanmis ISI degeri
LED         VAR WORD     ' Holds remainder for + temp C display
SURE        var word
X           VAR BYTE 
Y           VAR BYTE 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11'   +/- sicaklik isaret biti,1 = olursa eksi sicaklik
NEGAT_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° isareti
SIGN        VAR BYTE     '  ISI degeri icin  +/-  isaret
TEMP        VAR BYTE     ' Div32 bit hesap icin gecici degisken
SAYAC       VAR BYTE
SN          VAR BYTE
DAK         VAR BYTE 60
SAAT        VAR BYTE 61
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte    ' Temporary data holder
OUTBYTE     var byte    ' Second byte to ds1302
REG_ADR     var byte    ' First byte to DS1302
DAKBIR      VAR BYTE
DAKON       VAR BYTE
SAATBIR     VAR BYTE
SAATON      VAR BYTE
BIRLER      VAR BYTE
ONLAR       VAR BYTE
ESN         VAR BYTE
ZZ          var byte
WW          VAR word
SIRA        VAR BYTE
POZ         var byte
RENK        var bit
;*******************************************************************************
CLEAR                   'Tum degiskenler sifirlandi
low RTC_RST
low RTC_CLK
TMR0=7
PAUSE 200
esn=0:GOR=0
GOSUB ZAMAN_OKU
GOSUB ZAMAN_VER
GOSUB SENSOROKU
PAUSE 750
GOSUB BEKLE
GOSUB SENSOROKU
INTCON=%10100000
ON INTERRUPT GOTO KESME
PORTB=%11111111
PORTA.0=1
PORTC.7=1
;*******************************************************************************
Basla:
     
      FOR ZZ=0 to 10
        GOSUB ZAMAN_OKU
        GOSUB ZAMAN_VER
        RENK=1
        WHILE ESN=SN
          GOSUB ZAMAN_OKU
          IF SEC=0 then AYAR
        WEND
        ESN=SN
        IF ILK=0 then
          ILK=1:LED=0
        ENDIF
        nEXT           
        GOSUB ZAMAN_OKU
        ESN=SN

      for zz=0 to 3 
       GOSUB BEKLE
       GOSUB SENSOROKU
       RENK=0
       x=ISI DIG 0:gosub AL:DAKON=SAYI
       X=ISI DIG 1:GOSUB AL:SAATBIR=SAYI
       X=11:gosub AL:DAKBIR=SAYI
       X=10:GOSUB AL:SAATON=SAYI
       GOSUB DELAY
       GOSUB DELAY
       GOSUB DELAY
        WHILE ESN=SN
         GOSUB ZAMAN_OKU
        WEND
       ESN=SN
     NEXT
         
     GOTO BASLA

AL:   
       LOOKUP X,[192,249,164,176,153,146,130,248,128,144,198,156],SAYI :RETURN'CA
DELAY:
      for WW=0 to 255
      PAUSEus 750   
      NEXT
      RETURN   
ZAMAN_VER:
        X=DAK DIG 0:GOSUB AL:SAATON=SAYI :IF POZ=2 AND F=1 THEN SAATON=255
        X=DAK DIG 1:GOSUB AL:DAKBIR=SAYI  :IF POZ=2 AND F=1 THEN DAKBIR=255
        x=SAAT DIG 0:GOSUB AL:DAKON=SAYI:IF POZ=1 AND F=1 THEN DAKON=255
        IF SAATBIR<255 AND F=0 THEN SAATBIR=SAATBIR-128
        X=SAAT DIG 1:GOSUB AL:SAATBIR=SAYI:IF POZ=1 AND F=1 THEN SAATBIR=255
        RETURN
;*******************************************************************************
;--------------------Sicaklik Okuma Bolumu--------------------------------------
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI degerini oku
           RETURN
Bekle:

           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]'iki byte oku ve okumayi bitir.
           ISI = ((HAM*10)/16)/10
           RETURN
   
;*******************************************************************************   
;--------------------Zaman Okuma Bolumu-----------------------------------------
ZAMAN_OKU:   
    sayac=1-sayac: 
    high RTC_RST 
    shiftout RTC_DTA, RTC_CLK, 0, [$BF]
   
    SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU   
    MEM=SN:GOSUB CEVIR:SN=SAYI
    MEM=DAK:GOSUB CEVIR:DAK=SAYI
    MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
    low RTC_RST
    Return
   
ZAMAN_YAZ:   
         high  RTC_RST
         SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'YAZMAK İÇİN HAZIRLA
         low RTC_RST:PAUSE 1
         high RTC_RST         
         SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 0]  'YAZ
         low RTC_RST
         return     
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
         RETURN 

TERSCEVIR:               
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
         RETURN   
;******************************************************************************
;------------------AYAR KISMI BURDAN BASLIYOR-----------------------------------
AYAR: 
       low PORTB.7:LOW PORTA.0:SN=0:POZ=1:f=1
       WHILE SEC=0
         GOSUB ZAMAN_VER
         GOSUB GECIKME
         TOGGLE F
       WEND
       gosub DELAY
       
HOUR:       
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 and f=1 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0       
        ENDIF   
        IF ASAGI=0 AND F=1 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        TOGGLE F
        GOSUB ZAMAN_VER 
        GOSUB GECIKME
        GOTO HOUR
       
MINBIR:
        POZ=2:f=1       
        WHILE SEC=0
          GOSUB ZAMAN_VER
          GOSUB GECIKME
          TOGGLE F
        WEND
        GOSUB DELAY
       
MINUTE:
       IF SEC=0 THEN ara
        IF YUKARI=0 AND F=1 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 AND F=1 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59             
        ENDIF
        TOGGLE F
        GOSUB ZAMAN_VER
        GOSUB GECIKME
        GOTO MINUTE

GECIKME:
        FOR SURE=0 TO 1300:NEXT
        RETURN

ARA:   
        MEM=SN:GOSUB TERSCEVIR:SN=SAYI
        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
        F=0:POZ=0
        GOSUB ZAMAN_YAZ
        GOSUB ZAMAN_OKU
        GOSUB ZAMAN_VER
        WHILE SEC=0:wend
        GOSUB DELAY       
        goto BASLA
       


FLASH:
      TOGGLE PORTB.2:PAUSE 150:TOGGLE PORTB.2:PAUSE 150
      TOGGLE PORTB.3:PAUSE 150:TOGGLE PORTB.3:PAUSE 150
      TOGGLE PORTB.5:PAUSE 150:TOGGLE PORTB.5:PAUSE 150
      TOGGLE PORTB.6:PAUSE 150:TOGGLE PORTB.6:PAUSE 150
      return
;*******************************************************************************Disable
DISABLE
KESME:     
      PORTB=%11111111
      PORTB=(PORTB & 1)| 254
      PORTC.7=1
      SIRA=SIRA+1:IF SIRA=4 THEN SIRA=0
  led=led+1
      if led=200 then
       toggle PORTA.0
        portb.7=~portA.0
        led=0
       endif 
     
      if SIRA=0 then
        PORTD=DAKBIR
        if RENK=0 then
        KD4=0
        else
        YD1=0
      ENDIF
      endif 
     
      if SIRA=1 then
        PORTD=DAKON
        if RENK=0 then
        KD3=0
        else
        YD3=0
      ENDIF
      endif
       
      if SIRA=2 then
        PORTD=SAATBIR
        if RENK=0 then
        KD2=0
        else
        YD4=0
      ENDIF
      endif

      if SIRA=3 then
        PORTD=SAATON
        if RENK=0 then
        KD1=0
        else
        YD2=0
      ENDIF
      endif
    pauseus 1000
    pauseus 1000
     INTCON.2=0
     TMR0=7
     ReSUME
     ENABLE     
     end



videosu boyutu büyük olduğu için upload ettim :
https://hotfile.com/dl/248413364/70a5aa4/20131001_153100.mp4.html

ete

Renk=0 komutunu döngüden evvel verirsen program yalnızca bir kere o komutu görür ve bütün döngü süresince onu kullanır. Gereksiz yere döngü içine koyarsan aynı komutu döngü adedi kadar aynı komut çalışır. Burada çalışması bir sorun çıkarmıyor ama çıkaracağı yerler olabilir. Bu nedenle o komutları döngüden evvel ver.
Program içinde FLASH: isimli bir alt program var return a kadar onu sil. Hiç bir yerde kullanmıyoruz.
Kesme kısmında ilk satırda portb=%11111111. Şeklinde komut var onu sil. Hemen altında portb ye başka değer verilerek onu bozmuş oluyorsun zaten. Aynı işi yapam iki satır üst üste olmamalı. İlki zaten yanlış. Portb.0 da led bağlı. Led sönük iken sen o komutu verirsen led yanmış olur. Halbuki altındaki satır ledin konumunu aynen alarak diğer 7 bite değer vermektedir. Yine kesme kısmında iki tane üst üste pauseus 1000 var bu toplamda 2000 us lik gecikme demektir. O zaman komutlardan birini sil diğerini pauseus 2000 yap.
Sıcaklık ekranında ledleri sönük tutman için elindeki ip ucu renk=0 değeridir. O halde saat ekranı döngüsüne girmeden önce ama renk=1 komutundan sonra şu komutu ekle ;
Porta.0=gor : portb.7=~gor
Sıcaklık ekranı döngüsüne girmeden önce ve renk=0 komutundan sonra;
Gor=porta.0:porta.0=0:portb.7=0.  Komutlarını ekle
kesme kısmında ise;
If led=400 then satırını bul endif e kadar şöyle değiştir;

If led=400 then
If renk=0 then atla
Toggle porta.0
Portb.7=~porta.0
Atla:
Led=0
Endif

Umarım çalışır
Ete





oguztkn

Hocam dediğiniz yaptım o da çalıştı son olarak aşağıdaki kısmı programa eklesem ısı gösterme bölümü ondalıklı göstersin diye düşündüm ama bu kısma nerde gosub ile yollamam gerekli


Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
'       temp=($ffff-ham+1)*625 'bu satır alttakinin yerine kullanıldı
       Temp=625*(~HAM+2)
       ISI  = DIV32 1000
       GOTO GEC   
    endif
    TEMP = 625*(HAM)        '
    ISI = DIV32 1000          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    ISI2 = (ISI //10)
    ISI1=ISI/10
    RETURN

ete

Elinde 4 digit var 2 tanesi sıcaklık gösterecek 1 tanesi derece işareti diğeri ise C harfi. Ondalık içîn 5 digit olması gerekir. Yada sonda yer alan derece işareti yada C harfinden vaz geçmen gerekir.
Bu noktadan sonra ne yapacaksan kendin yapacaksın.
Önce otur mevcut bülgiler nasıl gösteriliyor onu incele ve öğren. Sonra ondalık göstermeyi dene.
Ete

Powered by EzPortal