avatar_ete

IR_HABERLEŞME PROJESİ

Başlatan ete, 21 Haziran 2015, 18:44:10

Yasin

Konuyla bir alakası yok ama yukarıdaki programlardan birinde değişken tanımlamalarında IR_AL var BYTE(32)62 diye bir şey gördüm. (32)62 değerleri değişken türünün yanına yazıldığında ne ifade ediyor?

sonmoikan

#46
IR_AL var BYTE(32)62

32 rakamı bu değişkenin 32 adet olduğunu belirtiyor.

62 ise bu değişkenin bellekteki adresini belirtiyor. ASM içerisinden bellek yerini aramaktansa bellekteki yerini kendimiz belirlememiz kolaylık sağlıyor.
Örneğin : Simülasyon içerisinde İsis de Debug >> Watch Window >> Add Memory item e ekleme yaptığımızda Address yazan yere 62 yazıp eklediğimizde o değişkenin değerini takip edebiliyoruz.

Micro Code Studio derleme yaptığında .asm dosyasını text edit programı ile açarak ilgili değişkenin bellek adresini bulabiliriz. Aşağıdaki resimleri inceleyebilirsiniz.
ABDULLAH

ete

Açıklamaya bir şey ekleyeyim. tanımlanan değişken bir dizi değişkeni ve 32 adet elemanı var. Bu elemanların her birine index değişkeni kullanarak kolaylıkla ulaşmak mümkün oluyor. IR_AL(0) denildiğinde sıfır burada index değişkeni oluyor. Anlamı sıfırıncı değişken bir sonrakinde index 1 olacaktır. Toplamda 0-31 arasında index değeri kullanılarak 32 adet değişkene ulaşmak mümkün olabilmektedir.
62 sayısı ise dizi değişkenlerinin değerlerinin yerleştirileceği hafıza başlangıç adresini veriiyor. 62 adresi IR_AL[0] değişkenine ait , 63 nolu adrese otomatikman IR_AL[1] değişken değeri yerleşmektedir. Böylece toplam 32 adres kullanılacaktır.

Ete

sonmoikan

#48
Hocam zaten bellek başlangıç adresi belirlenen IR_AL değişkeninden sonraki T1 değişkeninin adresi $5E= 94 olarak ayarlamış,
94-62=32, yani 32 adres sonra bir sonraki değişkenin başlangıç adresi verilmiş.
ABDULLAH

ete

Bu söylediğin hangi programda? bendekinde T1 diye bir değişken yok.

Ete

blueboard

Ete Hocam, Pic Kit2 ile istediğiniz değerleri aldım. Ekliyorum. Teşekkürler.

ete

Burada verdiğin resme bakarsak her şey usulüne uygun yürümüş gözüküyor. Yalnızca anlamadığım iki nokta var.
Madem bu resim IR_Alıcı çıkışından alınıp kayıt edildi çıkan bilginin ters çevrilmiş olmasını beklerdim. Oysa resim düz gözüküyor. Yani IR tarafından verildiği şekilde. Umarım devrende IR-Göz çıkışında bir transistör yoktur.
İkinci nokta ise hem adres hemde data bitleri ikinci defa verildiğinde bitler ters çevirlmesi gerekirken sabit ve başka bir bilgi verilmiş onların yerine. Bu bir uyumsuzluk olsa gerek yada artık ters bit verilme gereği duyulmuyor olsa gerek.

Toparlarsak , header sinyalinden sonra 8 bitlik adres bitleri ve peşinden sabit bir 8 bit bilgi verliyor Ardından 8 bit komut kodu ve yine sabit 8 bit veriliyor. En sonda ise sonlandırma biti olarak 1 adet 560ms lik HIGH veriliyor 33. bit gibi durmasına rağman değil sonlandırma biti. Ardından uzun bir LOW sinyali ve yine peşinden Repeat ve 110 ms low ve peşinden yine repeat sinyali.
Bu işlem sanırım kumandadan tuşu bırakıncaya kadar devam ediyor. Bu protokolü hiç sevmedim. Zira tuşa bastığın müddetçe yalnızca bir kere adres ve komut kodu veriliyor sonra repeat kodları tekrarlanıyor. Bu durum kodun yakalanmasını son derece zor hale getirecektir.
Bu sistemde kumanda tuşuna kesik kesik basmak gerekir aksi halde hiç bir şey yakalayamayabilirsin.

Bu lojik resmi isteme amacım adres ve komut bitlerinin tuşa basıldığı sürece tekrarlanıp tekrarlanmadığını görmek idi. Gördüm de tekrarlanmıyormuş. Öyle değerlendiriyorum çünki resmin gerisini göremiyorum. Ama açıklamalarda bu yönde. Ne demişler; tuşa basıldığı müddetçe repeat kodu tekrarlanır. O halde resim doğru demektir. Böylece okuduğumuz bilgilerle gerçek bilgiler bir biri ile örtüşmüş oluyor.

Tek sıkıntı bilginin ters çevrilmemiş olması bence.  Çünki program mantığını ters çevrilmiş bilgi üzerine kurmuştum. Şayet Pic e giden bilgi de bu resimdekinin aynısı ise kodu değiştirmek gerekecektir.

Ete

blueboard

Ete Hocam, göz çıkışında transistör bulunuyor.

ete

#53
Madem göz çıkışında transistör var. o halde aşağıdaki kodu dene bakalım. BASLA satırına kadar olan satırlar aynen önceki programdan alınacak.

Ete

BASLA:

      gosub TUSGIR
      IF TUS=%01000000 THEN  'AÇMA - KAPAMA       
        PORTB.0=1
        GOTO BEKLE
      endif
     
      if tus=%00011001 THEN
         PORTB.1=1
         GOTO BEKLE
      ENDIF
     
      IF TUS=%000001001 THEN
         PORTB.2=1
         GOTO BEKLE
      ENDIF             
           
      IF TUS=%00000111 THEN
         PORTB.3=1
         GOTO BEKLE
      ENDIF
             
      PORTB=0
     
      GOTO BASLA
     
     
     
BEKLE:
      TUS=0:CIHAZ=0
      I=0:TAMAM=0:PAKET=0
       
       while I<30  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,0,PAKET
'         IF PAKET >200 AND PAKET <250 THEN BEKLE '2,25ms arada bir değer olacaktır
         IF paket>12000 then
           portb=0
           goto basla
         endIF   
         I=I+1
       WEND
       PORTB=0
       GOTO BASLA

     
TUSGIR:
       TUS=0:CIHAZ=0
       I=0:TAMAM=0:PAKET=0
       
       while I<30  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,0,PAKET
         IF PAKET >400 AND PAKET <500 THEN CIK '4,5ms arada bir değer olacaktır
         I=I+1
       WEND 

       IF PAKET<400 THEN RETURN
CIK:       
       PAUSEUS 10     'BURADA HEADER YAKALANMIŞ OLCAK ARDINDAN GELEN 32 BİT ALINACAK
       for I=0 to 31
         pulsin IR_Goz,0,IR_AL(I)   'YALNZCA HIGH BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
       next
       
       CIHAZ=0 'ŞİMDİ ADRES (CİHAZ) KODUNU AYIKLIYORUZ İLK 8 BİT ADRES KODU OLACAK
AYIKLA:
       For I=0 to 7
         if IR_AL(I)>70 then CIHAZ.0[I]=1 '700us den büyük ise bu bit 1 dir (1=1690 us dir 0=560us dir)
       next

       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
       next                                'benzer şekilde 700us den büyük olanı "1" dir kabul ediyoruz
       RETURN
       
END

blueboard

#54
Ete Hocam, TUSGIR döngüsü yok.O etiketi BEKLE olarak mı değiştireyim?Ben TusGIR 'i eski dosyadan aşağıdaki gibi aldım ve denedim. Led 42 sn boyunca yanık kalıyor.Ancak led yanık iken kumandadan herhangi bir tuşa bastığımda tuşu görüyor. Ardından yanmakta olan led sönüyor.Hocam aklıma bir başka şey geliyor;Repeat Code'yi engellemeye çalışacağımız yerde Alıcı program Repeat Code'yi gördüğünde orijinal alıcıda olduğu gibi ilgili komutu tekrarlasa,Repeat codeyi görmediği zaman ise ilgili komutu yanlızca 1 kez çalıştırsa nasıl olur?



'****************************************************************
'*  Prog.Adı: IR_ALICI.BAS                                      *
'*  Yazan   : [*****ETE*********]                               *
'*  Notice  : Copyright (c) 2015                                *
'*          : Program hakları ETE'ye aittir izinsiz kopyalanmaz *
'*  Tarih   : 20.06.2015                                        *
'*  Versiyon: 1.0                                               *
'*  Açıklama:                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628
@ DEVICE PIC16F628, WDT_Off
@ DEVICE PIC16F628, LVP_Off
@ DEVICE PIC16F628, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F628, MCLR_Off
@ DEVICE PIC16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
'@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
DEFINE OSC 4

CMCON = 7
PortA=0:TRISA=%00000001
PORTB=0:TRISB=%00000000

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
Cihaz Var Byte 61
IR_AL var BYTE(32)62

I     var Byte 100
Z     var BYTE
Led   var bit
symbol IR_Goz=Porta.0

PAUSE 300

'---------------------------------------------------------------------------
'Tus Kodları:


BASLA:

      gosub TUSGIR
      IF TUS=64 THEN  'ses +    01000000       
        PORTB.0=1
        GOTO BEKLE
      endif
     
      if tus=25 THEN     'ses- 00011001
         PORTB.1=1
         GOTO BEKLE
      ENDIF
     
     IF TUS=9 THEN   ' seek+ 000001001
         PORTB.2=1
         GOTO BEKLE
      ENDIF             
           
      IF TUS=7 THEN   'seek-  00000111
         PORTB.3=1
         GOTO BEKLE
      ENDIF
             
      PORTB=0
     
      GOTO BASLA
   TUSGIR:
       TUS=0:CIHAZ=0
       I=0:TAMAM=0:PAKET=0
       while I<50
         PuLSIN IR_Goz,0,PAKET
         if PAKET>700 then CIK
         I=I+1
       WEND 
       IF PAKET<700 THEN RETURN
CIK:       
       PAUSEUS 50
       for I=0 to 31
         pulsin IR_Goz,1,IR_AL(I)
       next
       
       CIHAZ=0
AYIKLA:
       For I=0 to 7
         if IR_AL(I)>70 then CIHAZ.0[I]=1
       next

       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1
       next
       pause 150
       RETURN
         
BEKLE:
      TUS=0:CIHAZ=0
      I=0:TAMAM=0:PAKET=0
       
       while I<50  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,0,PAKET
         IF PAKET >200 AND PAKET <250 THEN BEKLE '4,5ms arada bir değer olacaktır
         I=I+1
       WEND
       PORTB=0
       
       
       GOTO BASLA

blueboard

Ete Hocam,bir şey daha sormak istiyorum.Tanımlamalarımız 16F628 için oysa ben yazılımı 16f628A 'ya yüklüyorum. Farkeder mi?

ete

#56
16F628 ve 16F628A ayarları aynıdır fark etmez.
Programda TUSGIR döngüsü bulunmaktadır. Iyı bakarsan görebilirsin.
Bekle ikinci bir bekleme alanıdır. Orada tuşun bırakılıp bırakılmadığını kontrol ediyoruz.

Bu rada daha akıllıca bir yöntem bulunması gerekiyor Yaptığım şey 2,25ms lik LOW süresinii yakaladığı müddetçe tuş bırakılmamış mantığını güdüyor. Ancak biraz düşünürsek , tuş bırakılmadığı sürece, 2,25ms lik low ardından 110 ms lik LOW sinyali veriliyor.  Biz ise yalnızca 2,25 lik sinyale bakıyoruz. Belkide tuş bırakıldığında uzunca bir LOW verileceğini hesaba katıp bunu yakalamak daha akıllıca olur diye düşünüyorum.
Bunun için BEKLE etiketi altında yer alan,
IF PAKET >200 AND PAKET <250 THEN BEKLE satırı yerine

IF PAKET>12000 THEN
     PORTB=0
     GOTO BASLA
ENDIF

eklemek belkide daha akıllıca olacaktır. 12000 rakamı nereden geliyor bakalım en uzun LOW 110 ms bu 110.000us eder. Pulsin bunu 11.000 olarak okur. O halde bundanbüyük değer oalrak biraz da tolereans koyarak 12.000 alabilirz.

Ete

blueboard

#57
Ete Hocam , bugün şehir dışındayım,yarın bakabilirim.Bu arada şunu belirtmek istiyorum; I<50 yazdığımızda bekleme süresi 42 sn civarı, I<30 yazdığımızda 25 sn civarı, I<20 yazdığımızda ise bekleme 15 sn civarı gerçekleşiyor. Sanki I miktarı ile paralellik gösteriyor gibi geldi.
Sizin dün değiştirmemi istediğiniz yerde GOSUB TUSGIR  ifadesi var ama TUSGIR: şeklinde bir yeri ben yine göremedim.Siz değişikliği şu şekilde yapmamı istemiştiniz" BASLA satırına kadar olan satırlar aynen önceki programdan alınacak."  Benim dosyada TUSGIR döngüsü BASLA satırından sonra yer alıyordu.

BASLA:

      gosub TUSGIR
      IF TUS=%01000000 THEN  'AÇMA - KAPAMA       
        PORTB.0=1
        GOTO BEKLE
      endif
     
      if tus=%00011001 THEN
         PORTB.1=1
         GOTO BEKLE
      ENDIF
     
      IF TUS=%000001001 THEN
         PORTB.2=1
         GOTO BEKLE
      ENDIF             
           
      IF TUS=%00000111 THEN
         PORTB.3=1
         GOTO BEKLE
      ENDIF
             
      PORTB=0
     
      GOTO BASLA
     
BEKLE:
      TUS=0:CIHAZ=0
      I=0:TAMAM=0:PAKET=0
       
       while I<50  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,0,PAKET
         IF PAKET >200 AND PAKET <250 THEN BEKLE '4,5ms arada bir değer olacaktır
         I=I+1
       WEND
       PORTB=0
       GOTO BASLA

ete

Ekledim TUSGIR kısmını. Altta kalmış koymamışım. Koymuşken sonduruma göre düzeltip koydum.

Ete

blueboard

Ete Hocam,son olarak düzenlediğiniz kısım nerede?

Powered by EzPortal