Merhabalar arkadaşlar
ben kendim bi otomatik çiçek sulama projesi yapıyorum programını bitirdim sayılır ufak tefek sorunlar var bunun için sizlerin fikirlerini ve görüşlerinizi almak istiyorum.
Öncelikle program ve devreden biraz bahsedeyim;
Programını pic basicde yazıyorum işlemci olarak 16F877 ,2x16 lcd, ısı ölçümü için DS18b20 saat içinde RTC olarak DS1302 kullandım.
Programda ısı ölçüm kodları ve ds1302 ile ilgili okuma ve yazma kodları ETE hocamıza aittir.
Devrenin çalışmasından biraz bahsetmek gerekirse şöyle söyliyeyim. Devre haftalık olarak haftanın hangi günlerinde su verilmesini şeçmişsek o günler su verir.Ana çalışma modundaygen menü tuşuna basıp ana menüye girilir ana menüden yukarı ve aşağı butonlarıyla pompa ayarları seçilip tekrar menüye basılıp bu sefer pompanın açıkmı kapılımı olduğu seçilir. açık veya kapalıdan herhangi birini seçtikten sonra tekrar menü tuşuna basarsak bu sefer hangi günler sulanacak bunu seçmemiz gerekir bu menüye girdiğimizde ilk karşımıza çıkan pazartesi olur yukarı tuşuşla pazartesinin yanına çarpı veya onay işareti konulur eğer günün yanında onay işareti varsa o gün sulama yapılır çarpı işareti varsa yapılmaz.sırasıyla bütün günler için bu ayarlar yapılır pazar gününüde yapıp tekrar menüye basarsak bu sefer saat kaçta sulama yapılacağı seçilir.Saat ve dakika cinsinde değerler girilip tekrar menüye basılırsa bu sefer pompanın kaç saniye çalışacağını ayarlamamızı ister saniye cinsinden 0 ile 59 saniye arasında bi değer seçip tekrar menüye basarsak pompa ayar menüsünden çıkar ve ana menüye döner oradanda çıkış yağpılıp normal çalışma moduna geri dönülür .Tabi bu yaptığımız ayarların hepsi epromda saklanır elektrik kesilsede ayarlarımız bozulmaz.
Menülerde bir sorunum yok sorun zamanı geldiğinde pompanın çalışmaması daha doğrusu devreyi çalıtırır çalıştırmaz hemen röle çekiyor bunun olmaması gerekiyor sadece ayarladığım günde saatte ve dakikada çalışması gerekir
ilk önce anlamanız açısında devrenin bütün kodlarını vereyim
DEFINE OSC 4
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
TRISA=%00000111
TRISB=%00000000
TRISC=%00001111
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
ADCON1 = 7
E VAR BYTE
AY var byte
YIL var byte
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
GUN VAR BYTE
MEM VAR BYTE
ONLAR VAR BYTE
BIRLER VAR BYTE
SAYAC VAR BYTE
SAYI VAR BYTE
SAAT1 VAR BYTE
DAK1 VAR BYTE
DUR VAR BYTE
TARIH VAR BYTE
PTESI VAR BYTE
SALI VAR BYTE
CARS VAR BYTE
PERS VAR BYTE
CUMA VAR BYTE
CTESI VAR BYTE
PAZAR VAR BYTE
'ISI
Busy VAR BIT ' Busy Status-Bit
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
ISARET_BITI VAR HAM.Bit11 ' +/- sıcaklık İşaret biti, 1 = olursa eksi sıcaklık
EKSI_ISI CON 1 ' Sıfır altında isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° işareti
ISARET VAR BYTE ' ISI değeri için +/- işaret
TEMP VAR BYTE ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTC.3 ' One-wire Data-Pin "DQ" PortB.0 da
MENU VAR PORTA.0
YUKARI VAR PORTA.1
ASAGI VAR PORTA.2
RTC_RST var PORTC.0
RTC_CLK var PORTC.1
RTC_DTA var PORTC.2
SYMBOL ROLE=PORTA.3
PAUSE 300
LCDOUT $FE,$40,0,1,2,20,8,0,0,0 'LCD 0. KARAKTER HAFIZASI ONAY İŞARETİ
LCDOUT $FE,$48,0,17,10,4,10,17,0,0 'LCD 1. KARAKTER HAFIZASI ÇARPI İŞARETİ
LCDOUT $FE,$50,16,8,4,2,4,8,16,0 'LCD 2. KARAKTER HAFIZASI YÖN İŞARETİ
LCDOUT $FE,1," OTOMATIK CICEK "
LCDOUT $FE,$C0," SULAYICI "
PAUSE 1500
LCDOUT $FE,1
GOSUB SENSOROKU
BASLA:
GOSUB ZAMAN_OKU
GOSUB SENSOROKU
GOSUB EKRANAYAZ
GOSUB ZAMANA_BAK
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO AYAR_MENUSU
ENDIF
GOTO BASLA
'---------------------------ALT PROGRAMLAR-------------------------------------
EKRANAYAZ:
READ $10,SAYAC:IF SAYAC=255 THEN SAYAC=0
READ $0,SAYI:IF SAYI=255 THEN SAYI=0
READ $11,DUR:IF DUR=255 THEN DUR=0
LCDOUT $FE,$80,ISARET,DEC ISI,",",DEC1 (Float),Derece,"C ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
IF SN=DUR THEN LOW ROLE
IF SAYI=1 THEN LCDOUT $FE,$C0,"P. ACIK "
IF SAYI=0 THEN LCDOUT $FE,$C0,"P. KAPALI "
IF SAAT=0 AND DAK=0 AND SN=0 THEN
SAYAC=SAYAC+1
IF SAYAC=7 THEN SAYAC=0
ENDIF
IF SAYAC=0 THEN
LCDOUT $FE,$CC,"PZTS"
ENDIF
IF SAYAC=1 THEN
LCDOUT $FE,$CC,"SALI"
ENDIF
IF SAYAC=2 THEN
LCDOUT $FE,$CC,"CARS"
ENDIF
IF SAYAC=3 THEN
LCDOUT $FE,$CC,"PERS"
ENDIF
IF SAYAC=4 THEN
LCDOUT $FE,$CC,"CUMA"
ENDIF
IF SAYAC=5 THEN
LCDOUT $FE,$CC,"CTESI"
ENDIF
IF SAYAC=6 THEN
LCDOUT $FE,$CC,"PAZR"
ENDIF
RETURN
ZAMANA_BAK:
READ $0,SAYI
READ $1,PTESI:IF PTESI=255 THEN PTESI=0
READ $2,SALI:IF SALI=255 THEN SALI=0
READ $3,CARS:IF CARS=255 THEN CARS=0
READ $4,PERS:IF PERS=255 THEN PERS=0
READ $5,CUMA:IF CUMA=255 THEN CUMA=0
READ $6,CTESI:IF CTESI=255 THEN CTESI=0
READ $7,PAZAR:IF PAZAR=255 THEN PAZAR=0
IF SAYI=1 THEN
IF (PTESI=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (SALI=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CARS=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (PERS=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CUMA=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CTESI=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (PAZAR=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
ENDIF
RETURN
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
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
RETURN
TEMIZLE:
LCDOUT $FE,1
RETURN
AYARLANDI:
lcdout $FE,1," AYARLANDI "
PAUSE 1000
GOSUB TEMIZLE
GOTO CIK
AYAR_MENUSU:
GOSUB TEMIZLE
SAATAYARI:
LCDOUT $FE,$80," SAAT AYARI"
IF MENU=1 then
WHILE MENU=1:WEND
GOTO SAATAYAR1
ENDIF
IF ASAGI=1 then
WHILE ASAGI=1:WEND
GOTO MOTOR_AYARI
ENDIF
IF YUKARI=1 then
WHILE YUKARI=1:WEND
GOTO CIKIS
ENDIF
GOTO SAATAYARI
MOTOR_AYARI:
GOSUB TEMIZLE
MOTOAYARI:
LCDOUT $FE,$80," POMPA AYARI"
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO MOTORAYAR
ENDIF
IF ASAGI=1 then
WHILE ASAGI=1:WEND
GOTO GUN_AYARI
ENDIF
IF YUKARI=1 then
WHILE YUKARI=1:WEND
GOTO AYAR_MENUSU
ENDIF
GOTO MOTOAYARI
GUN_AYARI:
GOSUB TEMIZLE
GUNA:
LCDOUT $FE,$82," GUN AYARI"
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
IF ASAGI=1 then
WHILE ASAGI=1:WEND
GOTO CIK
ENDIF
IF YUKARI=1 then
WHILE YUKARI=1:WEND
GOTO MOTOR_AYARI
ENDIF
GOTO GUNA
CIKIS:
GOSUB TEMIZLE
CIK:
LCDOUT $FE,$80," MENUDEN CIKIS"
IF MENU=1 THEN
WHILE MENU=1:WEND
LCDOUT $FE,1
GOTO BASLA
ENDIF
IF ASAGI=1 then
WHILE ASAGI=1:WEND
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 then
WHILE YUKARI=1:WEND
GOTO GUN_AYARI
ENDIF
GOTO CIK
MOTORAYAR:
GOSUB TEMIZLE
MOTOAYAR:
READ $0,SAYI
IF SAYI=255 THEN SAYI=0
LCDOUT $FE,$80," POMPA DURUMU "
IF MENU=1 THEN
WHILE MENU=1:WEND
GOSUB M_ZAMANI
ENDIF
IF YUKARI=1 THEN SAYI=SAYI+1
WHILE YUKARI=1:WEND
IF SAYI=2 THEN SAYI=0
WRITE $0,SAYI
IF SAYI=1 THEN lcdout $FE,$C0," ACIK "
IF SAYI=0 THEN LCDOUT $FE,$C0," KAPALI "
GOTO MOTOAYAR
M_ZAMANI:
GOSUB TEMIZLE
P_TESI
READ $1,PTESI
IF PTESI=255 THEN PTESI=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
PTESI=PTESI+1
IF PTESI=2 THEN PTESI=0
WHILE YUKARI=1:WEND
ENDIF
IF PTESI=1 THEN LCDOUT $FE,$C0,"PAZARTESI ",0
IF PTESI=0 THEN LCDOUT $FE,$C0,"PAZARTESI ",1
WRITE $1,PTESI:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO SALIGUNU
ENDIF
GOTO P_TESI
SALIGUNU:
GOSUB TEMIZLE
SALI_:
READ $2,SALI
IF SALI=255 THEN SALI=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
SALI=SALI+1
IF SALI=2 THEN SALI=0
WHILE YUKARI=1:WEND
ENDIF
IF SALI=1 THEN LCDOUT $FE,$C0,"SALI ",0
IF SALI=0 THEN LCDOUT $FE,$C0,"SALI ",1
WRITE $2,SALI:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO CARSAMBA
ENDIF
GOTO SALI_
CARSAMBA:
GOSUB TEMIZLE
CARS_:
READ $3,CARS
IF CARS=255 THEN CARS=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
CARS=CARS+1
IF CARS=2 THEN CARS=0
WHILE YUKARI=1:WEND
ENDIF
IF CARS=1 THEN LCDOUT $FE,$C0,"CARSAMBA ",0
IF CARS=0 THEN LCDOUT $FE,$C0,"CARSAMBA ",1
WRITE $3,CARS:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO PERSEMBE
ENDIF
GOTO CARS_
PERSEMBE:
GOSUB TEMIZLE
PERS_:
READ $4,PERS
IF PERS=255 THEN PERS=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
PERS=PERS+1
IF PERS=2 THEN PERS=0
WHILE YUKARI=1:WEND
ENDIF
IF PERS=1 THEN LCDOUT $FE,$C0,"PERSEMBE ",0
IF PERS=0 THEN LCDOUT $FE,$C0,"PERSEMBE ",1
WRITE $4,PERS:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO CUMAGUNU
ENDIF
GOTO PERS_
CUMAGUNU:
GOSUB TEMIZLE
CUMA_:
READ $5,CUMA
IF CUMA=255 THEN CUMA=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
CUMA=CUMA+1
IF CUMA=2 THEN CUMA=0
WHILE YUKARI=1:WEND
ENDIF
IF CUMA=1 THEN LCDOUT $FE,$C0,"CUMA ",0
IF CUMA=0 THEN LCDOUT $FE,$C0,"CUMA ",1
WRITE $5,CUMA:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO CUMARTESI
ENDIF
GOTO CUMA_
CUMARTESI:
GOSUB TEMIZLE
CTESI_:
READ $6,CTESI
IF CTESI=255 THEN CTESI=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
CTESI=CTESI+1
IF CTESI=2 THEN CTESI=0
WHILE YUKARI=1:WEND
ENDIF
IF CTESI=1 THEN LCDOUT $FE,$C0,"CUMARTESI ",0
IF CTESI=0 THEN LCDOUT $FE,$C0,"CUMARTESI ",1
WRITE $6,CTESI:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO PAZARGUNU
ENDIF
GOTO CTESI_:
PAZARGUNU:
GOSUB TEMIZLE
PAZAR_:
READ $7,PAZAR
IF PAZAR=255 THEN PAZAR=0
LCDOUT $FE,$80," SULAMA GUNLERI"
IF YUKARI=1 THEN
PAZAR=PAZAR+1
IF PAZAR=2 THEN PAZAR=0
WHILE YUKARI=1:WEND
ENDIF
IF PAZAR=1 THEN LCDOUT $FE,$C0,"PAZAR ",0
IF PAZAR=0 THEN LCDOUT $FE,$C0,"PAZAR ",1
WRITE $7,PAZAR:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO M_CALISMA
ENDIF
GOTO PAZAR_
M_CALISMA:
GOSUB TEMIZLE
SAAT_AYARLA:
READ $8,SAAT1:IF SAAT1=255 THEN SAAT1=0
READ $9,DAK1:IF DAK1=255 THEN DAK1=0
LCDOUT $FE,1
IF MENU=1 THEN SAAT_AYARLA
SAAT_AYAR:
LCDOUT $FE,$81,"CALISMA SAATI"
LCDOUT $FE,$C4,2,DEC2 SAAT1,":",DEC2 DAK1
IF YUKARI=1 THEN
SAAT1=SAAT1+1
IF SAAT1=24 THEN SAAT1=0
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
SAAT1=SAAT1-1
IF SAAT1=255 THEN SAAT1=23
WHILE ASAGI=1:WEND
ENDIF
WRITE $8,SAAT1:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO DAK_AYARLA
ENDIF
GOTO SAAT_AYAR
DAK_AYARLA:
READ $8,SAAT1
READ $9,DAK1:IF DAK1=255 THEN DAK1=0
LCDOUT $FE,1
IF MENU=1 THEN DAK_AYARLA
DAK_AYAR:
LCDOUT $FE,$81,"CALISMA SAATI"
LCDOUT $FE,$C4,DEC2 SAAT1,":",2,DEC2 DAK1
IF YUKARI=1 THEN
DAK1=DAK1+1
IF DAK1=59 THEN DAK1=0
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
DAK1=DAK1-1
IF DAK1=255 THEN DAK1=59
WHILE ASAGI=1:WEND
ENDIF
WRITE $9,DAK1:PAUSE 10
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO M_SURE
ENDIF
GOTO DAK_AYAR
M_SURE:
GOSUB TEMIZLE
MSURE:
READ $11,DUR
IF MENU=1 THEN AYARLANDI
WHILE MENU=1:WEND
lcdout $fe,$80,"POMPA CALISMA"
lcdout $FE,$C0,"SURESI:",DEC2 DUR," SANIYE"
IF YUKARI=1 THEN DUR=DUR+1
WHILE YUKARI=1:WEND
IF DUR=60 THEN DUR=0
IF ASAGI=1 THEN DUR=DUR-1
WHILE ASAGI=1:WEND
IF DUR=255 THEN DUR=59
WRITE $11,DUR:PAUSE 10
GOTO MSURE
GUNAYARI:
READ $10,SAYAC
GOSUB TEMIZLE
GUNAYAR:
LCDOUT $FE,$80,"GUNU SEC"
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO AYARLANDI
ENDIF
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAYAC=SAYAC+1
IF SAYAC=7 THEN SAYAC=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAYAC=SAYAC-1
IF SAYAC=255 THEN SAYAC=6
ENDIF
IF SAYAC=0 THEN LCDOUT $FE,$C0,"GUN=PAZARTESI"
IF SAYAC=1 THEN LCDOUT $FE,$C0,"GUN=SALI "
IF SAYAC=2 THEN LCDOUT $FE,$C0,"GUN=CARSAMBA"
IF SAYAC=3 THEN LCDOUT $FE,$C0,"GUN=PERSEMBE"
IF SAYAC=4 THEN LCDOUT $FE,$C0,"GUN=CUMA "
IF SAYAC=5 THEN LCDOUT $FE,$C0,"GUN=CUMARTESI"
IF SAYAC=6 THEN LCDOUT $FE,$C0,"GUN=PAZAR "
WRITE $10,SAYAC:PAUSE 10
GOTO GUNAYAR
SAATAYAR1:
lcdout $fe,1
IF MENU=1 then SAATAYAR1
SAATAYAR:
PAUSE 200
lcdout $FE,$80," SAATi AYARLA "
lcdout $FE,$C0,"SAAT :",2,dec2 SAAT,":",dec2 DAK,":",dec2 SN
E=0
button MENU, 1, 255, 255, E, 1,DAKIKAAYAR1
button YUKARI,1,255,255,E,1,SAATIARTIR
button ASAGI,1,255,255,E,1,SAATIAZALT
goto SAATAYAR
SAATIARTIR:
IF YUKARI=1 then SAAT=SAAT+1
WHILE YUKARI=1:WEND
IF SAAT=24 then SAAT=0
goto SAATAYAR
SAATIAZALT:
IF ASAGI=1 then SAAT=SAAT-1
WHILE ASAGI=1:WEND
IF SAAT=255 then SAAT=23
goto SAATAYAR
DAKIKAAYAR1:
IF MENU=1 then DAKIKAAYAR1
lcdout $fe,1
DAKIKAAYAR:
lcdout $FE,$80," SAATi AYARLA "
lcdout $FE,$C0,"SAAT :",dec2 SAAT,":",2,dec2 DAK,":",dec2 SN
E=0
button MENU, 1, 255, 255, E, 1,ZAMAN_B
button YUKARI,1,255,255,E,1,DAKARTTIR
button ASAGI,1,255,255,E,1,DAKAZALT
DAKARTTIR:
IF YUKARI=1 then DAK=DAK+1
WHILE YUKARI=1:WEND
IF DAK=60 then DAK=0
goto DAKIKAAYAR
DAKAZALT:
IF ASAGI=1 then DAK=dak-1
WHILE ASAGI=1:WEND
IF DAK=255 then DAK=59
goto DAKIKAAYAR
ZAMAN_B:
IF MENU=1 then ZAMAN_B
gosub ZAMAN_YAZ
GOSUB TEMIZLE
GOSUB AYARLANDI
goto CIK
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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:
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
high RTC_RST
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
end
program epeyce ağır oldu :)
programdada anlaşılacağı gibi röleyi kontrol etmek için aşağıdaki komutları kullandım
ZAMANA_BAK:
READ $0,SAYI
READ $1,PTESI:IF PTESI=255 THEN PTESI=0
READ $2,SALI:IF SALI=255 THEN SALI=0
READ $3,CARS:IF CARS=255 THEN CARS=0
READ $4,PERS:IF PERS=255 THEN PERS=0
READ $5,CUMA:IF CUMA=255 THEN CUMA=0
READ $6,CTESI:IF CTESI=255 THEN CTESI=0
READ $7,PAZAR:IF PAZAR=255 THEN PAZAR=0
IF SAYI=1 THEN
IF PTESI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF SALI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF CARS=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF PERS=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF CUMA=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF CTESI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF PAZAR=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
ENDIF
RETURN
burada sayı değişkeni pompanın açıkmı kapalımı olduğunu temsil ediyor eğer birse açık sıfırsa pompa kapalıdır
günler i açıklamak gerekirse eğer gün birse o gün sulama yapılır sıfırsa sulama yapılmaz yani menüde onay işareti koymaklar günün 1 veya sıfır olmasını değiştiriyorduk .Motoru kontrol etmek için bu kodları kullandım ama devreyi ilk çalıştırdığımızda hemen röle çekiyor
ve bir sonraki dakikada pompa kaç saniye çalışacaksa o kadar çalışıp röle bırakıyor ayrıca günlerede uymuyor diyelimki sadece pazartesi günü çalışması gerekiyorsa pazartesi dahil hergün boyunca ayarladığım saatte çalışıyor program nedense birtek ayarladığım saat ve dakikayı dikkate alıyor diğer durumları pass geçiyor anlayamadım gitti
Birinci sorununm bu arkadaşlar diğer bir sorun ise Ds1302nin normalden yavaş ilerlemesi yani saniye biraz yavaş ilerliyor bunun sebebi nedir sizce neden saniye yavaş ilerliyor olabilir.
Bide Ds1302den gün okumayla ilgli bir sorum var DS1302den tarih okurken bilgiler hep sayısal olarak geliyor yani diyelimki tarihi okuduk 29/06/2010 gibi bir tarih bilgimiz oluyor ama ben gün okumak istiyorum (ptesi,salı,çars gibi)ds 1302nin böyle bir özelliği varmı yani bu bilgileri okuma istesek nasıl okluyacağız ben şimdilik farklı bir yöntemle günü oraya yazdırdım ama elektrik kesikken gün ilerlemiyor malesef .
programda sizlerinde yardımıyla inşaalah epeyce düzeltmeler yapıcağım belki algoritmada yada yazım tarzında bana daha praik komutlar
söyleyebilirsiniz daha bu işte acemiyim pek fazla tecrübem yok çevremde görüdüğüm devrelerle kendimi geliştiriyorum bu tarz şeyler yapmaya çalışıyorum umarım sorunları çözeriz.Özellikle eğer kendiside müsaitse ETE hocamdan yardım istiyorum kendisi çok ilimli ve bilgili bir insan:)
Arkadaşlar yaptığım proje ile ilgili tüm dosyalar burada isis şeması vs var isiste çalışmasını daha rahat anlayabilirsiniz.Buyrun
http://www.dosya.tc/files/KbA1LQ/_i_eksulama.rar.html
Alıntı yapılan: mucit23 - 30 Haziran 2010, 13:09:25
...
Bide Ds1302den gün okumayla ilgli bir sorum var DS1302den tarih okurken bilgiler hep sayısal olarak geliyor yani diyelimki tarihi okuduk 29/06/2010 gibi bir tarih bilgimiz oluyor ama ben gün okumak istiyorum (ptesi,salı,çars gibi)ds 1302nin böyle bir özelliği varmı yani bu bilgileri okuma istesek nasıl okluyacağız ben şimdilik farklı bir yöntemle günü oraya yazdırdım ama elektrik kesikken gün ilerlemiyor malesef .
...
Kataloğun dokuzuncu sayfasında "Register Adress/Definition" bölümünde yazdığı gibi 0x8B size haftanın gün bilgisini veriyor.(Yazmak için 0x8A)
Merhabalar cevabın için teşekkür ederim
programda zaman okuma bölümü burası
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
haftadaki gün bilgisini alabilmek için tam olarak ne yapmam gerekiyor
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM] 'OKU
Kırmızıyla gösterdiğimi yeni bir değişkenle değiştirip okumayı dener misiniz?
JKRAMER;
çok teşekkür ederim sana
dediğin gibi kırmızı olarak gösterdiğin yer hafta adlı bir değişken oluşturum yazınca saattedeki saniyenin geç artması sorunu çözüldü saat çok güzel çalışıyor fakat bununla birlikte birçok sorun ortaya çıktı birinci sorun ısı ölçümü bozuldu anlayamadım doğrusu sıcaklık devamlı
-0,1 derece gösteriyor bunun sebebi ne olabilir acaba ayrıca diğer bir konu ise dediğiniz gibi kırmızı olan yeri hafta değişkeniyle değiştirim diğerleriyle aynı çevirme işlemini yaptım yani zaman okuma bölümü şöyle oldu
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, HAFTA, 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
MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
low RTC_RST
return
bu şekilde yapıp hafta değişkenin ekranın bir kösesine yazdırdığımda ekranda 06 rakamını gördüm bu 06 rakamı neyi temsil edyor acaba eğer gün bilgisini bu şekilde okuyabiliyorsak bunu nasıl pazartesi salı çarş çevireceğiz bunu anlayamıyorum şimdilik sorunlar bunlar tabi birde röle çıkışı var ama ilk önce bu sorunları çözmem lazım sizinde yardımlarınız ile sorunları çözüceğiz .
Kataloğun yine aynı sayfasında "HAFTA" adını verdiğiniz değişkene atılan değerin 1-7 arasında olduğu yazıyor. Bunu yorumlamak size kalmış; isterseniz 1:Pazartesi, 2:Salı,...,7:Pazar olur, isterseniz 1:Cumartesi, 2:Pazar,...,7:Cuma olur.
Tekrardan teşekkür ederim
hafta okuma işini anladım
Peki diyelimki ayar yapmak istersek zaman yaz bölümü aşağıdaki gibi yapsam olurmu
ZAMAN_YAZ:
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
MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
high RTC_RST
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, HAFTA 128] 'YAZ
low RTC_RST
PAUSEUS 10
return
...
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, HAFTA, YIL, 128] 'YAZ
...
Kataloğun yine aynı sayfasına bakarsanız değişkenlerin yazma/okuma sırasını görebilirsiniz. "HAFTA"nın "AY" ile "YIL" arasında olması gerekiyor.
JKramer;
Sana ne kadar teşekkür etsem azdır Allah senden razı olsun sayende bir sürü şey öğrendim şimdi saatle gün yazma ve okumayla ilgili hiçbir sorunum kalmadı tekrardan teşekkür ederim şimdilik yaptığım projede iki adet sorunum kaldı birisi ısı ölçme sorunu diğeri röle çıkış ile ilgili eğer onlarıda çözersem benim için çok iyi olacak
ısı ölçmeyi ise bi türlü anlam veremiyorum ısı ölçme kodları aşağıdaki gibidir kodlar ete hocaya aittir
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
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
RETURN
öncede ısı ölçümü çalışıyordu herşey normaldi ne olduysa bugün oldu
ana programdaki döngü ise şu şekilde yapmışım
BASLA:
GOSUB ZAMAN_OKU
GOSUB SENSOROKU
GOSUB EKRANAYAZ
GOSUB ZAMANA_BAK
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO AYAR_MENUSU
ENDIF
GOTO BASLA
ekrana yazdırma kısmında ise
LCDOUT $FE,$80,ISARET,DEC ISI,",",DEC1 (Float),Derece,"C ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
bu şekilde yaptım ama ısı -0,1 derecede kalıyor sizce sebebi ne olabilir bunun
Arkadaşlar ne yaptıysam sorunu çözemedim ısı hep -0,1 derece gösteriyor bunun sebebi ne olabilir sizce
Önceden çalışan program çalışmamaya başladıysa dediğiniz gibi son yaptığınız değişikliktendir :). Sorunun nerede olduğunu bulabilmek için sadece sensör okuma ve ekrana yazma kalsın, diğerlerini geçici olarak iptal edin.
merhabalar jkramer
dediğini uyguladım programda sadece ısı okuma bölümünü bıraktım ama değişen bişey olmadı malesef yine eski sorun var enlayamadım gitti acaba başka ne yapabilirim
merhabalar Jkramer sorunu çözdüm
sorun bendeymiş program bazı yerlerde çok köyüleşiyor diye programda osc frekansını 8 mhz ama şemadaki kristalin frekansı ve picin çalışma frekansı 4mhz ye ayarlımış bu yüzden saat normal ilerliyor ama ısı göstergesi -0,1 derece gösteriyordu bende tüm frekansları 8 mhz yapınca bu sefer ısı ölçümü normale döndü fakat bu seferde saat yavaşladı aynı şekilde tüm frekansları 4 mhz yapınca yine aynı şekilde davranıyor saatin yavaşlaması benim için çok kötü oluyor acaba normal yaşamdada saatr böyle geç çalışırmı yoksa normal olarakmı çalışır bu konuda bana ne önerirsin
Saatin yavaşlaması simulasyondandır, gerçek devrede doğru çalışacağını düşünüyorum. Hatta simulasyonda doğru çalışması için DS18b20'yi geçici olarak iptal edip deneyebilirsiniz ama çok da vakit kaybetmeyin artık, bence devreyi toplayın.
haklı olabilirsiniz erken zamanda pcb çizimlerine başlamayı düşünüyorum
tek bir sorunum kaldıu oda röle kontrolü hakkında ilk yazımda ayrıntılı bir bilgi vemiştim
Alıntı Yapprogramdada anlaşılacağı gibi röleyi kontrol etmek için aşağıdaki komutları kullandım
ZAMANA_BAK:
READ $0,SAYI
READ $1,PTESI:IF PTESI=255 THEN PTESI=0
READ $2,SALI:IF SALI=255 THEN SALI=0
READ $3,CARS:IF CARS=255 THEN CARS=0
READ $4,PERS:IF PERS=255 THEN PERS=0
READ $5,CUMA:IF CUMA=255 THEN CUMA=0
READ $6,CTESI:IF CTESI=255 THEN CTESI=0
READ $7,PAZAR:IF PAZAR=255 THEN PAZAR=0
IF SAYI=1 THEN
IF (PTESI=1)AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (SALI=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CARS=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (PERS=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CUMA=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (CTESI=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF (PAZAR=1) AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
ENDIF
RETURN
burada sayı değişkeni pompanın açıkmı kapalımı olduğunu temsil ediyor eğer birse açık sıfırsa pompa kapalıdır
günler i açıklamak gerekirse eğer gün birse o gün sulama yapılır sıfırsa sulama yapılmaz yani menüde onay işareti koymaklar günün 1 veya sıfır olmasını değiştiriyorduk .Motoru kontrol etmek için bu kodları kullandım ama devreyi ilk çalıştırdığımızda hemen röle çekiyor
ve bir sonraki dakikada pompa kaç saniye çalışacaksa o kadar çalışıp röle bırakıyor ayrıca günlerede uymuyor diyelimki sadece pazartesi günü çalışması gerekiyorsa pazartesi dahil hergün boyunca ayarladığım saatte çalışıyor program nedense birtek ayarladığım saat ve dakikayı dikkate alıyor diğer durumları pass geçiyor anlayamadım gitti
sorun aynı şekilde devam ediyor acaba ıf sorgulamasınımı yanlış yapıyorum anlayamadım nasıl çözebilirim acaba bu sorunu
Aslında IF satırları doğru çalışıyor.
Başla satırından önce zaman okuması yapmadığından ilk açılışta saat=0, saat1=0 dak=0 ve dak1=0 olduğu için direk gidip röleyi çalıştırıyor. Ama sonra zaman doğru okununca röle açık kalıyor ve bir daha ancak kapanma zamanında kapanıyor sanırım.
Yapılacak işi Başla satırından önce hatta sensör okumadan önce GOSUB ZAMAN_OKU şeklinde bir komut ilave etmen gerek.
Ete
Merhabalar ete hocam
Sorunu şimdi çözdüm programda ilk başlangıçta sizin dediğiniz gibi zaman okuma bölümüne yönlendirdim ama röleyi kontrol etmeyle ilgili komut bence yinede eksikti çünkü röleyi açmak için haftanın günlerine bakmıyordu önceden sadece hangi gün sulama yapılacak, saate ve dakikaya bakıyordu böyle olunca saat ve dakika ayarladaığım değerlerle eşitlenince hanggi gün olursa olsun o an röleyi açıyordu şimdi kodları aşağıdaki gibi yapınca hiç bir sorun kalmadı tam zamanında röleyi kontrol ediyor
ZAMANA_BAK:
READ $0,SAYI
READ $1,PTESI:IF PTESI=255 THEN PTESI=0
READ $2,SALI:IF SALI=255 THEN SALI=0
READ $3,CARS:IF CARS=255 THEN CARS=0
READ $4,PERS:IF PERS=255 THEN PERS=0
READ $5,CUMA:IF CUMA=255 THEN CUMA=0
READ $6,CTESI:IF CTESI=255 THEN CTESI=0
READ $7,PAZAR:IF PAZAR=255 THEN PAZAR=0
IF SAYI=1 THEN
IF HAFTA=1 AND PTESI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=2 AND SALI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=3 AND CARS=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=4 AND PERS=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=5 AND CUMA=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=6 AND CTESI=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
IF HAFTA=7 AND PAZAR=1 AND SAAT1=SAAT AND DAK1=DAK AND SN=0 THEN HIGH ROLE
ENDIF
RETURN
size danışmak istediğim bi konu daha var şu saatin geç ilerlemesiyle ilgili bu konuyla ilgili bana önereceğiniz bişey varmı yani biliyorum simülasyonla gereçk hayat çok farklı acaba gereçk hayattada bu sorun yaşanırmı
ben şöyle bi deneme yaptım programdaki osc değerini 8 mhz ye çıkartıp simülasyondaki kristal değerleride 4 mhz olunca saat çok normal çalışıyor ama bu sefer derecede -0,1 derecede kalıyor dderece kısmı çalışmıyor ama hem osc değerini hemde şemadaki kristal değerlerini 8 mehz veya 4 mhz yapınca yine eskisi gibi saat yavaş derece düzgün çalışıyor bunun sebeni ne olabilir acaba yani normalde kristal değerini 8 yaparsak saattaki yavaşlama sorunu çözülürmü
Saatin geç ilerlemesi simulasyondandır. Anlamak için;
İsis ekranının en altında gerçek zaman saati bulunmaktadır. Kısaca zaman artımı oradan takip edilebilir.
Saniye artışı orası ile aynı ise gerçekte sorunsuz çalışacak anlamınadır.
Gerçek devrede bakmadan saating geç ilerlediği hakkında hüküm verme bence. Bu sık sık olan bir şeydir.
İsis gerçekten bir sürü işi bir arada ypmakta bazen süre onun için yetersiz kalmaktadır. Olayın takibi ise gerçek zaman saatinden yapılabilir.
Ete
Hocam simülasyonda devreye ilk enerji verdiğim zaman bilgisayarın saatini alıyor ona göre ilerliyor ama isisin altındaki kronometre gibi bişey galiba
bide devreyi ilk çalıştırdığımızda DS1302 clock diye ufak bir pencere açılıyor oarda ds1302 içerisindeki saat ve tarih bilgilerini gösteriyor eğer dediğiniz şey buysa ozaman gerçekte doğru çalışır çünkü bu küçük pencerede yazanlarla lcd ekranda yazan saat bilgileri aynı
Aşağıda kronometre gibi şey dediğin şey aslında gerçek zaman saatidir. Orda saniyenin bir artması demek gerçek zamanda program çalıştığında 1 sn geçecek anlamındadır. Bazen oradaki sn değeri kolundaki saate nazaran 3 sn de bir sn bazen 5 sn de bir saniye atar. Bunun anlamı simulasyon yavaş çalışıyor ancak gerçekte normal çalışacak demektir.
Sen dosyaları bana bir yolla ben bakayım.
Ete
merhabalar ete hocam kusura bakmayın cevap yazmakta biraz geciktim
hocam dosyaları bu adresten indirebilirsiniz
http://s1.dosya.tc/HyNkxG/_i_eksulama.rar.html
Aslında önceki dosya bende var idi oradan baktım. Dediğim gibi sistem saati normal çalışıyor. Anlayacağın gerçek devre doğru çalışacak. Aşağıda gördüğün gerçek zaman saatidir ve o saat DS1302 ile doğru çalışıyor.
Ete
tamam hocam teşekkürler devrenin pcb sini çiziyorum en kısa zzamanda devreyi kuracam
Sağlıcakla kalın :)
merhabalar hocam size sormak istediğim bişey daha var projem ile ilgili görüşlerinizi almak istiyorum gerek program yazma mantığı gerekse devrenin çalışması ile ilgili sizce ne olsaydı güzel olurdu.Biliyorum sizin program yazma mantığınız çok farklı çok karmaşık işleri bile kısa yollardan halledebiliyorsunuz.Bu özelliğiniz benim çok hoşuma gidiyor nede olsizin sayenizde öğrendim program yazmayı şimdide ufak tefek işlerle uğraşıyorum .
Aslında bu soruyu cevaplayacak kadar çok detaylı incelemedim bu programı.
Ancak yinede söyleyebileceğim bir şey var. Programda hem değişken kullanılıyor hemde bu değişkendeğerleri eeproma kayıt ediliyor.
Değişken değeri zaten hafızada iken birkerede eepromdan okunuyor ve o şekilde kullanılıyor. Keşke bu kadar eeproma yazılıp okunan bir program olmasaydı diyorum. Benim kullanmadığım ve kullanmakda istemediğim bir mantık bu. Eepromların belirli sayıda yazma ömrü olduğunu düşünürsek programın çalışması anında bir çok kereler eeproma yazılıp okunmaktdaır. Bu eepromun ömrünü kısa sürede bitirebilir diye düşünüyorum. Birde lüzumsuz geciklemelere sebep olan bir husus.
Ete
tamam hocam teşekkürler
merhabalar hocam nasılsınız iyimisiniz
hocam geçen gün kuluçka makinamdan ilk civcivler çıktı :)
Ama bu sefer verim çok kötü oldu :( 10 yumurtadan sadece 5i çıkabildi :( buduruma biraz üzüldüm doğrusu civcivleri o halde görmek insanı üzüyor .
Bende hemen sebebini araştırmaya koyuldum
makina içerisinde yumurtalıkların üzerine çeşitli termometreler koyup ısı öçümleri aldım ve sonuç genelde devrenin gösterdiği ısıdan 2-3 derece düşük kalıyor bunun sebebide aslında basit makinada ısıtıcılar çalışınca ısınan hava makinanın üst taraflarına doğru ilerliyor sht 11 de üst taraflarda olduğu için makina nomalden daha yüksek ölçüyor.Ben çözümümü buldum, aslında sht 11 i alt tarafa alınarak belki sorun çözülebilir ama bence böyleside verimli olmaytacaktır.Bunun yerine devreye 1 adet DS18B20 daha ekledim.burada sorun yok.Şimdi makinanın iki yn tarafında iki adet fan var makina içerisindeki hava silkülasyonunu sağlamak için yapmak istediğim şey iki sensör arasındaki ısı farkı sıfır olanakadar yandaki fanlar çalışacak alt ve üst ısılar eşitlenince yandaki fanlar kapanacak aslında hasasiyet ayarıda eklenebilir buna ama hassaiyetin nasılyapıldığını bilmiorum.diğer karşılaştırma işlemini yapabilirim.
Set değeri ise bu iki sensörün ortalaması alınarak çıkan değerle karşılaştırılacak işte burada tıkandım kaldım ortalama için nasıl bir formül kullanmalıyım bunu bilmiyorum
ben örnek olarak şöyle bir uygulama yaptım ;Diyelimki iki adet ISI1 ve ISI2 adında değişkenimizolsun bunlar sensörlere ait ısı bilgilerini tutuyor biz ikisinin ortalamasını almak için aşağıdaki gibi bi formül kullanabilirmiyim
ORTISI=(ISI1*10)+(ISI2*10)/20 gibi bi formül kullansam aslında oluyor ama pic ondalıklı işlemleri yapmıyor net değeri veriyor acaba ondalıklı bi işlem yapabilmek için nasıl bi formul kullanmalıyım.
Şimdilik devreyi çok geliştirecem tam otomatik bir sistem haline getirecem elimde bir sürü malzeme var onları değerlendiriyorum. LCD boyutunu 20x4 lcd yapıcam eğer aşağıdakinin bir 20x4 lcd olduğunu düşünürsek aklımda şöyle bi ekran görüntüsü var
Ü=25,7 A=23,8 S=37,8
ORTISI=24,7 NEM%70
SAAT 12:12:00 01.GUN
TARIH 01/01/10 CTESI
Biraz açıklamak gerekirse
Ü= üst ısı
A= alt ısı
S= ısı set değeri
ortısı=ortalama ısı
bu işe çok heves verdim umarım projemi sağ sağlim bitiririm
Ayrıca işlemci olarak verim açısından 18F452 ye geçmek istiyorum elimde bu işlemciden çok var kristal frekansınıda 20 mhz ye çıkartmayı düşünüyorum çünkü ana programda birçok gosub komutu olduğu için ana menüye girmek için butona biraz basılı tutmak gerekiyor .
micro code studioda 18 f serisi için bi program yazmak için mpasm ile bi bağlantı kurmak gerekiyor bunun nasıl yapıldığını bilmiyorum daha önce hiç 18 f serisi için bi program yazmadım bunun nasıl yapıldığınıda eğerbi bilginiz varsa söylerseniz çok memnun olurum.
Umarım sizi çok rahatsız etmiyorumdur gözümde çok değerlisiniz benim için bi isteğiniz olursa herzaman budayım.
Lazımsa civcivde gönderebilirim sizin o civcivlerde emeğiniz çok :)
Öncelikle hemen belirteyim farklı sensörler sıcaklık oynamalarına farklı tepki verirler. Ancak stabil ortamda aynı sıcaklığı gösterebilirler. Bu nedenle bana kalırsa ortalama vermek yerine aralık vermek daha uygun olur gibime geliyor.
Örnek vermek gerekir ise ;
IF ALTISI=>(USTISI-1) AND ALTISI<=(USTISI+1) THEN
FAN=0
ELSE
FAN=1
ENDIF
Rakamla açıklamak gerekir ise ALTISI 24 derece ise ÜSTISI 23-24-25 derecelerde iken fan çalışmayacak bunun dışındaki derecelerde fan çalışacaktır.
Bir derecelik fark hem altta hem üstte fanın sürekli dur kalk yapmasını önleyecek ve nispeten sıcaklığı sabit tutmaya çalışmasına sebep olacaktır.
Başka bir deyişle, alt ısı 23 derece ye gelince fan duracak ve bu durma üst ısı ile alt ısıs arasındaki farkın 3 dereceyi aşmasına kadar devam edecektir.
Başka bir yöntemde fark alarak işlem yapılabilir. FARK isimli değişken WORD tipinde olacak
FARK=USTISI-ALTISI
IF FARK.Bit15=1 then FARK=~FARK (Şayet USTISI<ALTISI ise FARK=ALTISI-USTISI demek gerekir ki bu komut bu işlemi yerine getiriyor)
IF FARK>2 then '(ben fark olarak 2 kabul ettim sen 3 yada 4 yada 1 alabilirsin)
FAN=1
ELSE
FAN=0
ENDIF
belkide bu daha iyi bir yöntemdir. Denemek gerekir.
Gelelim ondalık meselesine. Hesaplanmış bir ısıs değerini 10 ile çarparak ondalık işlemi yapamazsın. Asıl işlem sensörden ilk sıcaklığı hesaplarken sonuç 10 ile çarpılmış olarak bulunmalıdır. Dolayısıyla karşılaştırmalar bu değerler üzerinden yapılırsa ondalıkl aişlem yapmış olacaksın. Bunada örnek vereyim.
Üst sensör bilgisini 238 (aslında 23,8 derece) olarak hesapladın. Alt sensör bilgisinide 224 olarak hesapladın. Burada karşılaştırmalar 238 ve 224 ile yapılarak ondalıklarıda devreye almış olursun. SOnuç olarak, IF 23,8>22,4 demek ile if 238>224 demek arasında fark yoktur.
Ete
Tamam hocam dediklerinizi çok iyi anladım ne yapacağımı biliyorum
Peki şu 18F serisi için program yazma hakkında bilginiz varmıydı nasıl yapmam gerekiyor
18F serisi için yapılacak işlem sırası ile şöyle,
Önce aşağıdaki sigorta ayarlarını programın başına ekle,
' device, 18F452
asm
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, _BOR_On_2L & _BORV_20_2L & _PWRT_OFF_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_On_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
20 MHz kristale göre verdim ayarları. daha düşük kullanırsan HS yerine XT seçilmesi gerekir.
Sonra MCS de View menüsünde "Compile & Program Options" seçeneğini seç
Gelen ekranda ortada yer alan Assembler butonuna tıkla ve çıkan ekranda Use MPASM kutucuğuna tıklayarak seçili hale getir.
Bundan sonra derlediğin işlemci 18F serisi olmalıdır. Diğer işlemciler için bu seçeneği yeniden iptal edip eskiye dönmelisin.
Bu şekilde programı derleyebilirsin.
Bir önceki mesajımda bir fark alma seçeneği daha ilave ettim gözünden kaçtı ise yeniden bakıver.
Ete
tamam hocam dediklerinizi anladım aslında ikinci formül birazdaha kafama yattı gerçi en iyisini deneyerek bulacağım elbette
18 f serisi için program yazmayıda anladım sigorta ayrları felan tabi bunun için bilgisayarda mpasm yüklü olması lazım galiba
Makinanda Proteus yüklü ise onun Tools klasörün de MPASM klasörü mevcuttur. Orayı gösterebilirsin.
Ben onu kullanırım daima.
Ete
hocam dediğiniz gibi yaptım derleyebiliyorum fakat program nedense çalışmıyor anlayamadım program derlenirken birsürü asm hatası veriyor
ama hexe çeviriyor nerede hata yapmış olabilirim hocam dosyaları ekliyeyim müsaitseniz bi bakın
sigorta ayarları aşağıdaki gibi
asm
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
__CONFIG _CONFIG2L, _BOR_On_2L & _BORV_20_2L & _PWRT_OFF_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_On_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
ama programın başına sizin gönderdiğiniz gibi device 18F452 yazınca orada hata veriyor
dosyalar
http://s1.dosya.tc/ieJ2ug/kulu_kaikisens_rl.rar.html
MPASM kullanınca işin içine protokol giriyor. Nedir bu dersen, P18F452.INC dosyasında sigorta ayarları ne şekilde yer alıyorsa senin programdakilerde aynı olmalı.
Bu yüzden ben hemen P18F452.INC dosyasına baktım (MPASM klasöründe yer almaktadır sonlara bakman gerek).
Bizim listede On yazan yer orada ON şeklinde yazılmış ve MPASM bunu hata olarak nitelendiriyor.
Bu hataları düzeltince hatasız derledi bende. Benim verdiğim liste Proteus 7.6 SP2 de yer alan MPASM ile ilgili idi.
asm
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_OFF_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
Bu arada program isimlerinde Türkçe karekter kullanma ayrıca program adlarında iki kelime arasında boşluk olmasın alttan çizgi ile birleştir en azından. CIFT_SENSOR şeklinde
Bu arada LCD portun program ile verdiğin şemada çakışmıyor. Birinde PortB şemada ise PortC kullanılmış. Bunları yada benzer hataları düzeltmen gerek.
Ete
merhabalar ete hocam kusura bakmayın mesaj yazmakta biraz geciktim
Hocam hala olmadı ben proteus 7.6 sp0 kullanıyorum sorun bundan olabilir diye microchipten mpasm indirip kurdum ve mcs ye gösterdim ama yine derlemedi hata veriyor nerede hata yapıyorum anlayamadım
bide şu ortalama alma işini anlayamadım sadece net ısı değerlerinin ortalamasını alabiliyorum ama virgülden sonraki değerle birlikte nasılortalama alınır bilmiyorum acaba virgülden önceki değerle sonraki değerlerin ayrı ayrımı ortalaması alınması gerek bu konuda bana yardımcı olurmusunuz sizin bildiğiniz bi formül varmı
Mucit,
Öncelikle nasıl bi,r hata çıkıyor görmem gerekiyor. Ona göre sorunu bulabiliriz. Yoksa tarifle bulmak zor. Gerekirse otur yaz yada ekran resmini kayıt et ve yolla bana.
Ortalama alma işine gelince, söylemiştim ondalıklı haneyide hesaba katmak istersen programındaki ısı hesp alt programına göre açıklama yapacağım.
Aşağıdaki satırlara bakarsan yanına' ********* şeklinde işaret koyduğum satırda ısı değerinin 10'a bölünmemiş hali yer almaktadır. İşte bu değeri kullanırsan ondalık hanesinide hesaba katmış olursun. Aynı şeyi diğer sensör içinde yapabilirsin aynı mantık 18B20 sensörünün hesabında da mevcut.
T1=(-4000+RAW)/100
T2=((-4000+RAW)//100)/10
Bu örnekte SHT11 den sıcaklık okuması yapılıyor ve sıcaklık değeri tam sayı kısmı T1 ve ondalık kısmıda T2 değişkenlerine yarleştiriliyor.
RAW değerinin 7550 olduğunu var sayarsak;
T1=(-4000+7550)/100=35 değerini buluruz. Bu hesabı şöyle yaparsak;
T1=(-4000+7550)/10= 355 değerini buluruz. İşte bizim ondalık hanesinide hesaba katacağımız değer bu olacaktır.
Çünki normal hesapta sıcaklık 35,5 derece olarak bulunacak idi. Bu şekilde elimizde 355 değeri bulunmakta ve bunu kullanarak ondalık hesabınıda devreye almış olacağız.
İstersen DS18B20 hesabınıda vereyim, Formülü ISI=HAM/16 şeklinde kullanırsak direk sıcaklığın tam sayı kısmını elde ederiz.
Ama şöyle kullanırsak;
ISI = (HAM*10)/16 sıcaklığın 10 ile çarpılmış halini dolayısıyla ondalık kısmınıda kullanmış oluruz. Dikkat edersen ham değeri 10 ile çarptığımız için ondalık hesabını yapabiliriz değilse seıcaklığı 10 kat artırmış oluruz yalnızca. Ama formatımız bu şekilde olmalıdır.
Ete
Merhabalar ete hocam hocam ortalama alma işini anladım artık buradan sorunum yok artık gerisin ben yaparım
18F derleme sorunuyla ilgilide hatanın resmini çekip vereyim 18F serisi için basit bi program yazdım
http://img94.imageshack.us/img94/2137/adszsae.jpg
Bide hocam size RB0 kesmesiyle ilgili bi sorum vardı şimdi kuluçka makinası projesinde ana programda çok fazla gosub komutu olduğu için yani program çok fazla şeye baktığı için menu tuşuna basar basmaz menüye girmiyor en az 3-4 saniye basılı tutmamız gerekiyorki girsin bu çok sinir bozucu bişey
Bende şöyle bişey yaptım menu tuşunu portb.0 a bağladım bu şekilde Rb0 kesmesiyle programı mana menü bölümüne yönlendirdim burada sorunum yoktu menude kesme pasif durumda olacak yine menü tuşunu normal olarak kullanmayı düşünüyordum menüye girebiliyorum ama menüden çıkamıyorum menüden çıktığım anda tekrar kesme oluşuyor ve yine menüye giriyor yani kesme oluşuyor bunu önlemek için ne yapmalıyım kesme ile ana menüye girdiğimde kesme pasif olacak ana menüde çıkıpm ana programa gere döndüğümde tekrar kesme aktif hale gelmesi lazım sizin bu konuda bi fikriniz varmı
Öncelikle 18F derleme ile ilgili problemini çözmeye çalışalım.
MCS de sanki yeni bir bas dosyası yüklermiş gibi,
PBP klasörü içinde bulunan 18F452,INC dosyasını yükle,
Muhtemelen aşağıdaki dosya ekrana gelecektir.
;****************************************************************
;* 18F452.INC *
;* *
;* By : Leonard Zerman, Jeff Schmoyer *
;* Notice : Copyright (c) 2005 microEngineering Labs, Inc. *
;* All Rights Reserved *
;* Date : 12/16/05 *
;* Version : 2.47 *
;* Notes : *
;****************************************************************
NOLIST
ifdef PM_USED
LIST
"Error: PM does not support this device. Use MPASM."
NOLIST
else
LIST
LIST p = 18F452, r = dec, w = -311, w = -230, f = inhx32
INCLUDE "P18F452.INC" ; MPASM Header
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
; __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
; __CONFIG _CONFIG4L, _LVP_OFF_4L
NOLIST
endif
LIST
EEPROM_START EQU 0F00000h
BLOCK_SIZE EQU 8
Bu dosyada görülen __CONFIG ..... ile başlayan bütün satırları yukarıda da gördüğün şekilde satır başına ; koyarak iptal et (silme)
sonra aynı dosyayı tekrar geri kayıt et.
Derleme esnasında hem bu INC dosyası hemde Proteusdaki INC dosyası kullanıldığı için çift işlem oluyor. Bu nedenle PBP içindeki config ayarlarını kapatıyoruz.
RB0 kesmesi kullanımına gelince, Programı vermemişsin bu nedenle sanal olarak yorum yapacağım.
Öncelikle Kesme alt programından ana program içine yönlendirme yapılamaz. RESUME (Etiket) şeklinde bir çıkış yapılabilir. Ancak pek tavsiye etmem. Bunun yerine bir işaret biti kullanırsan daha iyi çalışır.
PortB0 kesmesine girilince Menü (veya başka bir bit değişkenini set et (Menu=1) . Daha sonra kesmeden (RB0 kesme bayrağını sıfırlayarak) çık. Çalıştığın program içinde şayet Menu=1 ise Goto ANAMENU gibi bir satır ekle. Bu şekilde kesme içinde menüye dönüleceğini bir bit değişkeni ile belirlemiş olursun.
Programda da yapılan iş bitince ana menüye dönülmüş olur.
Kesme den sonra yeniden kesme oluşması demek kesme bayrağının sıfırlanmaması demektir yada yeniden kesme oluşturacak bir sebep yaratılmış demektir. Bu ihtimalleride elemelisin.
Ete
Hocam Allah sizden razı olsun siz olmasaydınız bunu çözmem imkansızdı.
şimdi hiç sorun çıkartmadan Derleniyor..
kuluçka makinasının ise son haliyle vereyim
'****************************************************************
'* Name : KULUÇKA.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [Desıgn by Ferhat YOL] *
'* : All Rights Reserved *
'* Date : 21.07.2010 *
'* Version : 2.0 *
'* Notes :Bu program Kuluçka makinesi için Ferhat YOL *
'* Tarafından yazılmıştır *
'****************************************************************
DEFINE OSC 8
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
TRISA=%111111
TRISB=%00000001
TRISC=%11110000
PORTA=0
PORTB=0
PORTC=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
ADCON1 = 7
'---------------------------değişkenler-----------------------------------------
A VAR BYTE
D VAR BYTE
E var byte
SYC VAR BYTE
AY var byte
YIL var byte
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
HAFTA VAR BYTE
GUN VAR BYTE
GUN1 VAR BYTE
MEM var byte
ONLAR VAR BYTE
BIRLER VAR BYTE
Y VAR BIT
SAYAC VAR BYTE
AYAR VAR BYTE
TERM VAR BYTE
NEM VAR BYTE
KONTROL VAR BYTE
ORTAK VAR BYTE
ISI1 VAR BYTE
ISI2 VAR BYTE
U1 VAR BYTE
U2 VAR BYTE
C0 VAR BYTE
Z VAR BYTE
SAYI VAR BYTE
SAY VAR BYTE
ZAM VAR BYTE
H0 VAR HAMISI.BYTE0
H1 VAR HAMISI.BYTE1
HAMISI VAR WORD
RAW var word
ISISHT VAR WORD
RUT VAR WORD
P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
C VAR WORD
B VAR WORD
W VAR WORD
ORTAISI VAR WORD
FARK VAR WORD
DUR VAR BYTE
CLK VAR PORTA.5
DTA VAR PORTA.3
ISARETSHT VAR BIT 'sensor değeri 0 ise artı, 1 ise eksi
SIGN VAR BIT 'ısı isareti 0 ise artı 1 ise eksi
HATA var BIT
MENU VAR PORTB.0
CIKIS VAR PORTA.0
YUKARI VAR PORTA.1
ASAGI VAR PORTA.2
'ISI
Busy VAR BIT ' Busy Status-Bit
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
ISARET_BITI VAR HAM.Bit11 ' +/- sıcaklık İşaret biti, 1 = olursa eksi sıcaklık
EKSI_ISI CON 1 ' Sıfır altında isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° işareti
ISARET VAR BYTE ' ISI değeri için +/- işaret
TEMP VAR BYTE ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1 ' One-wire Data-Pin "DQ" PortB.0 da
symbol ROLE1=PORTC.0
symbol ROLE2=PORTC.1
symbol ROLE3=PORTC.2
SYMBOL ROLE4=PORTC.3
SYMBOL BUZER=PORTC.7
RTC_RST var PORTC.5
RTC_CLK var PORTC.6
RTC_DTA var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------
LOW ROLE1
LOW ROLE2
LOW ROLE3
PAUSE 20
' CLEAR: 'TRISA=%00111111:TRISB=0
PAUSE 500:ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
LCDOUT $FE,$58,16,8,4,2,4,8,16,0 'LCD 3. KARAKTER HAFIZASI YON İŞARETİ
GIRIS:
LCDOUT $FE,$82, "OTOMATIK KULUCKA"
lcdout $FE,$C5,"MAKINESI"
lcdout $FE,$95,"TASARIM ve YAZILIM"
lcdout $FE,$D9,"FERHAT YOL"
PAUSE 2000
LCDOUT $FE,1
'-------------------------------------------------------------------------------
BASLANGIC:
READ $07,GUN:IF GUN=255 THEN GUN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $0,SAYI:IF SAYI=255 THEN SAYI=0
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
gosub ZAMAN_OKU
HIGH BUZER:PAUSE 50:LOW BUZER
BASLA:
KONTROL=%00000011:HAMISI=0 'SICAKLIK ÖLÇME
GOSUB OLCUMAL
Gosub ISIHESAP
KONTROL=%00000101:HAMISI=0 'RUTUBET ÖLÇME
GOSUB OLCUMAL
GOSUB RUTHESAP:GOSUB SENSOROKU
GOSUB ORTISI:GOSUB EKRAN1
GOSUB HAVAKONTROL
GOSUB ISIKONTROL
GOSUB RUTKONTROL
IF MENU=1 THEN AYARMENUSU
goto BASLA
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
GOSUB ZAMAN_OKU
GOSUB DONUSEBAK
GOSUB GUNEBAK
lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,0,"C NEM=%",DEC2 U1
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GUN,".GUN"
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN1,"/",DEC2 AY,"/",DEC2 YIL
IF SN=DUR THEN LOW ROLE3
IF SAAT=0 AND DAK=0 AND SN=0 THEN
GUN=GUN+1
IF GUN=31 THEN GUN=1
WRITE $07,GUN
ENDIF
RETURN
'''''''''''''''''MOTOR ÇALIŞ '''''''''''''''''
DONUSEBAK:
READ $10,ZAM
IF ZAM=255 THEN ZAM=1
IF ZAM=1 AND DAK=0 AND SN=0 THEN
HIGH ROLE3
ENDIF
IF ZAM=2 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=2 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=10 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=14 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=22 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=3 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=3 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=9 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=15 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=21 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=4 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
RETURN
GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
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
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
RETURN
'------------------------------- İŞLEM START -----------------------------------
T_START:
OUTPUT DTA:OUTPUT CLK
HIGH DTA
LOW CLK
PAUSE 1
HIGH CLK
LOW DTA
PAUSE 1
LOW CLK
PAUSE 1
HIGH CLK
PAUSE 1
HIGH DTA
LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
GOSUB T_Start
SHIFTOUT DTA,CLK,1,[KONTROL]
INPUT DTA
PULSOUT CLK,10
HATA=0
FOR W=0 to 65500
IF DTA=0 then GIT
NEXT W
HATA=1
GIT:
IF HATA=1 then
endif
SHIFTIN DTA,CLK,0,[H1]
OUTPUT DTA
LOW DTA
PULSOUT CLK,10
INPUT DTA
SHIFTIN DTA,CLK,0,[H0]
PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------
ISIHESAP:
If HAMISI<4000 then
ISARETSHT=1 'sıcaklık eksi değerde demek
ISI1=(4000-HAMISI)/100
ISI2=((4000-HAMISI)//100)/10
goto ISISON
endif
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
ISISON:
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
RETURN
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
'ISI=ISI1*10+ISI2
p1=(26542-(54722**HAMISI+hamISI))**HAMISI-25
P2=655+(HAMISI*5)+(HAMISI**15917)
P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1
U1=p3/10:U2=p3//10
IF HAMISI>3710 THEN
U1=0:U2=0
ENDIF
return
ORTISI:
ORTAISI=(ISI1*10+ISI*10)/20
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:
if TERM<ISI then
LOW Role1
ENDIF
if ISI<TERM then
HIGH ROLE1
Endif
RETURN
'----------------------------RUTKONTROL-----------------------------------------
RUTKONTROL:
if NEM<U1 then
HIGH Role2
ELSE
LOW ROLE2
ENDIF
RETURN
HAVAKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK
IF FARK>1 then
ROLE4=1
ELSE
ROLE4=0
ENDIF
RETURN
'-------------------------------------------------------------------------------
AYARMENUSU:
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SYC=SYC+1
IF SYC=6 THEN SYC=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SYC=SYC-1
IF SYC=255 THEN SYC=5
ENDIF
GOSUB DURUM
IF CIKIS=1 THEN GOTO BASLANGIC
GOTO AYARLAR
DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0," ISITICI AYARLARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0," NEM AYALARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0," CEViRiCi MOTOR "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0," SAAT-TARiH-GUN "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0," MANUEL OLARAK "
lcdout $fe,$94," MOTORU CEVIRME "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0," GUN AYARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
END SELECT
RETURN
MANUEL:
GOSUB TEMIZLE
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKLARIYA "
LCDOUT $FE,$94,"BASINIZ... "
IF CIKIS=1 then
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
IF YUKARI=1 THEN
lcdout $fe,$D4,"MOTOR CALISIYOR "
HIGH ROLE3
ELSE
lcdout $fe,$D4,"MOTOR KAPALI "
LOW ROLE3
ENDIF
GOTO MANU
GUNAYARI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $07,GUN
GUNA:
LCDOUT $FE,$80,"GUNU AYARLA"
lcdout $FE,$C0,"GUN:",DEC2 GUN
IF CIKIS=1 THEN AYARLANDI
WHILE CIKIS=1:WEND
IF YUKARI=1 THEN
GUN=GUN+1
IF GUN=31 THEN GUN=1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
GUN=GUN-1
IF GUN=255 THEN GUN=30
WHILE ASAGI=1:WEND
ENDIF
GOTO GUNA
''''''''''''''''''''''''''''''''''''''''
MOT_AYAR:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $0,SAYI:SAYI=0
MOTOR_AYAR:
lcdout $fe,$80,"MOTOR DURUMUNU"
LCDOUT $FE,$C0,"SECINIZ..."
lcdout $FE,$94," ACIK"
LCDOUT $FE,$D4," KAPALI"
IF MENU=1 THEN M_ZAMANI
WHILE MENU=1:WEND
IF YUKARI=1 THEN
SAYI=SAYI+1
WHILE YUKARI=1:WEND
ENDIF
IF SAYI=2 THEN SAYI=0
SELECT CASE SAYI
CASE 0
LCDOUT $FE,$94,3
CASE 1
LCDOUT $FE,$D4,3
END SELECT
GOTO MOTOR_AYAR
M_CALISMA:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $09,DUR
MOTO_CALISMA:
IF CIKIS=1 THEN AYARLANDI
WHILE CIKIS=1:WEND
lcdout $fe,$C0,"MOTOR CALISMA SURESi "
lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
IF YUKARI=1 THEN
DUR=DUR+1
WHILE YUKARI=1:WEND
ENDIF
IF DUR=60 THEN DUR=0
IF ASAGI=1 THEN
DUR=DUR-1
WHILE ASAGI=1:WEND
ENDIF
IF DUR=255 THEN DUR=59
GOTO MOTO_CALISMA
M_ZAMANI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $10,ZAM
MOTO_ZAMANI:
IF ZAM=255 THEN ZAM=1
IF YUKARI=1 THEN
ZAM=ZAM+1
WHILE YUKARI=1:WEND
ENDIF
IF ZAM=5 THEN ZAM=4
IF ASAGI=1 THEN
ZAM=ZAM-1
WHILE ASAGI=1:WEND
ENDIF
IF ZAM=0 THEN ZAM=1
IF MENU=1 THEN M_CALISMA
lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE"
lcdout $FE,$94,"BiR CEViREYiM"
GOTO MOTO_ZAMANI
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AYARLANDI:
IF MENU=1 then AYARLANDI
lcdout $fe,1
LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
WRITE $0,SAYI
WRITE $10,ZAM
WRITE $09,DUR
WRITE $07,GUN
WRITE $01,TERM
WRITE $02,NEM
WRITE $11,A
AYAR=1
PAUSE 1000
GOSUB TEMIZLE
goto AYARMENUSU
TEMIZLE:
lcdout $fe,1
RETURN
'-------------------------------------------------------------------------------
TERM_KONTROL:
GOSUB TEMIZLE
SET_AYAR
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A
IF YUKARI=1 then
A=A+1
IF A=10 THEN
A=0:TERM=TERM+1
ENDIF
IF TERM=100 THEN TERM=0
PAUSE 150
ENDIF
IF ASAGI=1 then
A=A-1
IF A=255 then
A=9:TERM=TERM-1
ENDIF
IF TERM=255 THEN TERM=99
PAUSE 150
ENDIF
IF CIKIS=1 THEN
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
GOTO SET_AYAR
'-------------------------------------------------------------------------------
NEM_KONTROL:
GOSUB TEMIZLE
NEM_KONT:
lcdout $fe,$C0,"NEM LiMiTi"
lcdout $FE,$94,"AYARI:",DEC2 NEM
IF YUKARI=1 then NEM=NEM+1
WHILE YUKARI=1:WEND
IF NEM=01 then NEM=121
IF ASAGI=1 then NEM=NEM-1
WHILE ASAGI=1:WEND
IF NEM=121 then NEM=01
IF CIKIS=1 THEN
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
GOTO NEM_KONT
RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMANAYARI:
GOSUB TEMIZLE
AYAR=1
ZAMANAYAR:
IF MENU=1 THEN
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
LCDOUT $FE,$80," ZAMAN AYARI "
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN1,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR
GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF
CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF
CASE 3
LCDOUT $FE,$C0,"GUN "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN1=GUN1+1
IF GUN1=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
GUN1=GUN1-1
IF GUN1=0 THEN GUN1=30
ENDIF
CASE 4
LCDOUT $FE,$C0,"AY "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
AY=AY-1
IF AY=0 THEN AY=12
ENDIF
CASE 5
LCDOUT $FE,$C0,"YIL "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF
CASE 6
LCDOUT $FE,$C0,"HAFTA "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN
ZAMAN_B:
IF MENU=1 then ZAMAN_B
AYAR=1
gosub ZAMAN_YAZ
GOSUB TEMIZLE
GOSUB AYARLANDI
goto AYARMENUSU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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, HAFTA, 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
MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
low RTC_RST
return
ZAMAN_YAZ:
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
MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
high RTC_RST
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, HAFTA, 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
END
Yanlız dediklerinizi pek anlayamadım nasıl yapacağımı bilmiyorum isterseniz bi programa bakın belki daha iyi bi yöntem söyleyebilirsiniz
Bu programda ben kesme göremedim acaba yanlış programmı verdin?
Üstelik programda o kadar çok pause varki bunu kesme kullanacak şekilde düzenlemek çok vakit alacak bir iş. Bütün o pauselerin yerine döngü şeklinde gecikme koyamk gerek. En büyük gecikme Pauseus 5 şeklinde olmalıki kesme alt programına çabuk girilebilsin aksi halde pauseler bitmeden kesme oluşmayacaktır. ANlayacağın kesme kullanman problemli olacak.
En iyisi menüye girişleri daha sık kontrol etmeye bak.
Ete
hocam doğru söylüyorsunuz en iyisi dediğiniz gibi daha çok menu giriş komutuna bakmak bunun içinde frekans yükseltilmeli ama frekansı yükselttiğimde yani 20 mhz düzelylerine çıkardığımda ne ds 18b20 çalışıyor nede sht11 hiçbirinde ölçüm yapılamıyor bunun sebebi ne olabilir sizce
Sensörler 20 Mhz de çalışır. Programa define osc 20 ilave etmen gerek. Ayrıca shift komutlarını yavaşlatacak define komutları var. Onalrıda ilave etmek gerekiyor programa. Define komutlarını incele istersen.
MCS de program yazarken Define yaz kursorü üzerine getir ve F1 tuşuna bas. Help ekranı karşına gelecektir.
Bu seçenek bütün komutlar için geçerli.
Ete
hocam son dediğinizi tam olrak anlayamadım tam olarak ne yapmam gerekiyor help menusunden defıne ile ilgili tüm komutları buldum bu komutlarla ne yapıcam
Define komutları içinde yalnızca shiftout YADA shiftin komutlarını yavaşlatacak komut mevcut buda;
DEFINE SHIFT_PAUSEUS 50 'Slow down the Shiftin and Shiftout clock
şeklinde kullanılıyor.
Ama esas ayarlamayı yapan Define OSC 20 komutudur.
Bu komutu ilave etmedi isen sensörler çalışmayabilir. Ama ilave edersen sorunsuz çalışırlar.
Ete
anlamıyorum hocam gerekli herşeyi yaptım ama nedense bi türlü programı yerine oturturamadım 20 mhz ye ayarladım ama nem sensörü çalışmıyor DS18B20 de yanlış ölçüyor çok yüksek gösteriyor yaptığım programın son olarak 20 mhz ye ayarlanmış haliye vereyim belki programla ilgili bi fikriniz veya tavsiyeniz olabilir
'****************************************************************
'* Name : KULUÇKA.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [Desıgn by Ferhat YOL] *
'* : All Rights Reserved *
'* Date : 21.07.2010 *
'* Version : 2.0 *
'* Notes :Bu program Kuluçka makinesi için Ferhat YOL *
'* Tarafından yazılmıştır *
'****************************************************************
DEFINE OSC 20
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, HS_OSC
TRISA=%111111
TRISB=%00000001
TRISC=%11110000
PORTA=0
PORTB=0
PORTC=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
DEFINE SHIFT_PAUSEUS 50
ADCON1 = 7
'---------------------------değişkenler-----------------------------------------
A VAR BYTE
D VAR BYTE
E var byte
SYC VAR BYTE
AY var byte
YIL var byte
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
HAFTA VAR BYTE
GUN VAR BYTE
MEM var byte
ONLAR VAR BYTE
BIRLER VAR BYTE
GN VAR BYTE
Y VAR BIT
SY VAR BIT
SAYI VAR BYTE
SAYAC VAR BYTE
AYAR VAR BYTE
TERM VAR BYTE
NEM VAR BYTE
KONTROL VAR BYTE
ORTAK VAR BYTE
ISI1 VAR BYTE
ISI2 VAR BYTE
U1 VAR BYTE
U2 VAR BYTE
C0 VAR BYTE
Z VAR BYTE
SAY VAR BYTE
ZAM VAR BYTE
H0 VAR HAMISI.BYTE0
H1 VAR HAMISI.BYTE1
HAMISI VAR WORD
RAW var word
ISISHT VAR WORD
RUT VAR WORD
P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
C VAR WORD
B VAR WORD
W VAR WORD
ORTAISI VAR WORD
FARK VAR WORD
DUR VAR BYTE
CLK VAR PORTA.5
DTA VAR PORTA.3
ISARETSHT VAR BIT 'sensor değeri 0 ise artı, 1 ise eksi
SIGN VAR BIT 'ısı isareti 0 ise artı 1 ise eksi
HATA var BIT
MENU VAR PORTA.0
YUKARI VAR PORTA.1
ASAGI VAR PORTA.2
'ISI
Busy VAR BIT ' Busy Status-Bit
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
ISARET_BITI VAR HAM.Bit11 ' +/- sıcaklık İşaret biti, 1 = olursa eksi sıcaklık
EKSI_ISI CON 1 ' Sıfır altında isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° işareti
ISARET VAR BYTE ' ISI değeri için +/- işaret
TEMP VAR BYTE ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1 ' One-wire Data-Pin "DQ" PortB.0 da
symbol ROLE1=PORTC.0
symbol ROLE2=PORTC.1
symbol ROLE3=PORTC.2
SYMBOL ROLE4=PORTC.3
SYMBOL BUZER=PORTC.7
RTC_RST var PORTC.5
RTC_CLK var PORTC.6
RTC_DTA var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------
LOW ROLE1
LOW ROLE2
LOW ROLE3
PAUSE 20
' CLEAR: 'TRISA=%00111111:TRISB=0
PAUSE 500:ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
LCDOUT $FE,$58,16,8,4,2,4,8,16,0 'LCD 3. KARAKTER HAFIZASI YON İŞARETİ
GIRIS:
LCDOUT $FE,$82, "OTOMATIK KULUCKA"
lcdout $FE,$C5,"MAKINESI"
lcdout $FE,$95,"TASARIM ve YAZILIM"
lcdout $FE,$D9,"FERHAT YOL"
PAUSE 2000
LCDOUT $FE,1
'-------------------------------------------------------------------------------
BASLANGIC:
SYC=0
AYAR=1
READ $07,GN:IF GN=255 THEN GN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $12,SY
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
gosub ZAMAN_OKU
BASLA:
KONTROL=%00000011:HAMISI=0 'SICAKLIK ÖLÇME
GOSUB OLCUMAL
Gosub ISIHESAP
KONTROL=%00000101:HAMISI=0 'RUTUBET ÖLÇME
GOSUB OLCUMAL
GOSUB RUTHESAP:GOSUB SENSOROKU
GOSUB ORTISI
GOSUB ZAMAN_OKU
GOSUB GUNEBAK
GOSUB EKRAN1
GOSUB HAVAKONTROL
GOSUB ISIKONTROL
GOSUB RUTKONTROL
IF SY=0 THEN
GOSUB DONUSEBAK
ENDIF
IF MENU=1 THEN
GOTO AYAR_MENUSU
WHILE MENU=1:WEND
ENDIF
goto BASLA
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,0,"C NEM=%",DEC2 U1
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GN,".GUN"
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
IF SN=DUR THEN LOW ROLE3
IF SAAT=0 AND DAK=0 AND SN=0 THEN
GN=GN+1
IF GN=31 THEN GN=1
WRITE $07,GN
ENDIF
RETURN
'''''''''''''''''MOTOR ÇALIŞ '''''''''''''''''
DONUSEBAK:
'HER SAAT BAŞI ÇEVİR
IF ZAM=1 AND DAK=0 AND SN=0 THEN
HIGH ROLE3
ENDIF
IF ZAM=2 THEN 'İKİ SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=2 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=10 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=14 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=22 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=3 THEN '3 SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=3 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=9 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=15 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=21 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=4 THEN '4 SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
RETURN
GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
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
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
RETURN
'------------------------------- İŞLEM START -----------------------------------
T_START:
OUTPUT DTA:OUTPUT CLK
HIGH DTA
LOW CLK
PAUSE 1
HIGH CLK
LOW DTA
PAUSE 1
LOW CLK
PAUSE 1
HIGH CLK
PAUSE 1
HIGH DTA
LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
GOSUB T_Start
SHIFTOUT DTA,CLK,1,[KONTROL]
INPUT DTA
PULSOUT CLK,10
HATA=0
FOR W=0 to 65500
IF DTA=0 then GIT
NEXT W
HATA=1
GIT:
IF HATA=1 then
endif
SHIFTIN DTA,CLK,0,[H1]
OUTPUT DTA
LOW DTA
PULSOUT CLK,10
INPUT DTA
SHIFTIN DTA,CLK,0,[H0]
PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------
ISIHESAP:
If HAMISI<4000 then
ISARETSHT=1 'sıcaklık eksi değerde demek
ISI1=(4000-HAMISI)/100
ISI2=((4000-HAMISI)//100)/10
goto ISISON
endif
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
ISISON:
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
RETURN
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
'ISI=ISI1*10+ISI2
p1=(26542-(54722**HAMISI+hamISI))**HAMISI-25
P2=655+(HAMISI*5)+(HAMISI**15917)
P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1
U1=p3/10:U2=p3//10
IF HAMISI>3710 THEN
U1=0:U2=0
ENDIF
return
ORTISI:
ORTAISI=(ISI1*10+ISI*10)/20
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:
if TERM<ISI then
LOW Role1
ENDIF
if ISI<TERM then
HIGH ROLE1
Endif
RETURN
'----------------------------RUTKONTROL-----------------------------------------
RUTKONTROL:
if NEM<U1 then
HIGH Role2
ELSE
LOW ROLE2
ENDIF
RETURN
HAVAKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK
IF FARK>1 then
ROLE4=1
ELSE
ROLE4=0
ENDIF
RETURN
'-------------------------------------------------------------------------------
AYAR_MENUSU:
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SYC=SYC+1
IF SYC=7 THEN SYC=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SYC=SYC-1
IF SYC=255 THEN SYC=6
ENDIF
GOSUB DURUM
GOTO AYARLAR
DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0," ISITICI AYARLARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0," NEM AYALARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0," CEViRiCi MOTOR "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0," SAAT-TARiH-GUN "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0," MANUEL OLARAK "
lcdout $fe,$94," MOTORU CEVIRME "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0," GUN AYARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
CASE 6
lcdout $fe,$c0," MENUDEN CIKIS "
LCDOUT $FE,$94," "
IF MENU=1 THEN BASLANGIC
END SELECT
RETURN
MANUEL:
GOSUB TEMIZLE
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKLARIYA "
LCDOUT $FE,$94,"BASINIZ... "
IF MENU=1 then
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 THEN
lcdout $fe,$D4,"MOTOR CALISIYOR "
HIGH ROLE3
ELSE
lcdout $fe,$D4,"MOTOR KAPALI "
LOW ROLE3
ENDIF
GOTO MANU
GUNAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
READ $07,GN
GUNA:
LCDOUT $FE,$80,"GUNU AYARLA"
lcdout $FE,$C0,"GUN:",DEC2 GN
IF MENU=1 THEN
WRITE $07,GN:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 THEN
GN=GN+1
IF GN=31 THEN GN=1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
GN=GN-1
IF GN=0 THEN GN=30
WHILE ASAGI=1:WEND
ENDIF
GOTO GUNA
''''''''''''''''''''''''''''''''''''''''
MOT_AYAR:
WHILE MENU=1:WEND
GOSUB TEMIZLE
READ $12,SY
MOTOR_AYAR:
lcdout $fe,$80,"MOTOR DURUMUNU"
LCDOUT $FE,$C0,"SECINIZ..."
lcdout $FE,$94," ACIK"
LCDOUT $FE,$D4," KAPALI"
IF MENU=1 THEN
WRITE $12,SY:PAUSE 2
GOTO M_ZAMANI
ENDIF
IF YUKARI=1 then SY=0
IF ASAGI=1 THEN SY=1
SELECT CASE SY
CASE 0
LCDOUT $FE,$94,3
CASE 1
LCDOUT $FE,$D4,3
END SELECT
GOTO MOTOR_AYAR
M_CALISMA:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $09,DUR
MOTO_CALISMA:
IF MENU=1 THEN
WRITE $09,DUR:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
lcdout $fe,$C0,"MOTOR CALISMA SURESi "
lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
IF YUKARI=1 THEN
DUR=DUR+1
WHILE YUKARI=1:WEND
ENDIF
IF DUR=60 THEN DUR=0
IF ASAGI=1 THEN
DUR=DUR-1
WHILE ASAGI=1:WEND
ENDIF
IF DUR=255 THEN DUR=59
GOTO MOTO_CALISMA
M_ZAMANI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $10,ZAM
MOTO_ZAMANI:
IF ZAM=255 THEN ZAM=1
IF YUKARI=1 THEN
ZAM=ZAM+1
WHILE YUKARI=1:WEND
ENDIF
IF ZAM=5 THEN ZAM=4
IF ASAGI=1 THEN
ZAM=ZAM-1
WHILE ASAGI=1:WEND
ENDIF
IF ZAM=0 THEN ZAM=1
IF MENU=1 THEN
WRITE $10,ZAM:PAUSE 2
GOTO M_CALISMA
ENDIF
lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE BiR"
lcdout $FE,$94,"CEVRiLSiN.."
GOTO MOTO_ZAMANI
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AYARLANDI:
IF MENU=1 then AYARLANDI
lcdout $fe,1
LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
AYAR=1
SYC=0
PAUSE 1000
GOSUB TEMIZLE
goto BASLANGIC
TEMIZLE:
lcdout $fe,1
RETURN
'-------------------------------------------------------------------------------
TERM_KONTROL:
GOSUB TEMIZLE
READ $01,TERM:READ $11,A
SET_AYAR:
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A
IF YUKARI=1 then
A=A+1
IF A=10 THEN
A=0:TERM=TERM+1
ENDIF
IF TERM=100 THEN TERM=0
PAUSE 150
ENDIF
IF ASAGI=1 then
A=A-1
IF A=255 then
A=9:TERM=TERM-1
ENDIF
IF TERM=255 THEN TERM=99
PAUSE 150
ENDIF
IF MENU=1 THEN
WRITE $01,TERM:PAUSE 2
WRITE $11,A:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
GOTO SET_AYAR
'-------------------------------------------------------------------------------
NEM_KONTROL:
GOSUB TEMIZLE
READ $02,NEM
NEM_KONT:
lcdout $fe,$C0,"NEM LiMiTi"
lcdout $FE,$94,"AYARI:",DEC2 NEM
IF YUKARI=1 then NEM=NEM+1
WHILE YUKARI=1:WEND
IF NEM=01 then NEM=121
IF ASAGI=1 then NEM=NEM-1
WHILE ASAGI=1:WEND
IF NEM=121 then NEM=01
IF MENU=1 THEN
WRITE $02,NEM:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
GOTO NEM_KONT
RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMANAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
ZAMANAYAR:
IF MENU=1 THEN
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
LCDOUT $FE,$80," ZAMAN AYARI "
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR
GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF
CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF
CASE 3
LCDOUT $FE,$C0,"GUN "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN=GUN+1
IF GUN=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
GUN=GUN-1
IF GUN=0 THEN GUN=30
ENDIF
CASE 4
LCDOUT $FE,$C0,"AY "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
AY=AY-1
IF AY=0 THEN AY=12
ENDIF
CASE 5
LCDOUT $FE,$C0,"YIL "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF
CASE 6
LCDOUT $FE,$C0,"HAFTA "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN
ZAMAN_B:
IF MENU=1 then ZAMAN_B
gosub ZAMAN_YAZ
goto AYAR_MENUSU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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, HAFTA, 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
MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
low RTC_RST
return
ZAMAN_YAZ:
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
MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
high RTC_RST
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, HAFTA, 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
END
Alıntı yapılan: mucit23 - 23 Temmuz 2010, 18:28:54
Hocam Allah sizden razı olsun siz olmasaydınız bunu çözmem imkansızdı.
şimdi hiç sorun çıkartmadan Derleniyor..
kuluçka makinasının ise son haliyle vereyim
'****************************************************************
'* Name : KULUÇKA.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [Desıgn by Ferhat YOL] *
'* : All Rights Reserved *
'* Date : 21.07.2010 *
'* Version : 2.0 *
'* Notes :Bu program Kuluçka makinesi için Ferhat YOL *
'* Tarafından yazılmıştır *
'****************************************************************
DEFINE OSC 8
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
TRISA=%111111
TRISB=%00000001
TRISC=%11110000
PORTA=0
PORTB=0
PORTC=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
ADCON1 = 7
'---------------------------değişkenler-----------------------------------------
A VAR BYTE
D VAR BYTE
E var byte
SYC VAR BYTE
AY var byte
YIL var byte
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
HAFTA VAR BYTE
GUN VAR BYTE
GUN1 VAR BYTE
MEM var byte
ONLAR VAR BYTE
BIRLER VAR BYTE
Y VAR BIT
SAYAC VAR BYTE
AYAR VAR BYTE
TERM VAR BYTE
NEM VAR BYTE
KONTROL VAR BYTE
ORTAK VAR BYTE
ISI1 VAR BYTE
ISI2 VAR BYTE
U1 VAR BYTE
U2 VAR BYTE
C0 VAR BYTE
Z VAR BYTE
SAYI VAR BYTE
SAY VAR BYTE
ZAM VAR BYTE
H0 VAR HAMISI.BYTE0
H1 VAR HAMISI.BYTE1
HAMISI VAR WORD
RAW var word
ISISHT VAR WORD
RUT VAR WORD
P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
C VAR WORD
B VAR WORD
W VAR WORD
ORTAISI VAR WORD
FARK VAR WORD
DUR VAR BYTE
CLK VAR PORTA.5
DTA VAR PORTA.3
ISARETSHT VAR BIT 'sensor değeri 0 ise artı, 1 ise eksi
SIGN VAR BIT 'ısı isareti 0 ise artı 1 ise eksi
HATA var BIT
MENU VAR PORTB.0
CIKIS VAR PORTA.0
YUKARI VAR PORTA.1
ASAGI VAR PORTA.2
'ISI
Busy VAR BIT ' Busy Status-Bit
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
ISARET_BITI VAR HAM.Bit11 ' +/- sıcaklık İşaret biti, 1 = olursa eksi sıcaklık
EKSI_ISI CON 1 ' Sıfır altında isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° işareti
ISARET VAR BYTE ' ISI değeri için +/- işaret
TEMP VAR BYTE ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1 ' One-wire Data-Pin "DQ" PortB.0 da
symbol ROLE1=PORTC.0
symbol ROLE2=PORTC.1
symbol ROLE3=PORTC.2
SYMBOL ROLE4=PORTC.3
SYMBOL BUZER=PORTC.7
RTC_RST var PORTC.5
RTC_CLK var PORTC.6
RTC_DTA var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------
LOW ROLE1
LOW ROLE2
LOW ROLE3
PAUSE 20
' CLEAR: 'TRISA=%00111111:TRISB=0
PAUSE 500:ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
LCDOUT $FE,$58,16,8,4,2,4,8,16,0 'LCD 3. KARAKTER HAFIZASI YON İŞARETİ
GIRIS:
LCDOUT $FE,$82, "OTOMATIK KULUCKA"
lcdout $FE,$C5,"MAKINESI"
lcdout $FE,$95,"TASARIM ve YAZILIM"
lcdout $FE,$D9,"FERHAT YOL"
PAUSE 2000
LCDOUT $FE,1
'-------------------------------------------------------------------------------
BASLANGIC:
READ $07,GUN:IF GUN=255 THEN GUN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $0,SAYI:IF SAYI=255 THEN SAYI=0
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
gosub ZAMAN_OKU
HIGH BUZER:PAUSE 50:LOW BUZER
BASLA:
KONTROL=%00000011:HAMISI=0 'SICAKLIK ÖLÇME
GOSUB OLCUMAL
Gosub ISIHESAP
KONTROL=%00000101:HAMISI=0 'RUTUBET ÖLÇME
GOSUB OLCUMAL
GOSUB RUTHESAP:GOSUB SENSOROKU
GOSUB ORTISI:GOSUB EKRAN1
GOSUB HAVAKONTROL
GOSUB ISIKONTROL
GOSUB RUTKONTROL
IF MENU=1 THEN AYARMENUSU
goto BASLA
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
GOSUB ZAMAN_OKU
GOSUB DONUSEBAK
GOSUB GUNEBAK
lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,0,"C NEM=%",DEC2 U1
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GUN,".GUN"
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN1,"/",DEC2 AY,"/",DEC2 YIL
IF SN=DUR THEN LOW ROLE3
IF SAAT=0 AND DAK=0 AND SN=0 THEN
GUN=GUN+1
IF GUN=31 THEN GUN=1
WRITE $07,GUN
ENDIF
RETURN
'''''''''''''''''MOTOR ÇALIŞ '''''''''''''''''
DONUSEBAK:
READ $10,ZAM
IF ZAM=255 THEN ZAM=1
IF ZAM=1 AND DAK=0 AND SN=0 THEN
HIGH ROLE3
ENDIF
IF ZAM=2 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=2 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=10 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=14 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=22 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=3 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=3 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=9 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=15 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=21 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=4 THEN
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
RETURN
GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
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
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
RETURN
'------------------------------- İŞLEM START -----------------------------------
T_START:
OUTPUT DTA:OUTPUT CLK
HIGH DTA
LOW CLK
PAUSE 1
HIGH CLK
LOW DTA
PAUSE 1
LOW CLK
PAUSE 1
HIGH CLK
PAUSE 1
HIGH DTA
LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
GOSUB T_Start
SHIFTOUT DTA,CLK,1,[KONTROL]
INPUT DTA
PULSOUT CLK,10
HATA=0
FOR W=0 to 65500
IF DTA=0 then GIT
NEXT W
HATA=1
GIT:
IF HATA=1 then
endif
SHIFTIN DTA,CLK,0,[H1]
OUTPUT DTA
LOW DTA
PULSOUT CLK,10
INPUT DTA
SHIFTIN DTA,CLK,0,[H0]
PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------
ISIHESAP:
If HAMISI<4000 then
ISARETSHT=1 'sıcaklık eksi değerde demek
ISI1=(4000-HAMISI)/100
ISI2=((4000-HAMISI)//100)/10
goto ISISON
endif
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
ISISON:
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
RETURN
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
'ISI=ISI1*10+ISI2
p1=(26542-(54722**HAMISI+hamISI))**HAMISI-25
P2=655+(HAMISI*5)+(HAMISI**15917)
P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1
U1=p3/10:U2=p3//10
IF HAMISI>3710 THEN
U1=0:U2=0
ENDIF
return
ORTISI:
ORTAISI=(ISI1*10+ISI*10)/20
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:
if TERM<ISI then
LOW Role1
ENDIF
if ISI<TERM then
HIGH ROLE1
Endif
RETURN
'----------------------------RUTKONTROL-----------------------------------------
RUTKONTROL:
if NEM<U1 then
HIGH Role2
ELSE
LOW ROLE2
ENDIF
RETURN
HAVAKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK
IF FARK>1 then
ROLE4=1
ELSE
ROLE4=0
ENDIF
RETURN
'-------------------------------------------------------------------------------
AYARMENUSU:
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SYC=SYC+1
IF SYC=6 THEN SYC=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SYC=SYC-1
IF SYC=255 THEN SYC=5
ENDIF
GOSUB DURUM
IF CIKIS=1 THEN GOTO BASLANGIC
GOTO AYARLAR
DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0," ISITICI AYARLARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0," NEM AYALARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0," CEViRiCi MOTOR "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0," SAAT-TARiH-GUN "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0," MANUEL OLARAK "
lcdout $fe,$94," MOTORU CEVIRME "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0," GUN AYARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
END SELECT
RETURN
MANUEL:
GOSUB TEMIZLE
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKLARIYA "
LCDOUT $FE,$94,"BASINIZ... "
IF CIKIS=1 then
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
IF YUKARI=1 THEN
lcdout $fe,$D4,"MOTOR CALISIYOR "
HIGH ROLE3
ELSE
lcdout $fe,$D4,"MOTOR KAPALI "
LOW ROLE3
ENDIF
GOTO MANU
GUNAYARI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $07,GUN
GUNA:
LCDOUT $FE,$80,"GUNU AYARLA"
lcdout $FE,$C0,"GUN:",DEC2 GUN
IF CIKIS=1 THEN AYARLANDI
WHILE CIKIS=1:WEND
IF YUKARI=1 THEN
GUN=GUN+1
IF GUN=31 THEN GUN=1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
GUN=GUN-1
IF GUN=255 THEN GUN=30
WHILE ASAGI=1:WEND
ENDIF
GOTO GUNA
''''''''''''''''''''''''''''''''''''''''
MOT_AYAR:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $0,SAYI:SAYI=0
MOTOR_AYAR:
lcdout $fe,$80,"MOTOR DURUMUNU"
LCDOUT $FE,$C0,"SECINIZ..."
lcdout $FE,$94," ACIK"
LCDOUT $FE,$D4," KAPALI"
IF MENU=1 THEN M_ZAMANI
WHILE MENU=1:WEND
IF YUKARI=1 THEN
SAYI=SAYI+1
WHILE YUKARI=1:WEND
ENDIF
IF SAYI=2 THEN SAYI=0
SELECT CASE SAYI
CASE 0
LCDOUT $FE,$94,3
CASE 1
LCDOUT $FE,$D4,3
END SELECT
GOTO MOTOR_AYAR
M_CALISMA:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $09,DUR
MOTO_CALISMA:
IF CIKIS=1 THEN AYARLANDI
WHILE CIKIS=1:WEND
lcdout $fe,$C0,"MOTOR CALISMA SURESi "
lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
IF YUKARI=1 THEN
DUR=DUR+1
WHILE YUKARI=1:WEND
ENDIF
IF DUR=60 THEN DUR=0
IF ASAGI=1 THEN
DUR=DUR-1
WHILE ASAGI=1:WEND
ENDIF
IF DUR=255 THEN DUR=59
GOTO MOTO_CALISMA
M_ZAMANI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $10,ZAM
MOTO_ZAMANI:
IF ZAM=255 THEN ZAM=1
IF YUKARI=1 THEN
ZAM=ZAM+1
WHILE YUKARI=1:WEND
ENDIF
IF ZAM=5 THEN ZAM=4
IF ASAGI=1 THEN
ZAM=ZAM-1
WHILE ASAGI=1:WEND
ENDIF
IF ZAM=0 THEN ZAM=1
IF MENU=1 THEN M_CALISMA
lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE"
lcdout $FE,$94,"BiR CEViREYiM"
GOTO MOTO_ZAMANI
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AYARLANDI:
IF MENU=1 then AYARLANDI
lcdout $fe,1
LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
WRITE $0,SAYI
WRITE $10,ZAM
WRITE $09,DUR
WRITE $07,GUN
WRITE $01,TERM
WRITE $02,NEM
WRITE $11,A
AYAR=1
PAUSE 1000
GOSUB TEMIZLE
goto AYARMENUSU
TEMIZLE:
lcdout $fe,1
RETURN
'-------------------------------------------------------------------------------
TERM_KONTROL:
GOSUB TEMIZLE
SET_AYAR
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A
IF YUKARI=1 then
A=A+1
IF A=10 THEN
A=0:TERM=TERM+1
ENDIF
IF TERM=100 THEN TERM=0
PAUSE 150
ENDIF
IF ASAGI=1 then
A=A-1
IF A=255 then
A=9:TERM=TERM-1
ENDIF
IF TERM=255 THEN TERM=99
PAUSE 150
ENDIF
IF CIKIS=1 THEN
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
GOTO SET_AYAR
'-------------------------------------------------------------------------------
NEM_KONTROL:
GOSUB TEMIZLE
NEM_KONT:
lcdout $fe,$C0,"NEM LiMiTi"
lcdout $FE,$94,"AYARI:",DEC2 NEM
IF YUKARI=1 then NEM=NEM+1
WHILE YUKARI=1:WEND
IF NEM=01 then NEM=121
IF ASAGI=1 then NEM=NEM-1
WHILE ASAGI=1:WEND
IF NEM=121 then NEM=01
IF CIKIS=1 THEN
WHILE CIKIS=1:WEND
GOTO AYARLANDI
ENDIF
GOTO NEM_KONT
RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMANAYARI:
GOSUB TEMIZLE
AYAR=1
ZAMANAYAR:
IF MENU=1 THEN
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
LCDOUT $FE,$80," ZAMAN AYARI "
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN1,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR
GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF
CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF
CASE 3
LCDOUT $FE,$C0,"GUN "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN1=GUN1+1
IF GUN1=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
GUN1=GUN1-1
IF GUN1=0 THEN GUN1=30
ENDIF
CASE 4
LCDOUT $FE,$C0,"AY "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
AY=AY-1
IF AY=0 THEN AY=12
ENDIF
CASE 5
LCDOUT $FE,$C0,"YIL "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF
CASE 6
LCDOUT $FE,$C0,"HAFTA "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN
ZAMAN_B:
IF MENU=1 then ZAMAN_B
AYAR=1
gosub ZAMAN_YAZ
GOSUB TEMIZLE
GOSUB AYARLANDI
goto AYARMENUSU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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, HAFTA, 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
MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
low RTC_RST
return
ZAMAN_YAZ:
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
MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
high RTC_RST
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, HAFTA, 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
END
Yanlız dediklerinizi pek anlayamadım nasıl yapacağımı bilmiyorum isterseniz bi programa bakın belki daha iyi bi yöntem söyleyebilirsiniz
hocam bu program isiste düzgün çalışıyo menüye geç girmesi dışında birde gün ayarı sorunlu onun dışında bi sorunu yok
gün 1 yapmama rağmen ana ekranda dün 26.gün yazıyodu bugün 27.gün yazıyo zannedersem rtc den alıyo gün bilgisini
birde bu programın baskı devresini yaptınızmı öncekini editleyeyim dedim ama pek düzgün olmadı
son gönderdiğim mesajdaki projramdaki sorunlar çözülmüştür bunu kullanabilirsiniz ama osc frekansını 4 mhz ye düşürmelisiniz şimdilik 4 mhz de daha düzgün çalışıyor eğer imkanınız varsa program gereçk ortamda deneyip sonuçları bildirirseniz sorunlar hakkında bana daha yardımcı olur
sayın mucit 23 devreyi kurup deneyecegim fakat şemada 452 var programda 877 hangisi dogru olanı?
isis cizimini ve kaynak kodunu bir arada verirsen iyi olur.
arkadaşlar programın son hali ile dosyalarını veriyorum kaynak kodu ve isis çizimleri mevcuttur sizden ricam eğer deneyecek olan arkadaşlar varsa bana gözlemlerini bildirmesini istiyorum bu verdiğim son haliyle çift sensörlü olandır simülasyonda saat biraz yavaş çalışıyor ama gerçekte normal hızıyla çalışacağını umuyorum
http://www.upload.gen.tr/d.php/s13/jof9xnfb/kulu__ka_son_hali.rar.html (http://www.upload.gen.tr/d.php/s13/jof9xnfb/kulu__ka_son_hali.rar.html)
Mucit23 hocam verdiğin isis bende çalışmadı iznin olursa bendekini vereyim emeklerin için teşekkürler
http://rapidshare.com/files/409384893/son.rar.html
Önümüzdeki günlerde devreyi kurup çalıştırmayı düşünüyorum ama iki haftaan önce zor gibi işler nedeniyle. yapınca sonuçları yazarım buraya
bu arada geçtiğimiz cumartesi 24 bıldırcın yumurtasından 16 tanesi çıktı pazar günüde 43 tavuk yumurtasından 32 si çıktı
ama birde üzücü haber var bıldırcınlardan 4 tanesini kediye kaptırdık :( :-[
proteus olarak 7.6spo kullanıyorum belki ondan açamamışsındır benim için sorun değil herkes istediği gibi paylaşsın faydalansın bişeyler öğrensin istiyorum bu tür projelerden para kazanma gibi bi niyetim yok
şu anda makinamda kullandığım termostat devresi DS18B20 ve 16f628 ile yapıldı motor için ise küçük delikli plakete 16f628 koydum basit bide program yazmaya çalıştım saatte 1 kere 3 saniye motoru çalıştırıyo. makinanın kendiside eski bulaşık makinası
Yorulmaz06 ısıtmayı nasıl hallettin
1 adet 50 watt ampul birazda elektrikli battaniye rezistansı kullandım
Bir arkadaş demiş ki;elk.battaniye rezinstansı ve 100w 2 adet ampül 1 ay boyunca 250 lira gelmiş fatura:) böyle bişey mümkün değil.sende ne alemde
Dikkat etmedim ama en fazla 20 tl farketmiştir.
Zaten makina 20 -30 saniye açık kalıyo 3 - 3,5 dakikada kapalı kalıyo
o arkadaş ya çok büyük makinası var yada yalıtımı kötü 2 tane 100w ampul fırın gibi yapar benim makinayı
Alıntı yapılan: ete - 24 Temmuz 2010, 18:17:01
Define komutları içinde yalnızca shiftout YADA shiftin komutlarını yavaşlatacak komut mevcut buda;
DEFINE SHIFT_PAUSEUS 50 'Slow down the Shiftin and Shiftout clock
şeklinde kullanılıyor.
Ama esas ayarlamayı yapan Define OSC 20 komutudur.
Bu komutu ilave etmedi isen sensörler çalışmayabilir. Ama ilave edersen sorunsuz çalışırlar.
Ete
merhabalar ETE hocam
hocam konu başlığından farklı ama size bişey sormak istiyorum ;
picin adc kanalları ile 3 fazlı sistemde her fazın gelirimini ölçüp ekrana yansıtmak istiyorum internette biraz araştırma yaparak 220 vot gelirimi aşağıdaki şema ile picin anlayacağı gelirime dönüştürebildim
[IMG]http://img411.imageshack.us/img411/4162/adszuap.jpg[/img] (http://img411.imageshack.us/i/adszuap.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
ama ADC ile ölçyüğümüz ham değerini nasıl volt olarsk hesaplıyacam bunu bilmiyorum bu konuda bana yardımcı olursanız sevinirim ayrıca bu gibi yüksek voltaj ölçümü gereken yerlerde True-RMS diye bir sistem kullanılıyormuş.İnternette biraz araştırma yaptım ama kayde değer bi kaynak bulamadım bu konuda sizin bi bilginiz varsa beni bilgilendirirseniz sevinirim
Benzer bir işte ben 2 watt 5V luk bir trafo kullandım. Trafo çıkışını 5V seviyesine getirip onuda pic'e girerek (doğrultup) ölçüm yaptım.
Bu şekilde hem daha emniyetli hem daha stabil. Hesap şeklinde şöyle olabilir.
Pic'e 5V geldiğinde AC volt karşılığı 300V olsun.
Bu durumda 220V AC de pic ADC girişine daha düşük bir voltaj gelecektir.
Trafo seni yanıltmasın. Gerilim düştüğünde yada arttığında tarfo çıkışıda paralel artıp düşmektedir.
TRUE RMS bir alternatif akım sinyalinin ölçümünde onun DC karşılığınında değerlendirilmesi şeklinde diye biliyorum. Daha fazla bilgi için daha iyi bilen birisine sormanda yarar var. Nede olsa benim konum değil.
Ama sinüs işaretlerinde RMS çevirimi için şu formüller kullanılıyormuş.
* RMS değeri = 0.707 x Tepe değeri
Bana kalırsa bu teorik bilgiler içinde kaybolma. Sana lazım olan şebeke voltajının değeri öyle değilmi.
Sonuçta multimetren ile ölçtüğünde 219V gibi bir değer alıyorsan aynı değeri pic devrende vermeli benim için esas olan budur.
Bunuda benim tarif ettiğim gibi yaparsan sonuç alırsın.
Ete
trafo benimde aklıma yattı aslında dediğiniz gibi daha emniyetli olur ama bu şekilde trafolar varmıdır yada sizin tarifinize uygun trafoyu nereden temin edebilirim
Kart üzerine monte 2-3 wattlık bir trafo işini görür. Piyasada sarı renkli trafolar var onlardan birini alabilirsin.
İllaki voltaj tutacak diyede bir şey yok. Nasıl olsa trafo çıkışını doğrultup bir gerilim bölücü yapacaksın. Bu nedenle hiç bulamaz isen 6V AC trafo bile olur. İdeali sanırım 4,5V yada 3V çıkışlı trafo olur.
Ete
merhabalar ete hocam
hocam kuluçka makinasının son haliyle pcb yi hazırladım malzemeleri yerleştirdim fakat bi sorun var devre üzerinde pic çalışmıyor.Nedense lcdde karelerden başka bişey gözükmüyor benim bildiğim kadarıyla pic çalışmayınca lcdde kareler çıkar.
iki adet 16F877 ile denedim ikisindede aynı sorun var pic bozuk desem programlayıcı sorun çıkarmada pice programı yüklüyor.Anlayamadım doğrusu simülasyonda program çok iyi çalışıyor.
acabada pcb de mi hata yaptım defalarca incelememe rağmen bi hata bulamadım picin besleme bacaklarında 5 volt var .beslemedede sorun yok gibi belki benim gözümden kaçmıştır bide sizler bakın pcb ye
Acaba rogramdamı sorun var ama simülasyonda çalışıyor acaba 16f877 için çok mu ağır oldu program daha programda bir kelime bile yazacak yer kalmadı 8045 words boyutunda oldu gerçi sorunsuz derleniyor program ama bilmiyorum belki başka bişey vardır.
aynı işlemcilerle ufak bi devre üzerindeki röleleri 50 ms aralıklarla açıp kapayacak şekilde ufak bi program yazdım ; Simülasyonda çalışıyor pice sorunsuz yüklendi ama gerçekte çalışmıyor.Ne yapacağımı şaşırdım doğrusu sizin yardımlarınız ihtiyacım var
program en son haliyle aşağıdaki gibi bi bakın isterseniz belki programdada sorun olabilir
'****************************************************************
'* Name : KULUÇKA.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [Desıgn by Ferhat YOL] *
'* : All Rights Reserved *
'* Date : 21.07.2010 *
'* Version : 2.0 *
'* Notes :Bu program Kuluçka makinesi için Ferhat YOL *
'* Tarafından yazılmıştır *
'****************************************************************
DEFINE OSC 4
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
TRISA=%111111
TRISB=%00000001
TRISC=%11110000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
ADCON1 = 7
'---------------------------değişkenler-----------------------------------------
A VAR BYTE
D VAR BYTE
E var byte
SYC VAR BYTE
AY var byte
YIL var byte
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
HAFTA VAR BYTE
GUN VAR BYTE
MEM var byte
ONLAR VAR BYTE
BIRLER VAR BYTE
GN VAR BYTE
ZAMAN VAR BYTE
Y VAR BIT
SY VAR BIT
AYR VAR BIT
AYAR_D VAR BIT
SAYI VAR BYTE
SAYAC VAR BYTE
AYAR VAR BYTE
TERM VAR BYTE
NEM VAR BYTE
KONTROL VAR BYTE
ORTAK VAR BYTE
CNY VAR BYTE
ISI1 VAR BYTE
ISI2 VAR BYTE
U1 VAR BYTE
U2 VAR BYTE
C0 VAR BYTE
Z VAR BYTE
SAY VAR BYTE
ZAM VAR BYTE
H0 VAR HAMISI.BYTE0
H1 VAR HAMISI.BYTE1
HAMISI VAR WORD
RAW var word
ISISHT VAR WORD
RUT VAR WORD
P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
C VAR WORD
B VAR WORD
W VAR WORD
ORTAISI VAR WORD
FARK VAR WORD
DUR VAR BYTE
CLK VAR PORTA.5
DTA VAR PORTA.3
ISARETSHT VAR BIT 'sensor değeri 0 ise artı, 1 ise eksi
SIGN VAR BIT 'ısı isareti 0 ise artı 1 ise eksi
HATA var BIT
MENU VAR PORTA.0
YUKARI VAR PORTA.1
ASAGI VAR PORTA.2
'ISI
Busy VAR BIT ' Busy Status-Bit
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
ISARET_BITI VAR HAM.Bit11 ' +/- sıcaklık İşaret biti, 1 = olursa eksi sıcaklık
EKSI_ISI CON 1 ' Sıfır altında isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° işareti
ISARET VAR BYTE ' ISI değeri için +/- işaret
TEMP VAR BYTE ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1 ' One-wire Data-Pin "DQ" PortB.0 da
symbol ROLE1=PORTC.0
symbol ROLE2=PORTC.1
symbol ROLE3=PORTC.2
SYMBOL ROLE4=PORTC.3
SYMBOL BUZER=PORTE.0
RTC_RST var PORTC.5
RTC_CLK var PORTC.6
RTC_DTA var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------
LOW ROLE1
LOW ROLE2
LOW ROLE3
LOW ROLE4
PAUSE 20
' CLEAR: 'TRISA=%00111111:TRISB=0
PAUSE 500:ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
LCDOUT $FE,$58,16,8,4,2,4,8,16,0 'LCD 3. KARAKTER HAFIZASI YON İŞARETİ
GIRIS:
LCDOUT $FE,$82, "OTOMATIK KULUCKA"
lcdout $FE,$C5,"MAKINESI"
lcdout $FE,$95,"TASARIM ve YAZILIM"
lcdout $FE,$D9,"FERHAT YOL"
PAUSE 2000
LCDOUT $FE,1
'-------------------------------------------------------------------------------
BASLANGIC:
SYC=0
AYAR=1
READ $07,GN:IF GN=255 THEN GN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
READ $12,SY
READ $13,AYR
gosub ZAMAN_OKU
BASLA:
KONTROL=%00000011:HAMISI=0 'SICAKLIK ÖLÇME
GOSUB OLCUMAL
Gosub ISIHESAP
KONTROL=%00000101:HAMISI=0 'RUTUBET ÖLÇME
GOSUB OLCUMAL
GOSUB RUTHESAP:GOSUB SENSOROKU
GOSUB ORTISI
GOSUB ZAMAN_OKU
GOSUB GUNEBAK
GOSUB EKRAN1
GOSUB ISIKONTROL
GOSUB RUTKONTROL
IF AYR=0 THEN
GOSUB HAVAKONTROL
ELSE
LOW ROLE4
ENDIF
IF SY=1 THEN GOSUB DONUSEBAK
IF AYAR_D=1 THEN GOTO AYAR_MENUSU
goto BASLA
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,",",DEC1 CNY,0,"C NEM%",DEC2 U1
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GN,".GUN"
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
IF SN=DUR THEN LOW ROLE3
IF SAAT=0 AND DAK=0 AND SN=0 THEN
GN=GN+1
IF GN=31 THEN GN=1
WRITE $07,GN
ENDIF
RETURN
'''''''''''''''''MOTOR ÇALIŞ '''''''''''''''''
DONUSEBAK:
'HER SAAT BAŞI ÇEVİR
IF ZAM=1 AND DAK=0 AND SN=0 THEN
HIGH ROLE3
ENDIF
IF ZAM=2 THEN 'İKİ SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=2 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=10 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=14 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=22 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=3 THEN '3 SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=3 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=6 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=9 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=15 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=18 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=21 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
IF ZAM=4 THEN '4 SAATTE BİR ÇEVİR
IF SAAT=0 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=4 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIf
IF SAAT=8 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=12 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=16 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
IF SAAT=20 AND DAK=0 AND sn=0 THEN
HIGH ROLE3
ENDIF
ENDIF
RETURN
GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
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
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
RETURN
'------------------------------- İŞLEM START -----------------------------------
T_START:
OUTPUT DTA:OUTPUT CLK
HIGH DTA
LOW CLK
PAUSE 1
HIGH CLK
LOW DTA
PAUSE 1
LOW CLK
PAUSE 1
HIGH CLK
PAUSE 1
HIGH DTA
LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
GOSUB T_Start
SHIFTOUT DTA,CLK,1,[KONTROL]
INPUT DTA
PULSOUT CLK,10
HATA=0
FOR W=0 to 65500
IF DTA=0 then GIT
NEXT W
HATA=1
GIT:
IF HATA=1 then
endif
SHIFTIN DTA,CLK,0,[H1]
OUTPUT DTA
LOW DTA
PULSOUT CLK,10
INPUT DTA
SHIFTIN DTA,CLK,0,[H0]
PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------
ISIHESAP:
If HAMISI<4000 then
ISARETSHT=1 'sıcaklık eksi değerde demek
ISI1=(4000-HAMISI)/100
ISI2=((4000-HAMISI)//100)/10
goto ISISON
endif
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
ISISON:
ISI1=(HAMISI-4000)/100
ISI2=((HAMISI-4000)//100)/10
RETURN
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
'ISI=ISI1*10+ISI2
p1=(26542-(54722**HAMISI+hamISI))**HAMISI-25
P2=655+(HAMISI*5)+(HAMISI**15917)
P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1
U1=p3/10:U2=p3//10
IF HAMISI>3710 THEN
U1=0:U2=0
ENDIF
return
ORTISI:
ORTAISI=((ISI1*10+ISI2)+FLOAT)/20
CNY=((ISI1*10+ISI2)+FLOAT)/2
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:
if TERM<ORTAISI then
LOW Role1
ENDIF
if ORTAISI<TERM AND CNY<A then
HIGH ROLE1
Endif
IF MENU=1 THEN AYAR_MENUSU
RETURN
'----------------------------RUTKONTROL-----------------------------------------
RUTKONTROL:
if NEM<U1 then
HIGH Role2
ELSE
LOW ROLE2
ENDIF
IF MENU=1 THEN AYAR_MENUSU
RETURN
HAVAKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK
IF FARK>1 then
ROLE4=1
ELSE
ROLE4=0
ENDIF
IF MENU=1 THEN AYAR_MENUSU
RETURN
'-------------------------------------------------------------------------------
AYAR_MENUSU:
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SYC=SYC+1
IF SYC=8 THEN SYC=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SYC=SYC-1
IF SYC=255 THEN SYC=7
ENDIF
GOSUB DURUM
GOTO AYARLAR
DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0," ISITICI AYARLARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0," NEM AYALARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0," CEViRiCi MOTOR "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0," SAAT-TARiH-GUN "
LCDOUT $FE,$94," AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0," MANUEL OLARAK "
lcdout $fe,$94," MOTORU CEVIRME "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0," GUN AYARI "
LCDOUT $FE,$94," "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
CASE 6
lcdout $fe,$c0,"SICAKLIK DENGELEYiCi"
LCDOUT $FE,$94," FAN AYARI "
IF MENU=1 then
WHILE MENU=1:WEND
GOTO FANKONTROL
ENDIF
CASE 7
lcdout $fe,$c0," MENUDEN CIKIS "
LCDOUT $FE,$94," "
IF MENU=1 THEN BASLANGIC
END SELECT
RETURN
MANUEL:
GOSUB TEMIZLE
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKLARIYA "
LCDOUT $FE,$94,"BASINIZ... "
IF MENU=1 then
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 THEN
lcdout $fe,$D4,"MOTOR CALISIYOR "
HIGH ROLE3
ELSE
lcdout $fe,$D4,"MOTOR KAPALI "
LOW ROLE3
ENDIF
GOTO MANU
GUNAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
READ $07,GN
GUNA:
LCDOUT $FE,$80,"GUNU AYARLA"
lcdout $FE,$C0,"GUN:",DEC2 GN
IF MENU=1 THEN
WRITE $07,GN:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 THEN
GN=GN+1
IF GN=31 THEN GN=1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN
GN=GN-1
IF GN=0 THEN GN=30
WHILE ASAGI=1:WEND
ENDIF
GOTO GUNA
FANKONTROL:
GOSUB TEMIZLE:
FANKONT:
lcdout $fe,$80,"FAN DURUMUNU"
LCDOUT $FE,$C0,"SECINIZ..."
lcdout $FE,$94," ACIK"
LCDOUT $FE,$D4," KAPALI"
IF MENU=1 THEN
WRITE $13,AYR:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
IF YUKARI=1 THEN AYR=0
IF ASAGI=1 THEN AYR=1
SELECT CASE AYR
CASE 0
LCDOUT $FE,$94,3
CASE 1
LCDOUT $FE,$D4,3
END SELECT
GOTO FANKONT
''''''''''''''''''''''''''''''''''''''''
MOT_AYAR:
WHILE MENU=1:WEND
GOSUB TEMIZLE
READ $12,SY
MOTOR_AYAR:
lcdout $fe,$80,"MOTOR DURUMUNU"
LCDOUT $FE,$C0,"SECINIZ..."
lcdout $FE,$94," ACIK"
LCDOUT $FE,$D4," KAPALI"
IF MENU=1 THEN
WRITE $12,SY:PAUSE 2
GOTO M_ZAMANI
ENDIF
IF YUKARI=1 THEN SY=0
IF ASAGI=1 THEN SY=1
SELECT CASE SY
CASE 0
LCDOUT $FE,$94,3
CASE 1
LCDOUT $FE,$D4,3
END SELECT
GOTO MOTOR_AYAR
M_CALISMA:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $09,DUR
MOTO_CALISMA:
IF MENU=1 THEN
WRITE $09,DUR:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
lcdout $fe,$C0,"MOTOR CALISMA SURESi "
lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
IF YUKARI=1 THEN
DUR=DUR+1
WHILE YUKARI=1:WEND
ENDIF
IF DUR=60 THEN DUR=0
IF ASAGI=1 THEN
DUR=DUR-1
WHILE ASAGI=1:WEND
ENDIF
IF DUR=255 THEN DUR=59
GOTO MOTO_CALISMA
M_ZAMANI:
GOSUB TEMIZLE
WHILE MENU=1:WEND
READ $10,ZAM
MOTO_ZAMANI:
IF ZAM=255 THEN ZAM=1
IF YUKARI=1 THEN
ZAM=ZAM+1
WHILE YUKARI=1:WEND
ENDIF
IF ZAM=5 THEN ZAM=4
IF ASAGI=1 THEN
ZAM=ZAM-1
WHILE ASAGI=1:WEND
ENDIF
IF ZAM=0 THEN ZAM=1
IF MENU=1 THEN
WRITE $10,ZAM:PAUSE 2
GOTO M_CALISMA
ENDIF
lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE BiR"
lcdout $FE,$94,"CEVRiLSiN.."
GOTO MOTO_ZAMANI
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AYARLANDI:
IF MENU=1 then AYARLANDI
lcdout $fe,1
LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
AYAR=1
AYAR_D=0
SYC=0
PAUSE 1000
GOSUB TEMIZLE
goto BASLANGIC
TEMIZLE:
lcdout $fe,1
RETURN
'-------------------------------------------------------------------------------
TERM_KONTROL:
GOSUB TEMIZLE
READ $01,TERM:READ $11,A
SET_AYAR:
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A
IF YUKARI=1 then
A=A+1
IF A=10 THEN
A=0:TERM=TERM+1
ENDIF
IF TERM=100 THEN TERM=0
PAUSE 150
ENDIF
IF ASAGI=1 then
A=A-1
IF A=255 then
A=9:TERM=TERM-1
ENDIF
IF TERM=255 THEN TERM=99
PAUSE 150
ENDIF
IF MENU=1 THEN
WRITE $01,TERM:PAUSE 2
WRITE $11,A:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
GOTO SET_AYAR
'-------------------------------------------------------------------------------
NEM_KONTROL:
GOSUB TEMIZLE
READ $02,NEM
NEM_KONT:
lcdout $fe,$C0,"NEM LiMiT"
lcdout $FE,$94,"AYARI: %",DEC2 NEM
IF YUKARI=1 then NEM=NEM+1
WHILE YUKARI=1:WEND
IF NEM=01 then NEM=121
IF ASAGI=1 then NEM=NEM-1
WHILE ASAGI=1:WEND
IF NEM=121 then NEM=01
IF MENU=1 THEN
WRITE $02,NEM:PAUSE 2
GOTO AYAR_MENUSU
ENDIF
GOTO NEM_KONT
RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMANAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
ZAMANAYAR:
IF MENU=1 THEN
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
LCDOUT $FE,$80," ZAMAN AYARI "
LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR
GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF
CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF
CASE 3
LCDOUT $FE,$C0,"GUN "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN=GUN+1
IF GUN=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
GUN=GUN-1
IF GUN=0 THEN GUN=30
ENDIF
CASE 4
LCDOUT $FE,$C0,"AY "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
AY=AY-1
IF AY=0 THEN AY=12
ENDIF
CASE 5
LCDOUT $FE,$C0,"YIL "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF
CASE 6
LCDOUT $FE,$C0,"HAFTA "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN
ZAMAN_B:
IF MENU=1 then ZAMAN_B
gosub ZAMAN_YAZ
goto AYAR_MENUSU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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, HAFTA, 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
MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
low RTC_RST
return
ZAMAN_YAZ:
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
MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
high RTC_RST
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, HAFTA, 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
END
devreyle ilgili tüm dosyaları aşağıdaki linke yükledim pcb şema kodlar vs.
http://www.dosya.tc/files/ndoMib/kulu_kasonhali.rar.html
Arkadaşlar sizlerin yardımlarınıza ihtiyacım var önerileriniz bekliyorum
Çok fazla değişken kullanmışsın bir de if kullanmak yerine case switch kullanırsan kodun epey kısalacaktır.
evet değişken ler çok fazla oldu bunlar programda fazla yer kaplar program daha çok incelenerek daha iyi bir hale getirilerbilir ve elimden geldiğince select case komutunu kullanmaya çalışıyorum.Şimdilik bu kadarını yapabildim daha iyi nasıl olur bilmiyorum ama asıl sorunum picin çalışmaması ne yapmalıyım sizce
pic ayarlarını bir kontrol et muhtemelen ondandır. Benzer birşey benimde başıma geldi c18 de otomatik ayarlar ile çalışmıyor ancak kendim kod ile yazınca geliyordu. Ekranda sadece siyah kareler geliyordu...
Alıntı yapılan: mucit23 - 05 Ağustos 2010, 13:31:16
aynı işlemcilerle ufak bi devre üzerindeki röleleri 50 ms aralıklarla açıp kapayacak şekilde ufak bi program yazdım ; Simülasyonda çalışıyor pice sorunsuz yüklendi ama gerçekte çalışmıyor.
Bence önce bu sorunu çözmelisiniz. Basit bir test programı (led yakıp söndürme) bile çalışmıyorsa (eğer besleme bağlantılarında sorun yoksa) programlayıcınızda sorun olması muhtemel.
PCB de bir hata göremedim. Tabiiki hata derken LCD nin çalışmasını etkileyebilecek hatalardan bahsediyorum. Birde pic in çalışmasını etkileyebilecek kusurlar aradım. Ama hem programda yok ki zaten o simulasyonda çalışıyor.
Sonuçta çalışmayan Pic LCD de tek sıra kareler oluşturur. şayet sende çift sıra kareler var ise kontrast ayarına bakman gerek.
Kontrast için 4K7 trimpot kullanmışsın. Bu bildiğim kadarı ile en uygun 22K dır ancak 10K idare etmektedir. 4K7 hiç kullanmadım ne netice verir bilemiyorum.
Dediğim gibi çift sıra kare var ise kontrast potunu 10K yap ve ayarlamaya çalış.
Onun dışında söyleyebileceğim bir şey yok maalesef.
Rölelere hükmedecek programında çalışmaması devrende sorun olduğunu gösteriyor.
Mutlaka PCB yi iyice incelemen gerekir. Kristalinde de hata olabilir. 1 Nolu (MCLR) pinde High varmı onada bir bak.
Ete
evet haklısın galiba usb Brener kullanıyorum bide 16F84 içişn flaşör gibi bi program yazayım öyle bi programlayıcıyı test edeyim akşama deniyecem inş sorunu tez zamanda çözeriz eğer oda çalışmazsa kesinlikle proramlayıcı sorun vardır.çünkü bi flaşör programıda 16f877için yazdım oda çalışmadı
Alıntı yapılan: ete - 05 Ağustos 2010, 13:48:06
PCB de bir hata göremedim. Tabiiki hata derken LCD nin çalışmasını etkileyebilecek hatalardan bahsediyorum. Birde pic in çalışmasını etkileyebilecek kusurlar aradım. Ama hem programda yok ki zaten o simulasyonda çalışıyor.
Sonuçta çalışmayan Pic LCD de tek sıra kareler oluşturur. şayet sende çift sıra kareler var ise kontrast ayarına bakman gerek.
Kontrast için 4K7 trimpot kullanmışsın. Bu bildiğim kadarı ile en uygun 22K dır ancak 10K idare etmektedir. 4K7 hiç kullanmadım ne netice verir bilemiyorum.
Dediğim gibi çift sıra kare var ise kontrast potunu 10K yap ve ayarlamaya çalış.
Onun dışında söyleyebileceğim bir şey yok maalesef.
Rölelere hükmedecek programında çalışmaması devrende sorun olduğunu gösteriyor.
Mutlaka PCB yi iyice incelemen gerekir. Kristalinde de hata olabilir. 1 Nolu (MCLR) pinde High varmı onada bir bak.
Ete
etehocam dediğiniz gibi lcd ekranın 1. ve 3. satırında kareler var yani çift sıra pot 4k7 kullanmıştım akşam onuda 10k ile değiştirecem inş sorun çözülür Ayrıca röleleride kendim test ettmi teker teker kendim iletime geçirdim hiçbirinde sorun yok
pic de bozulmuş olabilir onu da değiştirmeyi dene bence
4 sıra da da Kareler olsa idi Kontrast dan şüphelenmemiz gerekir idi. Ancak atlamalı 2 sıra başıma gelmeyen bir olay.
Bu durumda tek suçlu bana Pic miş gibi geliyor.
Ete
Bencede öyle iki adet pic ile denedim ikisindede aynı sonuç yarın yeni bir pic almayı deniyecem yada sadece giriş yazısı çıkacak şekilde programı 18F452 ye uyarlıyayım ekranda sadece giriş yazısı yazsın elimde birkaçtane 18F452 den var
Alıntı yapılan: ete - 05 Ağustos 2010, 13:59:51
4 sıra da da Kareler olsa idi Kontrast dan şüphelenmemiz gerekir idi. Ancak atlamalı 2 sıra başıma gelmeyen bir olay.
Bu durumda tek suçlu bana Pic miş gibi geliyor.
Ete
dediğiniz gibi olabilir hocam çünkü pot ile karelerin parlaklığı ayarlanabiliyor
18F452 mi kullanıyorsun yoksa 16F877 midir. Hangisi. Simulsayon 877 ye göre verilmiş.
Şayet 18F452 ile çalışıyor isen en iyisi 877 ye göre bir program derle ve onu dene kartın üzerinde. Bak bakalım çalışacakmı?
Ete
Atlamalı 2 sıra picin ayarlarından kaynaklanıyor aynı şey başıma geldi :)
hocam hepsindede 16F877 kullandım kusura bakmayın aklınızı biraz karıştırdım sadece 18F452 yi deneme için kullanayım dedim
Alıntı yapılan: orhanc - 05 Ağustos 2010, 14:11:29
Atlamalı 2 sıra picin ayarlarından kaynaklanıyor aynı şey başıma geldi :)
orhan bey picin ayarları derken hangi ayarları yapılması gerekiyor
ben 18f452 ve 18f4620 kullanmıştım ayarları şu şekilde
Bu 18F4620 için
__CONFIG(1, HS & IESODIS & FCMDIS);
__CONFIG(2, PWRTDIS & BORDIS & WDTDIS & WDTPS128);
__CONFIG(3, CCP2RB3 & LPT1DIS & MCLREN);
__CONFIG(4, STVREN & LVPDIS & DEBUGDIS & XINSTDIS);
__CONFIG(5, UNPROTECT);
__CONFIG(6, UNPROTECT);
__CONFIG(7, UNPROTECT);
Bu 18F452 için
__CONFIG(1, HS )
__CONFIG(2, PWRTDIS & BORDIS & WDTDIS & WDTPS128);
__CONFIG(3, CCP2RB3)
__CONFIG(4, STVREN & LVPDIS & DEBUGDIS)
__CONFIG(5, UNPROTECT);
__CONFIG(6, UNPROTECT);
__CONFIG(7, UNPROTECT);
Selamlar
Mucit23 hocam simulasyonda ısıtıcı rölesi çalışmıyor hata bendemi bi bakabilirmisiniz.? Birde baskı devrede butonların altındaki menu art azlt yazan pinlere +5v gireceğiz heralde ?
merhaba arkadaşlar
Arkadaşlar aklımı yemek üzereyim ne yapacağımı bilmiyorum
pic programlayıcıyı test ettmi sorun onda değil 16F628 için bi animasyon programı yazdım sorunsuz çalıştı hiç sorun çıkarmadan yüklendi 16F877 ve 18F452 içindebazı lcd de yazı yazması için bazı programlar yazdım sorunsuz bi şekilde derleniyor simülasyonda çalışıyor ama kart üzerinde çalışmıyor elim kolum bağlandı resmen sizce başka ne yapmalıyım neden karta takınca çalışmıyor bu işlemciler nerede hata yapıyorum bilmiyorum kartı defalarca inceledim ama bulamadım başka önerebileceğiniz bişey varmı ne yapayım ?
Alıntı yapılan: yorulmaz06 - 05 Ağustos 2010, 15:53:44
Selamlar
Mucit23 hocam simulasyonda ısıtıcı rölesi çalışmıyor hata bendemi bi bakabilirmisiniz.? Birde baskı devrede butonların altındaki menu art azlt yazan pinlere +5v gireceğiz heralde ?
ilk başta set değerini girmelisiniz ondan çalışmıyordur
arkadaşlar diyorumki sorun acaba 7805ten kaynaklanabilirmi yani 7805 picinçalışmasını etkileyecek bi durum yaratırmı.7805 in çıkışını ölçtüğümde yaklaşık 5.10 ile 5.6 volt arasında normalden biraz yüksek gibi.
devre üzerinde denemek için 18F452 yi kullanarak devre üzerindeki buzzeri 500 ms aralıklarla açıp kapatacak şekilde bi program yazdım devreye takıp enerji verdiğimde buzzerden hiç ses çıkmıyor demekki pic çalışmıyor ama enerjiyi keser kesmez bi anlık olarak buzzerden ses çıkıyor.Her nedendense picin çalışmasını etkileyen bir etmen var ortada ama bi türlü çözemedim
Pic'i yerinden sök ve devrenin voltajını tekrar ölç. Şayet 5V dan fazla ise 7805'ide değiştir bence.
Pic in çalışmadığı kesin ama sebep bir sürü olabilir.
Muhtemel olanlar;
1. 7805
2. Pic in kendisi
3. Kristal
4. Kristal kondansatörleri 22-33pf arasında bir değer olmalı.
5. Pic in besleme bacaklarına 100nf kondansatör bağlanmamış olması
6. LCD bacaklarının yerlerinin değişik olması
Ete
akşam kesinlikle 7805 i değitirecem çünkü kullandığım 7805 bence kaliteli değil st marka kullanmalıyım ayrıca picin besleme bacaklarınada 100nf kondansatör bağlıyacam bu kadar aldığım önlemden sonra inşaallah çalışır artık bu projeyle herkesin kafasını çok yordum bu beni çok üzüyor ama bi devreyi toparlıyabilsem her şeyi düzenliyecem derli toplu olarak yenişbaşlık altında yayınlayacam
Alıntı yapılan: mucit23 - 06 Ağustos 2010, 13:28:00
Alıntı yapılan: yorulmaz06 - 05 Ağustos 2010, 15:53:44
Selamlar
Mucit23 hocam simulasyonda ısıtıcı rölesi çalışmıyor hata bendemi bi bakabilirmisiniz.? Birde baskı devrede butonların altındaki menu art azlt yazan pinlere +5v gireceğiz heralde ?
ilk başta set değerini girmelisiniz ondan çalışmıyordur
yok hocam ne yaptıysam çalışmadı anladığım kadarıyla iki sensörü birden kontrol ediyo bunu tek sensöre ayarlasak
açık şemadaki direnç değerleriyle baskı devredekiler aynı değil ilk verdigin devreyi yaptıgımda da sapıtmıştı bence bi kontrol et,dirençlerden olabilir.deneme şansım olmadı sht11 gelsin başlıyacagım.
hocam sonunda devreyi çalıştırdım sorun tahmin ettiğim gibi çıktı 7805 bozukmuş.Beni çok uğraştırdı ama şimdi çok güzel çalışıyor saattede simülasyondaki gibi yavcaşlama yok gayet stabil çalışıyor yardımcı olan arkadaşlara ve ete hocama teşekkürler.
Alıntı yapılan: yorulmaz06 - 06 Ağustos 2010, 17:23:11
Alıntı yapılan: mucit23 - 06 Ağustos 2010, 13:28:00
Alıntı yapılan: yorulmaz06 - 05 Ağustos 2010, 15:53:44
Selamlar
Mucit23 hocam simulasyonda ısıtıcı rölesi çalışmıyor hata bendemi bi bakabilirmisiniz.? Birde baskı devrede butonların altındaki menu art azlt yazan pinlere +5v gireceğiz heralde ?
ilk başta set değerini girmelisiniz ondan çalışmıyordur
yok hocam ne yaptıysam çalışmadı anladığım kadarıyla iki sensörü birden kontrol ediyo bunu tek sensöre ayarlasak
senin sorununu farkkettim galiba aynı sorun bendede var ben set değerini nomalde ortalama ısıyla karşılaştırmasını istiyordum ama herhalde yazılımsal bi sorun var kısa zamanda çözerim inş
Sorunu çözdüğüne sevindim Mucit23 hocam role mümkünse ds18b20 ile çalışsın :D bu arada PM ni gördünmü?
merhaba arkadaşlar yardımlarınız için teşekkür ederim.Devrem çok iyi çalışıyor.
ısı kontrol sorununuda çözdüm galiba ben virülden sonraki haneyide hesaba katmışım ama bu kadar ince hesaba gerek yok o yüzden virgülden sonraki hanyi işin şçinden çıkartım şimdi tüm sistem çok iyi çalışıyor ,
yorulmaz kardeş eğer ısı kontrol kısmı ds18b20'yi dikkate almasını istiyorsan ısı kontrol kısmını aşağıdaki gibi değiştirmelisin
ISIKONTROL:
if TERM<ISI then
LOW Role1
ENDIF
i ISI<TERM
HIGH ROLE1
Endif
RETURN
Ayrıca arkadaşlar size sormak istediğim bi konu daha var şu toggle komutu hakkında bildiğimiz gibi bu komutun işlevi herhangi bi bitin durumunu değiştirmektir yani 1 ise 0 0 ise 1 yapar
peki ben bu komutla yine bir bit boyutundaki bir değişkenin durumunu değiştirebilirmiyim
yani
toggle sayı dediğimde sayının durumu değişirmi ?
Toggle komutu BIT bazında bir PIC pini'nin konumunu değiştirmek için kullanılır. Aslında komutun açıklamasında değişkenler için değil de Pic pinleri için kullanılacağı vurgulanmış. Ancak pinleri birer değişkene bağlamış iseniz tabiiki değişkenede uygulanır.
TOGGLE SAYI denildiğinde her komut işletiminde SAYI (BIT değişkeni) değeri 0 dan 1'e şayet 1 ise 1 den 0'a döner.
Bu komut SAYI=1-SAYI komutu ile aynı işlevi yapar.
AMa sanki Byte değişkenine TOGGLE komutu uygulamak istermişin gibi bir şey sezinledim? Şayet böyle bir şey istiyor isen;
Toggle komutunu kullanamazsın. Onun yerine ;
SAYI VAR BYTE
SAYI=63
SAYI=255-SAYI
şeklinde bir komut kullanabilirsin. Böylece her komut çalıştırıldığında bitler ters çevrilecektir.
Ete
evet hocam kuluçka makinası programını olabildiğince hafifletmeye çalışıyorum bu yüzden bazı değişkenlerin boyutunu küçültüyorum tabi gereken yerlerden örnek vermek gerekirse çevirici motorun açık veya kapalı olduğunu belirleyen sayı adında birdeğişken vardı önceden byte boyutundaydı bize lazım olan bir veya sıfır 1 ise motor açık sıfır ise motor kapalı bunun gibi programda sadece iki değer alan değişkenlerin boyutunu küçültüyorum
motorun açık veya kapalı olduğunu ayarladığım menüde önceden iki adet buton ile kontrol ediyordum şimdilik tek buton ile işimi hallediyorum burada toggle komutu lazım oldu dediğiniz gibi dün denedim olduda şimdi herşey gayet normal
Merhabalar Ete hocam;
Kuluçka makinası projemde garip bi durum var.Bu konua sizin fikrinizi almak istiyorum projemin son halinde iki adet ısı sensörü kullanmıştım biri ds18B20 diğeri SHT11 ama iki sensörüde aynı ortamda yan yana koyduğumda SHT11, DS18B20den 1 bazen iki derece yüksek gösteriyor hangisine inanacağımı şaşırdım doğrusu!.Aslında bana kalırsa ds18b20 daha doğru gösteriyor çünkü çeşitli termometrelerle test ettim ds18b20 daha az hata yapıyor.Acaba bu sensörlerin farklılığındanmı kaynaklanıyor yoksa hesaplamadan dolayımı kaynaklanıyor.Bu nu düzeltmenin bi yolu varmıdır acaba ne önerirsiniz.?
Ben sensörden kaynaklandığını sanıyorum.
Benim bir projem vardı Meteorolojik Monitör isimli.
Bu projeyi bir arakdaş tez olark hazırladı ve İstanbul'da bulunan bir test kuruluşuna vererek test sertifikası aldı.
Bu sertifikaya bakarsan SHT-11 ölçümlerinin son derece hassas bir şekilde olduğu belirtilmdi.
Sertifikanın bir kopyası elimde. Anlayacağın SHT-11 sensörününde doğruluğundan şüphe edemeyiz.
Ancak sensörler yan yana bile dursa ikisi aynı yerde durmamış oluyorlar. Mutlaka sensörler arasında 1 derecelik fark olabiliyor. Bu fark artı eksi yönde olabilir. Bazen olmuyor ama genelde oluyor maalesef. İki DS18B20 sensörünüde aynı konumda tutmama rağmen aralarında fark görmüş idim. Bana kalırsa 1 derecelik farkları fark olarak görmeyin. 2 derecelik fark şayet sürekli kalıyorsa ortada bir hata vardır diye şüphelenin. Arada sırada 2 derecelik farklar oluşuyorsa onuda göz ardı ediniz.
Kolay Gelsin
Ete
anbladım hocam simülasyonda dikkatimi çektide nedense benim yaptığım saatli ve dereceli uygulamalarda her zaman ds 18b20 programı çok yoruyor hatırlarsanız otomatik çiçek sulama projemde saat çok yavaş ilerliyordu programda ds18b20 yi iptal edince saat normale dönde aynı şey kullaçka makinasındada öyle oldu ama bu durumları artık pek dikkate almıyorum çünkü gerçekte herşey normal şekilde çalışıyor gerçi otomatik çiçek sulama projesini daha hayata geçiremedim ama emini oda sorunsuz çalışacaktır.
Bişey daha sormak istiyorum şu WİRE sistemi hakkında tek hatla iletişim
Birden fazla snsörü aynı hatta bağlayarak ölçüm yapılıyor.Benim bu konuda hiç bir bilgim yok acaba sizin bu konuda bi uygulamanız ve örnek kodunuz varmı
Bu arada Ramazanı Şerif'iniz hayırlı olsun
merhabalar ete hocam sizden bi konuda fikir almak istiyorum.şu şifreli kilitler hakkında
4x3 matrix tuş takımı kullanılan bi şifreli kilit sisteminde 4iyelimki şifre 4 ile 8 hane arasında olması gerekiyor.
tuş takımından gelen tuş bilgilerini nasıl tek bir sayıda toplarız.eğer şifre olarak 8 haneli bir şifre girlirse bunu tek bir sayıda toplayamayız şifreyi ikiye bölmek gerekir iki word değişkeninde tutulması gerekir acaba sizin bu tür bi şifreli kilit uygulamanız varmı.acaba bu işin asıl mantığı nedir yoksa sayıları toplamak yeirne basılan her tuşu ayrı ayrı bir değişkendemi sakmak daha iyi olur ne tavsiye edersiniz
Bu tür işlerde genelde ben 3 haneyi bir değişkene veririm.
Örnekle açıklamak daha iyi olacak sanırım. Diyelimki, şifren 63.541.873 şeklinde bir sayı olsun.
Girilen değerler sırası ile,
3 - 7 - 8 bu üçü bir değişkene verilecek, program 3 hanenin girilip girilmediğine bakacak girilmiş ise bir sonraki değişkene atlayacak.
sonra ikinci değişkene 1-4-5 rakamları verilecek
üçüncü değişkene ise 3 ve 6 sayları verilecek.
Bu şekilde 3 adet WORD değişkeni ile 8 hatta 9 haneli sayıları bir araya getirmek mümkün.
Ete
Merhabalar ete hocam
Hocam dediklerinizi çok iyi anladım.Kendi yaptığım bi sistemde kullandım pin kodu gibi 4 haneli bi giriş şifresi yapmam gerekiyordu.Burada kullandım çok iyi oldu.
Hocam aklıma şöyle bi uygulama geldi sizden fikir almak istiyorum.
Hocam sizin led displayli saat ve termomtere devreleriniz çok iyi çalışıyor.1,5 sene önce yaptığım 10cm displayli saat ve termometreyi hala evimde kulllanıyorum ve hiçbir sorun yok.Bunun için teşekkür ediyorum size
benim yapmayı düşündüğüm şey ise 8 adet 74hc595 ile 60 adet led sürmek 60 adet led saniyeyi temsil edecek saniye ile birlikte bu ledler artacak saniye sıfırlanınca tüm ledler sönüp tekrar baştan başlıyacak.
Programsal olarak sizden fikir almak istiyorum
acaba 74 hc 595 lere ledler ile ilgili bilgiyi her saniye değerini ayrı ayrı değerlendirerekmi göndereyim.
yani eğer saniye 1 ise verı=1
saniye 2 ise verı=3
saniye 3 ise verı=xx ..... saniye 60 ise ver=xx gibi
aslında bu hiçte iyi bi yöntem değil zaten örnek olarak verdim acaba bunu yapmanın daha iyi bir yolu varmıdır
Aslında DS1307 kullanırsan işin çok kolay gibi geliyor bana.
595 leri seri bir birine bağladığında ilkinin Data girişini HIGH yapıp sonra DS1307 nin frekans çıkışınıda 1 Hz ye ayarlayıp bu çıkışı 595 lerin CLK girişine verirsen al sana otomatik bir sistem. Her 1 sn yede bir ledler bir ilerler. Teorik olarak bu çalışır denemek gerekir.
Yok DS1307 kullanman DS1302 kullanırım dersen, o zaman her sn değişiminde CLK palsini senin pic ile üretmen gerekir.
Ete
Aslında hocam bunu bende düşünüdüm fakat şöyle bişey var ds1302 veya ds1307 hafıza pili sayesinde saati hafızasında tutabiliyor ve devam ettiriyor. Picin enerjisi kesildiğinde ledler yanmaz ama saat ilerler terkrar enerjilendiğinde ledler sıfırdan saymaya başlar fakat ds 1302 sıfırdan sayamaya başlamayabilir, bu sefer displayler ile ledler arasında bi çakışma olacaktır. Örnek vermek gerekirse saniye 32 iken ledler sıfırdan saymaya başlayacağı için farklı bişey gösterecektir. Bu yüzden devreyi ilk çalıştırdığımızda ds1302 içerisindeki saniye bilgisi kaç ise ledlerde otomatikme o saniyeden saymaya devam etmelidir.Benim aklıma bu geldi. eğer rtc kullamasaydım keme ile saat yapsaydım sizi dediğiniz gibi olurdu fakat rtc ile olmayacak gibi
[/quote]
Belki bu ıf komutuyla yapılabilir ama bu programı çok yoracaktır. Ayrıca ıf komutunu fazla kullanmak istemiyorum bu bende kötübi alışkanlık haline geliyor.Tabiki yine en iyisini siz bilirsiniz.
Program ilk çalıştığında zaten saniye bilgisine denk gelen değeri 595 lere yüklemen gerekir. Bu ise zor bir şey değil.
Ete
Şimdi anladım hocam ilk başta rtc den saniyeyi okuyup 74hc595lere gönderecem ondan sonra pals göndererek saymayı devam ettirecem.Bu aklıma gelmemişti doğrusu teşekkür ederim hocam
sağlıcakla kalın.
ete hocam ds1307 nin datasheedine baktımda orada 9. sayfada yazıyor. ds1307nin frekans çıkışından 1 hz almak için 07H adresinde bulunan control registerinin 10010000 olması gerekiyor
bunu ds1307 yazmak için aşagıdaki gibi bi kod kullanabilirmiyim.
I2CWrite DATA,CLK,$D0,$07,[144]
Kontrol kodunu $D0 kullandım acaba doğrumudur.
Komut doğru.
Ete
merhabalar ete hocam
Sizin Yapmış olduğunuz kayan yazı devrelerinden olan 96 sütün türkçe karakterli kayan yazı devresini 32 sütüna indirdim.
32 sütün için programda gerekli değişiklikleri yaptım simülasyonda çok iyi gözüküyor.
Devreyi boarda kurdum çalıştırdım fakat bir türlü düzgün görüntü elde edemedim.
Devrede katot matrix kullandım ama bi türlü doğru bağlantıları bulamadım.
Acaba devreyi kurarken özellikle dikkat etmem gereken bişey varmı.
yani picin portbsine satırlarmı yoksa sütünlarmı bağlanacak ve 74595 in çıkışlarıda
şekilde satırlarmı sütünlarmı bağlanması gerekiyor. Birde acaba hangi sırayla bağlanması gerekiyor.Müsait bir zamanınızda bu konuda bilgi verirseniz çok memnun olurum.
kullandığım isis şemasını hex ve bas dosyasını aşağıda ekliyorum yine bi müsait bi
zamanınızda incelerseniz sevinirim.
http://www.dosya.tc/file/3bIrSx/32s_t_nt_rk_ekarakterli.rar.html
Ayrıca birde dikkatimi çekti!
Belki sormak haddim değil ama yaptığınız programlarda yazı olarak hep aşağıdaki yazıyı kullanmışsınız.
"ETE PICMAN KAYAN YAZI PROGRAMI DENEME YAZISIDIR. TOPLAM KAREKTER ADEDI 127 ADET OLABILIR. MATRIKS SAYISI ARTIRILABILMEKTEDIR"
acaba bu kayan yazı devreleri picman(Umut KAZANÇ) bey ile ortak bi çalışmanızmı?
Söze kayan yazı programlarını yazmaktan nefret ettiğimi söyleyerek başlayayım.
Çünki gerçekten çetrefilli bir iş ve elinde donanım yok ise güzel program yazmak zor.
Bense hiç bir zaman kayan yazı devresini fiziki olarak yapmadım. Genelde simulasyonları kullanarak bir çok kayan ve sabit yazı programı yazdım.
Bu arada da bazı kayan yazı programlarını çalışır hale getirip bazılarınıda programda iyileştirmeler yaptım.
Picman isimli arkadaşı tanımıyorum. Bu programı bir kaç sene önce yazdım veya kısmen düzenledim belkide çok iyi hatırlamıyorum.
Bu ismin Umut Kazanç ile bir bağlantısı varmı yokmu onuda bilmiyorum.
Gelelim senin sorununa, Öncelikle her gördüğün devreyi yapmamalısın. Bu gibi devreler simulasyon amaçlı olup gerçek devrede çalışması için bazı devre tadilatları isterler. Mantık olarak düşün, bir 75HC595 yalnızca 1 led sürebilir. Pic pinleride öyle en fazla 20-25ma akım verirler. Matrix ledlerde bir ortak uç birde ledin diğer ucu bulunmaktadır. Ortak uç teorik olarak 8 adet led sürecek şekilde bağlanmalıdır. Yani bu uç ya bir transistörler yada TPIC595 gibi bir shift register ile sürülmelidir.
Halbuki bu devrede satırlar direk pic den çıkan uç ile sürülmüşler. Bu ise devrenin simulasyon amaçlı yapıldığını gösteriyor.
Devre aslında sütun taramalı sistemde hazırlanmış. 74HC595 ler sütünları tarıyorlar. Karekter bilgisi ise satırdan veriliyor. Hangi sütun aktif ise ona ait satır bilgisi pic den veriliyor belli bir süre bekliyor ve bir sonraki sütun aktif edilip ona ait bilgi veriliyor ve bu iş bu şekilde devam ettiriliyor.
Şimdi senin yapman gereken 74HC595ler yerine TPICB595 kullanmak olabilir ancak programda değişiklik yapmak şartı ile. Hatırladığım kadarı ile TPIC ler high verilince LOW çıkartıyor idi. Yanılıyorda olabilirim. Halbuki 595ler başlangıçta $FF ile yüklenip tek bir LOW sinyali bütün pinleri dolaşmaktadır. Şayet hatırladığım doğru ise TPIC takılınca bütün TPIC ler LOW ile yüklenip HIGH sinyali dolaştırılmalıdır. Sen High verdiğinde o LOW çıkartacaktır.
Matrix lere dikkat etmek gerekiyor. Bu devrede ortak ANOT (yani Pozitif voltaj ile beslenen) matrix kullanılmıştır. Ledlerin diğer uçlarına LOW sinyal tatbik etmek gerekiyor. Tek dikkat etmen gereken ortak anot matrix alıp ortak uçları tespit etmek ve şemaya göre doğru bağlantıyı yapmak olmalıdır. Ortak uçlar şemda 74HC595 lere bağlanmış diğer uçlar pic den gelen satır pinlerine bağlanmıştır.
Hepsi bu kadar.
Ete
Not: Bu programı pek hatırlayamadım. Bazı yerleri bana ait o kesin ama sanki melez bir program. Yardım ettiğim bir proje lerden biri olabilir.
Merhabalar ete hocam bağlantı şemasını daha iyi anlamam için aşağıdaki gibi bi matrix bağlantı şeması oluşturdum
Oluşturduğum şema
http://img830.imageshack.us/img830/7525/emaj.jpg
ilk başta kullandığım matrixlerin iç yapısı resim 2 deki gibiydi dolayısıyla bağlantılarıda ona göre yaptım
kullandığım matrixler anottu.
Şimdi ise katot display kullanmam gerek dolayısıyla onun bağlantı şemasıda resim 1 e göre olur dolayısıyla bağlantıları resim 1 e göre yapmam gerek değilmi doğrumudur acaba
Edit:Resim linki yenilendi.
Bağlantı linki şeması bozuk çıkmış. Ya düzelt yada yenile.
E-Posta da atabilirsin.
Ete
Merhabalar ete hocam. Hocam sizin led displayli saat ve termometre devrenizden yaptım. Bu saatten önceden defalarca yaptım fakat hiç birinde böyle enterasan bi sorunla karşılaşmadım. Ana çalışma modundayken saat ayarlama menüsüne girmiyor hiç birşekilde tuşa cevap vermiyor. Fakat menü tuşuna basılı haldeyken enerji verirsem saat ve derecenin ekranda kalma süreleri ayarlıyorum
Normal çalışmada ekranda sadece 00 00 gözüküyor. Menü tuşu ile saat ayarlama menüsüne giremiyorum. Sizce bunun sebebi ne olabilir. Size sormadan önce sorunu çözmek için çok uğraştım belki pcb de sorun vardır diye yeni pcb ye yaptım ama sorun aynı sizin fikirlerinizi almak istiyorum. (Hocam anlamadığim bi sebebten dolayı karakter sınırı oluşuyor bu yüzden iki mesaj halinde yazdım.)
Anlam veremiyorum hocam birsürü bu devreden yaptım fakat ilk defa böyle bi sorunla karşılaşıyorum. Gerçekten bana çok anlamsız geliyor normal çalışma durumunda picin çalışmasını engelliyecek ne gibi bi durum olabilir. Saat ve tarihin ekranda kalma sürelerini ayarlıyorum. Fakat normal çalışmada hiç bir işlem yapmıyor ekranda devamlı 00 00 gösteriyor sizin yardımlarımızı bekliyorum.
Bende bir anlam veremedim. Atladığın bir şey olmalı mutlaka.
Bence tuşlardan birisinde kısa devre gibi bir şey olabilir ve o tuş bırakmadığı için diğerlerini program görmüyordur.
Yada program ya zaman okuma yada sensör okuma kısmına gidip orada takılıyordur. Oradan dönemediği içinde sec tuşuna basılıp basılmadığını göremiyordur.
Bulmak için programda Başla satırından sonraki gosubları bir kapat ve programı pice yükle bakalım sec tuşunu görecekmi.
Görüyor ise anlaki gittiği bir yerde takılıp kalıyor. Sen yinede sensör ve RTC kısmınıda iyice gözden geçir derim.
Ete
Ete hocam dediklerinizi uyguladim dediğiniz gibi yapınca set tuşunu gördü. Bende ilk başta ısı sensorunu çıkardım sorun bir nevi çözüldü. Artık saati ayarlıyabili yorum. Sensor takılı olmadığı halde saat ilerliyordu devreyi tekrar kapatıp açınca yine saat durdu. Bu sefer saati ayarlıyorum saat ve dakikayi azarladıktan sonra set tuşuna basınca saniye ledi flash yapıp yanık kalıyor.
Aslında ben soyle düşünüyorum saati azarladıktan sonra rtc ye kaydedilip programin devam etmesi gerekiyor. Ama tam burada program donuyor bence çünkü saniye ledi sönmüyor. Programda kesme ile bir sayaç saydıriliyor. Ana programda soyle bir kod var if sayaç=30 then porta.3=0 yani eğer pic donmasaydı led sonerdi. Ama anlamıyorum rtc çalışıyor kristali değiştirdim. Ama saat ilerlemiyor.
Hocam rtcyi başka çalışan bir saate takıyorum orada çalışıyor.
DS1302 çok nazlı bir RTC bu yüzden sevmiyorum ve artık projelerimde DS1307 kullanıyorum. Hiç naz etmiyor.
DS1302 nin kristal bağlantısı son derece kritik. Data sheet de gösterildiği gibi kesinlikle kristal bacaklarının GND ile çevrilmesi gerekiyor. BUnu yapmaz iseniz bazen alışıyor bazende çalışmıyor.
Senin devrende PCB şeklinden kaynaklanan bir sorun olduğu düşüncesindeyim. DS1302 başka yerde çalışabilir ama başka yere kristali ile birlikte aktarman gerek. Sorunun kaynağı kesinlikle DS1302 bana kalırsa ya kristali yada kendisi.
Ama yazdıklarına bakarak sıcaklık sensöründe de sorun var gibi gözüküyor. Bu ikisinden birisi arızalı yada PCB de göremediğin bir kusur var. Başkada izah şekli yok bu problemi.
Ete
Hocam kristalin dış kılıfıni ve çevresini gnd ile çevirdim. Gerçektende çok nazlı bugünden sonra ds1302 ile eski yaptığım saatlerin nasıl çalıştığına şaşıyorum. Öncekilerde emin olunki datasheetteki anlatılanların hiç birine uymuyordum. Galiba bu birazda işin rast gitmesiyle alakalı.
Merhabalar ete hocam. Aslında rtcnin günahını biraz fazla almışız. :) Rtc çalışıyor. Aslında işin sorumlusu pic ve ısı sensörü normalde pic çalışıyor gibi görünüyor. Saat ayarlama menüsüne giriyor ondan sonra donuyordu. Diğer çalışan saat devresinin işlemcisini yeni saate takınca saat çalıştı fakat ısı sensörünü takınca yine bozuluyor.
Yeni yaptığım saatin işlemcisini eski çalışan saate takınca eski çalışanda bozuluyor. Anlamıyorum görünüşte kısmen çalışıyor. Ya pic tam programlanmıyor yada pic bozuk en iyisi bayramdan sonra temiz bir pic ve ısı sensorü almak olacak . Bu arada bayramıniz mübarek olsun.
İşin ilginç tarafı programlayıci pici tanıyıp ve programı yüklemesi bozuk olsaydı herhalde programlayıcı tanımazdı herhalde
Pic in programlanıyor olması sağlam olduğunu kesinlikle göstermez. baze yalnızca bir pin bozuluyor üstelik o pinin çıkış kısmı bozuluyor. Aynı pini input yapınca çalışıyor output yapınca çalışmayabiliyor. Bu nedenle programlanma ile sağlamlığı kesinlikle bağdaştırma.
Ete
Bu olayı yaşadım Hocam. Sadece Portd si bozuk bir picle bir hafta uğraşmıştım.
Merhaba ( *** MUCİT23 *** ) kuluçka makine projeni uzun zamanda beri takip ediyorum çok güzel oldu galiba sonunda.Ben pıc işine yeni başladım elimde 16f877a var onun üzerinde bu projeyi uygulamak istiyorum aynı zamanda uygularkende ögrenmek istiyorum, eğer sonra haline gelmişse bunun (***LYT - BAS - DSN ***) dosyasıyla bilrlikde paylaşırsan hafta sonu yapmak istiyorun.benimde senin gibi kuluçka makinesinde civcilerim var makine kontakları arıza yapıtı eger projeni payşasırsan sevinirim.aynısını uygulayıp sizlere bilgi veririm.
teşekkurler. ???
Tabiki vereyim sizde yararlanın. Devre son haliyle çok iyi çalışıyor.
Buyrun
http://s1.dosya.tc/file/HJKAOE/kulu_kasonhali.rar.html
teşekkürler dosyaları aldım deneyecegim dikkat etmem önemli birşey varmı.ütü baskı yaparak başlıyorum.
Merhaba arkadaşlar bişey sormak istiyorum. DS1302 hakkında
DS 1302 içerisinde saat, dakika, saniye, gün , ay, yıl ve hafta içerisindeki gün bilgilerini yürütebiliyor . Peki Ds1302 hangi ayın kaç gün çektiğini hesaplıyabiliyormu yani diyelim aylardan ağustos ise o ay içerisindeyken günün 31 gün olduğunu aylardan eylül iken 30 gün olduğunu Yada şubatın 28 gün olduğunu hesaplarmı yoksa biz dışarıdanmı hesaplatmalıyız. Nasıl olur sizce
Kataloğunda 2100 yılında kadar artık yıllar (böyle mi deniyordu?) dahil otomatik halledildiği yazıyor. Dışarıdan hesaplatmanıza gerek yok.
tamam çok teşekkür ederim
Merhaba (MUCiT) devreni yapyım sorunsuzca çalışıyor gibi test ediyorum . ama bu arada saat kısmındaki (** saniye ** ) geçikmeli geliyor neden dir açaba sende bunu yaptımı.
Aslında simülasyondada biraz gecikmeli çalışıyor. Ama bende geçekte hiçbir geçikme olmuyor. Gayet akıcı. Simülasyonda gecikme olmasıda bence proteusdan kaynaklanıyor. Ete hocamında dediği gibi birçok işi aynı anda yaptığı için bazı durumlarda biraz yavaşlıyor. Ben simülasyonda şöyle bir tespit yaptım. önceden bu programın ilk halinde iki adet sensör yoktu. yani sadece nem sensörü vardı. Saatte hiçbir sorun yoktu fakat ds 18b20 eklediğim zaman saatte yavaşlamalar oluşuyordu. Bu birtek kuluçka makinasında değil diğer başka projelerdede böyle davranıyordu özelliklede program biraz ağırsa saatte epeyi yavaşlama oluyordu. Tabiki bu anlattıklarım simülasyon ortamındaki deneyimmlerim kuluçka makinasını gerçek ortamda yaptım. yavaşlama olmadı. Belkide saat kristali kalitesizdir.
18b20 VE SHT 11 devrede takılı değil ama saniye sanki 5 er 5 er atlıyor gibi kristalin kalitesiz olması bir ihtimal ama ben aynı kristallerle başka bir saat devresi yaptım hersey normal acaba kodla ilgisi olabilirmi.saat kristalı 32.768 acaba bumu yanlış acaba. teşekkurler.
saniye 5 er 5 er atladığına göre ds1302 de sorun olmayabilir sorun bence picde o çok yavaş çalışıyor. kristali 4MHz taktığına eminmisin.
sorun çözüldü sht11 takınca hersey normale döndü ama bu seferde ds18b20 den sıcaklık bilgisi gelmiyor lm35 denedim yine gelmiyor senin başınada böyle bir sorun geldimi 3 tane ds18b20 denedim hiç biride sıcaklık bilgisini göndemedi .teşekkurler
Data hattını incele 4.7K dirençle pull-up yapıtınmı
F SAYAC=0 THEN
LCDOUT $FE,$CC,"PZTS"
ENDIF
IF SAYAC=1 THEN
LCDOUT $FE,$CC,"SALI"
ENDIF
IF SAYAC=2 THEN
LCDOUT $FE,$CC,"CARS"
ENDIF
IF SAYAC=3 THEN
LCDOUT $FE,$CC,"PERS"
ENDIF
IF SAYAC=4 THEN
LCDOUT $FE,$CC,"CUMA"
ENDIF
IF SAYAC=5 THEN
LCDOUT $FE,$CC,"CTESI"
ENDIF
IF SAYAC=6 THEN
LCDOUT $FE,$CC,"PAZR"
ENDIF
ŞUNLARI SELECT CASE İLE YAPSAN DAHA İYİ OLUR GİBİ GELİYOR BANA
mucit merhaba
Sorun 1 : Sorunu hallettim soguk lehim varmış simdi bilgi alıyor.biraz başını agrıtıyorum ama bir sorunum daha var 220 v rolesine elektrik verince motor açıp kapatmalarında pic kendini ya resetliyor yada parazit alıyor ledler yanıp yanıp sonuyor ekran gidip gidip geliyor sen böyle bir sorunla karşılaştınmı.
Sorun 2:
' if TERM > ORTAISI then
' LOW Role1
' ENDIF
' if ORTAISI+0 < TERM+0 then
' HIGH ROLE1
' Endif
orjinal kod bu ama bu kusurat algılamıyor. bende
if CNY < A then
LOW Role1
ENDIF
if CNY > A then
HIGH ROLE1
ENDIF
SHT 11 GELEN DEGERiN SONUNDAKI KUSURATI BIR TURLU ALGILATAMADIM. 37,5 ROLENiN KAPANMASI LAZIM 37,4 AçMASI LAZIM OLMADI NE YAPTIMSA OLMADI NEDENDiR ACABA.if lerde bir yanlışlık yapıyorum acaba.
1. sorunun cevabına bakalım doğrusunu söylemek gerekirse ben hiç böyle bir sorunla karşılaşmadım şaşırdım doğrusu olabilecekleri söylüyorum şimdi elektronik kartın şasesi herhangi bir nedenden dolayı motorun şasesiyle birleşebilir.Devreyi dış dünya ile tamamen izole etmelisin.
2. soruna bakılırsa Aslında ben ilk başlarda virgülden sonraki haneyide hesaba katıyordum. fakat öyle pek verimli olmadığını gördüm çünkü virgülden sonraki hane lineer bir şekilde hareket etmiyordu. Bu yüzden tek haneye düşürdüm. Yani küsüratı hesaba katmaması normal bişeydir
SA
hocam termostata röle takmak ciddi sorunlar doğurabilir. aç kapa nereye kadar. ALİMALLAH günün birinde çıkışlar birbirine yapışır. sonra ya yumurtaları pişirirsiniz ya da dondurursunuz. ama illa röle takacaksanız mcp serisi bir 0 geçiş ile bağlayın. böylece 0 voltta röle tetiklenir. yapışma olayı da olmaz.
mucit merhaba ...
tüm sorunları halletim ama son olarak 2 sorum daha kaldı.
Sorun 1 : SHT11 dogru nem bilgisi gelmiyor bende eski makinenin üzerinde çalışan nem ölçerin tam yanına bağlıyorum eski sağlam olan nemi %51 gösterirken sht11 %21 gösteriyor ve sürekli nem değişiyor %99 gösterirken birden bire %21 bazende % 55 gibi sürekli değişen degerler veriyor.Kablo mesafesi olabilir diye kablosunu kısaltım ama yine aynı. Sensorden dogru bilgi alamıyor SHT11 Bozuk olabilir diye 1 tane daha aldım ama aynı.. Hesaplamada bir sorun olabilirmi , senin kodların dogru ise bana verirmisin.
Sorun 2: Ayarladığım nem %60 algınan %10 normalde rolenin açık olması lazım ama açmıyor ve tam tersi oldugunda kapatmıyor , buda başka bir sorun devrenin dogru olduna eminim çunku roleyi bell
aralıklarla açan kapan bir kod yazdım o çalışıyor.
RUTKONTROL:
if NEM<U1 then
HIGH Role2
ELSE
LOW ROLE2
ENDIF
IF MENU=1 THEN GOTO AYAR_MENUSU
RETURN
Sanki bu kodlar burada yokmuş gibi davranıyor.Microcode studio plus yapıyorum acaba editörde bir sorun var sen hangi programda bunu sorunsuzca yaptın.
2 haftadan beri bununla uğrasıyorum.yardımların için şimdiden teşekkurler.
Neden microcode studio plusu kullanıyorsun ki bu sınırlı bi versiyon onun yerine benim verdiğim versiyonu kullan bu daha iyi ben tüm işlerimi bununla yapıyorum. Kurarken rar dosyasının içinde ilk önce bu yazan microcode studio yu kur dosyasını kur. Sonrada diğer dosyayı yani pbp yi kurman gerek. Pbp yi kurarken microcode studionun c deki mecanique dosyasının içine kurmayı unutma. Sonra mcs yi açıp compile and program options dan pbp yi buldunmu tamamdır.
Yaşadığın sorunlara gelince anlma veremiyorum sensörlerin sağlam olmasına rağmen böyle bir hata veriyorsa sorun derleyicinde olabilir. Micro code studio plus sınırlı kod yazmaya imkan verdiği için böyle sorunlar yaratmış olabilir birde bu derleyiciyle dene bakalım sonuç ne olacak
http://hotfile.com/dl/84040825/b7411f8/mcp.rar.html (http://hotfile.com/dl/84040825/b7411f8/mcp.rar.html)