Bitmiş bir termometre hikayesi..Ama...

Başlatan solidus, 13 Eylül 2006, 22:22:01

solidus

Evet arkadaşlar.. Sonunda bitti ama hala eksiklikleri var. Başlığı açmaktaki maksadım bunlara çözüm bulabilmektir.Devreşemasında büyük bir ihtimalle bir problem yok fakat yazılım olarak sıkıntılarım;
1. Harici ısı okuması yapılamaması
2. Harici ısıdaki işaret
ETE, fsan ve mmengi hocalarıma saygılarımla...

İşte açık kod;
@ DEVICE pic16F877 
@ DEVICE pic16F877, WDT_ON 
@ DEVICE pic16F877, PWRT_ON 
@ DEVICE pic16F877, PROTECT_OFF 
@ DEVICE pic16F877, XT_OSC

Define LCD_DREG     PORTD ' LCD data portunu belirle
Define LCD_DBIT     4 ' 4 bit'lik veri yolu
Define LCD_RSREG    PORTD ' LCD register seçme portunu belirle
Define LCD_RSBIT    1 ' LCD register seçme bitini belirle
DEFINE LCD_RWREG    PORTD        'LCD R/W Portu 
DEFINE LCD_RWBIT    2            'LCD R/W biti 
Define LCD_EREG     PORTD ' LCD enable portunu belirle
Define LCD_EBIT     3 ' LCD enable bitini belirle
Define LCD_LINES    4 ' LCD'deki satir sayisi

ADCON1=7
TRISA=%11
TRISB=%11001110
TRISC.3=0

'---------------------------DEĞİŞKENLER------------------------------
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       
SIGNBIT   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
Kalan       VAR BYTE			
Sayac       VAR	BYTe
Comm_1      VAR	PORTA.0
'===========DIŞ ISI İÇİN EKLENEN DEĞİŞKENLER===============
Comm_2         VAR	PORTA.1
HAM2           VAR WORD   ' Dış Sensör HAM okuma değeri
ISI1DIS        VAR BYTE       
ISI2DIS        VAR BYTE
SIGNDIS        VAR BYTE        '  ISI değeri için  +/-  işaret
ISARETDIS      VAR BYTE
KalanDIS       VAR BYTE			
SayacDIS       VAR	BYTe
SIGNBIT2       VAR HAM.11'Bit11 '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
ISIOUT         var word
'======================BAŞLIYORUZ===================
low PORTD.2
PAUSE 300


ISARET="+"
Z=1

GOSUB OKU
pauseus 500
GOSUB OKUDIS
IF ALT>400 THEN 
ALT=005
GOSUB YAZ
pauseus 500
GOSUB YAZDIS
ENDIF
SEC=0

BASLA:
GOSUB EKR1
pauseus 500
GOSUB EKR11
SEC=1-SEC
IF SEC=0 then ESAS
HAM=0   'SICAKLIK ÖLÇME
GOSUB SENSOKU
tsen=ISI1*10+ISI2
PAUSEus 500
GOSUB SENSOKUDIS
TSEN=ISI1DIS*10+ISI2DIS
GOSUB EKR1
PAUSEus 500
GOSUB EKR11
     
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           'ARTTIR KLİMA ON/OFF TUŞU PORTB.2 DE
ALRM=1-ALRM
GOSUB DURUM
WHILE PORTB.2=0 
WEND
ENDIF

       
IF PORTB.3=0 then           'AZALT KLIMA ON/OFF TUŞU PORTB.3 DE
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=ISARET and ISARET="+" then
GOSUB AC:GOTO ATLA
ENDIF
ENDIF
                
IF SIGN="-" AND ISARET="+" THEN
GOSUB AC:GOTO ATLA
ENDIF
            
IF TSET >= TSEN THEN
IF sign=isaret and isaret="-" then
GOSUB AC:GOTO ATLA
ENDIF 
ENDIF    
ENDIF
       
                        
IF Y=1 THEN
IF TSEN<TSET THEN
IF sign=isaret and isaret="+" then
GOSUB KAPA:GOTO ATLA 
ENDIF    
ENDIF
         
IF SIGN="+" AND ISARET="-" THEN
GOSUB KAPA:GOTO ATLA
ENDIF
          
IF TSET<TSEN THEN
IF sign=isaret and isaret="-" 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,1
LCDOUT $FE,$C0,"      FAN ACIK" 
LCDOUT $FE,$D4,"   KLIMA CALISIYOR"
Z=0:ILK=0:PAUSE 200
RETURN

KAPA:   
PORTB.5=0:Y=0:ALRM=0

KAPABIR:
LCDOUT $FE,1 
LCDOUT $FE,$C0,"     FAN KAPALI"
LCDOUT $FE,$D4,"  KLIMA CALISMIYOR"
Z=0:ILK=0:PAUSE 200
RETURN 

DURUM:  
IF ALRM=0 THEN
low PORTB.5
gosub KAPABIR
ELSE
HIGH PORTB.5
GOSUB ACBIR
ENDIF
Z=0        
RETURN


'----------------EKRANA YAZMA KISMI --------------------
EKR1:	 
LCDOUT $FE,$80,"DAHILI ISI:",Sign,DEC2 ISI1,".",DEC1 ISI2," ",Deg,"C"     

EKR11:

LCDOUT $FE,$C0,"HARICI ISI:",SignDIS,DEC2 ISI1DIS,".",DEC1 ISI2DIS," ",Deg,"C"     

EKRAN2:	LCDOut $FE,$94:
        ALARM1=ALT/10:ALARM2=ALT//10

    	LCDOut "AYARLANAN :",isaret,DEC2 ALARM1 , "." , DEC1 ALARM2," ",Deg,"C"  
		RETURN		
'-------------------------------------------------------
SECIM:  
pause 50
LCDOUT $FE,1 
gosub EKR3     
while PORTB.1=0 
wend

IKINCI: 
Z=20

IKIBIR: 
GOSUB EKR3
IF PORTB.2=0 THEN
IF isaret="-" THEN
alt=alt-1
IF alt=65535 THEN
alt=1:isaret="+"
ENDIF   
GOTO ARACIK
ENDIF
ALT=ALT+1  
ENDIF
IF PORTB.3=0 THEN
IF isaret="-" THEN 
alt=alt+1
GOTO ARACIK
ENDIF   
ALT=ALT-1
IF ALt=65535 THEN 
isaret="-"
ALT=1
ENDIF :ENDIF
 
ARACIK: 
GOSUB YAZ
GOSUB YAZDIS
PAUSE 20
IF PORTB.1=0 THEN
IF Z=20 THEN IKIBIR
while PORTB.1=0
gosub EKR1
GOSUB EKR11
wend
GOTO BASLA
ENDIF
Z=22
GOTO IKIBIR

EKR3:
LCDOUT $FE,$80,"   KLIMA ISI AYARI"
goto EKRAN2
RETURN
                 
'--------------------- İŞLEM BAŞLANGICI -----------------------
'================== DAHİLİ ISI RUTİNİ==========================
SENSOKU: 
OWOUT   Comm_1, 1, [$CC, $44]' ROM kodunu okuma ISI değerini oku
Bekle:
OWIN    Comm_1, 4, [Busy]    ' Busy değerini oku
IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
OWOUT   Comm_1, 1, [$CC, $BE]'ROM kodunu okuma SCRATCHPAD MEMORY oku
OWIn    Comm_1, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac]
GOSUB   Hesapla
RETURN
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı
Sign  = "+"    
IF SIGNBIT = 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 //1000)/100
ISI1=ISI/1000
pause 2000
RETURN

SENSOKUDIS:  
'======== HARİCİ ISI RUTİNİ======================
OWOUT   Comm_2, 1, [$CC, $44]' ROM kodunu okuma ISI değerini oku
BekleDIS:
OWIN    Comm_2, 4, [Busy]    ' Busy değerini oku
IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
OWOUT   Comm_2, 1, [$CC, $BE]'ROM kodunu okuma SCRATCHPAD MEMORY oku
OWIn    Comm_2, 0, [HAM2.LOWBYTE, HAM2.HIGHBYTE, Skip 4, Kalan, Sayac]
GOSUB   HesaplaDIS
RETURN
    
HesaplaDIS:                 ' Ham değerden Santigrat derece hesabı
SignDIS  = "+"    
IF SIGNBIT2 = NEGAT_ISI THEN
SignDIS   = "-"  
ISIOUT=((($ffff-HAM2+1)*50)-25)+ (((SayacDIS - KalanDIS) * 100) / SayacDIS)
GOTO GEC   
endif
ISIOUT=(((HAM2) * 50) - 25) + (((SayacDIS - KalanDIS) * 100) / SayacDIS)

GECDIS:
ISI2DIS = (ISIOUT //1000)/100
ISI1DIS=ISIOUT/1000
         
OKU:   
READ 8,ALT.BYTE0:PAUSE 20:READ 9,ALT.BYTE1:PAUSE 20:READ 10,ISARET:PAUSE 10
RETURN
       
YAZ:  
WRITE 8,ALT.BYTE0:PAUSE 20:WRITE 9,ALT.BYTE1:PAUSE 20:WRITE 10,ISARET:PAUSE 10 
RETURN  
       
OKUDIS:   
READ 8,ALT.BYTE0:PAUSE 20:READ 9,ALT.BYTE1:PAUSE 20:READ 10,ISARET:PAUSE 10
RETURN
       
YAZDIS:   
WRITE 8,ALT.BYTE0:PAUSE 20:WRITE 9,ALT.BYTE1:PAUSE 20:WRITE 10,ISARET:PAUSE 10 
RETURN  
                   
SENSORYOK:
LCDOUT $FE,1 
LCDOUT $FE,$C0,"   SENSOR YOK   "
LCDOUT $FE,$94," LUTFEN TAKINIZ "  
PAUSE 1500               
RETURN
END

Devre şeması;
http://img87.imageshack.us/img87/9601/devreemasgf2.jpg
Çalışırken çekilirken bir fotoğraf;
http://img50.imageshack.us/img50/5339/almaanho4.jpg
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

solidus

Sorun çözülmüştür arkadaşlar.. Nasıl mı ? 2. DS için farklı değişkenlerle ek bir yazılım ve 2. DS için 20 msn lik bir çalışma gecikmesi ile...
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..