kuluçka makinası

Başlatan hkalaycioglu, 19 Ocak 2015, 21:03:59

hkalaycioglu


@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _PWRTE_ON
DEFINE OSC 4

TRISA=%111111
TRISB=%00000001
TRISC=%01110000
TRISD=%00000000
TRISE=%00000000
'TRISE.4=0
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-----------------------------------------
   
    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
    TERM     VAR    BYTE   
    AYR      VAR    bit   
    SAYI     VAR    BYTE
    AYAR     VAR    BYTE
     a var byte
    TSEN     VAR    WORD
    TSET     VAR    WORD
    ALT      VAR    WORD
    EK       VAR    BYTE       
    SURE VAR BYTE
    ZAM1    VAR     WORD
    ZAM      VAR    BYTE
    ALARM1   VAR    WORD
    ALARM2   VAR    WORD
    E1        VAR    BYTE
    E2        VAR    BYTE
    E3   VAR        BYTE
    E4      VAR     BYTE
    ZAMAN1  VAR WORD 60 
    eksi var byte
    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.Bit12   '   +/- 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  'ds18b20 portb nin 1 inden veri alacak

    RTC_RST var PORTC.5
    RTC_CLK var PORTC.6
    RTC_DTA var PORTC.4
'-----------------------------B A Ş L A N G I C ------------------------------   
          LOW portc.0
          'LOW portc.7
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
        PAUSE 500:ISARET=0
        LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti dataları   
       
        LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
           
                   
         PAUSE 2000
         LCDOUT $FE,1         
'-------------------------------------------------------------------------------
BASLANGIC:
low porte.1
low portc.7
portc.7=0
SYC=0
rEAD $04,A:IF A=255 THEN A=00
READ $05,term:IF term=255 THEN term=00
read $02,eksi
read $03,ISARET

read $38,EK:IF EK=255 THEN EK=00
READ $07,GN:IF GN=255 THEN GN=00
READ $01,ALT.BYTE0:IF ALT.BYTE0=255 THEN ALT.BYTE0=00
READ $11,ALT.BYTE1:IF ALT.BYTE1=255 THEN ALT.BYTE1=00
READ $10,ZAM:IF ZAM=255 THEN ZAM=00
read $38,EK:IF EK=255 THEN EK=00
'gosub ZAMAN_OKU
                   
BASLA:
       GOSUB SENSOROKU
       if ISI=85 then ISI=00
        GOSUB ZAMAN_OKU
       GOSUB GUNEBAK
        GOSUB EKRAN1
        GOSUB ISIKONTROL
       
iF YUKARI=1 THEN 
       gosub yak
endif
if ASAGI=1 then
gosub sondur
endif         
IF MENU=1 THEN  GOTO AYAR_MENUSU
goto BASLA       
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
'low portc.7
'portc.7=0         
'rEAD $04,A
'READ $05,term
'read $02,eksi
'read $07,GN 
   ALARM1=alt/10:ALARM2=alt//10
  lcdout $FE,$80, "   ","C",2,"C",2,"K"," ","MAKINESI"  'lcdout $FE,$80, "eksi=",dec1 eksi,",", "isaret=",dec1 ISARET
  lcdout $FE,$C0,"ISI=",ISARET,DEC2 ISI,",",DEC1(FLOAT),0,"SET=",eksi,DEC2 term,",",DEC1 a,0
  LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GN,".GUN"

  LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
IF SAAT=00 AND DAK=00 AND SN=01 THEN
pause 500
GN=GN+1
IF GN=31 THEN GN=1
WRITE $07,GN
ENDIF
RETURN

yak:
high porte.1
pause 10       
return

sondur: 
low porte.1
  pause 10           
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 
'----------------------------ISI KONTROL----------------------------------------

ISIKONTROL:
low portc.7
portc.7=0
rEAD $04,A
READ $05,term
READ $38,EK
read $02,eksi

TSET=(TERM*10)+a:TSEN=FLOAT
       if eksi=ISARET then                 
     
        if TSEN=<(TSET-EK) then
         high PORTC.0
         endif
           if TSET=<TSEN then         
         LOW PORTC.0
         endif   
       
        if TSEN>(TSET+19) then
         high PORTC.7
         gosub bip
         else
         low PORTC.7
         endif
         
         
           
         endif                       
       
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN


BIP:
    HIGH PORTE.0   
pause 50
     LOW PORTE.0 
  RETURN
BIPBIP:
     HIGH PORTE.0   
    PAUSE 50
      LOW PORTE.0
    PAUSE 100
     HIGH PORTE.0
    PAUSE 50
      LOW PORTE.0
RETURN
'-------------------------------------------------------------------------------
AYAR_MENUSU:
GOSUB BIP
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:

IF YUKARI=1 THEN
high porte.1
zaman1=0
GOSUB BIP
WHILE YUKARI=1:wend
SYC=SYC+1           
  IF SYC=5 THEN SYC=0
ENDIF

if YUKARI=0 then
high porte.1
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif

IF ASAGI=1 THEN
high porte.1
zaman1=0
GOSUB BIP
WHILE ASAGI=1:WEND
SYC=SYC-1
  IF SYC=255 THEN SYC=4
ENDIF

if ASAGI=0 then
high porte.1
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif

GOSUB DURUM
GOTO AYARLAR
GOSUB EKRAN1

DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0,"  ISITICI AYARLARI  "
LCDOUT $FE,$95,"CIKIS SURESI ",DEC4 zaman1

IF MENU=1 then

WHILE MENU=1:WEND

GOSUB BIP
GOTO TERM_KONTROL
ENDIF

CASE 1
lcdout $fe,$c0,"   ISI HASSASIYET   "
LCDOUT $FE,$94,"      A Y A R I     "

IF MENU=1 then

WHILE MENU=1:WEND
GOSUB BIP
GOTO HASSASIYET
ENDIF
         

CASE 2
lcdout $fe,$c0,"   SAAT-TARiH-GUN   "
LCDOUT $FE,$94,"      A Y A R I     "   
IF MENU=1 then

GOSUB BIP
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF

         
CASE 3
lcdout $fe,$c0,"     GUN AYARI      "
LCDOUT $FE,$94,"                    "     
IF MENU=1 then

GOSUB BIP
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
       

CASE 4
lcdout $fe,$c0,"    MENUDEN CIKIS   "
LCDOUT $FE,$94,"                    "   
IF MENU=1 THEN AYARLANDI
END SELECT

RETURN

TERM_KONTROL:
       GOSUB TEMIZLE
       zaman1=0
       READ $04,a:READ $05,term:read $02,eksi   
        if a=255 then a=0
       
     
SET_AYAR:
ALARM1=ALT/10:ALARM2=ALT//10
'LCDOUT $FE,$80,"CIKIS SURESI ",DEC4 zaman1
LCDOUT $FE,$80,"ISI LIMITINI SEC"
LCDOUT $FE,$C0,"AYAR:",eksi,DEC3 term,",",DEC1 a,0,"C"
           
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
          if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif     
           IF YUKARI=1 then
           zaman1=0
           if eksi="+" then
                a=a+1
               
                gosub bip
                if a=10 then
                 
                 a=0:term=term+1
                 
                  if term>125 then term=125
                endif
              else
                a=a-1
                gosub bip
               
                if a=255 then
                 
                A=9 :term=term-1
                if term=255 then
                 term=00
                 eksi="+":A=1
                 
               
                 endif
                endif
              endif   
              ENDIF
             
             

           

           IF ASAGI=1 then
           zaman1=0
           
             
             if eksi="+" then
             
               A=A-1
               gosub bip
               if a=255 then
               a=9:
                   term=term-1
               IF term=255 then
                     term=00:eksi="-":A=01
                   
                   endif
                 endif 
                 PAUSE 70
             else                       
             a=a+1
              gosub bip
             if a=10 then
               a=0:
                  term=term+1
             IF term=55 then term=55
             
               endif 
             endif
             pause 50
            endif             
            PAUSE 70
         
         
iF MENU=1 THEN
        gosub bip
         WRITE $04,a
         WRITe $05,term
         write $02,eksi
         GOTO AYAR_MENUSU
         
         ENDIF
                     
GOTO SET_AYAR 

HASSASIYET:
GOSUB TEMIZLE
HASSAS:

E1=EK/10:E2=EK//10
LCDOUT $FE,$C0,"HASSASIYET"
LCDOUT $FE,$94,"AYARI:",DEC1 E1,",",DEC1 E2,0,"C"

if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   

IF YUKARI=1 THEN
EK=EK+1
PAUSE 100
gosub BIP
endif
IF EK=01 THEN EK=51

IF ASAGI=1 THEN
EK=EK-1
gosub BIP
PAUSE 100
endif

IF EK=51 THEN EK=01
IF MENU=1 THEN
WRITE $38,EK:PAUSE 10
GOTO AYAR_MENUSU
ENDIF
GOTO HASSAS   





ZAMANAYARI:
WHILE MENU=1:WEND
gosub BIP
GOSUB TEMIZLE
AYAR=1

ZAMANAYAR:

if MENU=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif       

IF MENU=1 THEN
zaman1=0
AYAR=AYAR+1
WHILE MENU=1:WEND
gosub BIP
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






GUNAYARI:
       WHILE MENU=1:WEND
       GOSUB TEMIZLE
       READ $07,GN
GUNA:     
     LCDOUT $FE,$80,"GUNU AYARLA" 
     lcdout $FE,$C0,"GUN:",DEC2 GN, " .GUN"
     IF MENU=1 THEN
      WRITE $07,GN:PAUSE 2
      GOTO AYAR_MENUSU
      ENDIF
     
     if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
     
        IF YUKARI=1 THEN
        zaman1=0
        gosub BIP
        GN=GN+1
        IF GN=31 THEN GN=1
        WHILE YUKARI=1:WEND
        ENDIF
       
        IF ASAGI=1 THEN
        zaman1=0
        gosub BIP
        GN=GN-1
        IF GN=0 THEN GN=30
        WHILE ASAGI=1:WEND
        ENDIF
             
     GOTO GUNA



             

AYARLANDI:
           IF MENU=1 then AYARLANDI
       lcdout $fe,1
       LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
       GOSUB BIPBIP
       AYAR=1
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto BASLANGIC       
TEMIZLE:
        lcdout $fe,1
RETURN
end       

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=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   

IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
wHILE ASAGI=1:WEND
gosub BIP
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF

CASE 2
LCDOUT $FE,$C0,"DAKIKA"
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
gosub BIP
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF
CASE 3
LCDOUT $FE,$C0,"GUN    "   
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
GUN=GUN+1
IF GUN=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
wHILE ASAGI=1:WEND
gosub BIP
GUN=GUN-1
IF GUN=0 THEN GUN=30
ENDIF

CASE 4
LCDOUT $FE,$C0,"AY    "
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
gosub BIP
AY=AY-1
IF AY=0 THEN AY=12
ENDIF

CASE 5
LCDOUT $FE,$C0,"YIL      "
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
gosub BIP
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF

CASE 6
LCDOUT $FE,$C0,"HAFTA     "
if YUKARI=0 then
zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif             
   
if ASAGI=0 then
  zaman1=zaman1+1
pause 10
if zaman1=1000 then BASLANGIC
endif   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
gosub BIP
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF

IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
gosub BIP
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



İyi akşamlar bu bir kuluçka makinasının programı. Program bazen reset atıyor kendi kendine veya kilitleniyor. Bunun sebebi ne olabilir sizce programı kilitleyecek, nerede yanlış yapıyorum anlayamadım.Beslemede kondansatör mevcut. Yardımcı olacaklara şimdiden teşekkürler. Kodları Code tagı içine alamadım.

http://s3.dosya.tc/server30/E30UNc/877ile.rar.html

ete

Bu tür sorunlar genelde Stack taşması ile oluşur. Bununda sebebi Gosub ile gidilen bir alt programdan GOTO ile dönmek ve bunu bir kaç kez tekrarlamaktır.
Örnek vereyim, Programında ISIKONTROL diye bir alt program var. Oraya GOSUB ISIKONTROL diye bir komutla programı yönlendiriyorsun. Isı Kontrol  alt programında bir komut satırı var , IF MENU=1 THEN  GOTO AYAR_MENUSU şeklinde. Isı kontrol yapılırken Menü tuşuna basarsan program Ayar_Menü süne gidiyor. Oradan ise yine Goto ile geri dönüyor. Bu durumda stack bozulmuş olacaktır. Buna benzer kusurlar aramalısın.
Ayrıca devrende röle , motor vs var ise bunların sürülmesini ana devrenden izole etmen gerekir. Aksi halde bu aletler parazit üretip işlemciye reset attırırlar.
Ete

hkalaycioglu

Teşekkürler ete hocam saolun. Bir bakalım çözmeye çalışayım.sagolun.

Powered by EzPortal