74HC595 in 7 nolu çıkışını nasıl sürebiliriz.

Başlatan obilgi, 01 Temmuz 2006, 10:37:53

obilgi

@ete ustanın 7 nolu saat-termometre devresinde displaylerin noktalarını saniye ledileri yerine kullanmak istiyorum. Bu yüzden 74HC595 in Q7 nolu çıkışın 500 ms on,  500ms off olmasını sağlamak için codeların neresinde değişiklik yapmam gerekiyor. Codelardan pek anladığım söylenemez. Yardımlarınız için teşekkürler.

'****************************************************************
'*  Name    : SAAT-TERMO.BAS                                      *
'*  Author  : [Erol Tahir Erdal]                                *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 23.06.2005                                        *
'*  Version : 1.0      LED (7)                                         *
'*  Notes   : SICAKLIK KUSURAT YAZMIYOR AMA EKSI SICAKLIK       *
'*          :  GOSTEREBİLİYOR SAAT RTC DS1302 ile çalışıyor                                  *
'****************************************************************
PORTA=0:portb=0
TRISB=0   
TRISA=%11100000  
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                                
@ DEVICE pic16F628, WDT_ON              '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
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
SN          VAR BYTE
DAK         VAR BYTE
SAAT        VAR BYTE
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte ' Temporary data holder
'TARIH       var byte ' Second byte to ds1302
ONLAR       VAR BYTE
BIRLER      VAR BYTE
ESN         VAR BYTE
'---------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
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ı
low RTC_RST
low RTC_CLK 
GOSUB GECIKME
'-----------------------------------------------------------------------------
HIGH PORTA.3 
gosub ZAMAN_OKU:esn=SN
BASLA: 
        IF Y=15 THEN Y=0
        IF Y>5 AND Y<11 THEN GOSUB EKRAN1
        IF Y>10 THEN GOSUB EKRAN2
        IF Y<6 THEN GOSUB EKRAN0
       
ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
       gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ

       GOTO BASLA

EKRAN0: if sayac=30 then LOW porta.3
       X= SAAT DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       
       X= SAAT DIG 0:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI+128]
       HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3 

       X= DAK DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4
       
       X= DAK DIG 0:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5
       
       X= sn DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6
       
       X= SN DIG 0:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7
       RETURN
       
AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
     

EKRAN1:LOW PORTA.3 
       SAYI=0
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       IF SIGN_BITI = NEGAT_ISI THEN SAYI=64
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3       
       x=(ISI DIG 1):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4
       x=(ISI DIG 0):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5
       X=10:GOSUB AL 
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6 
       X=11:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7
       RETURN
       
EKRAN2:IF POZ=0 THEN low porta.3
       X= GUN DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       
       X= GUN DIG 0:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI+128]
       HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3 

       X= AY DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4
       
       X= AY DIG 0:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI+128]
       HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5
       
       X= YIL DIG 1:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6
       
       X= YIL DIG 0:GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7    
       RETURN       
'-----------------------------------------------------       
AYAR:  
       LOW PORTA.3:SN=0:POZ=1:GOSUB FLASH
       IF Y>10 THEN TARIHAYAR
       WHILE SEC=0 
       WEND
HOUR:  GOSUB EKRAN0
       LOW PORTA.3
       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 EKRAN0
       LOW PORTA.3
       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
DELAY:
        FOR X=0 TO 1900
        PAUSEUS 10
        NEXT
        RETURN      

ARA:    
        GOSUB FLASH
        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:  GOSUB EKRAN2
       IF SEC=0 THEN AYBIR
       IF YUKARI=0 THEN
          GUN=GUN+1
          IF GUN=32 THEN GUN=1       
        ENDIF   
        IF ASAGI=0 THEN
           GUN=GUN-1
           IF GUN=255 THEN SAAT=31
        ENDIF   
        GOSUB GECIKME
        GOTO GUNAL
        
AYBIR: 
        GOSUB FLASH
        WHILE SEC=0
        WEND
        
AYAL: GOSUB EKRAN2
      IF SEC=0 THEN YILBIR
        IF YUKARI=0 THEN
           AY=AY+1
           IF AY=13 THEN AY=1
        ENDIF
        IF ASAGI=0 THEN
           AY=AY-1
           IF AY=255 THEN AY=12              
        ENDIF
        GOSUB GECIKME
        GOTO AYAL
YILBIR:
        gosub FLASH
        WHILE SEC=0:WEND
YILAL:
       GOSUB EKRAN2
       IF SEC=0 THEN ARA
        IF YUKARI=0 THEN
           YIL=YIL+1
           IF YIL=100 THEN YIL=0
        ENDIF
        IF ASAGI=0 THEN
           YIL=YIL-1
           IF YIL=255 THEN YIL=99              
        ENDIF
        GOSUB GECIKME
        GOTO YILAL                
              
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU: ham=$ff5e: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, 4, [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, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
             
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC   
    endif
    TEMP = 625 * HAM        ' 
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/90
    ISI=ISI/1000
    RETURN              

ZAMAN_OKU:

         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
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         low RTC_RST 
         return
          

ZAMAN_YAZ:
           
         high  RTC_RST 
         SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'YAZMAK İÇİN HAZIRLA
         low RTC_RST:PAUSEUS 10 
         high RTC_RST          
         SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 0]  'YAZ
         low RTC_RST 
         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 SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          Y=Y+1
          GOSUB ZAMAN_OKU
         if Y<5 then HIGH porta.3
       ENDIF
CIK:     INTCON.2=0  'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
                  
         
END

XX_CİHAN_XX

ete hocanın saat termometre devresını ıncelemedım fakat bu ısı 74hc595 ı kullanmadanda halledebılırsın eger devredekı pıc de 1 tane bos uc varsa tabı.O sekılde daha kolay olacaktır.Devrede uln2803 varsa onun bos gırıslerınden bırını yada harıcı bır transıstor ekleyerek sanıye ledını surebılırsın.Tabi dedıgım gıbı devreyı ınceleyemedıgım ıcın pıcın bos ayagı var mı bılmıyorum varsa boyle yapmanı tavsıye ederım 595 ıle daha zor olur cunku.Ama pıcın 1 bıtlık bos ucu yoksa tabı yapacak bırsey yok demektır 595 ı kullanacaksın.Pıc basıc kodlarından cok fazla anlamadıgım ıcın ete hoca yanıtlasa daha ıyı olur sorunu sadece fıkır vermek ıstedım kolay gelsın...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Logan

Dediğin işlemi yapabilmen için, ana programı ikiye ayırıp (500ms on\500 ms off olmak üzere),displaylere gönderdiğin 74595 bilgisini 128 ile toplaman gerekir.Tabii bu da bayağı vakit alır.Ya da timer kesmesi kullanarak 500 ms sonunda tekrar displaylerde gösterilen 74595 bilgisini 128 ile toplaman ve çıkarman yeterli olur.Yukarıdaki programda ekranda gösterilen rakamlar "SAYI" registerinin içine atılıp, oradan 74595 entegresine gönderiliyor.Burada 128 eklemen gereken register "SAYI" registeridir.Umarım içinden çıkarsın.Ama en doğrusu programı yazan kişiye, yani ETE'ye başvurmandır.
İmza.

mustafacan

Sayı+128 denmiş zaten bu kodla zaten port sürülüyorya! Tarih ayıracı için demi?

EKRAN2:IF POZ=0 THEN low porta.3
      X= GUN DIG 1:GOSUB AL
      SHIFTOUT DTA,CLK,1,[SAYI+128]
      HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       
      X= GUN DIG 0:GOSUB AL
      SHIFTOUT  DTA,CLK,1,[SAYI+128]
      HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3

      X= AY DIG 1:GOSUB AL
      SHIFTOUT DTA,CLK,1,[SAYI+128]
      HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4
       
      X= AY DIG 0:GOSUB AL
      SHIFTOUT DTA,CLK,1,[SAYI+128]
      HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5
       
      X= YIL DIG 1:GOSUB AL
      SHIFTOUT DTA,CLK,1,[SAYI+128]
      HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6
       
      X= YIL DIG 0:GOSUB AL
      SHIFTOUT DTA,CLK,1,[SAYI+128]
      HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7    
      RETURN
Keşfedilecek çok teknoloji var. Boş Vaktim Yok!

obilgi

Yo hayır tarih ayırıcı için [SAYI+128] ' i ete ustanın dediği gibi ben yazdım programa ve gayet güzel çalışıyor. Ama sadece PORTB.3 ve PORTB.5  (2 ve 4 nolu displaylerin dot ları )için yazdım. Saniye için aynı noktaları kullanmak istiyorum programda helletmek sanırım çok zor. Yukarıda @XX_CİHAN_XX arkadaşın verdiği fikir güzel aslında saniye için kullanılan PORTA.3 çıkışını direk UDN2981 in dot girişine bağlarsam amacıma ulaşmış olurum herhalde.

Herkese teşekkürler.