avatar_ete

Saat Projeleri

Başlatan ete, 05 Eylül 2011, 11:13:26

nurim

Önceki devreye ek olarak, ısı (25c üzeri) , gün/ay, yıl ( iki hane), gösterecek şekilde düzenlemeye çalıştım.....
Kolay Gelsin
nurim

erdoganacun

ete hocam  saygılar   sizin projeniz  olan  DS1307  saat  var  ben  bunu  yapıyım  dedim  similasyonuna  baktım   takvim kısmında  gün ay var  yıl  yok   size  zahmet  bir bakabilirmisiniz  yılı  nasıl ekleyeceğiz

erdoganacun

#182
'*  Name    : SAAT-TERMO.BAS                                    *
'*  Author  : [Erol Tahir Erdal]                                *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 31.07.2008                                        *
'*  Version : 1.0      LED (77)                                 *
'*  Notes   : 3 pinden 595 leri süren yeni sistem               *
'*          : YENİ MENÜ SİSTEMİ UYGULANDI EN SON MODEL          *
'****************************************************************
PORTA=0:portb=0      'dikkat*********************
TRISB=0             ' Bu program DS1307 ye göredir..............
TRISA=%11100000 
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_Off              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------
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
CMCON=7 
'----------------------------------------------------------------------------
Comm_Pin    VAR PortA.4     ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT         ' Busy Status-Bit
POZ         VAR BIT
Z           VAR BIT
W           VAR BIT
U           VAR BIT
T           VAR BIT
GOR         VAR BYTE
HAM         VAR WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD 
Y           VAR BYTE 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
SAYAC       VAR BYTE 50
SN          VAR BYTE
DAK         VAR BYTE
SAAT        VAR BYTE
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte '
HAFGUN      var byte '
ONLAR       VAR BYTE
BIRLER      VAR BYTE
ESN         VAR BYTE
SAAT_SURE   VAR BYTE
ISI_SURE    VAR BYTE
TAKV_SURE   VAR BYTE
YIL_SURE    VAR BYTE
SUM         VAR BYTE
'---------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
symbol  ST=PORTB.2
SYMBOL  RTC_DTA=PORTA.0
SYMBOL  RTC_CLK=PORTA.1
'SYMBOL  RTC_RST=PORTA.2
symbol  SEC   =PORTA.5 
SYMBOL  ASAGI =PORTA.6
SYMBOL  YUKARI=PORTA.7
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
SAAT_SURE=5
ISI_SURE=5
TAKV_SURE=5
'TAKVİM EKRANDA KALMA SÜRESİ
SUM=SAAT_SURE+ISI_SURE+TAKV_SURE
'IF sec=0 then ZAM_AYAR
ILK:
gosub ekran0
gosub sensoryaz
gosub sensoroku
GOSUB GECIKME
'-----------------------------------------------------------------------------
LOW PORTA.3
gosub ZAMAN_OKU:esn=SN
'-------------------------------------------------
BASLA:

    IF SAYAC=31 AND Y<SAAT_SURE THEN HIGH PORTA.3
      GOSUB ZAMAN_OKU
      if ESN=sn then atla
      IF Y<SAAT_SURE THEN
         LOW porta.3
         GOSUB EKRAN0
      ENDIF
             
      IF Y=>(SAAT_SURE) AND Y<(SAAT_SURE+ISI_SURE) THEN
         GOSUB SENSOROKU
         GOSUB EKRAN1
      ENDIF
     
      IF Y=>(SAAT_SURE+ISI_SURE) then gosub EKRAN2
      Y=Y+1 : ESN=SN : SAYAC=0
      IF Y=SUM THEN Y=0
       
ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
         
       GOTO BASLA       
'-----------------------alt programlar-------------------------------------------       
TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
       RETURN
BAK_0:
       GOSUB AL
       IF Z=1 AND W=1 THEN SAYI=0 
       RETURN
BAK_1:
       GOSUB AL
       IF Z=1 AND U=1 THEN SAYI=0             
       RETURN
BAK_2:
       GOSUB AL
       IF Z=1 AND T=1 THEN SAYI=0             
       RETURN
     

EKRAN0:         
'        X= SN DIG 0 :GOSUB al:GOSUB TEKRAR
'        X= sn DIG 1 :GOSUB al:GOSUB TEKRAR
       
        X= DAK DIG 0:GOSUB BAK_1:GOSUB TEKRAR
        X= DAK DIG 1 :GOSUB BAK_1:GOSUB TEKRAR
        u=0
        X= SAAT DIG 0 :GOSUB BAK_0:GOSUB TEKRAR
        X= SAAT DIG 1:GOSUB BAK_0:GOSUB TEKRAR
        w=0
        GOTO STYAZ
       
AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
     

EKRAN1:LOW PORTA.3
       X=11:GOSUB AL:GOSUB TEKRAR
'       X=10:GOSUB AL:GOSUB TEKRAR
       SAYI=99
       IF SIGN="-" then SAYI=64
       gosub tekrar
       x=(ISI DIG 0):GOSUB AL:GOSUB TEKRAR
       x=(ISI DIG 1):GOSUB AL:GOSUB TEKRAR
'       IF SIGN_BITI = NEGAT_ISI THEN
'         SAYI=64
'         else
'         SAYI=0
'         endif
'       GOSUB TEKRAR
'       SAYI=0
'       GOSUB TEKRAR
       HIGH st:PAUSEUS 2:LOW st
       RETURN       
       
EKRAN2:IF POZ=0 THEN HIGH porta.3
       X= YIL DIG 0:GOSUB BAK_2:GOSUB TEKRAR
       X= YIL DIG 1:GOSUB BAK_2:GOSUB TEKRAR
       T=0
       X= AY DIG 0:GOSUB BAK_1:GOSUB TEKRAR       
       X= AY DIG 1:GOSUB BAK_1:GOSUB TEKRAR
       U=0     
       X= GUN DIG 0:GOSUB BAK_0:GOSUB TEKRAR
       X= GUN DIG 1:GOSUB BAK_0:GOSUB TEKRAR
       w=0
       GOTO STYAZ     
'-----------------------------------------------------
'EKRAN_3:
'        X= SN DIG 0:GOSUB BAK_1:GOSUB TEKRAR
'        X= SN DIG 1 :GOSUB BAK_1:GOSUB TEKRAR
'        u=0
'        SAYI=0:GOSUB TEKRAR
'        SAYI=SUM:GOSUB TEKRAR
'        w=0

STYAZ:     
        HIGH st:PAUSEUS 2:LOW st
        RETURN         
'----------------------------------------------------- 
'ZAM_AYAR:
'        LOW PORTA.3:SN=0:POZ=1:SUM=6
'        SN=SAAT_SURE:GOSUB EKRAN_3
'        WHILE SEC=0:WEND
       
'ZAM_BIR:
'        W=1
'        IF SEC=0 THEN ZAM_IKI
'        IF YUKARI=0 THEN
'          IF Z=0 THEN sn=SN+1
'          IF SN=31 THEN SN=0       
'        ENDIF             
'        IF ASAGI=0 THEN
'           IF Z=0 THEN SN=SN-1
'           IF SN=255 THEN SN=30
'        ENDIF
'        Z=1-Z
'        GOSUB EKRAN_3       
'        GOSUB GECIKME
'        GOTO ZAM_BIR
       
'ZAM_IKI:
'        SAAT_SURE=SN:SUM=91
'        SN=ISI_SURE:GOSUB EKRAN_3
'        WHILE SEC=0:WEND
       
'ZAM_UC:
'        W=1
'        IF SEC=0 THEN ZAM_DORT
'        IF YUKARI=0 THEN
'          IF Z=0 THEN sn=SN+1
'          IF SN=31 THEN SN=0       
'        ENDIF             
'        IF ASAGI=0 THEN
'           IF Z=0 THEN SN=SN-1
'           IF SN=255 THEN SN=30
'        ENDIF
'        Z=1-Z
'        GOSUB EKRAN_3       
'        GOSUB GECIKME
'        GOTO ZAM_UC       
       
'ZAM_DORT:
'         ISI_SURE=SN
'         SUM=SAAT_SURE+ISI_SURE
'         Z=0:W=0:POZ=0
'         WRITE 0,SAAT_SURE:PAUSE 10
'         WRITE 1,ISI_SURE:PAUSE 10
'         GOTO ILK   
     
AYAR: 
       LOW PORTA.3:SN=0:POZ=1':GOSUB FLASH
       IF Y>10 THEN TARIHAYAR
       WHILE SEC=0
       WEND
HOUR:  W=1
       LOW PORTA.3
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          IF Z=0 THEN SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0       
        ENDIF   
        IF ASAGI=0 THEN
           IF Z=0 THEN SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        Z=1-Z
        GOSUB EKRAN0   
        GOSUB GECIKME
        GOTO HOUR
       
MINBIR: W=0:Z=0
        GOSUB EKRAN0
'        GOSUB FLASH
        WHILE SEC=0
        WEND
       
MINUTE: U=1       
       LOW PORTA.3
       IF SEC=0 THEN ara
        IF YUKARI=0 THEN
           IF Z=0 THEN  DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           IF Z=0 THEN  DAK=DAK-1
           IF DAK=255 THEN DAK=59             
        ENDIF
        Z=Z-1
        GOSUB EKRAN0
        GOSUB GECIKME
        GOTO MINUTE
       
SECBIR: WHILE SEC=0
        WEND
        U=0
GECIKME:
        FOR X=0 TO 3500
        PAUSEUS 5
        NEXT
        RETURN
DELAY:
        FOR X=0 TO 1900
        PAUSEUS 10
        NEXT
        RETURN     

ARA:    W=0:u=0:T=0:Z=0
        GOSUB FLASH
        Gosub EKRAN0
        HIGH PORTA.3
        WHILE SEC=0 
        wend
        MEM=SN:GOSUB TERSCEVIR:SN=SAYI
        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
        MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
        MEM=AY:GOSUB TERSCEVIR:AY=SAYI
        MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI
        GOSUB ZAMAN_YAZ
        GOSUB ZAMAN_OKU
        y=0:POZ=0
        goto BASLA
       
FLASH:
      TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY
      TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY
      return
'-------------------------------------------------------------------------------     
TARIHAYAR: 
       WHILE SEC=0
       WEND
GUNAL: W=1
       IF SEC=0 THEN AYBIR
       IF YUKARI=0 THEN
         IF Z=0 THEN GUN=GUN+1
          IF GUN=32 THEN GUN=1       
        ENDIF   
        IF ASAGI=0 THEN
          IF Z=0 THEN GUN=GUN-1
           IF GUN=255 THEN SAAT=31
        ENDIF
        Z=Z-1
        GOSUB EKRAN2 
        GOSUB GECIKME
        GOTO GUNAL
       
AYBIR:  W=0
'        GOSUB FLASH
        WHILE SEC=0
        WEND
       
AYAL: u=1
      IF SEC=0 THEN YILBIR
        IF YUKARI=0 THEN
           IF Z=0 THEN AY=AY+1
           IF AY=13 THEN AY=1
        ENDIF
        IF ASAGI=0 THEN
          IF Z=0 THEN AY=AY-1
           IF AY=255 THEN AY=12             
        ENDIF
        Z=Z-1
        GOSUB EKRAN2
        GOSUB GECIKME
        GOTO AYAL
YILBIR: u=0
'        gosub FLASH
        WHILE SEC=0:WEND
YILAL: T=1       
       IF SEC=0 THEN ARA
        IF YUKARI=0 THEN
          IF Z=0 THEN YIL=YIL+1
           IF YIL=100 THEN YIL=0
        ENDIF
        IF ASAGI=0 THEN
         IF Z=0 THEN YIL=YIL-1
           IF YIL=255 THEN YIL=99             
        ENDIF
        Z=1-Z
        GOSUB EKRAN2
        GOSUB GECIKME
        GOTO YILAL               
             
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU:
'           ham=$07d0:Gosub hesapla:RETURN  'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 0, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 0, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
           
SENSORYAZ:
          OWOUT   COMM_Pin, 1, [$CC, $4E, $00,$00,$31]
          return           
               
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=($ffff-ham)+1
    endif
    ISI = HAM/16
    RETURN
   
                   

ZAMAN_OKU:
         
         I2CRead RTC_DTA, RTC_CLK,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,MEM]
   
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
'         low RTC_RST
         return

ZAMAN_YAZ:
          MEM=$10:SAAT.7=1
         I2CWrite RTC_DTA, RTC_CLK,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,MEM]
         
         PAUSEUS 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
         
DISABLE
KESME:IF POZ=1 then CIK
         SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
         IF Y>(SAAT_SURE) AND SAYAC=62 THEN
           Y=Y+1:SAYAC=0
           IF y=(SUM+1) THEN y=0
         ENDIF 
         
CIK:     INTCON.2=0  'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE                 
         
END

         
                     

erdoganacun

ete hocam kusura  bakmayın dosya  gönderiuim derken bu şekilde  yanlışlıkla  gönderdim. hocam burda saat-derece-ve gün ay  var yıl eklemek için nasıl yapmamız  lazım ben daha öncede  söyledim hocam  fırsat  buldukça  öğrenmeye  çalışıyorum

ete

Bu programda yıl mevcut. Ekran2 etiketinde ise ekrana yazdırılıyor.
Okuma ve yazma (saat) kısmında ise yıl sürekli okunuyor ve yazılıyor. Sorun nedir anlamadım doğrusu.
Ete

erdoganacun

hocam yıl okumuyor  ekte  dosyayı veriyorum

erdoganacun

#186
hocam  dosya  bu  sizin dosya

ete

#187
Bu projede 2+2 display kullanılıyor. Bu displayde yıl göstermek pek akıllıca değil ondandır. Yıl göstermeye kalksak;
20 : 14  şeklinde gözükecek sence normalmi bu?
Sistem normal saati belirli bir süre gösteriyor. Ardından Gün ve AY değerini gösteriyor ardından sıcaklığı gösteriyor.  Birde buna yıl eklenirse nasıl olacak bilemiyorum.
Sence nasıl olmalı?

Ete

ete

Cevap yazmadığına göre ya mesajı görmedin yada söylediklerim mantıklı geldi.
Ben yinede istediğini yaptım. İlişikteki saat projesi aynı sistem içinde YIL da göstermektedir.
Basla satırından evvel şu değer atamalar var.
SAAT_SURE=10  'saatin ekranda kalma süresi sn olarak
ISI_SURE=5       'sıcaklığın ekranda kalma süresi sn olarak
TAKV_SURE=3    'ay/gün gösteriminin ekranda kalma süresi sn olarak
TAR_SURE=3     'yıl gösteriminin ekranda kalma süresi sn olarak

bu süreleri istediğin gibi değiştirerek süre ayarı (programdan) yapabilirsin.

Ete

djtur

ETE hocam öncelikle hayırlı işler dileyeyim.Benim de sizden bir ricam olacaktı.Acaba ledli akrep ve yelkovanı olan sadece saat özelliği olan analog saat devreniz var mı?Uzun zamandır aramadığım yer kalmadı ama bir türlü istediğim gibi bir devreye rastlamadım.Ben sadece analog saat devresi olsun akrep yelkovan ledlerden olsun istiyorum Acaba mümkün mü?

ete

Böyle bir projem yok maalesef. Bir ara düşündüm yapmayı ama baktım çok iyi bir devre tasarlamak gerekiyor. Bir sürü ledi dar bir alana sığdırmanız lazım. Sonra onları sisteme uygun bir şekilde sürmek de gerekiyor. Devreyi kafamda oluşturamadım. Ledlerin sürülmesi çok önemli. Değişik alternatifler var elbette. Bunların başında saat ekranını büyükçe bir dairesel şekil almış matrix gibi düşünmek geliyor. İkinci alternatifte her bir saat , dakika ve olacaksa sn konumunu önceden kayda alıp değerlerine göre programı oralara yönlendirmek. Dahada açmak gerekirse bir saniye çizgisinin 60 değişik konumu var aynı konumu hem dakika hemde saat çizgileri (akrep-yelkovan) da izliyor. Her bir konumu bir shift registere bağlarsak led sayısına bağlı olarak seri bir kaç register kullanırsak olur diye düşünmüştüm. Ama lafla kolay gibi gözüken şey devreye dönüştürülünce o kadar kolay olmuyor.
Anlayacağın zahmeti çok fazla olduğu gibi bitirilmesi uzun zaman alacak bir proje bu.

Ete

elvanmurat

ete hocam;

sizin projeniz olan saat-ısı-led 3 devresini yaptım.programda daha önce belirttiğiniz yerlerde oynamama ragmen saat ya ileri gidiyor,yada geri kalıyor.bi cözümü varmıdır acaba.teşekkürler..

ete

Bu proje pic dahili OSC sinden clk palsi alarak saat palslerini elde etmektedir.
Dolayısıyla hassasyeti tamamen pic osc sine bağlıdır. Kristal kullanırsanız daha stabil sonuçlar almanız mümkündür ancak yine kesin hass
asiyet beklemeyin bu saat den. Bu tür sorunlar yüzünden zaten RTC denilen harici saat entegrelerini yaratmışlar. Benim projelerin diğerlerinde saat entegresi kullanılmaktadır. Onlarda bile ileri gitme yada geri kalma sorunları olabiliyor. Sizin projenizde en akla yatkın çözüm kaliteli 4 Mhz kristal osc kullanmakta yatıyor. Başkada bir çözümü yok. En kolya Çözüm çok stabil çalışan kaliteli kristal osilatör kullanmakta yatıyor. Ama yinede garanti olmadığını söylemek zorundayım çünki Osilatör denilen devreler sıcaklıkla çok değişkenlik gösterir. 25 derece sıcaklıkta tam 4 Mhz olarak çalışan bir kristal sıcaklık 28-30 dereceye çıkınca 4,1 Mhz değerlerine ulaşabiliyor. Buda saatin ileri gitmesine sebep oluyor.  Bu bakımdan kesin çözüm istiyorsan sıcaklıkla değeri değişmeyen TCO denilen hazır osilatörler kullanman gerekiyor. Bunlar özel kılıf içinde belirli sıcaklıkta tutulan ve harici sıcaklık ile osc değeri değişmeyen kristal osilatörlerdir.

Ete

elvanmurat

hocam

yine her zamanki gibi cok hızlısınız cevap konusunda.rtc ile yaptıgımızda 1302 entegresindede bu sorun oluyor.sizce 1302 mi 1307 mi bu konuda daha iyi.birde bi yazınızda hassas bi 32.768 kristalden bahsetmiştiniz.bu kristali nasıl temin edebiliriz.

Mucit23

DS1302, biraz nazlı bir enteğre. İsteklerini Tam olarak yerine getirmek gerekiyor. Kristal konusunda bayağı hassas.
DS1307 biraz daha iyi bu konuda.

Hassas kristallari Saatlerin içinden veya PC anakartlarından sökebilirsin. Şekilleri aynıdır.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal