Değişken hatalı değer değişimi.

Başlatan aRci, 16 Aralık 2023, 04:12:51

aRci

Merhaba,
Yapmakta olduğum çalışmada word tipi bir değişkene ilk açılışta pic in kendi eepromundan veri almaktayım .
    Read 5,TxBkl.highbyte
    Read 6,TxBkl.lowbyte

bu satıra gelmeden 500ms bekleme vardır.

bu satırdan sonra TxBkl birdaha hiç bir şekilde değer almamaktadır. Kod içerisinde sadece veriyi palaşmaktadır.
        For Knt = 0 to PktBoyu
            for Knt1 = 0 to 6
                    lookup Knt1,["aRciSyc",13],Knt2   
                    if RxTmp1 [Knt + Knt1]  = Knt2 and Knt1 = 6 then TxEnb = 1:TxSay = TxBkl:Hserout ["OK",13]
                    if RxTmp1 [Knt + Knt1]  <> Knt2 then Knt1 = 6
            next Knt1
        Next Knt
Kod la TXBkl değeri Ayar kod u ile değişim yapmaya izin veriliyor ama oda doğrudan değilde sadece eeproma kaydedip kodu başlangıç noktasına gönderdikten ve yeniden eepromdan veri alarak değişkenin değeri güncelleniyor.

tüm işlemler adım adım çalışıyor fakat bu değişken durduk yere değeri kendiliğinden değişmekte ve bir çözüm bulamadım. kart üzerinde lora modül var. rf sinyaller buna sebep olmayacağını düşünüyorum çünkü bu değişken gibi iki ayrı değişkenim var ve onlarda bu durum olmuyor.

bu durumu nasıl düzeltirim teşekkürler.

denetleyici 16f1938 32mhz iç kristal aktif



ete

Programda hata diyemiyeceğim ancak hoşuma gitmeyen kısımlar var.
Öncelikle bunlara bakalım. Senin yazım şeklin değilde olması gerekeni yazarak bu satırları vereyim.
               if RxTmp1 [Knt + Knt1]  = Knt2 and Knt1 = 6 then 
                           TxEnb = 1:TxSay = TxBkl:Hserout ["OK",13]
                        endIF
Burada genel teori THEN den sonra tek komut var ise endif kullnmaz direk komutu yazarsın.
Ama birden fazla komut var ise bunları ENDIF altında toplamak her zaman daha iyi çalışır.
Sein kullandığın şekilde de arada bir bende kullanıyorum. Ama kodları çok fazla hesap ve karşılaştırma içeriyor bence ENDIF ile kullanman daha uygun olacaktır.

Diğer bir kural ise Bir for - next döngüsü içinde döngü değişkenine sen hariçten değer vermemelisin. Orada kullanman gereken komut EXIT olacaktır
if RxTmp1 [Knt + Knt1]  <> Knt2 then EXIT
şeklinde.

Birde LOOKUP komutlarının Hafıza bloğu seçtiğini duymuş idim. Şayet programı derlerken Cross Boundary ikazı alıyor isen orada Lookup komutunu kullanma derim.

Ete

aRci

Merhaba;
Tavsiyelerinizi uyguladım test ediyorum sonucunu paylaşacağım. LOOKUP komutunda bir problem yaşıyorum aslında bunuda denemelerim sırasında gördüm.
lookup Knt1,["aRciSyc",13],Knt2
bu kodda loradan gelen verinin kaydedildiği dizi değerleri ile karşılaştırma yapılan sabit mrtin yazılı. loradan aldığım veri ile burası birebir tutmasına rağmen if sorgusunda hata veriyor ve sonucu yanlış gösteriyor ve düzen bozuluyor bir kaç denemeden sonra LOOKUP dan vaz geçtim ve gelen bu değerin toplamını ve Birde gelen verinin son 2 byta da Crc amacı ile değer yükledim sonuç olarak gelen sabit değer karekter toplamı ve crc aynı ise veriyi kabul ettim sonuc ta algoritma doğru çalışmaya başladı.
bunun sebebi ni anlayadım. ara sıra böyle denk geliyor bazen hiç yapmıyor bazende peşpeşe yapıyor.

aRci

Merhaba;
ilk olarak IF le ilgili değişiklikleri uyguladım malesef sonuç değişmedi. belli belirsiz tekrarlamaya başladı. bende max değer olarak belirlediğim değeri aşarsa sistem program başına giderek eepromdan verileri tekrar okuyup baştan başlıyor.
Kodlamada Tüm kesmeleri kapalı olmasına rağmen bazen kapatıp açıldığında kesmenin çalışmaya başladığını fark ettim. bunun üzerine yoğunlaştıktan sonra sistemsağlıklı çalışaya başladı. kafamı karışmasına sebep olan şeyse kesme rutininde ki hiç bir değişken programda kullanılmadığı halde sisteme nasıl bir etkisi olabilir. devreye giren kesme tmr1 kesmesi oldukca yoğun miktarda kesme yapıyordu öok fazla ardışık kesme buna sebep oluyor olabilirmi.

aRci

Merhaba;
dünkü paylaşımdan sonra sistemi açık bıraktım. sistemde etiketlere birer adet hserout la etiketi belirten tanımlaöalar yaptım bu sayede programın işleyişini takip etmemei sağladı. alttaki resimde RxDone veri gelinince çalıştırılan etiketin adı ardından gelen Pkt: ile  başlayan kısım ise RxDone de gelen paket adet miktarını gösteriyor daha sonra sında İse TxDone ile gelen veri doğru ve buna cevap için veri gönderen rutune gitmekte.

fakat resimde işaretli olan kısımda paket miktarı 208 demiş bense 9 adet olması gerekirkekn parazit vb birşey yüzünden bu miktar bu şekilde alınmış benim gelen verileri aldığım dizim ise 80byte lık dolayısı ile dizinin var olmayan kısımlarına veri yazan kodlarım yaşadığım soruna oluşturuyor. bunu öngöremediğim için bu problemi yaşadığımı düşünüyorum.


alttaki kodlar sayesinde gelen paket boyu kontrol ediliyor ve 79 dan fazla ise veri okunmadan çıkış yapıyoruz. yukarıdaki işaretli kısımlarda Test yazılı satır aslında benim değeri hatalaı şekilde kendiğinden değişen depişkenim yüzünden sistem programın başına dönüyordu işte başa dondüğündeki etiketim Test etiketi idi.

Buradan şu sonuç çıkartabiliriz. dizi elemanlarının oluşturulduğu adetten fazla değer atmamaya dikkat etmeliyiz.

;===============================================================================
;===============================================================================
RxDone:    
    hserout["RxDone",13]                  
    irqFlags = 0          
    RaData = $12 : Gosub RaOku : irqFlags = RaData             
    if irqflags != 0 then
        if irqflags.6 = 1 and irqflags.5 = 0 then
        RaData = $13 : Gosub RaOku : PktBoyu = RaData                           
        Sayac1 = 0 
        RaData = $10 : Gosub RaOku
        RaVeri = RaData: RaData = $0D : Gosub RaYaz  
        Hserout ["Pkt:",dec PktBoyu,"-"]
        HspCrc = 0  
        if PktBoyu > 79 then RxDoneAtla                 
        for RaTemp = 0 to (PktBoyu-1)
               RaData = $00 : Gosub RaOku
               RxTmp1[RaTemp] = RaData
               if RaTemp < 7 then 
               HspCrc = HspCrc + RxTmp1[RaTemp]:Hserout [RxTmp1[RaTemp]]
               endif
        next RaTemp
        SendCrc.highbyte = RxTmp1[7]
        SendCrc.lowbyte  = RxTmp1[8]
        
        Hserout [" Hsp:",dec HspCrc," Snd:",dec SendCrc]
        if SendCrc = HspCrc and HspCrc = 686 and PktBoyu = 9 then
        TxEnb = 1:TxSay = TxBkl:RxSAy = 200:Hserout [" OK"]
        endif
        endif
        hserout [13]
        for RaTemp = 0 to 79
        RxTmp1[RaTemp] = 13
        next RaTemp
    endif
RxDoneAtla:
    RaData = $12 :RaVeri = $ff: Gosub RaYaz
    Gosub Idle 
    RaData = $01 :RaVeri = $85: Gosub RaYaz                   
return
;===============================================================================
;===============================================================================

Powered by EzPortal