ds1820 okuma hatası

Başlatan tufan953, 21 Haziran 2015, 23:45:36

tufan953

hayırlı akşamlar değerli meslektaşlarım ve hocalarım yazmış olduğum kodlarda hatanın nerde olduğu konusunda yardımcı olursanız sevinirim ds18b20 okumuyor?
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 17.06.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;__config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF

'***************************************************************

'@ DEVICE PIC16f877A
'@ DEVICE PIC16f877A, WDT_OFF
'@ DEVICE PIC16f877A, BOD_ON
'@ DEVICE PIC16f877A, PWRT_ON
'@ DEVICE PIC16f877A, PROTECT_OFF
'@ DEVICE PIC16f877A, XT_OSC
'CMCON=7

'****************************************************************
ON INTERRUPT GoTo Kesme
OPTION_REG=%0000000     
INTCON=%10010000
OPTION_REG.7=1


'*******************************************************************




   DEFINE OSC 4

TRISA=%00000000
TRISB=%00001111
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0



SEC VAR PORTB.0
ARTI VAR PORTB.1
EKSI VAR PORTB.2
DUR VAR PORTB.3
'*******************BYTE TANIM************************************
AYAR var bit
SAYAC1 var byte
SAYAC2 var byte
SETSURE VAR BYTE
SURE VAR BYTE
SET VAR BYTE
'****************SENSÖR TANIMLAMASI***********************************

Comm_Pin   VAR PortB.4
Busy        VAR BIT
HAM         VAR WORD
ISI         VAR WORD
SIGN        VAR BYTE
SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
TEMP        VAR BYTE
Float       VAR WORD
'**********************************************************************
AYAR=0
SAYAC1=0
SAYAC2=0
SETSURE=0
SURE=0 
SET=0
'*********************LCD TANIMLAMARI******************************
DEFINE LCD_DREG      PORTD
DEFINE LCD_DBIT      0 
DEFINE LCD_RSREG     PORTD
DEFINE LCD_RSBIT     4
DEFINE LCD_EREG      PORTD
DEFINE LCD_EBIT      5
DEFINE LCD_BITS      4
DEFINE LCD_LINES     4
'*****************************************************************

PAUSE 100
LCDOUT $FE,1


BASLA:

IF AYAR=0 THEN
  GOSUB SENSOROKU
  LCDOUT $FE,$80,"SET=",DEC2 SET
  LCDOUT $FE,$86,"ISI=",Sign,DEC ISI,".",DEC1 (Float),0,"C"
  LCDOUT $FE,$C0,"SETSURE=",DEC2 SETSURE
  LCDOUT $FE,$CB,"SURE=",DEC2 SURE

  PAUSE 200
  ELSE
 
  SELECT CASE SAYAC1
 
       case 1
                lcdout $FE,$0E
                lcdout $FE,$85
            case 2
                lcdout $FE,$0E
                lcdout $FE,$C9

             END SELECT

        GOSUB BUTON

  LCDOUT $FE,$80,"SET=",DEC2 SET
  LCDOUT $FE,$86,"ISI=",Sign,DEC ISI,".",DEC1 (Float),0,"C"
  LCDOUT $FE,$C0,"SETSURE=",DEC2 SETSURE
  LCDOUT $FE,$CB,"SURE=",DEC2 SURE
 

  ENDIF
  GOTO BASLA

   BUTON:
   
  SELECT CASE SAYAC1
  CASE 1
   IF ARTI=0 THEN SET=SET+1
   IF EKSI=0 THEN SET=SET-1
   IF SET<1 THEN SET=0

   CASE 2
  IF ARTI=0 THEN SETSURE=SETSURE+1
  IF EKSI=0 THEN SETSURE=SETSURE-1
  IF SETSURE<1 THEN SETSURE=0
   END SELECT
  GOSUB TUFAN
  RETURN

 

  '***********Sensör Oku***********
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ı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)        '
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=(ISI/1000)-1


 

  TUFAN:
  PAUSE 100
LCDOUT $FE,1
  IF SAYAC1=3 THEN
  lcdout $FE,$0C
   PAUSE 250 
  LCDOUT $FE,$80,"SURE VE SETDEGERLERI"
  LCDOUT $FE,$C4,"AYARLANDI"
 
   SAYAC1=0
   AYAR=0

   ENDIF
   RETURN
    '***********Kesme***********
RETURN
DISABLE   
Kesme:
    if Ayar=0 then
   
   PAUSE 100
LCDOUT $FE,1
     
  LCDOUT $FE,$80,"SURE VE SETDEGERLERI"
  LCDOUT $FE,$C4,"AYARLA"

        pause 100
        lcdout $FE,1
    endif
    pause 400
    Ayar=1
    SAYAC1=SAYAC1+1
    INTCON.1=0
Resume
Enable

end


erdem883

Selam, ete hocanin 628a icin yazdigi kodu bende 877a icin uyarlamak istedim, isis te simule
ettigimde ekranda tset tsen yazilari cikiyor sorun isistemi yoksa bi hatami var bulamadim.
gercek devrede denemedim.130 goruntuleme 0 cevap. yardim alamadim
877a nin ilk calismada analog pinleri aktif diye biliyorum. o yuzden adcon komutu ile analog
Pinleri dijital yapmalisin.
Adcon1=7
bilgim cok az, fakat dikkatimi ceken bu oldu.

aRci

hesapla etiketinde işlem bitince geri dönmesi için return eklemeyi unutmuşsunuz aşağıdaki kodlar la değiştiriseniz olacaktır

Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)        '
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=(ISI/1000)-1
return

tufan953

#3
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 22.06.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

;__config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF

'***************************************************************

'@ DEVICE PIC16f877A
'@ DEVICE PIC16f877A, WDT_OFF
'@ DEVICE PIC16f877A, BOD_ON
'@ DEVICE PIC16f877A, PWRT_ON
'@ DEVICE PIC16f877A, PROTECT_OFF
'@ DEVICE PIC16f877A, XT_OSC
'CMCON=7

'****************************************************************
ON INTERRUPT GoTo Kesme
OPTION_REG=%0000000
INTCON=%10010000
OPTION_REG=7


'*******************************************************************




DEFINE OSC 4

TRISA=%00000000
TRISB=%00011111
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
ADCON1 = 7


SEC VAR PORTB.0
ARTI VAR PORTB.1
EKSI VAR PORTB.2
DUR VAR PORTB.3
'*******************BYTE TANIM************************************
AYAR var bit
SAYAC1 var byte
SAYAC2 var byte
SETSURE VAR BYTE
SURE VAR BYTE
SET VAR BYTE

'****************SENSÖR TANIMLAMASI***********************************
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=PORTB.4   ' One-wire Data-Pin "DQ" PortB.0 da

'**********************************************************************
AYAR=0
SAYAC1=0
SAYAC2=0
SETSURE=0
SURE=0
SET=0

'*********************LCD TANIMLAMARI******************************
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
'*****************************************************************

PAUSE 100
LCDOUT $FE,1


BASLA:

IF AYAR=0 THEN
GOSUB SENSOROKU

LCDOUT $FE,$80,"SET=",DEC2 SET
LCDOUT $FE,$88," A=",DEC2 ISI,",",DEC1 (FLOAT)
LCDOUT $FE,$C0,"SETSURE=",DEC2 SETSURE
LCDOUT $FE,$CB,"SURE=",DEC2 SURE

PAUSE 200
ELSE

SELECT CASE SAYAC1

case 1
lcdout $FE,$0E
lcdout $FE,$85
case 2
lcdout $FE,$0E
lcdout $FE,$C9

END SELECT
GOSUB BUTON

LCDOUT $FE,$80,"SET=",DEC2 SET
LCDOUT $FE,$88," A=",DEC2 ISI,",",DEC1 (FLOAT)
LCDOUT $FE,$C0,"SETSURE=",DEC2 SETSURE
LCDOUT $FE,$CB,"SURE=",DEC2 SURE


ENDIF
GOTO BASLA








BUTON:

SELECT CASE SAYAC1
CASE 1
IF ARTI=0 THEN SET=SET+1
IF EKSI=0 THEN SET=SET-1
IF SET<1 THEN SET=0

CASE 2
IF ARTI=0 THEN SETSURE=SETSURE+1
IF EKSI=0 THEN SETSURE=SETSURE-1
IF SETSURE<1 THEN SETSURE=0
END SELECT
GOSUB TUFAN
RETURN



'***********Sensör Oku***********
               
         
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

TUFAN:
PAUSE 100
LCDOUT $FE,1
IF SAYAC1=3 THEN
lcdout $FE,$0C
PAUSE 250
LCDOUT $FE,$80,"SURE VE SETDEGERLERI"
LCDOUT $FE,$C4,"AYARLANDI"

SAYAC1=0
AYAR=0

ENDIF
RETURN
         
'***********Kesme***********
RETURN
DISABLE
Kesme:
if Ayar=0 then

PAUSE 100
LCDOUT $FE,1

LCDOUT $FE,$80,"SURE VE SETDEGERLERI"
LCDOUT $FE,$C4,"AYARLA"

pause 100
lcdout $FE,1
endif
pause 400
Ayar=1
SAYAC1=SAYAC1+1
INTCON.1=0
Resume
Enable

end



ne yaptıysam olmadı ds18b20 16f877 çalıştıramadım programda atladığım bir şeyler mi var acaba şimdiden tşk'ler



ete

#4
Böyle uzun programları verirken Kod Tag içine alın lütfen. Mesaj yazarken üzerinde "#" olan buton bu işi yaptırıyor.

Programdaki mantığı anlayamadım. Sensör okuması yalnızca AYAR=0 iken yapılabiliyor.
Zira başta,
IF AYAR=0 THEN
GOSUB SENSEROKU  şeklinde bir komut satırı mevcut.
Diğer taraftan SEC tuşuna basılırsa program kesmeye girip AYAR=1 olarak çıkıyor.
Bu durumda AYAR=1 olduktan sonra bir daha sensör okuması yapmayacak demektir.
Bu programda SEC tuşu için kesme kullanılması da gereksiz. Bence kesmeyi iptal edip o kısmı normal program içine alsan daha iyi olur. Zira oaraya bir sürü Pause doldurmuşsun. Ayrıca programın içinde de Pause 200 gibi bir değer var. Bunlar kesmenin doğru çalışmasını engeller zaten.

Her şeyden önce neden sensör okuma için böyle anlamsız bir mantık kullandın onu açıkla da ona göre yorum yapayım. Belki vardır bir bildiğin ama o neyse bende bilmek isterim.

Aslında  SEC tuşuna basılıncaya kadar sistem sensör okuması yapıp bunu ekrana veriyor olması gerekir. Bunuda yapmıyor ise daha dikkatli bakılması gerekir programa.

Ete

Edit: Yeniden baktım da programa AYAR=1 meselesi değerlerin set edilmesi için düşünülmüş. Değer girişi tamamlanınca yeniden AYAR=0 yapılıyormuş. Onu önce görmemiştim. Sistem çalışıyor aslında ama bu mantıkla bu programın doğru çalışması biraz zor. Bazı kusurlar var;
OPTION_REG=7 verilmiş neden? BU dahili pullup ları açıyor. (Bit-7=0 olduğu için) peki sensör data pinide PORTB.4 e bağlı ve bu normalda 4K7 pullup direnci ister. Sen bir direnç bağladınmı? bağlamadın ise o sensör sağlıklı çalışmayacaktır. Zira dahili pullup dirençleri bildiğim 47K dolayındadır. Program çalışmasına rağmen ekrandaki bilgiler bir birine giriyor eski bilgiler ekranda kalıyor. Bunlar düzeltilmelidir.
Bence kesmeye bağlı sistem yerine ayrı bir AYAR menüsü düzenlenmeli ve işlem orada bitirilip geriye dönülmelidir.

BU arada sistemi simulasyonda denedim ve sensöre ayrıca 4K7 pullup direnci taktım.

Ete

tufan953

hocam verdiğiniz bilgiler için çok tsk ederim  söylemis olduklarinizi uygulayip programı ve semasini tekrar upload edicem siteye

tufan953

değerli hocalarım hayırlı akşamlar benim kendimi geliştirmek amacıyla ete hocamın daha önceki projelerinden de yardım alarak yapmaya çalışmış olduğum projenin konusu set ve ısı değeri eşit olunca röle1 off konumuna gececek daha sonra ayarlamış olduğum zaman aralıklarında röle2 aktif olup program sonlanacak program ısısde çalışmaya baslayınca devamlı call ve return hataları veriyor ama devre çalışıyor gözüküyor yardımlarınız için şimdiden tşk ederim
***************************************************************
'*  Name    : DİS PROTEZ 3                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 18.07.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

;__config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF

'***************************************************************

'@ DEVICE PIC16f877A
'@ DEVICE PIC16f877A, WDT_OFF
'@ DEVICE PIC16f877A, BOD_ON
'@ DEVICE PIC16f877A, PWRT_ON
'@ DEVICE PIC16f877A, PROTECT_OFF
'@ DEVICE PIC16f877A, XT_OSC
'CMCON=7

'****************************************************************



'***********RTC DS1302 DEĞİŞKENLERİ***********
SN      VAR BYTE
DAK     VAR BYTE
SAAT    VAR BYTE
GUN     VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE
MEM     var byte
SAYI    VAR BYTE
DAY     var byte
ONLAR   VAR BYTE
BIRLER  VAR BYTE
'*******************************************************************


DEFINE OSC 4

TRISA=%00000000
TRISB=%00011111
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
ADCON1 = 7

'***********Saat İçin Gerekli Port Tanımlamaları***********
RTC_RST     var     PORTA.2
RTC_DTA     var     PORTA.0
RTC_CLK     var     PORTA.1

'*******************BYTE TANIM************************************

SETSURE  VAR BYTE
SET      VAR BYTE
SYC      VAR BYTE
AYAR     VAR BYTE
'*********************************************************************
SEC VAR PORTB.0
ARTI VAR PORTB.1
EKSI VAR PORTB.2
BSL VAR PORTB.3
BUZER VAR PORTE.0
'***********************************************************************

SYMBOL ROLE1=PORTD.6
SYMBOL ROLE2=PORTD.7

'*************************************************************************
SETSURE=6     
SET=3       
SYC=0         
AYAR=0     

'****************SENSÖR TANIMLAMASI***********************************
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=PORTB.4   ' One-wire Data-Pin "DQ" PortB.0 da





'*********************LCD TANIMLAMARI******************************
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
'*****************************************************************



GIRIS:
    LCDOUT $FE,$80,"==>tufan<=="
    LCDOUT $FE,$C1,"953"
    LCDOUT $FE,$95,"proje"
    LCDOUT $FE,$DA,"calısması"
     PAUSE 2000
     LCDOUT $FE,1




BASLANGIC:

SYC=0
AYAR=1

   
   

BASLA:
 
     
     GOSUB SENSOROKU
     GOSUB TUFAN
     GOSUB ZAMANOKU
     GOSUB EKRAN
     
     
     IF SEC=0 THEN AYAR_MENU
     GOTO BASLA
     
EKRAN:

     LCDOUT $FE,$80,"SET=",DEC2 SET
     LCDOUT $FE,$88,"ISI=",DEC2 ISI,",",DEC1 (FLOAT)
     LCDOUT $FE,$C0,"SETSURE=",DEC2 SETSURE
     LCDOUT $FE,$CB,"SURE=",DEC2 DAK
     




'***********Sensör Oku***********
               
         
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




 
TUFAN:
LOW PORTD.6
IF SET>ISI THEN
HIGH PORTD.6
IF SET=ISI THEN 
LOW PORTD.6
ENDIF
ENDIF
IF SET=ISI THEN BIR
gosub ZAMAN_YAZ





BIR:



LOW PORTD.7
IF SETSURE=DAK THEN
HIGH PORTD.7
IF SETSURE<DAK THEN
LOW PORTD.7
IF SEC=0 THEN  GOTO AYAR_MENU
ENDIF
ENDIF 
RETURN







    BIP:
   
    HIGH buzer   
pause 50
     LOW buzer 
  RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER
RETURN
     

   AYAR_MENU:

GOSUB BIP
WHILE SEC=0: WEND
GOSUB TEMIZLE
SYC=0

AYARLAR:

  IF ARTI=0 THEN
  GOSUB BIP
  WHILE ARTI=0:WEND
  SYC=SYC+1
  IF SYC=5 THEN SYC=0
  ENDIF

  IF EKSI=0 THEN
  GOSUB BIP
  WHILE EKSI=0:WEND
  SYC=SYC-1
  IF SYC=255 THEN SYC=4
  ENDIF
  GOSUB DURUM
  GOTO AYARLAR


    DURUM:

SELECT CASE SYC
 
  CASE 0

LCDOUT $FE,$84,"SET AYARI"
LCDOUT $FE,$C0,"          "
IF SEC=0 THEN
WHILE SEC=0:WEND
GOSUB BIP
GOTO SET_AYARI
ENDIF

CASE 1

LCDOUT $FE,$84,"SET SURE"
LCDOUT $FE,$C0,"AYARI"
IF SEC=0 THEN
WHILE SEC=0:WEND
GOSUB BIP
GOTO SET_SURE
ENDIF

CASE 2

LCDOUT $FE,$84,"SURE AYARI"
LCDOUT $FE,$C0,"           "
IF SEC=0 THEN
WHILE SEC=0:WEND
GOSUB BIP
GOTO SURE_AYARI
ENDIF

CASE 4

LCDOUT $FE,$84," MENUDEN CIKIS "
LCDOUT $FE,$C0,"               "
IF SEC=0 THEN AYARLANDI
END SELECT
RETURN



SET_AYARI:


GOSUB TEMIZLE


SET_AYR:

lcdout $fe,$C0,"SET"
lcdout $FE,$94,"AYARI:  ",DEC2 SET

   IF ARTI=0 then SET=SET+1
        WHILE ARTI=0:WEND
           IF SET=99 then SET=0
           
           IF EKSI=0 then SET=SET-1
        WHILE EKSI=0:WEND
           IF SET=0 then SET=99       
            IF SEC=0 THEN
           
            GOTO AYAR_MENU 
            ENDIF                 
         GOTO SET_AYR
       RETURN

  AYARLANDI:
           IF SEC=0 then AYARLANDI
       lcdout $fe,1
       LCDOUT $FE,$C0,"AYARLAR KAYDEDILDI.."
       GOSUB BIPBIP
       AYAR=1
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto BASLA       
TEMIZLE:
        PAUSE 100
        lcdout $fe,1
RETURN

'**********************************************************************
SET_SURE:

   GOSUB TEMIZLE



SET_SRE:

lcdout $fe,$C0,"SET SURE"
lcdout $FE,$94,"AYARI:  ",DEC2 SETSURE

   IF ARTI=0 then SETSURE=SETSURE+1
        WHILE ARTI=0:WEND
           IF SETSURE=59 then SETSURE=0
           
           IF EKSI=0 then SETSURE=SETSURE-1
        WHILE EKSI=0:WEND
           IF SETSURE=0 then SET=59       
            IF SEC=0 THEN
         
            GOTO AYAR_MENU 
            ENDIF                 
         GOTO SET_SRE
       RETURN



SURE_AYARI:

WHILE SEC=0:WEND 
GOSUB TEMIZLE
  AYAR=1
 
 
       ZAMANAYAR:
 
IF SEC=0 THEN
AYAR=AYAR+1
WHILE SEC=0:WEND
ENDIF
GOSUB BUTONOKU   

        LCDOUT $FE,$80,"    ZAMAN AYARI     "       
        LCDOUT $FE,$94, "SURE=",DEC2 DAK

  IF AYAR=2 THEN ZAMAN_B
  GOTO ZAMANAYAR         
                             
BUTONOKU:
SELECT CASE AYAR         
CASE 1
LCDOUT $FE,$94, "SURE=",DEC2 DAK
IF ARTI=0 THEN
WHILE ARTI=0:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF EKSI=0 THEN
WHILE EKSI=0:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF     
END SELECT
RETURN

ZAMAN_B:
        IF SEC=0 then ZAMAN_B
       
goto AYAR_MENU   
       



'***********Zaman Oku***********
ZAMANOKU:

         high RTC_RST
         shiftout RTC_DTA, RTC_CLK, 0, [$BF]
         SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, day, YIL, MEM]
         low RTC_RST
         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=day:GOSUB CEVIR:day=SAYI
       
         return
'***********Zaman Yaz***********
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]
    low RTC_RST:PAUSE 1
    high RTC_RST         
    SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, day, YIL, 0]  'YAZ
    low RTC_RST
    PAUSE 10
return
'***********Çevir***********               
CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
RETURN 
'***********Ters Çevir***********
TERSCEVIR:               
    ONLAR=MEM DIG 1
    ONLAR=ONLAR<<4
    BIRLER=MEM DIG 0
    SAYI=ONLAR+BIRLER
RETURN
 

END

tufan953

Ete hocam soylediklerinizi yapmaya calistim ama call return hatasi veriyor yardimci olursaniz sevinirim

ete

Stack hatası GOSUB ile gidilen yerden başka yerlere GOTO ile yada tekrar GOSUB ile atlayarak oradan geldiğin yere sonuçta GOTO ile dönmek sonucunda oluşur.
GOSUB komutunu iyi anlamak gerekir. Bu komut bir ETIKET'e git ama orada RETURN görünce tekrar ayrıldığın yere geri dön amacı ile kullanılır. Böylece programın değişik bölgelerinden aynı etikete gidip ayrıldığın yere dönebilirsin.
Ama Bir etikete GOSUB ile gittikten sonra orada tekrar GOTO ile bir yere oradan başka bir yere atlarsan sonuçta RETURN komutunun dönüş özelliğini kaybedersin.

Şimdi senin GOSUB larına sırası ile bakarsan TUFAN isimli etiketinde sorun olduğunu göreceksin.
Bir defa anlam veremediğim komutlar burada başlıyor;
IF SET>ISI THEN
        HIGH PORTD.6
        IF SET=ISI THEN 
Bir yandan SET>ISI demiş ve doğru ise HIGH PORTD.6 demişsin. Ama hemen altına yazdığın komutun orada bir işlevi varmı sence? Yani IF SET=ISI THEN komutu orada işleyebilirmi? Çünki o if dmngüsüne SET>ISI olduğu için girmiş oldun. Aynı yerde SET=ISI olabilirmi hiç ? imkansız bir şey.
Çok gerekiyor ise IF SET=ISI THEN komut satırını o if döngüsünden çıkartıp ayrı bir şart komutu olarak yazman gerekir.
Zaten hemen altında yine anlam veremediğim bir komut daha var,
        IF SET=ISI THEN BIR
        gosub ZAMAN_YAZ
ISI=SET ise Zamanı yeniden yazdırıyorsun ne gerek var. Neden zaman yeniden yazılsınki?
Her neyse devam edelim,
Altında BIR isimli etiket geliyor ve alt kısımda,
IF SEC=0 THEN  GOTO AYAR_MENU
işte olayın koptuğu komut bu. Şayet burada SEC tuyşuna basarsan sistem stack hatası için bir adım atmış olacak. Çünki oralarda başka yerlere geçişler var ve sonunda goto ile başlangıca geri dönüyorsun.
Bu gibi durumlarda FLAG (BAYRAK) kullanılır.
IF SEC=0 THEN
BAYRAK=1
RETURN
ENDIF
dersem program nereye dönecektir? bakalım istersen. Elbette GOSUB TUFAN yazan satırın bir altına dönecektir.
Sende oraya;
IF BAYRAK=1 then
   BAYRAK=0
   GOTO AYAR_MENU
ENDIF
dersen sorunsuzca ayar menüsüne gitmiş olursun stack taşmasından da kurtulmuş olursun.
                 
Benzer hatalar daha olabilir. İncele ve bulmaya çalış.
Ete


Powered by EzPortal