avatar_Mucit23

Pic16F88 Eepromuna Veri yazma Sorunu

Başlatan Mucit23, 23 Ekim 2011, 21:58:05

Mucit23

Merhabalar Ete hocam.

Hocam Daha önce yaptığım Pic16F628 Ayarlanabilir Termometre Devresini Geliştirmek için Yeniden MCS nin karşısına geçtim. Yapmak istediğim Birçok değişiklik vardı. Bunlardan bazıları şöyle. Eski Yazılım Eksi sıcaklıkları göstermiyor. Ayrıca Eksi değerleride kontrol edemiyordu. Ayrıca Pozitif Ve negatif olmak üzere iki çalışma modu ekledim. Bunca değişikliği 16F628 in flash hafızası kaldırmayacağı için En baştan 16F88 e geçtim ve hafızayla ilgili  bir sıkıntım kalmadı. Yukarıda anlattığım özelliklerin hepsini yaptım. Benim asıl sorunum Epprom ile ilgili.  1 Gündür Picin Epromuyla uğraşıyorum. Set değerlerini Eproma kaydetmem gerekiyor. Değerleri Eprooma kaydediyorum. (Veya Hiç kaydedemiyorum) Her okuyuşumda kaydettiğim adresten 255 değerini okuyorum. Bu sorun Beni Resmen delirtti. Başımda yolacak şaç kalmadı.  :-[

Birazdaha sorunumu yazılımla destekli halde anlatayım. Daha anlaşılır olur.
Program
'****************************************************************'Name    : TERMOMETRE.BAS                                    *'*  Author  : [FERHAT YOL]                                      *'Notice  : DS18B20'li oda termometresi]                      *'*          :                                                   *'*  Date    : 12.02.2011                                        *'Version : 1.0                                               *'*  Notes   : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*'*          : kablosu 15 metreden fazla olaması halinde DS18B20 *'*          : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *'*          : ile değiştirilmesi gerekmektedir.                 * '****************************************************************;----------------------------------KURULUM--------------------------------------DEFINE OSC 4@ DEVICE pic16F88                     'işlemci 16F88                              @ DEVICE pic16F88, WDT_ON              'Watch Dog timer açık@ DEVICE pic16F88, PWRT_ON             'Power on timer açık@ DEVICE pic16F88, PROTECT_OFF         'Kod Protek kapalı@ DEVICE pic16F88, MCLR_off            'MCLR pini kullanılMIYOR.@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak TRISA=%10111000TRISB=%00000000PORTA=0:PORTB=0CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkışANSEL=0  ;Analog Girişler İptalOSCCON=%01100000ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256 OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktifTMR0=99'---------------------------PIN TANIMLAMALARI-----------------------------------SYMBOL SET=PORTA.5SYMBOL YUKARI=PORTA.4SYMBOL ASAGI=PORTA.3SYMBOL DIG0=PORTA.0SYMBOL DIG1=PORTA.1SYMBOL DIG2=PORTA.2'-------------------------------------------------------------------------------ROLE  VAR PORTA.6'-----------------------------DEĞİŞKENLER---------------------------------------TERM   VAR  WORDISIS   VAR  WORDISIZ   VAR  WORDI      VAR  WORDSAYAC  VAR  BYTESIRA   VAR  BYTESAYI   VAR  BYTEONDA   VAR  BYTEAKTAR1 VAR  BYTEAKTAR2 VAR  BYTEAKTAR3 VAR  BYTESYC    VAR  BYTESNS    VAR  BYTEZNS    VAR  BYTESNY    VAR  BYTEISIH   VAR  BYTEISIL   VAR  BYTESIGN   VAR  BYTETUS    VAR  BYTEZ      VAR  BYTEX      VAR  BYTEAYR    VAR  BITPOZ    VAR  BITDP     VAR  BITSP     VAR  BITW      VAR  BITU      VAR  BIT'---------------------------------ISI TANIMLAMALARI-----------------------------    Busy        VAR BIT         ' Busy Status-Bit    HAM         VAR WORD    ISI         VAR WORD        ' Sensör HAM okuma değeri    Float       VAR WORD        ' Holds remainder for + temp C display           ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık    EKSI_ISI    CON 1           ' Negatif_Cold = 1    SERECE      CON 223         ' ° işareti    ISARET      VAR BYTE            Comm_Pin    VAR PORTA.7'-------------------------------------------------------------- BASLANGIC:'--------------------BAŞLANGIC------------------------------------     gosub SENSORYAZ  GOSUB SENSOROKU  DP=0:SP=0  gosub EKRAN3      read $0,ISIL      READ $1,ISIH      READ $2,SNS      READ $3,ZNS      READ $4,SIGN      READ $5,POZ   IF ISIL>99 THEN ISIL=0   IF ISIH>9 THEN ISIH=0   IF SNS>50 THEN SNS=0   IF ZNS>5 THEN ZNS=0   IF SIGN>45 THEN SIGN = "+"   IF POZ>1 THEN POZ=1    W=1:SYC=0:AYR=0BASLA:'----------------------------ANA DONGÜ------------------------------------   GOSUB EKRAN   GOSUB SENSOROKUGOSUB KONTROL       IF TUS>5 AND TUS<11 THEN       WHILE SET=0        IF TUS=70 THEN          TUS=0:AYR=1         GOTO AYAR2        ENDIF      WEND      TUS=0:AYR=1      GOTO AYAR    ENDIF      GOTO BASLA'--------------------------------ALT PROGRAMLAR---------------------------------SENSOROKU:           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini okuBekle:           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           RETURNSENSORYAZ: 'okumaya hazırlan..          OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]  ;Hassasiyet 12 bit olarak ayarlanıyorOWOUT   Comm_Pin, 1, [$CC,$48]          OWOUT   Comm_Pin, 1, [$CC,$B8]          OWOUT   Comm_Pin, 1, [$CC,$BE]          return Hesapla:  ' Ham değerden Santigrat derece hesabı    ISARET  = "+"  :dp=1  ;İşaret pozitif,Nokta aktif..    IF ISARET_BITI = EKSI_ISI THEN       ISARET = "-":DP=0  ;İşaret negatif,Nokta pasif..        ham=~ham+2    endif    float = (HAM*10)/16     ISI=FLOAT/10     RETURN  KONTROL: ' Role kontrol..   TERM=(ISIL*10)+ISIH   ISIS=TERM-SNS  IF POZ=1 THEN    IF ISARET = "+" THEN      IF ISIS=>FLOAT THEN       SYC=SYC+1        IF SYC=>5 THEN           SYC=5:HIGH ROLE        ENDIF      endIF      IF FLOAT=>TERM THEN         SYC=0:LOW ROLE      ENDIF    ELSE ;ISARET = "-"      ISIZ=TERM+SNS      IF ISI=>ISIZ THEN        SYC=SYC+1          IF SYC=>5 THEN            SYC=5:HIGH ROLE          ENDIF      ENDIF      IF TERM=>ISI THEN        SYC=0:LOW ROLE      ENDIF    ENDIF  ELSE    IF FLOAT=>ISIZ THEN       SYC=SYC+1        IF SYC=>5 THEN           SYC=5:HIGH ROLE        ENDIF    endIF    IF TERM=>FLOAT THEN      SYC=0:LOW ROLE    ENDIF  ENDIFRETURN   DELAY: 'gecıkme 1  FOR I=0 TO 150:NEXTRETURNDELAY1:'gecıkme 2  FOR I=0 TO 12000:NEXTRETURNDELAY2:'gecıkme 3  FOR I=0 TO 125:NEXTRETURNDELAY3:'gecıkme 4  FOR I=0 TO 500:NEXTRETURNEKRAN:'Sıcaklık gösteriliyor.  IF ISARET = "+" THEN  ;sıcaklık pozitif ise...    Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI              Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI    Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI  ELSE                  ;sıcaklık negatif ise    z=FLOAT DIG 1:GOSUB AL:AKTAR1=SAYI;3 dijit old. için negatif sıcalıklarda    Z=FLOAT DIG 2:GOSUB AL:AKTAR2=SAYI;sadece tam sıcaklık değeri gösterilir.    AKTAR3=64   ;Bu değer eksi işaretini temsil eder.  ENDIF  RETURNEKRAN1: 'SET yazısı Z=14:GOSUB AL:AKTAR1=SAYI Z=13:GOSUB AL:AKTAR2=SAYI Z=5:GOSUB AL:AKTAR3=SAYIRETURNEKRAN2:'Set değeri gösteriliyor   IF SIGN = "+" THEN     ;sıcaklık pozitif ise       DP=1     Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0     Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI     Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI   ELSE                   ;SICAKLIK EKSİ DEĞER DEMEK       DP=0     Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0     Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI     AKTAR3=64       ENDIFRETURNEKRAN3: ;Başlangıç AKTAR1=64 AKTAR2=64 AKTAR3=64RETURNEKRAN4:'Hassasiyet ekranı Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0 Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI aktar3=0RETURNEKRAN5:;Çalışma Modu Ekranı  IF POZ=1 THEN     Z=15:GOSUB AL:AKTAR3=SAYI   ;POZiTiF(POZ.)    Z=0 :GOSUB AL:AKTAR2=SAYI   ;O       Z=2 :GOSUB AL:AKTAR1=SAYI   ;Z  ELSE    Z=16:GOSUB AL:AKTAR3=SAYI   ;NEGATiF(NEG.)    Z=13:GOSUB AL:AKTAR2=SAYI   ;E    Z=9 :GOSUB AL:AKTAR1=SAYI   ;G  ENDIF RETURNEKRAN6:'Neg. Hassasiyet ekranı   z=ZNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0   AKTAR2=0   AKTAR3=0RETURN AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120,115,55],SAYI :RETURN'Karekter al ;AL:LOKUP  Z,[0,1,2,3,4,5,6,7,8,9,o,C,-,E,T,P,N],SAYI :RETURN ; KARAKTER ALKAYDET: 'Değerler eproom'a kaydediliyor..WHILE SET=0:WENDISIL=TERM/10ISIH=TERM//10 WRITE $0,ISIL:PAUSEUS 10 WRITE $1,ISIH:PAUSEUS 10 WRITE $2,SNS :PAUSEUS 10 WRITE $3,ZNS:PAUSEUS 10 WRITE $4,SIGN:PAUSEUS 10GOTO BASLANGICAYAR: 'Menuye gırıs WHILE SET=0:WEND DP=0 GOSUB EKRAN1 GOSUB DELAY1 READ $0,ISIL READ $1,ISIH read $4,SIGN IF ISIL>99 THEN ISIL=0 IF ISIH>9 THEN ISIH=0 IF SIGN>45 THEN SIGN = "+" TERM=(ISIL*10)+ISIH DP=1:syc=0:SNY=0:W=0 GOSUB EKRAN2MENU:                           ;MENÜ ALT PROGRAMIIF YUKARI=0 THEN W=1:U=0:sny=0   IF SIGN= "+" THEN     TERM=TERM+1      WHILE YUKARI=0      SYC=SYC+1:GOSUB DELAY        IF SYC>40 THEN          SYC=50:TERM=TERM+1:GOSUB DELAY        ENDIF       GOSUB EKRAN2      IF TERM>990 THEN TERM=990    WEND    SYC=0:IF TERM>999 THEN TERM=990  ELSE     TERM=TERM-1    GOSUB EKRAN2        IF TERM=0 OR TERM>50 THEN          TERM=0:SIGN = "+"          GOSUB EKRAN2            WHILE YUKARI=0:WEND          GOTO MENU        ENDIF    WHILE YUKARI=0:WEND    SYC=0  ENDIFELSE  W=0ENDIFMENU2:IF ASAGI=0 THENW=1:U=0:sny=0   IF SIGN = "+" THEN                              ;_______________      TERM=TERM-1                                   ;               |    WHILE ASAGI=0                                 ;               |      SYC=SYC+1:GOSUB DELAY                       ;               |        IF SYC>40 THEN                            ;               |          SYC=50:TERM=TERM-1:GOSUB DELAY          ;               |        ENDIF                                     ;               |      GOSUB EKRAN2                                ;               |      IF TERM>999 THEN                            ;               |        TERM=0:SIGN = "-" ;SICAKLIK EKSİYE İNMİŞ  ;               |        GOTO MENU2                                ;               |      ENDIF                                       ;               |    WEND                                          ;               |    SYC=0                                         ;               |    IF TERM>999 THEN                              ;               |      TERM=0:SIGN = "-"   ;SICAKLIK EKSİYE İNMİŞ  ;               |      GOTO MENU2                                  ;               |    ENDIF                                         ;               |  ELSE                                            ;               |    TERM=TERM+1                                   ;               |                                     IF TERM>49 THEN TERM=50                    ;               |       GOSUB EKRAN2                               ;               |       WHILE ASAGI=0:WEND                         ;               |                                              SYC=0                                      ;               |  ENDIF                                           ;_______________|ELSE                                              W=0ENDIFgosub ekran2IF SET=0 THEN  WHILE SET=0:WEND  GOTO SENSIVITYENDIFGOTO MENUSENSIVITY: 'TOLERANS menusu giriş..  read $2,sns  READ $3,ZNS  IF SNS>50 THEN SNS=0  IF ZNS>5 THEN ZNS=0  SNY=0SENS:IF SIGN = "+" THEN  dp=1:gosub ekran4  IF YUKARI=0 THEN    W=1:SNY=0:U=0      SNS=SNS+1      WHILE YUKARI=0        SYC=SYC+1:GOSUB DELAY          IF SYC>40 THEN            SYC=40:SNS=SNS+1:GOSUB DELAY2          ENDIF         GOSUB EKRAN4        IF SNS=>50 THEN SNS=50      WEND    SYC=0:IF SNS=>50 THEN SNS=50  ELSE    W=0  ENDIF              IF ASAGI=0 THEN    W=1:U=0:sny=0     SNS=SNS-1      WHILE ASAGI=0        SYC=SYC+1:GOSUB DELAY          IF SYC>40 THEN            SYC=40:SNS=SNS-1:GOSUB DELAY2          ENDIF         GOSUB EKRAN4        IF SNS>50 THEN SNS=0      WEND    SYC=0:IF SNS>50 THEN SNS=0  ELSE    W=0  ENDIFELSEdp=0:GOSUB EKRAN6  IF YUKARI=0 THEN     W=1:SNY=0:U=0    zNS=zNS+1    IF zNS=>5 THEN zNS=5    GOSUB EKRAN6      WHILE YUKARI=0:WEND  ELSE    W=0  ENDIF   IF ASAGI=0 THEN    W=1:SNY=0:U=0    zNS=zNS-1    IF zNS=255 THEN SNS=0    GOSUB EKRAN6       WHILE ASAGI=0:WEND  ELSE    W=0  ENDIFENDIF  IF SET=0 THEN   GOTO KAYDETENDIFGOTO SENSAYAR2:  READ $5,POZ  DP=0:SP=1  GOSUB EKRAN5    WHILE SET=0:WENDPOZ_AYAR:IF YUKARI=0 THEN  POZ=1-POZ  GOSUB EKRAN5  WHILE YUKARI=0:WENDENDIFIF ASAGI=0 THEN   POZ=1-POZ  GOSUB EKRAN5  WHILE ASAGI=0:WENDENDIFIF SET=0 THEN   WHILE SET=0:WEND  WRITE $5,POZ:PAUSEUS 2  GOTO BASLANGICENDIFGOTO POZ_AYARDisable          KESME:  'kesme alt programı  IF SET=0 AND AYR=0 THEN     TUS=TUS+1    IF TUS>69 THEN TUS=70    ELSE    TUS=0  ENDIF  IF W=0 THEN   SNY=SNY+1  IF SNY=>120 THEN     U=1    ELSE    U=0  ENDIFENDIFIF SNY=>240 THEN SNY=0 SAYAC=SAYAC+1     If SAYAC>2 then SAYAC=0     If SAYAC=0 then   DIG2=0   PORTB=AKTAR1   PORTB.7=SP   DIG0=1        PAUSEUS 2      Endif   If SAYAC=1 then   DIG0=0   PORTB=AKTAR2   PORTB.7=DP   DIG1=1   PAUSEUS 2   Endif     If SAYAC=2 then   DIG1=0   PORTB=AKTAR3   DIG2=1   PAUSEUS 2   Endif               TMR0=160    INTCON.2=0        Resume Enable   end      


Hocam dediğim gibi menülerde sorun yok gibi. Yaptığım Tüm değişiklikleri isiste Debug menüsünde Ram adreslerini izleyerek görüyorum.   
Yani anlık olarak Değişken içeriklerini görebiliyorum..

Hocam Değerlerin Eproma kaydedildiği bölüm burası.
KAYDET: 'Değerler eproom'a kaydediliyor..
WHILE SET=0:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 10
WRITE $1,ISIH:PAUSEUS 10
WRITE $2,SNS :PAUSEUS 10
WRITE $3,ZNS:PAUSEUS 10
WRITE $4,SIGN:PAUSEUS 10
GOTO BASLANGIC

Buradaki Term Değişkeni set Sıcaklığı bilgisinin olduğu değerdir. Menüdeki Sıcaklık ayarlamaları Bu değer arttırılıp azaltılarak ayarlanır. ISIL ve ISIH değişkenleri ise Sıcaklık değerinin parçalanmış halidir. Term 235 ise(23,5C) ISIL değişkeni 23, ISIH değişkeni 5 Değerini alıyor ve eproma iki parça halinde yazılıyor. Genelde Sorun ISIH değişkeninde oluyor. Eproma yazıyorum ama okduğumda Direk 255 değerini okuyorum. Bunun sebebini öğrenmek istiyorum. Atladığım bir noktamı var bilemiyorum.

Epromdan okuduğum kısım ise burası
      READ $0,ISIL
      READ $1,ISIH
      READ $2,SNS
      READ $3,ZNS
      READ $4,SIGN
      READ $5,POZ
   IF ISIL>99 THEN ISIL=0
   IF ISIH>9 THEN ISIH=0
   IF SNS>50 THEN SNS=0
   IF ZNS>5 THEN ZNS=0
   IF SIGN>45 THEN SIGN = "+"
   IF POZ>1 THEN POZ=1

Adreslerde bir yanlışlık yok gibi. okunan Adres farklı olsa 255 okumam doğal olur. Ama defalarca inceledim. Daha neyi kaçırıyorum gerçekten bilmiyorum.
Eğer boş Bir vaktinizde incelerseniz sevinirim gerçekten. Nerde hatam var öğrenmek istiyorum
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Hex sayıları tek digit yazma . Bu bir hata değil ama hoş gözükmüyor.
Eprom kayıt sorunu yeterli kayıt zamanını vermemenden kaynalanıyor.
WRITE $0,ISIL:PAUSEUS 10  komutuna bakarsan 10us lik bir süre vermişsin ama bu süre aslen 10ms olması gerekiyor.
Bu nedenle oraya 10us yazmak yerine gecikme döngülerinden birine yollarsan daha uygun olur sanırım.
Delay3 belki kurtarır ama bence 0 to 5000 gibibir döngü kurup oraya yolalrsan daha uygun olacak sanırım.
Kurtarmaz ise süreyi biraz daha uzatabilirsin.

Programı çalıştırdım ama set menülerine giremedim. Yoksa uygun bir şey deneyecektim.
Bana kalırsa menü girişlerinide kontrol et. Ekrana sıfır geliyor ve orada çakılıp kalıyor.

Ete

Mucit23

Hocam Hex Sayıları Tek Dijit yazma konusunu anlayamadım. Bunu birazdaha açıklayabilirmisiniz.

Menü giriş durumu ise biraz farklı. Benim amacım Menü tuşuna 2-3 sn arası basılıp bıraklırsa ısı set menüsüne, Menü tuşu bırakılmadan yaklaşık 4-5 sn arası beklenip bırakılırsa çalışma modu menüsüne gidilmesi idi. Aslında buna yaklaştım fakat epromla uğraşırken bunlarla faxzla ilgilenemedim.

Eproma veri yazdıktan sonra bekleme konusunda ben 10us olarak biliyordum. 10ms gecikme  görüntüyü bozar. Delay3 ü bir deniyeyim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam sorun git gide çak daha anlamsız ve saçma bir hal alıyor.

ISIL=23:ISIH=5:ISI3=5
WRITE $0,ISIL:GOSUB DELAY4
WRITE $1,ISIH:GOSUB DELAY4
WRITE $2,SNS :GOSUB DELAY4
WRITE $3,ZNS :GOSUB DELAY4
WRITE $4,SIGN:GOSUB DELAY4
WRITE $10,ISI3:GOSUB DELAY4

Yukarıdaki gibi eprooma bazı değerler kaydettim

aynı şekilde okudum
      read $0,ISIL
      READ $1,ISIH
      READ $2,SNS
      READ $3,ZNS
      READ $4,SIGN
      READ $5,POZ
      READ $10,ISI3
Hocam ISIL de sorun olmuyor. Ne yazıyorsam onu okuyorum
Ama $1. adresteki ISIH ve $10. adresteki ISI 3 değerlerine 5 yazmama rağmen hep 255 okuyorum. Bunun sebebi ne olabilir sizce.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bu konuştuklarını simulasyonda mı görüyorsun yoksa gerçek devredemi?
Ben simulasyonda görmeye çalıştım. Bir defa wdt müsaade etmiyor ve sürekli pici resetliyor. O hald wdt_off olmalı.
Onu off yaptıktan sonra kayıt işi düzeldi. Tabiiki ben baş tarafa (Başlangıç satırından evvel)
  ISIL=10
  ISIH=11
  SNS=12
  ZNS=13
  SIGN="-"
  POZ=1
  temp.0=poz
  GOTO KAYDET
satırlarını ilave ettim. Ayrıca kayıt kısmında yer alan ,
'ISIL=TERM/10
'ISIH=TERM//10
satırlarını kapattım çünki sonucun sıfır çıkmasına sebep oluyorlardı.
Bu şekilde yapınca sistem doğru kayıt yapıyor. Hatta gecikme döngüsünü 500 değerine kadar düşürdüm.
BU arada poz isimli bit değişkenini byte gibi kayıt edemezsin  nasıl kayıt edeceğini yukarıda gösterdim.
Bir byte değişkeninin sıfırncı biti olarak eşitle ve byte değerini kayıt ediver.

Ete

Mucit23

#5
  Hocam gerçek devrede deneyemedim. Herşey Simülasyonda gerçekleşiyor. Ama Gerçektede çalışacağını düşünüyorum. Epromla   uğraşmaktan diğer kısımlarla hiç ilgilenemedim. Düzeltilmesi gereken birçok kısım var.

  WDT 'i kapatınca Eproma veri yazma sorunu çözüldü. Ayrıca teşekkür ederim size. Ama anlamadığım bir nokta var. Mademki WDT işlemciye reset atıyor Resetlemene zamanında tüm program baştan başlaması gerekmiyormu. Bu Resetlenmeyi ben hiç hissetmiyordum. Ayrıca neden sadece Epromun bazı adreslerinde oluyordu anlamıyorum.

  Bunlara rağmen sayenizde birçok yanlışımı gördüm.

  Hocam yanlız term değişkenin parçalama kısmı neden sonucu sıfır çıkarıyor anlamadım. Bende iyi çalışıyordu.
   ISIL=TERM/10
   ISIH=TERM//10
Eğer ısı pozitif ise ben tüm işlemleri tek parça halinde yapıyordum. Yani Sıcaklık 23.7 ise Ben bunu 237 olarak işleme tabi tutuyordum. Dolayısıyla TERM değişkeni yani SET değerinin olduğu değişkende tek parça halinde işleme giriyor.

Eproma kaydederken Yukarıdaki formülle term değerinin iki parçaya ayırıp öylece kaydediyorum. Okurkende yine bu değerleri okuyup tek parça haline getirip. Term değerine yüklüyordum. Sizde neden sonuç olarak sıfır verdi.

Bunların yanı sıra programda gözünüze takılan başka yanlışlarım varsa bunları öğrenmem benim için iyi olur :)

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#6
Formülünde yanlışlık yok. Ben TERM değişkenine değer vermediğim için değerler sıfırlanıyordu o yüzden kapattım.
O kısma kafanı takma.
WDT'ı çok gerekli değilse daima kapalı tutmaya çalış. Ancak kontrol edemediğin yerlerde pic kilitlenme yapıyor ise o zaman açmanda yarar var zira kilitlenmeyi engeller.
WDT pici resetler ve program daima baştan başlar. Ancak bunu fark etmek her zaman mümkün olmayabilir.
Çalışma prensibi gayet basit. Bir yerde istenmeyen bir bekleme olduğu zaman wdt açık ise ayarlanan oranda ve bölücü ile çalışıp (Option_Reg) pici resetler. Ne zaman devreye girdiği konusunu bende çok iyi incelemedim doğrusu. Bazın programcılar onun reset özelliğini bile programlarında kullanabiliyorlar. Bana kalırsa biraz daha Asm ye uygun bir kullanım şekli var.
Şimdilik lüzümsuz gecikmelerin olduğu yerde devreye girer desen yeterli zaten. Örnek vermek gerekir ise Pulsin komutu belirli bir süre gelen sinyalin ölçülecek konuma gelmesini bekler gelmez ise sanırım mya kendi maksimum sayacı sayar ve sıfırlanır (65535) veya wdt onu resetler.  Şöyle düşünmek lazım işin ASM kısmında her komut geldiğinde wdt resetlenir. İki komut arasında beklenenden yada ayarlanandan daha fazla beklenirse wdt işlemciye reset atar. Wdt bağımsız bir osilatörden (RC) puls alır. Ayarlaması Option registerinden yapılır. Bu registerin 0-1-2 nolu bitlerine 111 yaparsan yaklaşık 2,3 sn lik wdt süresi elde edersinki bu kolay kolay reset attırmaz. Tabiiki 4 biti de 1 yaparak ayarlanan bölme oranının WDT a ait olduğunu belirlemen gerekiyor. Bu şekilde WDT'ı on yapabilirsin.

Ete

Mucit23

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal