dijital saat-tarih-nem... hata nerede???

Başlatan ozzge, 01 Ocak 2007, 22:58:58

ozzge

arkadaşlar hepinize selam. ya bi projem var dijital saat tarih ve ısı-em göstergesi lcd de. aşağıdaki kodu yazdım (ısı nem kısmı alıntı olmak üzere) fakat derlediğimde bi sürü hata mesajı ile karşılaştım. saniye 55 olunca 5 sn boyunca ısı ve nemi gösterecek diğer zamanlarda lcd de saat ve tarih yeralacak. en son bölümdeki karmaşık if li hesaplar ise artık yıl hesapları ve 31 gün olan ayların hesapları. bu koddaki hatayı bulabilecek bir arkadaş varsa çooookkkk sevinirim. en kısa zamanda yardımlarınızı buradan ya da pm olarak bekliyorumm.(sensör olarak sht 11 kullanılıyor)

'****************************************************************
'*  Name    : dijitalsaat-tarih-nem.BAS                         *
'*  Author  : [ozge]                                            *
'*  Notice  : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14.12.2006                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define LCD_DREG	PORTC	'LCD data bacakları hangi porta bağlı?
   Define LCD_DBIT		0	'LCD data bacakları hangi bitten başlıyor?
   Define LCD_EREG	PORTB	'LCD Enable Bacağı Hangi Porta bağlı?
   Define LCD_EBIT		3	'LCD Enable Bacağı Hangi bite bağlı ?
   Define lcd rwreg PORTB 	'LCD R/W Bacağı Hangi Porta bağlı?
   Define LCD_RWBIT 	2 	'LCD R/W Bacağı Hangi bite bağlı ?
   Define LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
   Define LCD_RSBIT	    1	'LCD RS bacağı Hangi Bite bağlı  ?
   Define LCD_BITS		4	'LCD 4 bit mi yoksa 8 bit olarak bağlı?
   Define LCD_LINES	    2	'LCD Kaç sıra yazabiliyor
   OPTION_REG.7=1
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, MCLR_OFF
@ DEVICE pic16F877, INTRC_OSC_NOCLKOUT
'*****************************************************************
    TRISC=%00010000          'C Portunun 4. pini hariç tüm pinleri çıkış
    TRISB=%11110001          'B Portunun 7,6,5,4 ve 0. pinleri giriş,diğerleri çıkış
      
'*****************************************************************      
  SAYAC VAR BYTE
  SN VAR BYTE
  DAK VAR BYTE
  SAAT VAR BYTE
  GUN VAR BYTE
  AY VAR BYTE
  YIL VAR BYTE
  SYMBOL ENTER =PORTB.4
  SYMBOL ESC =PORTB.5
  SYMBOL YUKARI =PORTB.6
  SYMBOL ASAGI =PORTB.7
  Y       VAR     BIT
  KONTROL VAR     BYTE	   
  ISI1    VAR     BYTE       
  ISI2    VAR     BYTE       
  U1      VAR     BYTE         
  U2      VAR     BYTE
  C0      VAR     BYTE
  Z       VAR     BYTE
  H0      VAR     HAM.BYTE0
  H1      VAR     HAM.BYTE1
  HAM	  VAR	  WORD
  RAW     var     word
  ISI     VAR     WORD 
  RUT     VAR     WORD
  P1      VAR     WORD
  P2      VAR     WORD
  P3      VAR     WORD             
  C       VAR     WORD
  B       VAR     WORD
  W       VAR     WORD
  CLK     VAR     PORTC.4
  DTA     VAR     PORTB.0  
  ISARET  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
'*******************************************************************
clear  'tüm değişkenler sıfırlandı
    pause 200    'LCD nin çalışması için bekle
    Lcdout $fe, 1 'Ekranı sil
    Low PORTB.2  'LCD -R/W bacağı LOW'a çekildi.
'*******************************************************************
On Interrupt Goto KESME  'kesme oluşursa KESME adlı etikete git.
   ' OPTION_REG = %10000101 	'Pull up dirençleri İPTAL- Bölme oranı 1/64.
    INTCON = %10100000 		'Kesmeler aktif ve TMR0 kesmesi aktif
    TMR0 = 0
'******************************************************************
lcdout $FE,1                  '2 sn reklam..:) 
    lcdout "  ozzzzzgeeeee"
    lcdout $FE,$C0,"    PRESENTS"
    :PAUSE 1500
    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,1
    GOTO START    
'*******************************************************************
START:
    Lcdout $fe, $80,"saat:", dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C0,"tarih:", DEC2 GUN,"/", DEC2 AY ,"/", DEC2 YIL
    IF (SN>54) and (SN<60)THEN
    Gosub reset :GOSUB T_START
    GOTO BASLA
    ENDIF 
    IF ENTER=1 THEN 
    PAUSE 200
    GOTO DAKAYAR
    ENDIF
    GOTO START
'*****************dijital saat ve tarih etiketleri******************************
DAKAYAR:
    Lcdout $fe, $84, dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C4, DEC2 GUN,".", DEC2 AY ,".", DEC2 YIL
    LCDOUT $FE,$88,$0F
    LCDOUT $FE,$87,$0F
    PAUSE 1
    IF ESC=1 THEN GOTO START
    IF ENTER=1 THEN
    PAUSE 200
    GOTO SAATAYAR
    ENDIF
    IF YUKARI=1 THEN
    PAUSE 200
    DAK=DAK+1
        IF DAK=60 THEN
        DAK=0
        ENDIF
    ENDIF
    IF ASAGI=1 THEN
    PAUSE 200
    DAK=DAK-1
         IF DAK=-1 THEN
         DAK=59
         ENDIF
    ENDIF
    GOTO DAKAYAR
'*********************************************************************
SAATAYAR:
    Lcdout $fe, $84, dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C4, DEC2 GUN,"/", DEC2 AY ,"/", DEC2 YIL
    LCDOUT $FE,$85,$09
    LCDOUT $FE,$84,$09
    PAUSE 1
    IF ESC=1 THEN GOTO START
    IF ENTER=1 THEN
    PAUSE 200
    GOTO YILAYAR
    ENDIF
    IF YUKARI=1 THEN 
    PAUSE 200
    SAAT=SAAT+1
        IF SAAT=24 THEN
        SAAT=0
        endIF
    ENDIF
    IF ASAGI=1 THEN
    PAUSE 200
    SAAT=SAAT-1
         IF SAAT=-1 THEN
         SAAT=23
         ENDIF
    ENDIF
    GOTO SAATAYAR
'*********************************************************************
YILAYAR:
    Lcdout $fe, $84, dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C4, DEC2 GUN,"/", DEC2 AY ,"/", DEC2 YIL
    LCDOUT $FE,$CB,$09
    LCDOUT $FE,$CA,$09
    PAUSE 1
    IF ESC=1 THEN GOTO START
    IF ENTER=1 THEN 
    PAUSE 200
    GOTO AYAYAR
    ENDIF
    IF YUKARI=1 THEN
    PAUSE 200
    YIL=YIL+1
        IF YIL=31 THEN
        YIL=90
        ENDIF
    ENDIF
    IF ASAGI=1 THEN
    PAUSE 200
    YIL=YIL-1
        IF YIL=89 THEN
        YIL=30
        ENDIF
    ENDIF
    GOTO YILAYAR
'*********************************************************************
 AYAYAR:
    Lcdout $fe, $84, dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C4, DEC2 GUN,"/", DEC2 AY ,"/", DEC2 YIL
    LCDOUT $FE,$C8,$09
    LCDOUT $FE,$C7,$09 
    PAUSE 1
    IF ESC=1 THEN GOTO START
    IF ENTER=1 THEN
    PAUSE 200
    GOTO GUNAYAR 
    ENDIF
    IF YUKARI=1 THEN
    PAUSE 200
    AY=AY+1
        IF AY=13 THEN
        AY=1
        ENDIF
    ENDIF
    IF ASAGI=1 THEN
    PAUSE 200
    AY=AY-1
        IF AY=0 THEN
        AY=12
        ENDIF
    ENDIF
    GOTO AYAYAR
'********************************************************************* 
GUNAYAR:
    Lcdout $fe, $84, dec2 saat ,":", dec2 dak ,":", dec2 sn
    lcdout $FE,$C4, DEC2 GUN,"/", DEC2 AY ,"/", DEC2 YIL
    LCDOUT $FE,$C5,$09
    LCDOUT $FE,$C4,$09
    PAUSE 1
    IF ESC=1 THEN GOTO START
    IF ENTER=1 THEN
    PAUSE 200
    GOTO START
    ENDIF
    IF YUKARI=1 THEN 
    PAUSE 200
    GUN=GUN+1
        IF GUN=31 THEN
        GUN=1
        ENDIF
    ENDIF
    IF ASAGI=1 THEN
    PAUSE 200
    GUN=GUN-1
        IF GUN=0 THEN
        GUN=30
        ENDIF
    ENDIF
    GOTO GUNAYAR

'***************ısı ve nem etiketleri******************************************
BASLA:  
        KONTROL=%00000011:HAM=0   'SICAKLIK ÖLÇME
        GOSUB OLCUMAL
        Gosub ISIHESAP:GOSUB EKRAN1
        PAUSE 250

       KONTROL=%00000101:HAM=0 'RUTUBET ÖLÇME
       GOSUB OLCUMAL
       GOSUB RUTHESAP:GOSUB EKRAN2
        PAUSE  300
        GOTO BASLA
	
EKRAN1:	LCDOut $FE,2       
        		If ISARET=1 THEN
          		     LCDOut "  ISI :-",DEC3 ISI1 , "," , DEC1 ISI2," ",0,"C ":RETURN  
       		EndIF 
        		LCDOut "  ISI : ",DEC3 ISI1 , "," , DEC1 ISI2," ",0,"C ":RETURN

EKRAN2:	LCDOut $FE,$C0:
    		LCDOut "  NEM : ",DEC3 U1 , "," , DEC1 U2,"  % "
		RETURN		

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


RESET:  OUTPUT DTA:OUTPUT CLK':TRISC.4=0:TRISB.0=0'
        high DTA=1
        FOR W=0 TO 9
        HIGH CLK
        pause 1
        LOW CLK
        Next W
        Return

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 EXIT
        NEXT W
        HATA=1
EXIT:  IF HATA=1 then 
         gosub SENSORYOK
       endif
       SHIFTIN DTA,CLK,0,[H1]
       OUTPUT DTA
       LOW DTA
       PULSOUT CLK,10
       INPUT DTA
       SHIFTIN DTA,CLK,0,[H0]
       PULSOUT CLK,10
       RETURN
      
ISIHESAP:  
           if ham<4000 then 
              ISARET=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAM)/100
              ISI2=((4000-ham)//100)/10   
              goto ISISON
            endif
           ISI1=(HAM-4000)/100
           ISI2=((HAM-4000)//100)/10
ISISON:    if HAM>16384 then
             ISI1=0:ISI2=0
           endif  
    RETURN
          

 RUTHESAP: 
           ISI=ISI1*10+ISI2
           p1=(26542-(54722**ham+ham))**ham-40     
           P2=655+(HAM*5)+(HAM**15917)	      
           P3=(P2**(ISI*10+2480))-(P2**2730)+P1   ' kompanse edilmiş değer
           U1=p3/10:U2=p3//10
           IF ham>3710 THEN
              u1=0:U2=0
              GOTO SENSORYOK
           ENDIF  
           return 

          
SENSORYOK: LCDOUT $FE,$02,"   SENSOR YOK   "
           LCDOUT $FE,$C0," LUTFEN TAKINIZ "  
           PAUSE 1500               
           RETURN

'*********************************************************************
Disable
       kesme:
       sayac = sayac + 1 	'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
        If sayac = 61 Then 	'61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
                  sayac = 0 	'sayaç sıfırlanıyor
                  sn = sn + 1 	'saniye değeri bir artırılıyor
           If sn = 60 Then 	'saniye 60 olmuş ise 1 dakika süre geçti o halde
                  sn = 0 	' saniye sıfırlanıyor
                  dak = dak + 1 	' dakika değeri bir artırılıyor
              If dak = 60 Then  'dakika 60 olmuş ise 1 saat süre geçti
                   dak = 0 	' dakika sıfırlanıyor
                   saat = saat + 1  ' saat değeri bir artırılıyor
                If saat = 24 Then  'saat 24 olmuş ise 1 gün geçti
                    saat = 0  'saat sıfırlanıyor
                    gun = gun + 1  'gün değeri bir artırılıyor
                    IF yIL=92 OR YIL=96 OR YIL=00 OR YIL= 04 OR YIL=08 OR YIL=12 OR YIL=16 OR YIL=20 OR YIL=24 OR YIL= 28 THEN 
                        IF AY=12 THEN
                            IF GUN=30 THEN
                                GUN=1
                                AY=1
                                YIL=YIL+1
                            ENDIF
                        ENDIF
                        If ay=1 OR ay=3 OR ay=5 OR AY=7 OR AY=8 OR AY=10 Then
                                IF GUN=32 THEN
                                    GUN=1
                                    AY=AY+1
                                ENDIF
                        ENDIF
                        IF GUN=31 THEN
                            GUN=1
                            AY=AY+1
                        ENDIF
                    ELSE
                        If ay=1 OR ay=3 OR ay=5 OR AY=7 OR AY=8 OR AY=10 OR AY=12 Then
                            IF GUN=32 THEN
                                GUN=1
                                AY=AY+1
                                IF AY=13 THEN
                                    AY=1
                                    YIL=YIL+1
                                ENDIF
                            ENDIF 
                        ELSE
                            IF GUN=31 THEN 
                                GUN=1
                                AY=AY+1
                            ENDIF
                        ENDIF
                    ENDIF
                Endif
              Endif
            Endif
         ENDIF
         
INTCON.2 = 0  'TMR0 Kesme bayrağı sıfırlanıyor
Resume
Enable

End

SpeedyX

RUTHESAP:
           ISI=ISI1*10+ISI2
           p1=(26542-(54722**ham+ham))**ham-40     
           P2=655+(HAM*5)+(HAM**15917)        
           P3=(P2**(ISI*10+2480))-(P2**2730)+P1   ' kompanse edilmiş değer
           U1=p3/10:U2=p3//10
           IF ham>3710 THEN
              u1=0:U2=0
              GOTO SENSORYOK
           ENDIF 
           return

Burada ** operatörü ne iş yapıyor?
** ları birde * yaparak dener misin.

ete

Programdan önce keşke hata kodlarını verseydin. Aynı hataları görebilmek için programı bizimde derlememiz gerekecek.
Programı derlemeden gördüğüm ilk hata define mclr off komutu. Bu komut 16f877 için geçerli değildir. f628 ile kullanılan bir komutdur.
Diğer hatalara programı derledikten sonra bakacağım.
Bu arada ** bir aritmetik işlemdir ve 32bit çarpma yapar.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ozzge

ilgin için teşekkürler ete. hata mesajlarını yazmak isterdim fakat bir hayli hata çıktı :( .o yüsden kodları verdim.ya nasıl yapıcam ben bu projeyi.üfff. define mclr off u da kaldırıp derledim yine bi sürü hata çıktı.

shy

slm arkadaşlar...
bu nem ölçen sensörü nasıl bulabiliriz???
ismini bileniniz varmı???
bu konuda çalışma yapıyorumda...

marsilya55

biraz pahalı olmakla birlikte sht 11 diye bir  sensör var. sensiron firmasının hem ısı hem de nem sensörü. digital çıkışlı. 20$ olması lazım.

ozzge

ete kodları derlemeye fırsatın oldu mu?hataları çözemedim ben hala.

mytap

Vakitle alakalı problemlerle belki derleme sorunu olabilir. Bence siz hata msjlarını buraya yazarsanız, daha hızlı bir çözüm bulunabilir.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

OG

Alıntı yapılan: "ozzge"ete kodları derlemeye fırsatın oldu mu?hataları çözemedim ben hala.

Yalnızca
@ DEVICE pic16F877, MCLR_OFF 
@ DEVICE pic16F877, INTRC_OSC_NOCLKOUT
Bunlar hata veriyor.  Daha fazla hata veriyorsa programdan işlemciyi yanlış seçmiş olabilirsin.

MCLR tanımını kaldır diğerini de @ DEVICE pic16F877, XT_OSC yap. Şeması (DSN dosyası) olmadığı için denemek mümkün değil.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.