Etepic

Ana Tema => Basic Programlama Komut Kullanımı => Konuyu başlatan: blueboard - 11 Şubat 2025, 21:33:43

Başlık: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 11 Şubat 2025, 21:33:43
Ete Hocam, iyi akşamlar. Yardımınıza ihtiyacım var. Bir koıntrol devresinde NEC protokolüne benzeyen ama NEC olmayan komutlar gönderiliyor. Bu komutlar infrared led ile değil de normal kablo üzerinden gönderiliyor. Bununla ilgili ekran görüntülerini paintte tek bir foto üzerinde toplayıp ekledim. Bu protokol 16 bitten oluşuyor. İlk 8 bit her 3 komutta da aynı geliyor. Resimden de göreceğiniz üzere başlangıçta sürekli high geliyor. Ardından komut gönderilmeye başlandığında 9 ms low ve 4,5 ms high gelerek header sinyali oluşturuluyor. Bu aşamadan sonra komut 16 bit olarak gönderilşiyor. Lojik Analizör ile ölçümleri transistör kullanmadan yani terslemeden direkt olarak analizöre girdim. Buradaki tespitimde 0 biti 560 ms low+ 560 ms high'tan oluşuyor.      1 biti ise 560ms low+ 1890 ms high'tan oluşuyor( en azından ben o şekilde yorumladım. Siz daha doğrusunu bilirsiniz) . Bu yorumuma göre eklediğim resimdeki 1. komut 1111000100101001    ,   2. komut  1111000110100001 ve 3. komut ise 1111000100010001 olduğunu tespit ettim. Sizin daha önce IR kumanda datalarını almak konusundaki programınız üzerinde elimden geldiği kadar düzenleme yaptım ancak yaptığım değişikliğin n e derece doğru olduğu konusunda fikrim yok. Proteus versiyonu uyumsuzluğu olabilir düşüncesiyle devre şemasının ekran görüntüsünü de ekledim.Size zahmet kontrol eder misiniz.
(https://i.ibb.co/BKsdDzCw/header-LOJ-K-0-LOJ-K1.jpg) (https://ibb.co/BKsdDzCw)

(https://i.ibb.co/BVJmgMgN/KOMUTLAR.jpg) (https://ibb.co/BVJmgMgN)
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 11 Şubat 2025, 22:44:59
Tamamen NEC protokol mantığı ile yollanmış bilgiler. Ufak tefek farklılıklar var elbette.
Bu protokolde ilk 8 bit Cihaz kodu dur. Dolayısıyla komutlarda cihaz kodunun aynı tutulması tesadüf olmasa gerek.
Sonraki 8 bit cihaz kodunun tersi(bitlerin ters çevrilmiş hali)  olması gerekirken sende komut bilgisi yollanmış oluyor. Farklılık burada başlıyor.
Normal protokolde 32 bit bilgi yollanır iken sende 16 bit yollanıyor yani terslenmiş bilgiler yollanmıyor. Hepsi bu. Zaten benim kod çözme mantığımda da terlenmişler devre dışı kalıyor idi.
Yapılacak iş şöyle;
Program öncelikle 4,5ms lik HIGH peryodunu yakalamalı ve ardından 16 adet biti süre bazında kayıt etmelidir.
Herbir bilgi biti 2 şer bit ile ifade edildiği için ve bitin ne oldupunu belirleyen ise ikinci bit olduğundan 4,5ms lik HIGH peryodunun ardından ikinci HIGH peryod olan bilginin ikinci parçası alınıp süre bazında kayıt edilmelidir.
16 bitkik kayıt daha sonra çözümlenmeli ve bunun içinde sürenin 70us ki bu aslında 700us ye  tekabül edecektir. Bu süre 70 den büyük ise o bit "1" değil ise "0" olacaktır.
Bu temel mantık üzerinden çalışması gereken program aşağıdadır.
Bu arada tuş kodlarını verdiğin değerlere göre 41 - 161 - 17 olarak tespit edip programa yerleştirdim.

Ete


  
    'PIC 16F1827 İŞLEMCİ
    #CONFIG
      __config _CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
      __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 & _LVP_OFF 
    #ENDCONFIG
    DEFINE OSC 4
    OSCCON      =%01101000      ' %0xxxx000 ,xxxx=1111 16Mhz, 1110=8Mhz, 1101=4Mhz, 1100=2 Mhz.
    OSCTUNE    =0
    DEFINE PULSIN_MAX 12000 'Maximum counts allowed before pulsin times out
    WPUA      =0              'MCLR için bit5 Pull-up enabled.Eğer MCLR ON yapılmışsa herzaman enabled.
    WPUB      =0
    ADCON0.0  =0              'ADC ölçümleri iptal edildi.
    ANSELA    =0              'PortA nın <4:0> arası analog-dijital olabilen pinlerini dijital yaptık.Pinler Dijital I/0 oldu.
    ANSELB    =0 
    CCP1CON   =0            'Capture/Compare/PWM off
    CCP2CON   =0            'Capture/Compare/PWM off
    CM1CON0.7 =0              'Comparatör disable-kapalı.
    CM2CON0.7 =0
    FVRCON    =0              'Referans sabit voltaj çıkışları (COMPARATOR,DAC ve ADC) kapalı-disable.
    DACCON0.7 =0              'DAC referans voltaj çıkışı kapalı.
    CPSCON0.7 =0              'Capasitive sensing modulu disable yapıldı.
    MDCON.7   =0              'Modülasyon modülü iptal edildi.DSM (Dijital Sinyal Modülü) iptal. Modüleli yani karışık sinyal çıkış kapalı.
    MDSRC.7   =1              'Çevresel sinyallerin sürücü çıkış pinleri iptal.Modüleli sinyal çıkışı pinleri kapalı.
    CLKRCON.7 =0              'Referasn clock modülü kapalı.
     
    PIE1      =0              'TÜM ÇEVRESEL KESMELER KAPALI.
    PIE2      =0              'Tüm Çeveresel Kesmeler Kapalı.
    PIE3      =0
    PIE4      =0              'Tüm çevresel kesmeler kapalı.
    APFCON0=0  'CCP1=B3 de, CCP2=B6 da
    APFCON1=0
     
    LATA=0
    TRISB=%00000001  'PortB.0 giriş diğerleri çıkış yapıldı.
    TRISA=%00000000  'A portu tamamı çıkış yapıldı.
    OPTION_REG.7 = 1    'dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok.
    OPTION_REG.6 = 0    'düşen kenarda kesme oluşturacak
    '-----------------------------------------------------------------
     
    SYMBOL DATA_GIRIS=PORTB.0
     
    Paket var word 56
    Tus  Var Byte 60
    Cihaz Var Byte 61
    DATA_AL var BYTE(16)62
     
    I    var Byte 100
    Z    var BYTE 101
    TEMP VAR BYTE 102
    SAY  VAR WORD 103
    TAMAM VAR WORD 105
    ARA  VAR BYTE 107
     
    SYMBOL ALDIM=ARA.0
    SYMBOL ILK  =ARA.1
    IOCBN=%00000001 
    INTCON=%10001000  'Kesmeler aktif ve RB0/INT kesmesi aktif
    ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
    LATB=0
    PAUSE 200
    '-------------------------------------------------------------------
    BASLA:
          SAY=0
          while ALDIM=0
            SAY=SAY+1
            IF SAY=2700 THEN LATB=0
          WEND
          ALDIM=0
           
          TUS=0
          for I=0 to 7
'            WRITE (0+I),DATA_AL[I]
            IF DATA_AL(8+I)>7 then TUS.0[I]=1 '8 bit den itibaren gelen 8 bit ise komut bitleri oluyor
          next 
'          PAUSE 10                                                    
          IF TUS=41 THEN  '    11110001 00101001    32+8+1=41
            LATB.4=1 
            PAUSE 10
            GOTO BASLA
          endif
          
          if tus=161 THEN  '    11110001 10100001    128+32+1= 161
            LATB.5=1 
            GOTO BASLA
          ENDIF
          
          IF TUS=17 THEN    '    11110001 00010001    1+16=17
            LATB.6=1 
            GOTO BASLA
          ENDIF                          
                  
'          LATB=0
          
          GOTO BASLA          
      
    DISABLE    
    KESME:  
            PULSIN DATA_GIRIS,1,TAMAM:TEMP=NCD(TAMAM) 
            IF TEMP=9 THEN    ' BU PROTOKELDE lojik 0 560 low 560 high VE    
            for I=0 to 15                    'lojik 1 560 low 1890 high OLDUĞUNDAN HIGH BİTLERİNİ ALMAK DOĞRU OLACAKTIR DİYE DÜŞÜNÜYORUM.
              PULSIN DATA_GIRIS,1,TEMP:DATA_AL(I)=NCD(TEMP) 'YALNZCA HIGH BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
            next 
            ALDIM=1:ILK=1:LATA.0=1 
            ENDIF 
            
    GECGIT: SAY=0     
            INTCON.0=0:IOCBF=0  
            Resume      
    Enable      
    End

17-02-2025 de İKİNCİ DEFA düzenlendi (Ete)
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 11 Şubat 2025, 23:34:32
Ete Hocam, hızlı cevabınız için sonsuz teşekkür ederim. İlk fırsatta gerçek devreyi kurarak deneyeceğim. İyi ki varsınız. Siz olmasanız benim gibi acemilere kim yol gösterecekti. Sağlığınıza duacıyım.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 16 Şubat 2025, 20:00:16
Ete Hocam,iyi akşamlar. Maalesef ne yaptımsa devreyi bir türlü çalıştıramadım. Mutlaka bir şeyi atlıyorum ama hatamın nerede olduğunu bilemiyorum. Kullandığınız Proteus'un versiyonu nedir? Sizinle aynı versiyonda hem verici hem de alıcı devreyi çizeyim. Verici devrenin kodlarını yazarım. Tüm kodlar ile birlikte buraya yükleyeyim. Zamanınız olduğunda kontrol etmenizi rica edeceğim.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 16 Şubat 2025, 23:07:56
Hemen telaş etme. Bir sebep yakalamaya çalışalım önce bütün. Eminim mantıklı bir sebebi vardır çalışmamasının. Programa bakınca sigorta ayarlarında ;
_FOSC_XT  grüyorum. Bu devrede kristal kullanılmasını gerektiren bir komut. Ancak alt kısma bakınca da her şeyin dahili OSC ye göre yazıldığını anlıyorum. Şimdi soruyorum devrende kristal kullandınmı?
Aslında birebir bir devre şeması buraya kaysan daha iyi olabilir.
Diğer taraftan bu gibi durumlarda şüphe duyacağımız bir kaç nokta olacak. Bunların başında programın 4500us lik HIGH pulsini yakalayıp yakalamadığını bir şekilde anlamak.
İkincisi puls sürelerinin hangi değerlerle okunup kayda alındığının bilinmesi ki bunuda okumadan sonra kod ayıklamadan önce okunan süreleri eproma yazdırıp sonra bu süreleri incelemek.

Bana kalırsa sorun bu anlattıklarımdan birisi kesinlikle.
4500us lik süre için , kesme içindeki aşağıdaki satırın devamına işlemcinin boş bir pinini HIGH yaptırarak anlayabilirsin.;
ALDIM=1:ILK=1:LATA.x=1 şeklinde.

Sürelerin durumunu gözlemlemek için ise;
IF TUS=41 THEN  satırından önce;
For I=0 to 31 
WRITE (0+I),DATA_AL(I)
NEXT
PAUSE 10
şeklinde kod eklemesi yapıp programı çalıştırıp bir tuş kaydı alman.
Ardından başka bir şey yapmadan devreyi durdurup işlemciyi programlayıcıya takıp 0-31 arası adres değerlerini bir yere yazman ve mümkünse buraya o değerleri koyman yeterli olacaktır.

Programın bu hali ile çalışması gerekir. Çalışmaz ve süre kayıtları çok fazla değişiklik arzederse o zaman o sürelerin küsüratlarını atmamızı sağlayan şu komutu kullanmamızı önereceğim.
PULSIN DATA_GIRIS,1,TAMAM:TEMP=NCD(TAMAM)
NCD komutu o sayının en yüksek değerlikli bitini bulur ve TEMP değişkenine (Byte cinsinden) eşitler. Örnek vermek gerekirse diyelimki PULSIN 4500us lik süreyi okudu ve TAMAM=450 buldu. TEMP=NCD(450)=9 olacaktır.
Süre değerlerinde ise Uzun Süre değerimiz 189 olacak ve bunun NCD karşılığı ise 8 olacaktır.
Bu yazdıklarımı bir düşün ve yağpmaya çalış yapamadığını tekrar sor açıklayayım.

Ete

Programı çalışır hale getirdikten sonra başka alternatifler deneyeceğiz. Bu hali ile puls süreleri
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 17 Şubat 2025, 08:13:40
Ete hocam, günaydın. Gerçek devrede harici kristal kullanmış idim. Kullandığınız Proteus'un versiyonunu yazarsanız şemamı da sizin proteus'a uygun olarak çizerek ekleyeceğim.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 17 Şubat 2025, 11:24:51
Yukarıda verdiğin  programı yeniden düzenledim.
Bir kere daha denermisin lütfen.
Buda olmuyor ise okunan bilgileri kayıt ettirip ne kayıt ediliyor bakmak gerekir.

Ete

Edit: Yukardaki programı yeniden düzenledim. Ufak bir hata varmış.
Devreyi simule ettim ben uğraşmana gerek yok. Çalışıyor.
Son haline şimdi yeniden bak lütfen.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 18 Şubat 2025, 21:23:27
Ete Hocam , iyi akşamlar. Son yazılımınızı yükledim.Ancak hem gerçek devrede hem de isis'te  yine çalışmadı. Simule ettiğiniz isis dosyalarını gönderebilir misiniz. Ben de benim bilgisayarımda simule edeyim. Veya benim bilgisayarımda Proteus'un 8.5 versiyonu ile çizmiş olduğum alıcı ve verici isis devresini göndereyim.( Verici devresinin hem isis çizimini , hem de kontrol datalarını gönderen pbp dosyasını gönderebilirim. Vericinin de gerçek devresini yaptım. Verici dataları doğru çıkıyor.)  Siz kontrol edin.
Eğer Proteus versiyonunun benim 8.5'ten üst versiyon ise sorun olmaz. Bilgisayarıma sizin versiyonu da yükleyebilirim. Versiyonu bildirmeniz yeterli olacaktır.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 18 Şubat 2025, 23:11:59
Simulede 8.17 kullanıyorum.
Daha önceden nec protokolünü denediğim bir şemayı senin sistemine adapte ederek kullandım.
Dosyalar ilişiktedir.

Ete
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 19 Şubat 2025, 17:45:54
Ete hocam,sanırım sorunun kaynağını buldum. Sizin simulasyonunuzda verici devreden hiç bir butona basmıyorken sürekli low çıkıyor. Butona basılınca 9 ms high ve ardından 4,5 ms low ve komut bitleri geliyor. Komut bitleri sonlanınca çıkış yine sürekli low'da kalıyor. Oysa benim verici devrede durum bunun tam tersi.Benim  devreden hiç bir butona basmıyorken sürekli high çıkıyor. Butona basılınca 9 ms low ve ardından 4,5 ms high ve komut bitleri geliyor. Komut bitleri sonlanınca çıkış yine sürekli high'ta kalıyor.
Sizin gönderdiğiniz verici simulasyon devresini kendi yazdığım verici kodları uyarladım. Farkı gösteren sizin verici devresi ile benim verici devresinin çıkışlarındaki farkın daha net görülebilmesi için ikisini ekteki resimde birleştirdim. Benim verici devresinin çıkışına transistör ile tersleme yapılmamıştır. Devreden çıktığı gibidir.Uygun bir zamanda kontrol edebilir misiniz.
(https://i.ibb.co/xKgfKpq6/KONTROL-FARKI.jpg) (https://ibb.co/xKgfKpq6)
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 19 Şubat 2025, 18:57:01
Bu tespitin bir sorun değil aslında. Program sürekli olarak düşen kenar kesmesi bekliyor.
Düşen kenarda kesmeye girip orada HIGH bitinin süresini ölçmek için bekliyor. Dikkat edersen her düşen kenar bir LOW sinyale tekabül eder. Ama bu LOW un ardından bir HIGH sinyali gelir ve bizde bu sinyali önce buluyor sonra süresini ölçüyoruz. Bana göre devrenin sinyalsiz hali sürekli LOW yada HIGH olması bir şeyi değiştirmez. Ancak yinede senin sinyal şekline uygun hale getirip o şekilde denemekte yarar görüyorum. Bakacağım.
Şunuda belirteyim hemen, benim devrede IR göz bulunuyor ve sinyal sanki IR sinyali imiş gibi yollanıyor. IR_Göz aldığı sinyali ters çeviriyor ve sinyal şeklini senin sinyal şekli ile aynı hale getiriyor. sonuçta sinyalin şekli önemli burada nerden nasıl geldiği önemli değil. Anlayacağın tamamen senin sinyal ile aynı olan bir sinyali çözdürüyorum ben.


Ete
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 19 Şubat 2025, 20:44:02
Asıl sorunu ben anladım galiba. Senin sistemin önce cihaz bilgisini veriyor ardından tus bilgisi dediğimiz asıl bilgiyi veriyor ama o bilginin son biti gerektiği gibi sonlandırılmıyor.
Bu son verdiğin resime bakarsan senin bilginde en son bit bir HIGH biti kod değeri 1 ise orada 1860us lik bir HIGH olması gerekiyor kod değeri "0" ise orada 560us lik bir HIGH palsi olması gerekiyor. Ama sinyaline bakarsan orada sürekli devam eden bir HIGH görüyorsun. Kısaca son bitin HIGH kısmı sinyalin boşta verilen HIGH ile birleşerek o bitin çözülmesi imkansız hale geliyor.
Çünki PULSIN komutu çok uzun gelen HIGH bitini süre olarak ölçemiyor.

Bu durumu değiştirmek yada bir şekilde düzeltmek mümkün değil ise yapılacak tek şey 8 bitlik bilginin 7 bitini kullanmak olur. Yada en güzel orada yalnızca 7 bitlik bilgi almak en doğrusu olacaktır.
Örnek vermek gerekir ise , gelen bilgi 41 olduğunu varsayalım (%0010 1001) bunun %x0101001 kısmını kullanacağız. Böylece 41 geldiğinde yine 41 almış olacağız (41 AND 127 işlemi), 161 geldiğinde ise 33 almış olacağız. (161 AND 127 işlemi) 17 geldiğinde yine 17 almış olacağız.
Programı bu mantığa göre yeniden düzenledim. Sistemi hızlandırmak açısından işlemciyi 16Mhz de çalıştırdım. Şimdi kod çözme daha hızlı çalışıyor.

Ete

Edit: Bu sistemde bir sorun olsa gerek. Hiç bir haberleşme sisteminde son bit HIGH ile bitiyor ise sistemin boşta bekleme şekli HIGH olmamalı. Olursa da son bitin HIGH palsi bir şekilde LOW sinyali anlık da olsa (1us-2us gibi) verilerek bit sonlandırılmalı sonrasında sistemin boşta bekleme lojik seviyesine geçilmelidir. Aksi halde bu gibi sorunların olması kaçınılmaz olur.
Son bitin bitiriliş şekline bakmak benim bile aklıma gelmemiş idi. Ancak sistemi senin istediğin şekle yada senin sisteminin çalışma şekline sokunca 2. tuş olan 161 yollanınca alınan bilginin sürekli olarak 33 olması beni detaylı araştırmaya sevk etti. 33 ün 2li sistem değerine bakınca 161 in 7ci bitin 1 olduğunu 33 de ise 7 ci bitin0 olduğunu görünce uyandım. Demekki sistem son biti doğru şekilde alamıyor dedim ve o bite bakınca boşta bekleme sinyali ile birleştiğini görerek durumu anlamış oldum.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 22 Şubat 2025, 19:29:48
Ete Hocam , iyi akşamlar. Gerçek devrede kodları çalıştırdım. Sizin verici devre ile 16 MHz kristale göre yazdığınız son kodlar çalışıyor. Butonlara basınca alıcı devredeki ledler yanıyor. Ancak küçük bir sorun var.
 Şu şekilde izah edeyim:
Benim orijinal kontrol devresinde cihaz kodu  kodu  11110001    iken sizin verici devreden cihaz kodu olarak 10001111  çıkıyor.
Aynı şekilde  1. buton basıldığında orijinal devrede 00101001  olan komut sizin verici devreden  10010100 şeklinde çıkıyor.

2.  buton basıldığında orijinal devrede 10100001  olan komut sizin verici devreden  10000101 şeklinde
çıkıyor.

3.  buton basıldığında orijinal devrede 00010001  olan komut sizin verici devreden  10001001 şeklinde çıkıyor.

16 MHz kristal olan devrede alış kodları da sizin verici devre kodlarına göre yazılmış olduğundan orijinal kontrol ünitesinin gönderdiği kodlar ile örtüşmediğinden ledler yanmıyor.

Sizin makinanız 64 bit olduğundan kodları 64 bit makinaya göre yazıyorsunuz. Oysa benim makinam 32 bit. Sigorta ayarlarını 32 bite göre değiştirirdim . Fakat sizin kodların en başında " #header
  errorlevel -306  ; Crossing page boundry   
#ENDHEADER    "    şeklinde bir ifade var. Bu ifade için ne yapacağımı bilmediğimden tekrar yardımınızı talep ediyorum.

Bu arada şu da dikkatimi çekti; belirttiğiniz gibi orijinal kontrol komutlarında  end biti 0 mı yoksa  1 mi belli değil ancak gönderilen bit sayısı 17 bit olarak gönderiliyor.


Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 23 Şubat 2025, 11:59:19
Anladığım kadarı ile benim program aldığı bitleri ters alıyor. Yani 7. bit olması gereken bit 0.cı bit olarak işleniyor ve böylece %11110001  olması gereken sayı 10001111 şeklinde çıkıyor.
Bunu bir kaç şekilde düzeltebiliriz en kolayı bitleri çözümlerken;
   for I=0 to 7
        IF DATA_AL[I]=10 THEN CIHAZ.0[I]=1
        IF DATA_AL(8+I)=10 then TUS.0[I]=1 '8 bit den itibaren gelen 8 bit ise komut bitleri oluyor
   next 
komut satırlarında yer alan "THEN CIHAZ.0[I]=1" ifadesini "THEN CIHAZ.0[7-I]=1" şeklinde ve
"TUS.0[I]=1" ifadesini de "TUS.0[7-I]=1" şeklinde değiştirmen yeterli olacaktır.
Diğer konuya gelince cross boundary bir hata değil bir ikaz dır ve işlemci derleme esansında bir kaç bloktan oluşan hafıza bloklarını aşıyorsun ikazını verir. Bu birazda ASM kullananlar için gerekli bir şey ve Basic de de Lookup2 tablolarının kullanımında bir blok kontrolü gerektirir. Sende gerekli bir şey olmadığında o komutu direk silebilirsin.
Bana yolladığın resimlerde yollanan data hep 16 bit olarak gözüküyor. 17. ci bit belkide son biti kurtarmak için yollanıyordur ama yolladıklarında böyle bir uygulama göremeim ben. O neden bu konuda söyleyebilecek bir şeyim yok maalesef. Çok istiyorsan 7 bit kontrol yerine 8 bite (eski haline) geri dönebilirsin.

Ete
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 23 Şubat 2025, 14:45:17
Ete Hocam,program cihaz kodu olan 11110001'i  tersleyerek 10001111 olarak okuyor. Bunun için de değişiklik yapılacak mı? Ayrıca tuşa basıldığında hangi değerin geldiğini belirlemek için "TUS=TUS & 127" ifadesi var. Bu kısımda değişiklik olacak mı? 127 Binary olarak %01111111 eşit oluyor.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 23 Şubat 2025, 15:13:51
Sana iki düzeltme kodu verdim birisi cihaz kodunu diğeride Tuş kodunu ters çeviriyor.
"TUS=TUS & 127" ifadesi alınan 8 bitlik tuş kodunun 7 bitini kullanmak için idi.
Sen 16 yerine 17 bit alınıyor demişsin. Ben göremedim 17 bit. Bana yolladığın resimlerde son bit daima boşta bekleme lojik seviyesi ile birleşiyor gözüküyor verdiğin resimlerde. Bu nedenle bana göre "TUS=TUS & 127" kullanılması gerekir. Gerek olup olmadığına sen karar vereceksin.
Gerke yok diyorsan o komutu silersin ve hemen altındaki Tuş karşılaştırma komutlarında 33 gördüğün yeri 161 yaparsın olur biter.

Ete
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 23 Şubat 2025, 19:11:20
Alıntı yapılan: ete - 23 Şubat 2025, 11:59:19Anladığım kadarı ile benim program aldığı bitleri ters alıyor. Yani 7. bit olması gereken bit 0.cı bit olarak işleniyor ve böylece %11110001  olması gereken sayı 10001111 şeklinde çıkıyor.
Bunu bir kaç şekilde düzeltebiliriz en kolayı bitleri çözümlerken;
   for I=0 to 7
        IF DATA_AL[I]=10 THEN CIHAZ.0[I]=1
        IF DATA_AL(8+I)=10 then TUS.0[I]=1 '8 bit den itibaren gelen 8 bit ise komut bitleri oluyor
   next 
komut satırlarında yer alan "THEN CIHAZ.0[I]=1" ifadesini "THEN CIHAZ.0[7-I]=1" şeklinde ve
"TUS.0[I]=1" ifadesini de "TUS.0[7-I]=1" şeklinde değiştirmen yeterli olacaktır.
Diğer konuya gelince cross boundary bir hata değil bir ikaz dır ve işlemci derleme esansında bir kaç bloktan oluşan hafıza bloklarını aşıyorsun ikazını verir. Bu birazda ASM kullananlar için gerekli bir şey ve Basic de de Lookup2 tablolarının kullanımında bir blok kontrolü gerektirir. Sende gerekli bir şey olmadığında o komutu direk silebilirsin.
Bana yolladığın resimlerde yollanan data hep 16 bit olarak gözüküyor. 17. ci bit belkide son biti kurtarmak için yollanıyordur ama yolladıklarında böyle bir uygulama göremeim ben. O neden bu konuda söyleyebilecek bir şeyim yok maalesef. Çok istiyorsan 7 bit kontrol yerine 8 bite (eski haline) geri dönebilirsin.

Ete

Ete hocam, sizi sürekli meşgul ediyorum. Ancak mantığıma uymayan bir durum sözkonusu. Orijinal vericide cihaz kodu  %11110001 şeklinde geliyorken sizin verici devre bitleri yer değiştirerek %10001111 şeklinde gönderiyordu. Bu hususu size iletmiştim. Siz de son olarak alıcı devre kodunda değişiklik yaparak alıcının da bitleri yer değiştirerek almasını sağlayacak kod ilavesi yapmam gerektiğini belirtmiştiniz.
Hatalı düşünüyor olabilirim. Kod değişikliği yapıldığında bu sefer orijinal devreden gelen %11110001 bitleri alıcı tarafından %10001111 şeklinde görüleceği için cihaz bitleri ve komut bitleri farklı değer olarak algılanacağı için alıcı ilgili ledleri yakmaz diye düşünüyorum. Yanlış düşünüyorsam kusuruma bakmayın.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: blueboard - 23 Şubat 2025, 19:24:53
Bu arada sizin verici devre bitleri yer değiştirdiği için devreden çıkan bitlerin orijinal kontrol devresi ile aynı bitlerin( yer değiştirildiğinde) alıcı tarafından algılanması için şunları yazdım.
@ DEVICE pic16F628a 'islemci 16F628A
@ DEVICE pic16F628a, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628a, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628a, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628a, MCLR_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628a, XT_OSC 'Dahili osilatör kullanilacak
@ DEVICE pic16F628a, LVP_OFF
@ DEVICE pic16F628a, BOD_OFF
'64 BİT MAKİNALAR AŞAĞIDAKİ SİGORTA AYARINI KULLANIN
'#CONFIG
'  __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'#ENDCONFIG
Define OSC 4
CMCON = 7           '// komparator Kapalı
VRCON = 0           '// Vref kapalı

PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00010111 
OPTION_REG.7=0 'pulluplar aktif                 
                 

'// Define variables
X        VAR WORD 
Cevrim   VAR BYTE     '// 38KHz taşıyıcı döngü adedini tutar
Index    VAR BYTE     '// Index sayacı
TUS      VAR BYTE 62     '// 8-bit data byte değerini tutar
CIHAZ    VAR BYTE 63    '// 5-bit donanım adresini tutar
paket    var byte
symbol   TUSA=PORTB.0
SYMBOL   TUSB=PORTB.1
SYMBOL   TUSC=PORTB.2
SYMBOL   TUSD=PORTB.4
SYMBOL   CIKIS=PORTA.0

pause 200
'PR2=25 'max Duty=105 olacak %50 için 52 kullanacağız.
'T2CON=%00000100  'bu işlmecide PWM Timer2 ile çalışıyor.              'açılış gecikmesi
CCP1CON.1=0
CCP1CON.2=1
CCP1CON.3=1
X=52
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=x>>2
porta.0=1
BASLA:
       
        IF TUSA=0 THEN
TUSBIR:       
           TUS=20       '   
           GOSUB VER
           IF TUSA=0 THEN TUSBIR
        ENDIF
       
        IF TUSB=0 THEN
TUSIKI:
           TUS=5         
           GOSUB VER
           IF TUSB=0 THEN TUSIKI
        ENDIF
       
        IF TUSC=0 THEN
TUSUC:       
           TUS=8
           GOSUB VER
           IF TUSC=0 THEN TUSUC
        ENDIF
       
        IF TUSD=0 THEN
TUSDORT:       
           TUS=162
           GOSUB VER
           IF TUSD=0 THEN TUSDORT
        ENDIF
        IF TUS>0 THEN
           TUS=0:GOSUB VER
         ENDIF                             
        paket=0
        GOTO BASLA

'------------------------------------------------------------------------------------- 

BIR:
      PORTA.0=0
      PAUSEUS 520
      PORTA.0=1
      PAUSEUS 1801   
      RETURN
SIFIR:
      PORTA.0=0
      PAUSEUS 520
      PORTA.0=1
      PAUSEUS 520
      RETURN   
   
HEADER:
       PORTA.0=0
       PAUSEUS 9000
       PORTA.0=1
       PAUSEUS 4445
       RETURN   
             
VER:   
       gosub header        '// 2.4mS Baslik/synch pulse yolla                         
       CIHAZ=143
VER_BIR:       
       FOR Index = 0 TO 7 '// 7 bit data  döngüsü
        IF CIHAZ.0[Index] = 0 THEN
          GOSUB SIFIR           
        ELSE
          GOSUB BIR   
        ENDIF
       NEXT Index                         

VER_IKI:       
       FOR Index = 0 TO 7 '// 5 bitlik adres kodu
        IF TUS.0[Index] = 0 THEN '// gönderilecek her bir biti belirle
          GOSUB SIFIR   '// sıfır için Puls zamanı = 0.6mS
        ELSE
          GOSUB BIR    '// Bir için puls zamanı =1.2mS
        ENDIF
       NEXT Index         '// 5v biti yollayıncaya kadar döngüyü tekrarla
       PORTA.0=1 
       
       PAUSE 10
       RETURN       
 
   END

Cihaz kodunu 143
1. komutu 20
2. komutu 5
3. komutu 8 olarak belirledim.
Bu şekilde derleme yapıldığında verici devreden çıkan bitler ile orijinal devreden çıkan bitler birebir aynı oldu.
Başlık: Ynt: Protokol komutlarına göre led yakıp söndürme
Gönderen: ete - 24 Şubat 2025, 10:13:58
Bu iş çorbaya döndü sonunda. İşin içine simulasyonu katınca iyice çorba oldu.

Şimdi simulasyon gönderim kodunda değişiklik yapıp alıcı devrenin doğğru bilgi almasını sağladın.
Bu durumda alıcı doğru idi ve ters çevirme gerekmiyordu diye düşünüyorum.
Çünki seninde belirttiğin gibi vericide;
- cihaz kodu=143
- Kod1      =20
- Kod2      =5
- Kod3=    =8
yapınca alıcı bunları yollandığı şekilde alıyor ve sorun olmuyor. O halde ters çevirmek gereksiz.
Bütün yapman gereken alıcıda aşağıdaki değişikliği yapman.
TUS=TUS & 127                                                      
      IF TUS=20 THEN  '    
        LATB.4=1 
        PAUSE 10
        GOTO BASLA
      endif
      
      if tus=5 THEN  '    
        LATB.5=1 
        PAUSE 10
        GOTO BASLA
      ENDIF
      
      IF TUS=8 THEN    '     
        LATB.6=1 
        PAUSE 10
        GOTO BASLA
      ENDIF                  

Bu durumda yeniden düşünecek olursak simuledeki yollanan bilgi ile senin sisteminde yollanan bilgi aynımıdır?  İşte bunu ancak sen bilebilirsin.
Kısaca senin sisteminin yolladığı cihaz kodu %10001111 şeklinde mi yollanıyor. Bunu daha anlaşılır şekilde sorarsak;
Senin lojik analizör sonuçlarına bakarak;
9000us lik Header => 4500us header sonlandırma => "1" biti =>"1" biti =>"1" biti =>"1" biti =>"0" biti =>"0" biti =>"0" biti ="1" biti şeklinde bir yollamamı yapılıyor?
Yoksa,
9000us lik Header => 4500us header sonlandırma => "1" biti =>"0" biti =>"0" biti =>"0" biti =>"1" biti =>"1" biti =>"1" biti ="1" biti şeklinde bir yollamamı yapılıyor?
Dkkat edersen lojik analizör çıktısında bit ilerleme şekli soldan sağa doğru ve en son bit en sağda yer alıyor.
Bizim byte gösterme şeklmizde ise %10001111  şeklinde en yüksek değerlikli bit en solda en düşük olanı ise en sağda yer alıyor.
Bu soruları anladın ise doğru cevabıda bulursun demektir.
Burada benim bilmek istediğim şudur. Senin sistemin 143 olan cihaz kodunu nasıl yolluyor.
Bit0 dan bağlayarak en sonda bit7 yimi veriyor yoksa bit7 den başlayarak en sonda bit0'ımı veriyor.
Buna göre alıcı programıda düzenlemek gerekir. Bunuda sen yap artık. Her şey ortaya döküldü zaten. Elinde çalışan programda var. Bunu baz alarak sistemine uygun değişiklikleri yaparsın artık. Benden destek bu kadar.
Zaten bana göre yapacak başka bir şeyde kalmadı.

Ete