ilker_32
Member level 3
pic16f628 ile derece saat
with Sofie Elenctronics,
ºematik : Proteus 7.5 service pack 3
programlama dili : Pic Basic Pro
simulation:
**broken link removed**
**broken link removed**
sourcecode:
with Sofie Elenctronics,
ºematik : Proteus 7.5 service pack 3
programlama dili : Pic Basic Pro
simulation:
**broken link removed**
**broken link removed**
sourcecode:
Code:
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
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
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
GUN VAR BYTE
AY VAR BYTE
YIL VAR BYTE
MEM var byte '
EKRAN_ZAM var byte '
SUM VAR BYTE
EKRAN_ISI VAR BYTE
ONLAR VAR BYTE
BIRLER VAR BYTE
ESN 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ı
EKRAN_ZAM=10 'ZAMANIN EKRANDA KALMA SÜRESİ
EKRAN_ISI=5 'SICAKLIĞIN EKRANDA KALMA SÜRESİ BUNLARI DEĞݪTİREBİLİRSİNİZ.
SUM=EKRAN_ZAM+EKRAN_ISI
IF sec=0 then ZAM_AYAR
ILK:
gosub ekran0
gosub sensoryaz
gosub sensoroku
low RTC_RST
low RTC_CLK
GOSUB GECIKME
'-----------------------------------------------------------------------------
HIGH PORTA.3
gosub ZAMAN_OKU:esn=SN
BASLA:
IF Y=SUM THEN Y=0
IF Y>(EKRAN_ZAM-1) AND Y<SUM THEN
if y=(EKRAN_ZAM+1) then GOSUB SENSOROKU
GOSUB EKRAN1
ENDIF
IF Y<EKRAN_ZAM THEN GOSUB EKRAN0
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: if sayac=28 then LOW porta.3
' 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
HIGH st:PAUSEUS 2:LOW st
RETURN
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
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
HIGH st:PAUSEUS 2:LOW st
RETURN
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
HIGH st:PAUSEUS 2:LOW st
RETURN
'-----------------------------------------------------
ZAM_AYAR:
LOW PORTA.3:SN=0:POZ=1:SUM=6
SN=EKRAN_ZAM: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:
EKRAN_ZAM=SN:SUM=91
SN=EKRAN_ISI: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:
EKRAN_ISI=SN
SUM=EKRAN_ZAM+EKRAN_ISI
Z=0:W=0:POZ=0
GOTO ILK
AYAR:
LOW PORTA.3:SN=0:POZ=1':GOSUB FLASH
gosub ekran0
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
'-------------------------------------------------------------------------------
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU:
'-----------------DİKKAT İSİS'de BU SATIR AKTİF EDİLECEK----------------------
' 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
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 = "-"
temp=($ffff-ham+1)*625
ISI = DIV32 10
GOTO GEC
endif
TEMP = 625 * (HAM+1) '
ISI = DIV32 10 ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
FLOAT = (ISI //1000)/100
ISI=ISI/1000
RETURN
ZAMAN_OKU:
high RTC_RST:OUTPUT rtc_dta
shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
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:OUTPUT RTC_DTA
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0] 'WRT Protek açıldı
low RTC_RST:PAUSEUS 10
high RTC_RST
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 128] '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=58 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<EKRAN_ZAM then HIGH porta.3
ENDIF
CIK: INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE
END