ETE Hocamın Termo Alarm devresi..

Başlatan solidus, 23 Ağustos 2006, 21:09:03

solidus

ETE Hocamın hoşgörüsüne sığınarak....
ETE hocamdan 16f628a ile yapılmış bir termometre ve alarm (ısıya duyarlı) şema ve yazılımı aldım. Amacım bu şema ve yazılımı 16f877 ye uyarlayıp yazılımında oynayarak bir dual termometre ve alarm devresi yapmaktı ama başaramadım. Ne yaptıysam olmadı. Yazılım ve devre şeması hakkında bir yorumu olanlardan yardımlarını bekliyorum.. Saygılar... Devre şemasının linki : http://img178.imageshack.us/img178/8593/877pt4.jpg
Yazılım aşağıda:
@ DEVICE pic16F877 
@ DEVICE pic16F877, WDT_ON 
@ DEVICE pic16F877, PWRT_ON 
@ DEVICE pic16F877, PROTECT_OFF 
@ DEVICE pic16F877, XT_OSC 


DEFINE LCD_DREG     PORTD   'LCD data bacakları hangi porta bağlı? 
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor? 
DEFINE LCD_RSREG    PORTD   'LCD RS Bacağı Hangi Porta bağlı ? 
DEFINE LCD_RSBIT    1       'LCD RS bacağı Hangi Bite bağlı ? 
define LCD_RWREG    PORTD   'LCD RW bacağı Hangi Porta bağlı ?
define LCD_RWBIT    2       'LCD RW bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG     PORTD   'LCD Enable Bacağı Hangi Porta bağlı? 
DEFINE LCD_EBIT     3       'LCD Enable Bacağı Hangi bite bağlı ? 
DEFINE LCD_BITS     4       'LCD 4 bit mi yoksa 8 bit olarak bağlı? 
DEFINE LCD_LINES    4       'LCD Kaç sıra yazabiliyor 
OPTION_REG.7=1 

ILK     VAR     BIT
Y       VAR     BIT
ISI1    VAR     BYTE       
ISI2    VAR     BYTE       
ALARM1  VAR     BYTE       
ALARM2  VAR     BYTE        
Z       VAR     BYTE
ALRM    VAR     BYTE
SEC     VAR     BYTE
TSET    var     word
TSEN    var     word
ALT     VAR     WORD
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       
SIGN_BITI   VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
ISARET      VAR BYTE
Comm_Pin_in    VAR	PORTA.1
Comm_Pin_out    VAR	PORTA.2
Kalan VAR BYTE			
Sayac VAR	BYTe
'    SYMBOL Comm_Pin_in=PORTA.1

  '-----------------------------B A Ş L A N G I Ç ---------------------------    
 
TRISA=%00111001
TRISB=%11111111
Z=1
low PORTD.2                                                                                                                                                                                                                                                                                
LCDOUT $FE,1
LCDOUT $FE, $C0, " LUTFEN BEKLEYINIZ"
PAUSE 500
SIGN="+"
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0 
LCDOut $FE,1
data @$40,"TERMOALARM":DATA @$4A,"  V.00   "  Bu satır nedir anlayamadım
GOSUB OKU
IF ALT>400 THEN 
ALT=005:GOSUB YAZ:ENDIF
SEC=0
'-------------------------------------------------------------------------------    
BASLA:
GOSUB EKRAN1
SEC=1-SEC
IF SEC=0 then ESAS
HAM=0   'SICAKLIK ÖLÇME
GOSUB SENSOROKU
tsen=ISI1*10+ISI2
GOSUB EKRAN1
IF ALRM=1 THEN 
LCDOUT $FE,2,1
ELSE
LCDOUT $FE,2," " 
ENDIF
PAUSE 50        
'--------BU ARAYA ISI VE RUTUBETE BAĞLI KONTROL RUTİNİ YERLEŞTİRİLECEK--------------------

ESAS: 
    IF PORTB.1=0 THEN           'SELECT TUŞU PORTB.1 DE
             WHILE Z<22
               ILK=0
               GOTO SECIM
             WEND  
           ENDIF   
            
        IF PORTB.2=0 then
            ALRM=1-ALRM:GOSUB DURUM
            WHILE PORTB.2=0
            WEND
        ENDIF
       
       IF PORTB.3=0 then
            ALRM=1-ALRM:GOSUB DURUM
            WHILE PORTB.3=0
            WEND
         ENDIF
'------------------------------------------------------------------------------------------
    tset=alarm1*10+ALARM2:TSEN=ISI1*10+ISI2
       IF Y=0 THEN
            IF TSEN >= TSET THEN  'ODA<=ALRM 
                if SIGN=SIGN and SIGN="+" then
                    GOSUB AC:GOTO ATLA
                ENDIF
             ENDIF
                
            IF SIGN="-" AND SIGN="+" THEN
                GOSUB AC:GOTO ATLA
            ENDIF
            
            IF TSET >= TSEN THEN
               IF sign=SIGN and SIGN="-" then
                   GOSUB AC:GOTO ATLA
                ENDIF 
            ENDIF    
       ENDIF
       
                        
       IF Y=1 THEN
          IF TSEN<TSET THEN
             IF sign=SIGN and SIGN="+" then
               GOSUB KAPA:GOTO ATLA 
             ENDIF    
          ENDIF
         
          IF SIGN="+" AND SIGN="-" THEN
              GOSUB KAPA:GOTO ATLA
          ENDIF
          
          IF TSET<TSEN THEN
             IF sign=SIGN and SIGN="-" then
                 GOSUB KAPA:GOTO ATLA
             ENDIF 
          ENDIF     
       ENDIF
           
ATLA:   Z=1
        SLEEP 1
        GOTO BASLA			
'------------------------------------------------------------------
AC:     PORTB.5=1:Y=1:ALRM=1
ACBIR:  LCDOUT $FE,2
        LCDOUT "   ALARM ACIK   "
        Z=0:ILK=0:PAUSE 100
        RETURN

KAPA:   PORTB.5=0:Y=0:ALRM=0
KAPABIR: LCDOUT $FE,2
        LCDOUT "  ALARM KAPALI  "
        Z=0:ILK=0:PAUSE 100
        RETURN 

DURUM:  IF ALRM=0 THEN
           low PORTB.5
           gosub KAPABIR
        ELSE
           HIGH PORTB.5
           GOSUB ACBIR
        ENDIF
        Z=0        
        RETURN
'---------------------------------------EKRANA YAZ ------------------------------------------------	
EKRAN1:	 TseN=ISI1*10+ISI2  
        LCDOUT $FE,$2," ISI  : ",Sign,DEC2 ISI1,".",DEC1 ISI2," ",Deg,"C    "     
'        LCDOUT $FE,$2,"TSen:",SIGN,# tsen," N:",#isi1'," 2:",#ALARM2

EKRAN2:	LCDOut $FE,$C0:
        ALARM1=ALT/10:ALARM2=ALT//10
'        LCDOUT $FE,$C0,"TSet:",Sign,# tset," T:",#alarm1'," 2:",#ISI2
    	LCDOut "ALARM : ",SIGN,DEC2 ALARM1 , "," , DEC1 ALARM2," ",Deg,"C    "  
		RETURN		
'----------------------------------------------------------------------------------
SECIM:  
pause 50
LCDOUT $FE,1 
gosub ekran3     
while PORTB.1=0 
wend
IKINCI: Z=20
IKIBIR: 
        GOSUB EKRAN3
        IF PORTB.2=0 THEN
           IF SIGN="-" THEN
             alt=alt-1
             IF alt=65535 THEN
                alt=1:SIGN="+"
             ENDIF   
             GOTO ARACIK
           ENDIF
        ALT=ALT+1  
        ENDIF
        IF PORTB.3=0 THEN
           IF SIGN="-" THEN 
              alt=alt+1:GOTO ARACIK
           ENDIF   
            ALT=ALT-1
          IF ALt=65535 THEN 
            SIGN="-"
            ALT=1
          ENDIF :ENDIF 
ARACIK: GOSUB YAZ:PAUSE 110
        IF PORTB.1=0 THEN
        IF Z=20 THEN IKIBIR
            while PORTB.1=0
            gosub ekran1
            wend
            GOTO BASLA:ENDIF
        Z=22:GOTO IKIBIR

EKRAN3: LCDOUT $FE,$80," ALARM ISI AYARI"
        goto ekran2

        RETURN
                 
'------------------------------- İŞLEM START ------------------------------------------------------
SENSOROKU: 
'           ham=20:sayac=16:kalan=8:Gosub hesapla:RETURN  'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK          
           OWOUT   Comm_Pin_in, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin_in, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin_in, 1, [$CC, $BE]' scratchpad memory oku
           OWIn    Comm_Pin_in, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac]
           GOSUB   Hesapla
           RETURN
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       ISI=((($ffff-ham+1)*50)-25)+ (((Sayac - Kalan) * 100) / Sayac)
       GOTO GEC   
    endif
    ISI = (((HAM) * 50) - 25) + (((Sayac - Kalan) * 100) / Sayac)
'    ISI=ISI-25
GEC:
    ISI2 = (ISI //100)/10
    ISI1=ISI/100
    RETURN
    
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------      
                 
'-------------------------RUTUBET HESAP ALT PROGRAMI-------------------------------------------------
         
OKU:   READ 8,ALT.BYTE0:PAUSE 20:READ 9,ALT.BYTE1:PAUSE 20:READ 10,SIGN:PAUSE 10
       RETURN
       
YAZ:   WRITE 8,ALT.BYTE0:PAUSE 20:WRITE 9,ALT.BYTE1:PAUSE 20:WRITE 10,SIGN:PAUSE 10 
       RETURN  
       
SENSORYOK: LCDOUT $FE,$02," SENSOR ALGILANAMADI "
           LCDOUT $FE,$C0," LUTFEN TAKINIZ "  
           PAUSE 1500               
           RETURN
        END


Code tagları unutmayalım.
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

sanalgezgin

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC



Bu kismi niye ben bir türlü kullanamiyorum niye hata veriyor acaba çözümü nedir bunun... :)  :)  :)

solidus

Derleme yapmadan önce programın en üst kısmına yazdığın PIC ne ise derleyiciden de o PICi seçmen gerekir
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

Ziya

Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

solidus

Bundan sonra uygulayacağım. Verdiğim rahatsızlık için özür dilerim. Ve bir soru.. 16F877 ve 2 adet ds 18B20 kullanarak ısıya duyarlı bir alarm devresi dizayn ettim..Yazılımın neredeyse tamamına yakını ETE hocamın. Fakat ne yaptım ne ettimse 2. sensörü PIC e gösteremedim. ISIS te sadece dahili ısı sensöründe veri alışverişi oluyor.Neden olabilir ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..