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=%10111000
TRISB=%00000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ANSEL=0  ;Analog Girişler İptal
OSCCON=%01100000
ON 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/16
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLE  VAR PORTA.6
'-----------------------------DEĞİŞKENLER---------------------------------------

TERM   VAR  WORD
ISIS   VAR  WORD
ISIZ   VAR  WORD
I      VAR  WORD
SAYAC  VAR  BYTE
SIRA   VAR  BYTE
SAYI   VAR  BYTE
ONDA   VAR  BYTE
AKTAR1 VAR  BYTE
AKTAR2 VAR  BYTE
AKTAR3 VAR  BYTE
SYC    VAR  BYTE
SNS    VAR  BYTE
ZNS    VAR  BYTE
SNY    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
SIGN   VAR  BYTE
TUS    VAR  BYTE
Z      VAR  BYTE
X      VAR  BYTE
AYR    VAR  BIT
POZ    VAR  BIT
DP     VAR  BIT
SP     VAR  BIT
W      VAR  BIT
U      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=0
BASLA:'----------------------------ANA DONGÜ------------------------------------

   GOSUB EKRAN
   GOSUB SENSOROKU
;  GOSUB 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 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
SENSORYAZ: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]  ;Hassasiyet 12 bit olarak ayarlanıyor
OWOUT   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
  ENDIF
RETURN   

DELAY: 'gecıkme 1
  FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
  FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
  FOR I=0 TO 125:NEXT
RETURN
DELAY3:'gecıkme 4
  FOR I=0 TO 500:NEXT
RETURN

EKRAN:'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
 
RETURN
EKRAN1: 'SET yazısı
Z=14:GOSUB AL:AKTAR1=SAYI
Z=13:GOSUB AL:AKTAR2=SAYI
Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'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   
   ENDIF
RETURN
EKRAN3: ;Başlangıç
AKTAR1=64
AKTAR2=64
AKTAR3=64
RETURN
EKRAN4:'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=0
RETURN
EKRAN5:;Ç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
RETURN
EKRAN6:'Neg. Hassasiyet ekranı
   z=ZNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
   AKTAR2=0
   AKTAR3=0
RETURN


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 AL

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

AYAR: '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 EKRAN2
MENU:                           ;MENÜ ALT PROGRAMI
IF 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
  ENDIF
ELSE
  W=0
ENDIF

MENU2:

IF ASAGI=0 THEN
W=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=0
ENDIF

gosub ekran2

IF SET=0 THEN
  WHILE SET=0:WEND
  GOTO SENSIVITY
ENDIF
GOTO MENU

SENSIVITY: 'TOLERANS menusu giriş..
  read $2,sns
  READ $3,ZNS
  IF SNS>50 THEN SNS=0
  IF ZNS>5 THEN ZNS=0
  SNY=0
SENS:
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
  ENDIF
ELSE
dp=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
  ENDIF
ENDIF 

IF SET=0 THEN
  GOTO KAYDET
ENDIF
GOTO SENS

AYAR2:
  READ $5,POZ
  DP=0:SP=1
  GOSUB EKRAN5
    WHILE SET=0:WEND
POZ_AYAR:

IF YUKARI=0 THEN
  POZ=1-POZ
  GOSUB EKRAN5
  WHILE YUKARI=0:WEND
ENDIF

IF ASAGI=0 THEN
  POZ=1-POZ
  GOSUB EKRAN5
  WHILE ASAGI=0:WEND
ENDIF

IF SET=0 THEN
  WHILE SET=0:WEND
  WRITE $5,POZ:PAUSEUS 2
  GOTO BASLANGIC
ENDIF
GOTO POZ_AYAR

Disable         
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
  ENDIF
ENDIF
IF 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