Protokol komutlarına göre led yakıp söndürme

Başlatan blueboard, 11 Şubat 2025, 21:33:43

ete

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

blueboard

#16
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.

blueboard

#17
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.

ete

#18
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

Powered by EzPortal