PicBasic'de yazılmış bir program ve devresinin modifiyesi

KralMurat

Üye
Katılım
14 Tem 2011
Mesajlar
22
Puanları
1
Yaş
34
Merhabalar,

Pic programlama konusunda biraz yeniyim, belki basit bir soru olacak ama fikrinizi almak istedim.

Şimdi elimde bir devre var, Pic16f628 ile yapılmış bir devre. Devrede 1 adet röle var, fakat ben devreyi ve kaynak kodunu biraz modifiye ederek 2 röleyi kontrol edecek şekilde düzenlemek istiyorum. Fakat 2. röle için hiçbir I/O portu kalmıyor maalesef. PORTA'nın tüm pinleri sensörler ve birkaç buton için kullanımda. PORTB ise Ortak katotlu bir DIGIT (8 şeklindeki display) sürmek için kullanılmakta. PORTB'nin 8 pini, digit'in ABCDEFG ve (dot) olmak üzere 8 pinini sürüyor. Burda (dot) sürmek gereksiz, yani PORTB.7'inci bitini 2. röle için kullanabilirim, pic'den veri almaya gerek yok digit'in nokta led'ini yakmak için, bunu iptal edebiliriz.

Fakat söyle bir sorunla karşılaşabileceğimi düşünüyorum, eğer PORTB.7'ye röle bağlarsam, digit'e veri sürüldüğü zaman (örneğğin digit'te 3 yazmasını istediğim zaman) gönderdiğim veri röleyi etkileyecektir, çünkü digit'e veriyi direk PORTB'ye aktararak sürüyorum. Buda 8. pin'e bağlı 2. röleyi etkileyecektir değil mi? Birinci sorum bu.

Bunu engellemek için söyle birşey geldi aklıma, PORTA'ya bağlı butonlardan birini PORTB.7'ye bağlasam, yani TRISB'ye '10000000' atsam ve PORTB.7'yi input yapsam, ve geri kalan 7 bite de digit'i aynı şekilde bağlasam, digit'e veri gönderdiğim zaman (yani örneğin 3 bilgisini direk PORTB'ye aktardığım zaman) program hata verir mi? İkinci sorumda bu. Eğer hata vermezse, butonlardan birini PORTB'deki (dot)'tan arttırdığımız pine taşırım, PORTA'daki aktarılan butonun yerine de kontrol etmek istediğim 2. rölemi bağlamış olurum.

Olabildiğince basit anlatmaya çalıştım umarım karışmamıştır. Bu konudaki yardımlarınızı bekliyorum (aslında multiplexer kullanarak 8 bir yerine 3-4 bitle digit sürüp fazladan 4-5 bit arttırılabilir, veya PORTA'daki 4 buton pic'de 2 portla kontrol edilebilir belki ama bunları teorik olarak biliyorum, devreye uyarlayacak kadar bilgi sahibi değilim, o yüzden en basit şekilde 1 pin arttırıp digit'e sayı bilgisi göndermemi etkilemeyecek şekilde 1 röle daha bağlayabilmem gerekiyor
smiley.gif
PORA'da arttırılacah hiç pin yok, o yüzden mecburen digit'in bağlı olduğu PORTB2den arttırmam gerekiyor) Zaman ayırdığını için teşekkürler
wink.gif
cevaplarınızı bekliyorum


- - - Updated - - -

Aslında ben tam olarak ne yapmak istediğimi anlatayım, 2. röle olayını çözdükten sonra kodlama kısmında da yardıma ihtiyacım olabilir çünkü
smiley.gif
hem devreyi gördüğünüzde 2. röle için anlattıklarımı da daha iyi görebilir ve yardımda bulunabilirsiniz diye düşündüm.

Modifiye etmek istediğim devre şu :

http://320volt.com/ayarlanabilir-termometre-devresi-16f628-ds18b20-picbasic-pro/

Bu devre sadece ısıtıcı bağlanarak ortam ısısını belirli bir seviyede tutmayı sağlayan bir termostat. Ben bunu peltier kullanarak hem ısıtıcı hemde soğutucu elemanı kontrol eden bir devreye dönüştürmek istiyorum. Bu yüzden 2 röleye ihtiyacım var. Tek röleylede peltieri kontrol edebilirim aslında ama peltier'in sürekli çalışması gerekiyor ozamanda. Rölenin 2 konumu olduğu için birisinde ısıtıcı birisinde soğutucu olarak çalışması gerekecek, buda çok verimsiz olacak, belli bir ısı aralığında peltier'in çalışmadan durması gerekiyor.

Mevcut devrenin çalışması şu şekilde, bir sıcaklık değeri set ediyoruz, birde tolerans değeri veriyoruz. ortam sıcaklığı Set edilen değere (örneğin 27 dereceye) gelene kadar röleyi sürüyor (ısıtıcıyı çalıştırıyor). 27 dereceye gelince röleyi kesiyor. ve tolerans değerinin altına düşene kadar (örneğin tolerans değeri 0.5 derece ise 26.5'e gelene kadar) ısıtıcıyı çalıştırmıyor, 26.5'in altına düştüğü anda tekrar 27 olana kadar röleyi sürüyor.

Benim modifiye etmek istediğim devrenin ise çalışma prensibi şu şekilde olmalı, yine sıcaklığı 27 dereceye set ettiğimizi ve toleransın 0.5 derece olduğunu varsayarsak, eğer sıcaklık 26.5'in altında ise 1. röleyi sürerek ısıtıcıyı çalıştıracak, 27 dereceye gelince 1. röleyi (ısıtıcıyı) kesecek. Eğer sıcaklık 27.5'in üzerine çıkarsa da soğutucuyu çalıştıracak, 27 dereceye kadar soğutunca da 2. röleyi (soğutucuyu) kesecek. Yani sıcaklık 26.5-27.5 arasında tutulmuş olacak. ve peltier devamlı çalışmak zorunda kalmayacak. Sıcaklığı 27 dereceye getirince peltier çalışmayı bırakacak, 26.5'un altına düşünceye kadar veya 27.5'un üzerine çıkıncaya kadar çalışmayacak.

Eğer bu mevcut devreyi dediğim şekilde modifiye etmeyi başarabilirsek harika bir termostat devresi ortaya çıkarmış oluruz, devreyi tasarlayan arkadaşa fikir önerisinde bulunduk bir arkadaşımla birlikte ama tasarlayan arkadaş pek oralı olmadı
smiley.gif
buna ayıracak zamanı olmadığını söyleyince bizde şansımızı forumlarda deneyelim dedik
smiley.gif


İnternette de buna benzer bir proje (hem ısıtıcıyı hem soğutucuyu kontrol eden) bulamadım, var ama şöyle var, ısı 27 dereceye set edilmişse tolerans değeri kadar aşağı inince ısıtıcıyı çalıştırıyor, set edilen değerin üzerine çıkar çıkmaz soğutucuyu çalıştırıyor, yani tolerans değeri kadar üstüne çıkmasını beklemiyor. O yüzden bu önerdiğim devreyi yapabilirsek çok daha kullanışlı ve internette olmayan (veya bulamadığım) bir devre tasarlamış olacağız. Durum genel olarak bu
smiley.gif

 
anlatmak icin ugrastım fakat zor geldi ..
Sen kodu ekle gerekli degişikligi yapalım o bile anlatmaktan kolay olur.
Kodu eklersen gerekli modifiyeyi yapmakta yardımcı olurum
 
Son düzenleme:
Serkan hocam çok teşekkür ederim, inanın çok büyük bi dertten kurtarıyorsunuz beni günlerdir kodla boğuşuyorum.

emai.jpg

Kod:

'****************************************************************
'* Name : TERMOMETRE.BAS *
'* Author : [FERHAT YOL] *
'* Notice : DS18B20'li oda termometresi] *
'* : *
'* Date : 12.02.2011 *
'* Version : 1.0 *
'* Notes : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*
'* : kablosu 15 metreden fazla olaması halinde DS18B20 *
'* : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *
'* : ile değiştirilmesi gerekmektedir. *
'****************************************************************
DEFINE OSC 4


@ 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


TRISA=%10111000
TRISB=%00000000
PORTA=0:pORTB=0


CMCON=7 'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256
OPTION_REG=%00000011 'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000 'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99


'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLE VAR PORTA.6
'-----------------------------DEĞİŞKENLER---------------------------------------


SAYAC VAR BYTE
SIRA VAR BYTE
SAYI VAR BYTE
TERM VAR WORD
ISIS VAR WORD
ONDA VAR BYTE
AKTAR1 VAR BYTE
AKTAR2 VAR BYTE
AKTAR3 VAR BYTE
SYC VAR BYTE
SNS VAR BYTE
SNY VAR BYTE
ISIH VAR BYTE
ISIL VAR BYTE
TUS VAR BIT
DP VAR BIT
W VAR BIT
U VAR BIT
Z VAR BYTE
X VAR BYTE
I VAR WORD
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy VAR BIT ' Busy Status-Bit
HAM VAR WORD
ISI VAR WORD ' Sensör HAM okuma değeri
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
SERECE CON 223 ' ° işareti
ISARET VAR BYTE
Comm_Pin VAR PORTA.7
'--------------------------------------------------------------


BASLANGIC:DP=0'--------------------BAŞLANGIC------------------------------------
gosub EKRAN3
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
DP=1:W=1:SYC=0


BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL


IF TUS=1 THEN GOTO AYAR
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
RETURN
END

RETURN


KONTROL: ' Role kontrol..
IF ISIS=>FLOAT THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLE
ENDIF
endIF
IF FLOAT=>TERM THEN
SYC=0:LOW ROLE
ENDIF
RETURN


DELAY: 'gecıkme 1
FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
FOR I=0 TO 125:NEXT
RETURN


EKRAN:'Sıcaklık gösteriliyor.
Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI
Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN1: 'SET yazısı
Z=14:GOSUB AL:AKTAR1=SAYI
Z=13:GOSUB AL:AKTAR2=SAYI
Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN3:
AKTAR1=64
AKTAR2=64
AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
aktar3=0
RETURN

AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI :RETURN'Karekter al


KAYDET: 'Değerler eproom'a kaydediliyor..
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


AYAR: 'Menuye gırıs
WHILE TUS=1:WEND
DP=0
GOSUB EKRAN1
GOSUB DELAY1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH
DP=1:syc=0:SNY=0:W=0


MENU:
IF YUKARI=0 THEN
W=1:U=0:sny=0
TERM=TERM+1
WHILE YUKARI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=50:TERM=TERM+1:GOSUB DELAY
ENDIF
GOSUB EKRAN2
IF TERM>990 THEN TERM=0
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF


IF ASAGI=0 THEN
W=1:U=0:sny=0
TERM=TERM-1
WHILE ASAGI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=50:TERM=TERM-1:GOSUB DELAY
ENDIF
GOSUB EKRAN2
IF TERM>999 THEN TERM=990
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF


IF TUS=1 THEN
GOTO SENSIVITY
ENDIF
GOSUB EKRAN2
GOTO MENU


SENSIVITY: '| menusu giriş..
WHILE TUS=1:WEND
read $2,sns
IF SNS>50 THEN SNS=0
DP=1:SNY=0
SENS:
GOSUB EKRAN4
IF YUKARI=0 THEN
W=1:SNY=0:U=0
SNS=SNS+1
WHILE YUKARI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=40:SNS=SNS+1:GOSUB DELAY2
ENDIF
GOSUB EKRAN4
IF SNS=>50 THEN SNS=50
WEND
SYC=0:IF SNS=>50 THEN SNS=50
ELSE
W=0
ENDIF


IF ASAGI=0 THEN
W=1:U=0:sny=0
SNS=SNS-1
WHILE ASAGI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=40:SNS=SNS-1:GOSUB DELAY2
ENDIF
GOSUB EKRAN4
IF SNS>50 THEN SNS=0
WEND
SYC=0:IF SNS>50 THEN SNS=0
ELSE
W=0
ENDIF


IF TUS=1 THEN
GOTO KAYDET
ENDIF
GOTO SENS


Disable
KESME: 'kesme alt programı
IF SET=0 THEN
TUS=1
ELSE
TUS=0
ENDIF

IF W=0 THEN
SNY=SNY+1
IF SNY=>120 THEN
U=1
ELSE
U=0
ENDIF
ENDIF
IF SNY=>240 THEN SNY=0


SAYAC=SAYAC+1
If SAYAC>2 then SAYAC=0


If SAYAC=0 then
DIG2=0
PORTB=AKTAR1
DIG0=1
PAUSEUS 2
Endif


If SAYAC=1 then
DIG0=0
PORTB=AKTAR2
PORTB.7=DP
DIG1=1
PAUSEUS 2
Endif

If SAYAC=2 then
DIG1=0
PORTB=AKTAR3
DIG2=1
PAUSEUS 2
Endif

TMR0=160
INTCON.2=0

Resume
Enable
end

Şöyle bir fikir ürettik, PORTA'daki SET butonunu PORTB'deki nokta yerine taşırsak, PORTB'nin 1 pini input diğer 7 pini output olursa, PORTB'deki digit'e veri gönderdiğimiz zaman buton'un pini etkilenmeyecektir, bu sayede digit'in nokta pinini iptal edip ordan 1 pin arttırmış oluyoruz :) PORTA'daki SET butonu yerine de 2. rölemizi bağlayabiliriz.

Yani PORTB'deki nokta yerine röle bağlamaktan sa oraya PORTA'daki butonu taşıyıp röleyi PORTA'ya bağlamak karışıklığı ortadan kaldırabilir diye düşündük. Çünkü asıl sorum PORTB'deki nokta yerine röle bağlarsak, PORTB'ye veri gönderdiğimizde röle de etkilenecek diye çekiniyordum, bu sayede bunu ekarde etmiş olabiliriz.

Kod ve şema yukarda hocam, son gelişmeleri de paylaşayım dedim, eğer ilk mesajlarımda söylediğim değişikliği yapıp programın istediğimiz şekilde çalışması için gerekli değişikliği kodlarda yapabilirseniz inanın minnettar olurum. Şimdiden çok teşekkürler.
 
BASLANGIC:DP=0'-------BAŞLANGIC----------- satırında smile yerine "BASLANGIC: DP=0" (arada boşluk yok) olacak.
 
porta daki butonla portb deki noktayı yerdegistirmeye gerek yok programı yaptım

7 segment display deki nokta kesme altprogramından portb.7 ile acılıp kapatılıyordu
portb7 yi bordan kaldırdım. DP ise hala duruyor. Yani DP nin işlevini bozmadım. Sadece Portb.7 ye cıkıs yapmasını engelledim
kontrol altprogramında ısı kontrolu yapılıyordu
aynısını kopyalayıp kucuk buyuk isaretlerini degistirerek soguk kontrol rolesinin kontrolunu olusturdum
portb.7 yide sogukrole cıkısı yaptım

mevcut ısı degeri Set edilen ısı degerinden az ise roleısı acılacak
mevcut ısı degeri set degerine esit ((ve)) mevcut ısı degeri setısı degeri + tolerans tan kucuk ise (ısı rolesi+soguk rolesi) kapanacak
mevcut ısı degeri set degerine esit ((ve)) mevcut ısı degeri setısı degeri + tolerans tan buyuk ise soguk rolesi acılacak

bende basic derleyicisi olmadıgından test edemedim
belki hata verebilir. verirse tekrar bakarız
​ '************************************************* ***************
'* Name : TERMOMETRE.BAS *
'* Author : [FERHAT YOL] *
'* Notice : DS18B20'li oda termometresi] *
'* : *
'* Date : 12.02.2011 *
'* Version : 1.0 *
'* Notes : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*
'* : kablosu 15 metreden fazla olaması halinde DS18B20 *
'* : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *
'* : ile değiştirilmesi gerekmektedir. *
'************************************************* ***************
DEFINE OSC 4




@ 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




TRISA=%10111000
TRISB=%00000000
PORTA=0:pORTB=0




CMCON=7 'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256
OPTION_REG=%00000011 'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000 'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99




'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLEISI VAR PORTA.6
ROLESOGUK VAR PORTB.7
'-----------------------------DEĞİŞKENLER---------------------------------------




SAYAC VAR BYTE
SIRA VAR BYTE
SAYI VAR BYTE
TERM VAR WORD
ISIS VAR WORD
ONDA VAR BYTE
AKTAR1 VAR BYTE
AKTAR2 VAR BYTE
AKTAR3 VAR BYTE
SYC VAR BYTE
SNS VAR BYTE
SNY VAR BYTE
ISIH VAR BYTE
ISIL VAR BYTE
TUS VAR BIT
DP VAR BIT
W VAR BIT
U VAR BIT
Z VAR BYTE
X VAR BYTE
I VAR WORD
'---------------------------------ISI TANIMLAMALARI-----------------------------
Busy VAR BIT ' Busy Status-Bit
HAM VAR WORD
ISI VAR WORD ' Sensör HAM okuma değeri
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
SERECE CON 223 ' ° işareti
ISARET VAR BYTE
Comm_Pin VAR PORTA.7
'--------------------------------------------------------------




BASLANGICP=0'--------------------BAŞLANGIC------------------------------------
gosub EKRAN3
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
DP=1:W=1:SYC=0




BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL




IF TUS=1 THEN GOTO AYAR
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
RETURN
END


RETURN




KONTROL: ' Role kontrol..
'mevcut ısı degeri Set edilen ısı degerinden az ise roleısı acılacak
'mevcut ısı degeri set degerine esit ((ve)) mevcut ısı degeri setısı degeri + tolerans tan kucuk ise (ısı rolesi+soguk rolesi) kapanacak
'mevcut ısı degeri set degerine esit ((ve)) mevcut ısı degeri setısı degeri + tolerans tan buyuk ise soguk rolesi acılacak
' Sıcaklık kontrol


IF (FLOAT=>TERM AND FLOAT <=TERM+SNS) THEN
SYC=0:LOW ROLEISI :LOW ROLESOGUK
ELSE IF FLOAT<=ISIS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ELSE IF FLOAT=>TERM+SNS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ENDIF




RETURN




DELAY: 'gecıkme 1
FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
FOR I=0 TO 125:NEXT
RETURN




EKRAN:'Sıcaklık gösteriliyor.
Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI
Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN1: 'SET yazısı
Z=14:GOSUB AL:AKTAR1=SAYI
Z=13:GOSUB AL:AKTAR2=SAYI
Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN3:
AKTAR1=64
AKTAR2=64
AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
aktar3=0
RETURN


AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI :RETURN'Karekter al




KAYDET: 'Değerler eproom'a kaydediliyor..
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




AYAR: 'Menuye gırıs
WHILE TUS=1:WEND
DP=0
GOSUB EKRAN1
GOSUB DELAY1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH
DP=1:syc=0:SNY=0:W=0




MENU:
IF YUKARI=0 THEN
W=1:U=0:sny=0
TERM=TERM+1
WHILE YUKARI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=50:TERM=TERM+1:GOSUB DELAY
ENDIF
GOSUB EKRAN2
IF TERM>990 THEN TERM=0
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF




IF ASAGI=0 THEN
W=1:U=0:sny=0
TERM=TERM-1
WHILE ASAGI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=50:TERM=TERM-1:GOSUB DELAY
ENDIF
GOSUB EKRAN2
IF TERM>999 THEN TERM=990
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF




IF TUS=1 THEN
GOTO SENSIVITY
ENDIF
GOSUB EKRAN2
GOTO MENU




SENSIVITY: '| menusu giriş..
WHILE TUS=1:WEND
read $2,sns
IF SNS>50 THEN SNS=0
DP=1:SNY=0
SENS:
GOSUB EKRAN4
IF YUKARI=0 THEN
W=1:SNY=0:U=0
SNS=SNS+1
WHILE YUKARI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=40:SNS=SNS+1:GOSUB DELAY2
ENDIF
GOSUB EKRAN4
IF SNS=>50 THEN SNS=50
WEND
SYC=0:IF SNS=>50 THEN SNS=50
ELSE
W=0
ENDIF




IF ASAGI=0 THEN
W=1:U=0:sny=0
SNS=SNS-1
WHILE ASAGI=0
SYC=SYC+1:GOSUB DELAY
IF SYC>40 THEN
SYC=40:SNS=SNS-1:GOSUB DELAY2
ENDIF
GOSUB EKRAN4
IF SNS>50 THEN SNS=0
WEND
SYC=0:IF SNS>50 THEN SNS=0
ELSE
W=0
ENDIF




IF TUS=1 THEN
GOTO KAYDET
ENDIF
GOTO SENS




Disable
KESME: 'kesme alt programı
IF SET=0 THEN
TUS=1
ELSE
TUS=0
ENDIF


IF W=0 THEN
SNY=SNY+1
IF SNY=>120 THEN
U=1
ELSE
U=0
ENDIF
ENDIF
IF SNY=>240 THEN SNY=0




SAYAC=SAYAC+1
If SAYAC>2 then SAYAC=0




If SAYAC=0 then
DIG2=0
PORTB=AKTAR1
DIG0=1
PAUSEUS 2
Endif




If SAYAC=1 then
DIG0=0
PORTB=AKTAR2


DIG1=1
PAUSEUS 2
Endif


If SAYAC=2 then
DIG1=0
PORTB=AKTAR3
DIG2=1
PAUSEUS 2
Endif


TMR0=160
INTCON.2=0


Resume
Enable
end
 
Üstadım kralsınız :) vallahi kralsınız :) kaç tane foruma konu açtım kaç kişiye sordum, saolsunlar yardımcı olmaya çalıştılar ama bukadar kökten çözüm ver kardeşim yapayım diyen çıkmadı, bend kaç gündür uğraşıyorum picbasic'e hakim olmadığım için programı anlamaya çalışıyordum, bi türlü işin içinden çıkamamıştım, inanın beni çok büyük bi dertten kurtardınız, çok teşekkür ederim çok saolun. Been programı derleyip atıp deniyorum hemen yarın, olası bir sorunda tekrar mesaş atarım başlık altından. Şimdiden çok teşekkürler.
 
Yalnız hocam şimdi kodu incelerken gözüme çarpan bir nokta varda, rolesoguk hiçbir zaman high olmuyor :)

IF (FLOAT=>TERM AND FLOAT <=TERM+SNS) THEN ++ Burda işaret değiştirerek sanırım soğuk kontolünü eklemişsiniz
SYC=0:LOW ROLEISI :LOW ROLESOGUK ++ Burda rolesoguk low yapılıyor, ardından aşağıdaki işlemlerde duruma göre roleısı'nin low yada high olduğu ayarlanıyor fakat rolesoguk başka hiçbir yerde geçmiyor, sanırım rölesoğuk'un kontrolünü unuttunuzmu acaba? Yada gözümden mi kaçtı? rolesoguk diye de arattım ama programda başka yerde geçmiyor :)
ELSE IF FLOAT<=ISIS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ELSE IF FLOAT=>TERM+SNS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ENDIF


 
ELSE IF FLOAT<=ISIS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI

Burdaki ROLEISI, ROLESOGUK'mu olacaktı yoksa?
 
Evet ben orayı dalgınlıkla ROLEISI bırakmısım. dedigin gibi ROLESOGUK olucak
Eger sıcaklık ayarlanan sıcaklık + toleranstan fazlaysa ROLESOGUK HIGH olucak



IF (FLOAT=>TERM AND FLOAT <=TERM+SNS) THEN
SYC=0:LOW ROLEISI :LOW ROLESOGUK
ELSE IF FLOAT<=ISIS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ELSE IF FLOAT=>TERM+SNS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI ' ----------HIGH ROLESOGUK olucak
ENDIF
ENDIF

yani dogru olan kod

IF (FLOAT=>TERM AND FLOAT <=TERM+SNS) THEN
SYC=0:LOW ROLEISI :LOW ROLESOGUK
ELSE IF FLOAT<=ISIS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLEISI
ENDIF
ELSE IF FLOAT=>TERM+SNS THEN
SYC=SYC+1
IF SYC=>3 THEN
SYC=3:HIGH ROLESOGUK
ENDIF
ENDIF
 
Hocam compile ederken :

If (Float=>TERM And Float<=TERM+SNS) Then
SYC=0:Low ROLEISI :Low ROLESOGUK
Else If Float<=ISIS Then
SYC=SYC+1
If SYC=>3 Then
SYC=3:High ROLEISI
EndIf
Else If Float=>TERM+SNS Then
SYC=SYC+1
If SYC=>3 Then
SYC=3:High ROLESOGUK
EndIf
EndIf

burdaki iki else if satırında da syntax error veriyor, if else if falan kalıplarında bir hata olabilir mi?
 

Forum istatistikleri

Konular
128,179
Mesajlar
915,658
Kullanıcılar
449,940
Son üye
yavuzturan

Yeni konular

Geri
Üst