otomatik çiçek sulama projesi bazı sorunlar var lütfen yardım edin!

Başlatan Mucit23, 30 Haziran 2010, 13:09:25

Mucit23

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

JKramer

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)

Mucit23

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

JKramer

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?

Mucit23

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 .

JKramer

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.

Mucit23

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

JKramer

...
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.

Mucit23

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

Mucit23

Arkadaşlar ne yaptıysam sorunu çözemedim ısı hep -0,1 derece gösteriyor bunun sebebi ne olabilir sizce

JKramer

Ö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.

Mucit23

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

Mucit23

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

JKramer

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.

Mucit23

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