pic 16f628A kablosuz kombi oda termostatı açma kapama butonu hk.

Başlatan ozkbilgi, 23 Kasım 2016, 10:55:51

ozkbilgi

merhaba arkadaşlar,
bu işe yeni başlayanlardanım henüz yeni yeni devre yapıp kodlama kısmına girmeye çalışıyorum, rahmetli abim kablosuz oda termostatı yapmıştı (internetten bulduğumuz değerli hocalarımız çalışmalarını kendine göre tasarladı) bende o devreleri ve kodları kullanarak ikinci oda termostatımı yapayım dedim ve yeni bir kaç özellik ekleyeyim istedim. ancak yazımın başında belirttiğim gibi henüz merdivenin en alt basamağında olduğumdan bir türlü beceremedim,
sorum şu şekilde bir tuşa bastığımda devre kombiye kapatma sinyali gönderecek ve kombi kapatılmış olacak tekrar basıldığında ise devre normal çalışma vaziyetine gelip kombiye açıl diyecek yani her seferinde kombiye gidip manuel aç kapa yapmak yerine oda termostatı üzerinden aç kapa yapacak. ben devreye symbol katap=porta.0 ekledim zaten yapabildiğim yeğane şeyde oyudu , kesme işlemlerine baktım ete hocamızın anlatımlarına baktım inetrnet te araştırdım ancak kafam bir türlü basmadı bana yardımcı olacak arkadaşlara şimdiden teşekkür ederim sonsuz saygılarımı sunarım , dosya ekte

kodlar

'@ DEVICE pic16F628A                      'işlemci 16F628                               
'@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
TRISA=%10111001
TRISB=%00000000
PORTA=0:PORTB=0
CMCON=7 
ON INTERRUPT GoTo KESME   
OPTION_REG=%00000000  'Pull up dirençleri İPTAL- Bölme oranı 1/2
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL    SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL  ASAGI=PORTA.3
SYMBOL  CIKIS=PORTA.6
SYMBOL   ISIK=PORTA.1
SYMBOL  KAPAT=PORTA.0
'-----------------------------DEĞİŞKENLER---------------------------------------
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0    ;DERECE İŞARETİ
TERM   VAR  WORD
ISIS   VAR  WORD
TERMM  VAR  BYTE
T_ONDA VAR  BYTE
H_BIR  VAR  BYTE
H_ONDA VAR  BYTE
ONDA   VAR  BYTE
SNS    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
I      VAR  WORD
VERI   VAR  BYTE
PAUSE 200
LCDOUT $FE,1
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD
ISI         VAR BYTE
Float       VAR WORD        ' Holds remainder for + temp C display       
ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI    CON 1           ' Negatif_Cold = 1
ISARET      VAR BYTE       
Comm_Pin    VAR PORTA.7
;****************BAŞLANGIC*********************************************
BASLANGIC:
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1

BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL
IF TUS=1 THEN GOTO AYAR
IF ASAGI=0 OR YUKARI=0 THEN GOTO ISIK0
GOTO BASLA
'--------------------------------ALT PROGRAMLAR--------------------------------- 
SENSOROKU:
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: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return   
Hesapla:  ' Ham değerden Santigrat derece hesabı
ISARET  = "+"
IF ISARET_BITI = EKSI_ISI THEN
ISARET   = "-" 
ham=~ham+2
endif
float = ((HAM*10)/16 )
ISI=FLOAT/10
ONDA=(FLOAT //10)
   
RETURN
;************role kontrol******************************************
KONTROL:
IF ISIS=>FLOAT THEN
VERI=120
LCDOUT $FE,$8D,"(A)" :gosub delay4: LCDOUT $FE,$8D,"( )" :gosub delay4:LCDOUT $FE,$8D,"(A)"
portb.0=1   :portb.1=0
ENDIF
IF FLOAT=>TERM THEN
VERI=150
LCDOUT $FE,$8D,"(K)" ':gosub delay1: LCDOUT $FE,$8D,"( )" :gosub delay3:LCDOUT $FE,$8D,"(K)"
portb.1=1  :portb.0=0
ENDIF
INTCON.7=0
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
INTCON.7=1
RETURN

;*************gecikmeler*9******************************************
DELAY: FOR I=0 TO 150:NEXT
RETURN
DELAY1:FOR I=0 TO 10000:NEXT
RETURN
DELAY2:FOR I=0 TO 125:NEXT
RETURN
DELAY3:FOR I=0 TO 2000:NEXT
RETURN
DELAY4:FOR I=0 TO 10000:NEXT
RETURN
DELAY5:FOR I=0 TO 50000:NEXT
RETURN
;************Sıcaklık gösteriliyor**********************************
EKRAN:'
LCDOUT $FE,2,"ISI:",ISARET,DEC2 ISI,".",DEC1 ONDA,0,"C"
TERMM=TERM/10
T_ONDA=(TERM//10)
'LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C0,"SET:",DEC2 TERMM,".",DEC1 T_ONDA',0,"C"
H_BIR=SNS/10
H_ONDA=(SNS//10)
'LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C9,"HSS:",DEC1 H_BIR,".",DEC1 H_ONDA',0,"C"
RETURN
;************ayarlar giriş ekranı***********************************
EKRAN1:
LCDOUT $FE,1,"    AYARLAR"
gosub delay1
LCDOUT $FE,1
RETURN
;***********Set değeri gösteriliyor*********************************
EKRAN2:
IF TERM>850 THEN TERM=250
TERMM=TERM/10
T_ONDA=(TERM//10)
LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C5,DEC2 TERMM,".",DEC1 T_ONDA,0,"C"
RETURN 
;**********Hassasiyet ekranı****************************************
EKRAN4:
IF SNS =0 THEN SNS=5
H_BIR=SNS/10
H_ONDA=(SNS//10)
LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C6,DEC1 H_BIR,".",DEC1 H_ONDA,0,"C"
RETURN
;**********kapalı ekranı****************************************
EKRAN5:
  LCDOUT $FE,1,"    KOMBi KAPALI"
gosub delay1
LCDOUT $FE,1
RETURN
;**********açık ekranı****************************************
EKRAN6:
  LCDOUT $FE,1,"    KOMBi ACIK"
gosub delay1
LCDOUT $FE,1
RETURN
;**********Değerler eproom'a kaydediliyor..*************************
KAYDET:
WHILE TUS=1:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 2
WRITE $1,ISIH:PAUSEUS 2
WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC
;**********Menuye gırıs ********************************************
AYAR:
WHILE TUS=1:WEND
GOSUB EKRAN1
GOSUB DELAY1
ISIK=1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH

MENU:
;***********YUKARI************************************************
IF YUKARI=0 THEN TERM=TERM+1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=>990 THEN TERM=990
;**********AŞAGI**************************************************
IF ASAGI=0 THEN TERM=TERM-1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=65535 THEN TERM=0

IF TUS=1 THEN
LCDOUT $FE,1
GOTO HASSASIYET
ENDIF
GOSUB EKRAN2

GOTO MENU

;************hassasiyet ayarları**********************************
HASSASIYET:
WHILE TUS=1:WEND
read $2,sns
IF SNS=>50 THEN SNS=0
;************yukarı***********************************************
SENS:
ISIK=1
GOSUB EKRAN4
IF YUKARI=0 THEN SNS=SNS+1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=>50 THEN SNS=50 :GOSUB ISIK0
;***********aşagı*************************************************       
IF ASAGI=0 THEN SNS=SNS-1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=255 THEN SNS=0  :GOSUB ISIK0

IF TUS=1 THEN
lcdout $fe,1,"    AYARLAR"
LCDOUT $FE,$C3,"KAYDEDiLDi"
GOSUB DELAY1
ISIK=0
lcdout $fe,1
GOTO KAYDET
ENDIF
GOTO SENS
;*****************************ISIK SONDUR
ISIK0:
ISIK=1
FOR I=0 TO 500
gOSUB DELAY5
NEXT
  ISIK=0
  GOTO BASLA

;***********kapat alt programı*****************************************
KAPATMA:
IF KAPAT=0 THEN
GOSUB EKRAN5
GOSUB DELAY1
ISIK=1
ENDIF
GOTO BASLA
;***********kesme alt programı*****************************************
Disable
KESME: 
IF SET=0 THEN
TUS=1
ELSE
TUS=0
ENDIF
INTCON.2=0
Resume
Enable
end      

ete

Bana göre yapılması gereken şu,
Değişken tanımlama kısmında ACIK isimli bir byte (aslında bit lazım ama byte olarak alıcıya yollayacağımız için byte kullanacağız) şeklinde bir değişken tanımlamak gerekiyor. ACIK=1 ise sistem açık, ACIK=0 ise sistem kapalı kabul edilecek.

Programda bekleme anlarında GOSUB KAPATMA şeklinde kapat tuşuna bakılması gerekiyor.
O alt programın en altına GOTO BASLA değil RETURN yazmak daha doğru olacak bu durumda.
KAPAT tuşuna basılmış ise TOGGLE ACIK.0 yapmak gerekiyor.
Burada ESKI isimli bir değişkene ACIK değerini önceden verip sonra tuşa bakmak belkide daha doğru olur.
Tuş kontrolü sonunda ESKI=ACIK ise bir şey yapmaya gerek yok demektir.
Ama ESKI<> ACIK ise Bilgi yollama kısmına gosub le gidip sıcaklık ile birlikte KONUM bilgisi de göndermek gerekiyor.
Bu durumda  SEROUT2 CIKIS,396,["BLG",VERI] komutu,  SEROUT2 CIKIS,396,["BLG",VERI,ACIK] şeklinde değiştirilmesi gerekiyor. Sistem ilk açılışta ACIK değerine senin karar vermen gerekir. Şayet sistem KOMBI ACIK olarak başlayacak ise , ACIK=1 ile başlamak gerekir değilse ACIK=0 ile başlanır ve manuel olarak açılır.

Verici kısmındaki işlem bu kadar ALıcı programında yine bir ACIK değişkeni tanımlanmalı ve SERIN komutuna birde ACIK eklemek gerekiyor.
ACIK=0 ise kombiyi kapatmalı ACIK=1 ise kombiyi açmalısın. Hepsi bu
Ete

ozkbilgi

hocam affınıza sığınaraktan bana bunları kodlamanın üzerinde belirtebilirmisiniz? ama sakın hazırcılığa falan kaçtığımı düşünmeyin demiştim çok acemiyim yolun başındayım diye şayet kodların üzerinde belirtebilirseniz kafama daha çok oturur gibime geliyor. yinede çok teşekkür ederim herşey için kolay gelsin

ete

tarifim yeni başlayanlariçin bile çok açıklayıcı. Kodlar ile gösterince sana bir şey kalmamış olacak öyle değilmi.
Düşün biraz ve yapmaya çalış. Çok açık anlattım.
Ete

ozkbilgi

hocam dediğim gibi hakkatende çok acemiyim özelliklede yazılım kısmına normalde c# ile birşeyler yapıyorum ama basıc çok karmaşık geliyor bana ama genede birşeyler yapmaya çalıştım şayet hatalarımı düzeltebilirseniz ne mutlu bana ve sizlere

'@ DEVICE pic16F628A                      'işlemci 16F628                               
'@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
TRISA=%10111001
TRISB=%00000000
PORTA=0:PORTB=0
CMCON=7 
ON INTERRUPT GoTo KESME   
OPTION_REG=%00000000  'Pull up dirençleri İPTAL- Bölme oranı 1/2
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL    SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL  ASAGI=PORTA.3
SYMBOL  CIKIS=PORTA.6
SYMBOL   ISIK=PORTA.1
SYMBOL  KAPAT=PORTA.0
'-----------------------------DEĞİŞKENLER---------------------------------------
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0    ;DERECE İŞARETİ
TERM   VAR  WORD
ISIS   VAR  WORD
TERMM  VAR  BYTE
T_ONDA VAR  BYTE
H_BIR  VAR  BYTE
H_ONDA VAR  BYTE
ONDA   VAR  BYTE
SNS    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
I      VAR  WORD
VERI   VAR  BYTE
ACIK   VAR  BYTE ' KOMBININ AÇIK YADA KAPALI OLDĞUNU GÖSTERECEK
ESKI   VAR  BYTE ' KOMBININ AÇIK YADA KAPALI OLDĞUNU GÖSTERECEK
ESKI=0
PAUSE 200
LCDOUT $FE,1
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD
ISI         VAR BYTE
Float       VAR WORD        ' Holds remainder for + temp C display       
ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI    CON 1           ' Negatif_Cold = 1
ISARET      VAR BYTE       
Comm_Pin    VAR PORTA.7
;****************BAŞLANGIC*********************************************
BASLANGIC:
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1

BASLA:'----------------------------ANA DONGÜ------------------------------------
IF ESKI<>ACIK THEN
GOSUB KAPATMA
ENDIF
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL
IF TUS=1 THEN GOTO AYAR
IF ASAGI=0 OR YUKARI=0 THEN GOTO ISIK0
GOTO BASLA
'--------------------------------ALT PROGRAMLAR--------------------------------- 
SENSOROKU:
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: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return   
Hesapla:  ' Ham değerden Santigrat derece hesabı
ISARET  = "+"
IF ISARET_BITI = EKSI_ISI THEN
ISARET   = "-" 
ham=~ham+2
endif
float = ((HAM*10)/16 )
ISI=FLOAT/10
ONDA=(FLOAT //10)
   
RETURN
;************role kontrol******************************************
KONTROL:
IF ISIS=>FLOAT THEN
VERI=120
LCDOUT $FE,$8D,"(A)" :gosub delay4: LCDOUT $FE,$8D,"( )" :gosub delay4:LCDOUT $FE,$8D,"(A)"
portb.0=1   :portb.1=0
ENDIF
IF FLOAT=>TERM THEN
VERI=150
LCDOUT $FE,$8D,"(K)" ':gosub delay1: LCDOUT $FE,$8D,"( )" :gosub delay3:LCDOUT $FE,$8D,"(K)"
portb.1=1  :portb.0=0
ENDIF
INTCON.7=0
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
INTCON.7=1
RETURN

;*************gecikmeler*9******************************************
DELAY: FOR I=0 TO 150:NEXT
RETURN
DELAY1:FOR I=0 TO 10000:NEXT
RETURN
DELAY2:FOR I=0 TO 125:NEXT
RETURN
DELAY3:FOR I=0 TO 2000:NEXT
RETURN
DELAY4:FOR I=0 TO 10000:NEXT
RETURN
DELAY5:FOR I=0 TO 50000:NEXT
RETURN
;************Sıcaklık gösteriliyor**********************************
EKRAN:'
LCDOUT $FE,2,"ISI:",ISARET,DEC2 ISI,".",DEC1 ONDA,0,"C"
TERMM=TERM/10
T_ONDA=(TERM//10)
'LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C0,"SET:",DEC2 TERMM,".",DEC1 T_ONDA',0,"C"
H_BIR=SNS/10
H_ONDA=(SNS//10)
'LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C9,"HSS:",DEC1 H_BIR,".",DEC1 H_ONDA',0,"C"
RETURN
;************ayarlar giriş ekranı***********************************
EKRAN1:
LCDOUT $FE,1,"    AYARLAR"
gosub delay1
LCDOUT $FE,1
RETURN
;***********Set değeri gösteriliyor*********************************
EKRAN2:
IF TERM>850 THEN TERM=250
TERMM=TERM/10
T_ONDA=(TERM//10)
LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C5,DEC2 TERMM,".",DEC1 T_ONDA,0,"C"
RETURN 
;**********Hassasiyet ekranı****************************************
EKRAN4:
IF SNS =0 THEN SNS=5
H_BIR=SNS/10
H_ONDA=(SNS//10)
LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C6,DEC1 H_BIR,".",DEC1 H_ONDA,0,"C"
RETURN
;**********kapalı ekranı****************************************
EKRAN5:
  LCDOUT $FE,1,"    KOMBi KAPALI"
gosub delay1
LCDOUT $FE,1
RETURN
;**********açık ekranı****************************************
EKRAN6:
  LCDOUT $FE,1,"    KOMBi ACIK"
gosub delay1
LCDOUT $FE,1
RETURN
;**********Değerler eproom'a kaydediliyor..*************************
KAYDET:
WHILE TUS=1:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 2
WRITE $1,ISIH:PAUSEUS 2
WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC
;**********Menuye gırıs ********************************************
AYAR:
WHILE TUS=1:WEND
GOSUB EKRAN1
GOSUB DELAY1
ISIK=1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH

MENU:
;***********YUKARI************************************************
IF YUKARI=0 THEN TERM=TERM+1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=>990 THEN TERM=990
;**********AŞAGI**************************************************
IF ASAGI=0 THEN TERM=TERM-1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=65535 THEN TERM=0

IF TUS=1 THEN
LCDOUT $FE,1
GOTO HASSASIYET
ENDIF
GOSUB EKRAN2

GOTO MENU

;************hassasiyet ayarları**********************************
HASSASIYET:
WHILE TUS=1:WEND
read $2,sns
IF SNS=>50 THEN SNS=0
;************yukarı***********************************************
SENS:
ISIK=1
GOSUB EKRAN4
IF YUKARI=0 THEN SNS=SNS+1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=>50 THEN SNS=50 :GOSUB ISIK0
;***********aşagı*************************************************       
IF ASAGI=0 THEN SNS=SNS-1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=255 THEN SNS=0  :GOSUB ISIK0

IF TUS=1 THEN
lcdout $fe,1,"    AYARLAR"
LCDOUT $FE,$C3,"KAYDEDiLDi"
GOSUB DELAY1
ISIK=0
lcdout $fe,1
GOTO KAYDET
ENDIF
GOTO SENS
;*****************************ISIK SONDUR
ISIK0:
ISIK=1
FOR I=0 TO 500
gOSUB DELAY5
NEXT
  ISIK=0
  GOTO BASLA

;***********kapat alt programı*****************************************
KAPATMA:
IF KAPAT=0 THEN ACIK=1
VERI=150
LCDOUT $FE,$8D,"(K)" ':gosub delay1: LCDOUT $FE,$8D,"( )" :gosub delay3:LCDOUT $FE,$8D,"(K)"
portb.1=1  :portb.0=0
ENDIF
KAPAT=1
ACIK=0
VERI=120
LCDOUT $FE,$8D,"(A)" :gosub delay4: LCDOUT $FE,$8D,"( )" :gosub delay4:LCDOUT $FE,$8D,"(A)"
portb.0=1   :portb.1=0
ENDIF
INTCON.7=0
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
SEROUT2 CIKIS,396,["BLG",VERI]
INTCON.7=1
GOSUB EKRAN5
GOSUB DELAY5
ISIK=1
ENDIF
RETURN
;***********kesme alt programı*****************************************
Disable
KESME: 
IF SET=0 THEN
TUS=1
ELSE
TUS=0
ENDIF
INTCON.2=0
Resume
Enable
end      








ozkbilgi

aslında yapmak istediğimiz kombiyi kapatıp açmak değil ben yanlış anlattım sanırım yapmamız gereken şey düğmeye bastığımızda kombi alıcısına kapalı komutu göndermek ve sistemi beklemeye almak taki bir dahaki düğmeye basasıya kadar tekrar bastığımızda ise termostatı devreye alıp normal akışkanlığına geri dönecek,

ete

Sistemin ilk çalıştırmada AÇIK mı yoksa kapalımı çalışmaya başlayacağı belli değil yine söylemiştim.
BASLA etiketinden bir önceki satıra ;
ESKI=1:ACIK=1:GOSUB KONTROL_BIR  yazarak sistemi açık başlatmak en doğrusu.

Verici ile alıcı arasındaki haberleşme sayısı belli veri adedi üzerinden yapılır. Bir durumda 2 adet byte diğer durumda 3 adet byte yollanmaz.
Yollama alt programı tek olmalı ki oda sende var oradaki byte adetleri de son duruma göre ;
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
şeklinde olmalı.
Normalde BASLA satırından sonra sürekli olarak GOSUB KONTROL şekilnde veri yolluyorsun. Orada INTCON.7=0 satırından evvel bir etiket ismi yerleştir. Mesela KONTROL_BIR: şeklinde olsun. Böylece kapatma içinden GOSUB KONTROL_BIR (yada GOTO KONTROL_BIR demek daha iyi belkide) diyerek programı oraya yönledirebilirsin.
Tabiiki Kontrol altındaki SEROUT komutlarını yukarıda açıkladığım şekilde değiştirmelisin.
KAPATMA isimli etiket ise şöyle olmalı;
KAPATMA:
ESKI=ACIK
IF KAPAT=0 THEN
  TOGGLE ACIK
  WHILE KAPAT=0:WEND
ENDIF
IF ESKI=ACIK THEN RETURN  'durum değişmemiş ise geri dön
GOTO KONTROL_BIR   'Orada veri yollayıp oradaki RETURN ile BASLA etiketine dönülecektir.
şeklinde olmalıdır.
Bu şekilde sistem açık bilgisini (1 ise AÇIK 0 ise KAPALI) sürekli olarak veri paketine ekleyecektir.

İşin Verici kısmı böyle olmalı. Alıcı kısmında ise;
Benzer şekilde tek byte değil daima 2 bbyte beklenmeli. Orada da bir ACIK değişkeni olmalı.
Bilgi alındığında ACIK=0 ise kombiyi kapatıp yalnızca bilgi alışına müsaade edecek şekilde programı ayarlamalısın.
Mesela ACIK=0 ise program satırlarındnbelirli bir yere kadar gelir ve acık=0 ise tekrar başa döner. Ama acık=1 ise alta devam eder ve sistemi çalıştırır.
Bu tür mantıkları kurmak zor olmasa gerek. Program yazan kişi önce algoritma geliştirmeye odaklanmalı bence. Bu iş nasıl yaptırabilirim diye düşünmelidir. Olay önce kafada çözülür. Sonra çözüm program komutlarına dönüştürülmelidir.

Verici aşağı yukarı belli olduğuna göre şimdide alıcıyı hallet bakalım görelim.  Onuda yeterince tarif ettim.

Ete

NOT: Aslında Alıcı programa bakınca benzer şeylerin yapılması gerektiğini düşündüm. Sırası ile,
Once ACIK isimli bir Byte değişkeni tanımlanmalı.
Bu programda sistem KAPALI başlamalı bu nedenle BASLA etiketinden öncesine ACIK=0 komutu yerleştirilmeli.
BASLA etiketinden hemen sonrasına;
IF ACIK=0 THEN
  WHILE ACIK=0
     GOSUB EKRAN5
     GOSUB KONTROL_BIR
   WEND
ENDIF
şeklinde kod yerleştirilerek sistem kapalı olduğu müddetçe ekrana KOMBI KAPALI ibaresini getirip bir yandan da yeni VERI gelip gelmediğine bakılmalıdır.
Tabiiki KONTROL etiketi altında yine INTCON.7=0 komutundan bir önceki satıra KONTROL_BIR: şeklinde bir etiket yerleştirilmelidir.

Sistem açıldıktan sonra arada kapatılırsa bunu kontrol eden yerin altına ;
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL
IF ACIK=0 THEN basla

şeklinde (en alttaki kod satırını ) bir kod ekleyerek sistemi kapalı hale getirmek gerekecektir.
Aslında sistemin kapanması için başka şeyler gerekmezmi programda buna ait bir şey göremedim. En azından bir röle felan çektirilerek kombinin çalışmaması temin edilmezmi?

Son olarak da veri aln kısıma birde ;
SEROUT2 CIKIS,396,["BLG",VERI,ACIK] eklemesi yaparak düzeltilmesi gerekiyor.
Hepsi bu kadar.

Ete


ozkbilgi

hocam çok teşekkür ederim, akşam kodlar üzerinde biraz yoğunlaşıp yapmaya çalışayım yapılan kodları tekrar paylaşırım siz ve sizin gibi hocalarımız sayesinde bu ve benzeri işleriden soğumayıp daha da sıkı sarılmak ne kadar güzel bir şey herşey için teşekkür ederim. iyi çalışmalar

ozkbilgi

hocam iyi akşamlar sanırım bana kızacaksınız ama dediklerinizi yapmaya çalıştım ama maalesef çalıştıramadım,  acaba kodlara bir göz gezdirebilirmisiniz. iyi akşamlar
'@ DEVICE pic16F628A                      'işlemci 16F628                               
'@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
TRISA=%10111001
TRISB=%00000000
PORTA=0:PORTB=0
CMCON=7 
ON INTERRUPT GoTo KESME   
OPTION_REG=%00000000  'Pull up dirençleri İPTAL- Bölme oranı 1/2
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL    SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL  ASAGI=PORTA.3
SYMBOL  CIKIS=PORTA.6
SYMBOL   ISIK=PORTA.1
SYMBOL  KAPAT=PORTA.0
'-----------------------------DEĞİŞKENLER---------------------------------------
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0    ;DERECE İŞARETİ
TERM   VAR  WORD
ISIS   VAR  WORD
TERMM  VAR  BYTE
T_ONDA VAR  BYTE
H_BIR  VAR  BYTE
H_ONDA VAR  BYTE
ONDA   VAR  BYTE
SNS    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
I      VAR  WORD
VERI   VAR  BYTE
ACIK    VAR BYTE
ESKI    VAR BYTE
ESKI=0
PAUSE 200
LCDOUT $FE,1
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD
ISI         VAR BYTE
Float       VAR WORD        ' Holds remainder for + temp C display       
ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI    CON 1           ' Negatif_Cold = 1
ISARET      VAR BYTE       
Comm_Pin    VAR PORTA.7
;****************BAŞLANGIC*********************************************
BASLANGIC:
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1
;*******************************kombi açık veya kapalı kontrolü
ESKI=1:ACIK=1:GOSUB KONTROL_BIR
;*******************************kombi açık veya kapalı kontrolü
ACIK=0
BASLA:'----------------------------ANA DONGÜ------------------------------------
IF ACIK=0 THEN
WHILE ACIK=0
GOSUB EKRAN5
GOSUB KONTROL_BIR
WEND
ENDIF
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL
IF ACIK=0 THEN BASLA
IF TUS=1 THEN GOTO AYAR
IF ASAGI=0 OR YUKARI=0 THEN GOTO ISIK0
GOTO BASLA
'--------------------------------ALT PROGRAMLAR--------------------------------- 
SENSOROKU:
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: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return   
Hesapla:  ' Ham değerden Santigrat derece hesabı
ISARET  = "+"
IF ISARET_BITI = EKSI_ISI THEN
ISARET   = "-" 
ham=~ham+2
endif
float = ((HAM*10)/16 )
ISI=FLOAT/10
ONDA=(FLOAT //10)
   
RETURN
;************role kontrol******************************************
KONTROL:
IF ISIS=>FLOAT THEN
VERI=120
LCDOUT $FE,$8D,"(A)" :gosub delay4: LCDOUT $FE,$8D,"( )" :gosub delay4:LCDOUT $FE,$8D,"(A)"
portb.0=1   :portb.1=0
ENDIF
IF FLOAT=>TERM THEN
VERI=150
LCDOUT $FE,$8D,"(K)" ':gosub delay1: LCDOUT $FE,$8D,"( )" :gosub delay3:LCDOUT $FE,$8D,"(K)"
portb.1=1  :portb.0=0
ENDIF
KONTROL_BIR:
'SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
INTCON.7=0
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
INTCON.7=1
RETURN

;*************gecikmeler*9******************************************
DELAY: FOR I=0 TO 150:NEXT
RETURN
DELAY1:FOR I=0 TO 10000:NEXT
RETURN
DELAY2:FOR I=0 TO 125:NEXT
RETURN
DELAY3:FOR I=0 TO 2000:NEXT
RETURN
DELAY4:FOR I=0 TO 10000:NEXT
RETURN
DELAY5:FOR I=0 TO 50000:NEXT
RETURN
;************Sıcaklık gösteriliyor**********************************
EKRAN:'
LCDOUT $FE,2,"ISI:",ISARET,DEC2 ISI,".",DEC1 ONDA,0,"C"
TERMM=TERM/10
T_ONDA=(TERM//10)
'LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C0,"SET:",DEC2 TERMM,".",DEC1 T_ONDA',0,"C"
H_BIR=SNS/10
H_ONDA=(SNS//10)
'LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C9,"HSS:",DEC1 H_BIR,".",DEC1 H_ONDA',0,"C"
RETURN
;************ayarlar giriş ekranı***********************************
EKRAN1:
LCDOUT $FE,1,"    AYARLAR"
gosub delay1
LCDOUT $FE,1
RETURN
;***********Set değeri gösteriliyor*********************************
EKRAN2:
IF TERM>850 THEN TERM=250
TERMM=TERM/10
T_ONDA=(TERM//10)
LCDOUT $FE,2," SICAKLIK AYARI"
LCDOUT $FE,$C5,DEC2 TERMM,".",DEC1 T_ONDA,0,"C"
RETURN 
;**********Hassasiyet ekranı****************************************
EKRAN4:
IF SNS =0 THEN SNS=5
H_BIR=SNS/10
H_ONDA=(SNS//10)
LCDOUT $FE,2,"   HASSASiYET"
LCDOUT $FE,$C6,DEC1 H_BIR,".",DEC1 H_ONDA,0,"C"
RETURN
;**********kapalı ekranı****************************************
EKRAN5:
  LCDOUT $FE,1,"    KOMBi KAPALI"
gosub delay1
LCDOUT $FE,1
RETURN
;**********açık ekranı****************************************
EKRAN6:
  LCDOUT $FE,1,"    KOMBi ACIK"
gosub delay1
LCDOUT $FE,1
RETURN
;**********Değerler eproom'a kaydediliyor..*************************
KAYDET:
WHILE TUS=1:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 2
WRITE $1,ISIH:PAUSEUS 2
WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC
;**********Menuye gırıs ********************************************
AYAR:
WHILE TUS=1:WEND
GOSUB EKRAN1
GOSUB DELAY1
ISIK=1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH

MENU:
;***********YUKARI************************************************
IF YUKARI=0 THEN TERM=TERM+1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=>990 THEN TERM=990
;**********AŞAGI**************************************************
IF ASAGI=0 THEN TERM=TERM-1
GOSUB DELAY3
GOSUB EKRAN2
IF TERM=65535 THEN TERM=0

IF TUS=1 THEN
LCDOUT $FE,1
GOTO HASSASIYET
ENDIF
GOSUB EKRAN2

GOTO MENU

;************hassasiyet ayarları**********************************
HASSASIYET:
WHILE TUS=1:WEND
read $2,sns
IF SNS=>50 THEN SNS=0
;************yukarı***********************************************
SENS:
ISIK=1
GOSUB EKRAN4
IF YUKARI=0 THEN SNS=SNS+1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=>50 THEN SNS=50 :GOSUB ISIK0
;***********aşagı*************************************************       
IF ASAGI=0 THEN SNS=SNS-1
GOSUB DELAY3
GOSUB EKRAN4
IF SNS=255 THEN SNS=0  :GOSUB ISIK0

IF TUS=1 THEN
lcdout $fe,1,"    AYARLAR"
LCDOUT $FE,$C3,"KAYDEDiLDi"
GOSUB DELAY1
ISIK=0
lcdout $fe,1
GOTO KAYDET
ENDIF
GOTO SENS
;*****************************ISIK SONDUR
ISIK0:
ISIK=1
FOR I=0 TO 500
gOSUB DELAY5
NEXT
  ISIK=0
  GOTO BASLA

;***********kapat alt programı*****************************************
KAPATMA:
ESKI=ACIK
IF KAPAT=0 THEN
TOGGLE ACIK
WHILE KAPAT=0:WEND
ENDIF
IF ESKI=ACIK THEN RETURN
GOTO KONTROL_BIR   
;***********kesme alt programı*****************************************
Disable
KESME: 
IF SET=0 THEN
TUS=1
ELSE
TUS=0
ENDIF
INTCON.2=0
Resume
Enable
end      

ete

Basla etiketinden önce Acık=1 deyip bunu karşıya yollamışsın ama hemen altına Acık=0 yazmışsın bu ne demek. Önce açıyorsun sonra kapatıyorsun neden?
Karşı taraf açık olarak biliyor ama bu taraf kapalıda kalıyor. Bu bir mantık hatası. Böyle şeyleri düşünebilmeni beklerdim.
Ete

ozkbilgi

günaydın,
hocam o acık=0 kısmınıda sildim denedim size göndermeden önce bir türlü düğmeye bastığımda sinyal gönderip devreyi baypas konumuna alamadım yardım ederseniz çok sevinirim. zaten algoritmasınıda çözemedem demiştim ya çok acemiyim diye bu sefer kendim bile vazgeçme aşamasına geldim ne yaptımsa düğmeye basınca kapat sinyalini gönder ve devreyi baypas konumuna alamadım. yinede yardımlarınızı ve çabanız için teşekkür ederim.

ete


ozkbilgi

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 2.12.2016                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'@ DEVICE pic16F628A                      'işlemci 16F628                               
'@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
TRISA=%10111001
TRISB=%00000000
PORTA=0:PORTB=0
CMCON=7 
ON INTERRUPT GoTo KESME   
OPTION_REG=%00000000  'Pull up dirençleri İPTAL- Bölme oranı 1/2
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL    SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL  ASAGI=PORTA.3
SYMBOL  CIKIS=PORTA.6
SYMBOL   ISIK=PORTA.1
SYMBOL  KAPAT=PORTA.0
'-----------------------------DEĞİŞKENLER---------------------------------------
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0    ;DERECE İŞARETİ
TERM   VAR  WORD
ISIS   VAR  WORD
TERMM  VAR  BYTE
T_ONDA VAR  BYTE
H_BIR  VAR  BYTE
H_ONDA VAR  BYTE
ONDA   VAR  BYTE
SNS    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
I      VAR  WORD
VERI   VAR  BYTE
ACIK    VAR BYTE
ESKI    VAR BYTE
ESKI=0
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD
ISI         VAR BYTE
Float       VAR WORD        ' Holds remainder for + temp C display       
ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI    CON 1           ' Negatif_Cold = 1
ISARET      VAR BYTE       
Comm_Pin    VAR PORTA.7
;****************BAŞLANGIC*********************************************
PAUSE 200
LCDOUT $FE,1
BASLANGIC:
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1

;*******************************kombi açık veya kapalı kontrolü
ESKI=1:ACIK=1:GOSUB KONTROL
;*******************************kombi açık veya kapalı kontrolü

BASLA:'----------------------------ANA DONGÜ------------------------------------
        IF ACIK=0 THEN
           WHILE ACIK=0
             GOSUB EKRAN5
             GOSUB KAPATMA
           WEND
        ENDIF
        GOSUB EKRAN
        GOSUB SENSOROKU       
        GOSUB KONTROL
        GOSUB KAPATMA
        IF ACIK=0 THEN BASLA
        IF TUS=1 THEN GOTO AYAR
        IF ASAGI=0 OR YUKARI=0 THEN GOTO ISIK0
        GOTO BASLA
'--------------------------------ALT PROGRAMLAR--------------------------------- 
SENSOROKU:
        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: 'okumaya hazırlan..         
        OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
        OWOUT   Comm_Pin, 1, [$CC,$48]         
        OWOUT   Comm_Pin, 1, [$CC,$B8]         
        OWOUT   Comm_Pin, 1, [$CC,$BE]         
        return   
Hesapla:  ' Ham değerden Santigrat derece hesabı
        ISARET  = "+"
        IF ISARET_BITI = EKSI_ISI THEN
        ISARET   = "-" 
        ham=~ham+2
        endif
        float = ((HAM*10)/16 )
        ISI=FLOAT/10
        ONDA=(FLOAT //10)     
        RETURN
;************role kontrol******************************************
KONTROL:
        IF ISIS=>FLOAT THEN
           VERI=120
           LCDOUT $FE,$8D,"(A)" :gosub delay4: LCDOUT $FE,$8D,"( )" :gosub delay4:LCDOUT $FE,$8D,"(A)"
           portb.0=1   :portb.1=0
        ENDIF
        IF FLOAT=>TERM THEN
           VERI=150
           LCDOUT $FE,$8D,"(K)" ':gosub delay1: LCDOUT $FE,$8D,"( )" :gosub delay3:LCDOUT $FE,$8D,"(K)"
           portb.1=1  :portb.0=0
        ENDIF
KONTROL_BIR:
         'SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        INTCON.7=0
        SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        SEROUT2 CIKIS,396,["BLG",VERI,ACIK]
        INTCON.7=1
        RETURN

;*************gecikmeler*9******************************************
DELAY: FOR I=0 TO 150:NEXT
       RETURN
DELAY1:FOR I=0 TO 10000:NEXT
           RETURN
DELAY2:FOR I=0 TO 125:NEXT
           RETURN
DELAY3:FOR I=0 TO 2000:NEXT
           RETURN
DELAY4:FOR I=0 TO 10000:NEXT
           RETURN
DELAY5:FOR I=0 TO 50000:NEXT
           RETURN
;************Sıcaklık gösteriliyor**********************************
EKRAN:'
    LCDOUT $FE,2,"ISI:",ISARET,DEC2 ISI,".",DEC1 ONDA,0,"C"
    TERMM=TERM/10
    T_ONDA=(TERM//10)
    'LCDOUT $FE,2," SICAKLIK AYARI"
    LCDOUT $FE,$C0,"SET:",DEC2 TERMM,".",DEC1 T_ONDA',0,"C"
    H_BIR=SNS/10
    H_ONDA=(SNS//10)
    'LCDOUT $FE,2,"   HASSASiYET"
    LCDOUT $FE,$C9,"HSS:",DEC1 H_BIR,".",DEC1 H_ONDA',0,"C"
    RETURN
;************ayarlar giriş ekranı***********************************
EKRAN1:
    LCDOUT $FE,1,"    AYARLAR"
    gosub delay1
    LCDOUT $FE,1
    RETURN
;***********Set değeri gösteriliyor*********************************
EKRAN2:
    IF TERM>850 THEN TERM=250
    TERMM=TERM/10
    T_ONDA=(TERM//10)
    LCDOUT $FE,2," SICAKLIK AYARI"
    LCDOUT $FE,$C5,DEC2 TERMM,".",DEC1 T_ONDA,0,"C"
    RETURN 
;**********Hassasiyet ekranı****************************************
EKRAN4:
    IF SNS =0 THEN SNS=5
    H_BIR=SNS/10
    H_ONDA=(SNS//10)
    LCDOUT $FE,2,"   HASSASiYET"
    LCDOUT $FE,$C6,DEC1 H_BIR,".",DEC1 H_ONDA,0,"C"
    RETURN
;**********kapalı ekranı****************************************
EKRAN5:
      LCDOUT $FE,1,"    KOMBi KAPALI"
    gosub delay1
    LCDOUT $FE,1
    RETURN
;**********açık ekranı****************************************
EKRAN6:
      LCDOUT $FE,1,"    KOMBi ACIK"
    gosub delay1
    LCDOUT $FE,1
    RETURN
;**********Değerler eproom'a kaydediliyor..*************************
KAYDET:
    WHILE TUS=1:WEND
    ISIL=TERM/10
    ISIH=TERM//10
    WRITE $0,ISIL:PAUSEUS 2
    WRITE $1,ISIH:PAUSEUS 2
    WRITE $2,SNS:PAUSEUS 2
    GOTO BASLANGIC
;**********Menuye gırıs ********************************************
AYAR:
    WHILE TUS=1:WEND
    GOSUB EKRAN1
    GOSUB DELAY1
    ISIK=1
    READ $0,ISIL
    READ $1,ISIH
    TERM=(ISIL*10)+ISIH

MENU:
;***********YUKARI************************************************
    IF YUKARI=0 THEN TERM=TERM+1
    GOSUB DELAY3
    GOSUB EKRAN2
    IF TERM=>990 THEN TERM=990
;**********AŞAGI**************************************************
    IF ASAGI=0 THEN TERM=TERM-1
    GOSUB DELAY3
    GOSUB EKRAN2
    IF TERM=65535 THEN TERM=0
   
    IF TUS=1 THEN
    LCDOUT $FE,1
    GOTO HASSASIYET
    ENDIF
    GOSUB EKRAN2
   
    GOTO MENU

;************hassasiyet ayarları**********************************
HASSASIYET:
    WHILE TUS=1:WEND
    read $2,sns
    IF SNS=>50 THEN SNS=0
;************yukarı***********************************************
SENS:
    ISIK=1
    GOSUB EKRAN4
    IF YUKARI=0 THEN SNS=SNS+1
    GOSUB DELAY3
    GOSUB EKRAN4
    IF SNS=>50 THEN SNS=50 :GOSUB ISIK0
;***********aşagı*************************************************       
    IF ASAGI=0 THEN SNS=SNS-1
    GOSUB DELAY3
    GOSUB EKRAN4
    IF SNS=255 THEN SNS=0  :GOSUB ISIK0
   
    IF TUS=1 THEN
    lcdout $fe,1,"    AYARLAR"
    LCDOUT $FE,$C3,"KAYDEDiLDi"
    GOSUB DELAY1
    ISIK=0
    lcdout $fe,1
    GOTO KAYDET
    ENDIF
    GOTO SENS
;*****************************ISIK SONDUR
ISIK0:
    ISIK=1
    FOR I=0 TO 500
     gOSUB DELAY5
     NEXT
      ISIK=0
      GOTO BASLA

;***********kapat alt programı*****************************************
KAPATMA:
         ESKI=ACIK
         IF KAPAT=0 THEN
            TOGGLE ACIK
            WHILE KAPAT=0:WEND
         ENDIF
         IF ESKI=ACIK THEN RETURN
         GOTO KONTROL_BIR   
;***********kesme alt programı*****************************************
Disable
KESME: 
    IF SET=0 THEN
    TUS=1
    ELSE
    TUS=0
    ENDIF
    INTCON.2=0
    Resume
    Enable
    end

ete

Ne yazıkki birini çağırmak istiyorsun ama ona seslenmiyorsun. O da seni görmüyor yada duymuyor.!!!!
KAPATMA adı altında bir alt program hazırlamışsın. Amaç kapatma tuşunu kullanarak karşı tarafa açık yada kapalı bilgisini yollamak.
Ama program içinde KAPATMA etiketine hiç bir yerden ulaşım gözükmüyor. Bu normal midir. ? değil elbette acemi olabilirsin ama mantıksız da değilsin sanırım.!!!!.
Yazdığın kodları olması gerekenle değiştirdim. Oradan al ve yeniden bir bak yada dene. Ama benzer şekilde alıcınında değiştirilmesi gerekir. Bu taraftan aç yada kapa emri gidiyor ama oradaki bunu anlayacak koda sahipmidir o belli değil.?

Ete

ozkbilgi

hocam çok sağolun akşam eve gidince tekrar deneyeceğim. sonuçları yazarım

Powered by EzPortal