avatar_Mucit23

EV1527 Decode işlemi

Başlatan Mucit23, 14 Temmuz 2016, 13:47:46

Mucit23

Selamlar,

İçerisinde EV1527 bulunan bir RF kumanda için alıcı yapmam gerekiyor. Kodlama şekli PT2262'ye benziyor biraz fakat bunda sabit 24 bit şifreleme var. Benim bu şifrelemeyi çözüp gelen verileri ayrıştırmam gerekiyor. PT2272 gibi hazır bir decoder yok dolayısıyla MCU ile kendim kodlamam gerekiyor. En çok takıldığım kısım 1 ve 0 ları nasıl ayırt edip sıralayacağım. Bu konuda yöntem arıyorum.

EV1527'nin datasheet'i budur http://aitendo3.sakura.ne.jp/aitendo_data/product_img/wireless/315MHz-2012/RX315-HT48R/EV1527.pdf

Lojik analizatör ile birkaç test yaptım. Örneğin kumandada 1 butonuna basınca alıcıdan aşağıdaki gibi bir veri dizisi alıyorum.

Bu resimde gelen veri sırasıyla "111101010100111110101000" den ibaret. Bunu arduino için yazılmış hazır bir kütüphane ile test ettim. Arduino ile çalışıyor. Butona bastığımda yukarıdaki gibi veriler geliyor. Son 4 bit benim bastığım butonun verisi.

Ete hocam daha önce bu konuda bir çalışmanız olduğundan bahsetmiştiğiniz. Yöntem olarak nasıl yaptığınızdan bahsetmeniz mümkünmüdür? 1'leri ve 0'ları ayrıştırmak için EXTINT veya Capture mi kullandınız?

Teşekkürler.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

PT serisi encoder'e benzerlik fazla. Data sheet'e  (her ne kadar zayıf bir data sheet olsada bazı şeyler anlaşılıyor) bakacak olursak output formatı,
Preambl +20 bit şifre (bu sabit bir kereliğine programlanıyor) +D0+D1+D2+D3
Sonra HIGH formatına bakalım bir Uzun HIGH+Kısa LOW
, LOW formatı ise bir Kısa HIGH ve UZUN LOW dan oluştuğunu görüyoruz.
Senin elde ettiğin lojik analizör çıktısına bakacak olursak

PT serisi entegreleri decode edebiliyorum. Kullandığım yöntem şöyle;
Öncelikle gelen sinyale bakarak bit uzunluklarını tespit ederim. bunları bir yere kayıt ederim.
Daha sonra Preambl içindeki uzun LOW bitini yakalamaya çalışırım. Çünki yollanan bilgi bir paket ve paketin başlangıcı bu LOW biti bana göre. Senin entegrede de aynısı geçerli.
Önce bu uzun LOW bitini yakalayacaksın . Dikkat edersen 3 farklı LOW biti mevcut. Birisi Preambl içindeki LOW, ikincisi HIGH biti içindeki kısa LOW ve diğeri LOW biti içindeki uzun LOW. O halde gelen bitlere bakıp en uzun olanını bulman gerekiyor.
Bunu bulduktan sonra gelen her bir bitin LOW sürelerini kayda almanda yarar var. Sonra bu aldığın kayıtları önceden kayıt ettiğin sürelerle karşılaştırman gerekiyor. Zira LOW biti kısa ise bu bir HIGH dır, LOW biti uzun ise bu bir LOW dur deyip bunlardan şifreyi ve ardından basılan tuşu tespit etmen gerekiyor. Şayet 20 bitlik şifre kısmı sabit ise onu atlayabilir ve yalnızca buton bitlerini kayda alabilirsin.
Toparlarsak takip edeceğin yol şu,
Önce bir sinyal içindeki bütün low bitlerini süre olarak ölçeceksin. Bunları kayda alacaksın. Bunu yalnızca bir kere yapsan yeterli olacaktır.
Sonra sinyali okumaya geçeceksin. Bunun için uzun LOW bitini yakalayacaksın. Yakalar yakalamaz ardından gelen bütün LOW bitlerini kayda alacaksın. Sonuncu bitide kayda aldıktan sonra bu sefer elindeki kayıtlarla karşılaştıracaksın her bir biti.
Kısa olan HIGH bitine ait, Uzun olan ise LOW bitine aittir deyip şifre ve buton bitlerini buna göre oluşturacaksın.

Ete

Mucit23

Hocam benim amacım genel bir decoder yazılımı yapmak. Yani farklı bir kumanda geldiğinde alıcıda bir butona basıp kumanda ile alıcının eşleşmesini sağlamam gerekir. Tabi bu sırada HIGH ve LOW sürelerinide ölçüp kaydetmem gerekiyor anladığım kadarıyla. Az önce 16F628 ile basitçe HIGH süresini ölçmek için aşağıdaki gibi bir yazılım yaptım. Harici kesmeyi giriş olarak ayarlayıp kesme içerisinde iki konumda puls süresini ölçtüm.


static int1 ext_int_state=FALSE;
static int16 pulse_time=0;

#int_ext
void  EXT_isr(void)
{
  if(ext_int_state)  //failing edge
  {
     pulse_time=get_timer1();  // Timer değerini alıyoruz.
     ext_int_edge(L_TO_H);
     ext_int_state=FALSE;
  }
  else  //Rissing Edge
  {
     set_timer1(0);  //Timeri sıfırlıyoruz.
     ext_int_edge(H_TO_L);
     ext_int_state=TRUE;
  }
  clear_interrupt(INT_EXT);   
}


Bu şekilde pozitif puls süresi çalışıyor. Ama daha çok iş var. Puls sürelerini ayrı ayrı nasıl ölçerim şuanda ona kafa yoruyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Ben olsam high süreleriile hiç uğraşmazdım. Bir işine yaramayacaklar çünki. Senin işin yalnızca low süreleri ile. Gelen sinyali 30 adetlik bir döngü ile inceleyip low yakaladığında süresini ölçmek türlü şekilde olur. Qma en güzeli tmr1 ile yapılır. Artık sanada bunu anlatmayayım nasıl yapılacağını.
Çok önemli olduğunu düşündüğüm bir ayrıntıya dikkatini çekmek isterim. Süre karşılaştırmasında düşük değerlikli bitleri dikkate alırsan işin içinden çıkamazsın. Bulduğun sürenin en yüksek bitini yanlız başına esas al. Örneğin süre=129 ise bu sayıyı 7 kabul et. Çünki 129 un en yüksek değerlikli biti 7 ci bit dir. Bu sayede karşılaştırmaların çok kolaylaşır ve hızlı sonuç alırsın. Bunu yapmamızdaki ana amaç okunan sürelerde ufak tefek farklılıkların olması ihtimalidir. Bu nedenle gerçek değerleri karşılaştırırsan işin içinden çıkamazsın.
Okunacak low bitlerini bir dizi değişkenine atarsan işin dahada kolaylaşır bunu unutma.

Ete

Mucit23

Hocam ben aslında kesme ile yapmaya çalışıyorum. Şuanda ufakta olsa sonuçlar almaya başladım ama düzgün çalışmıyor Ben şuanda sizin önermediğiniz şekilde uzun low'u tespit ettikten sonra high sürelerine bakarak 1 veya 0 olsuğuna karar verip sırasıyla diziye yazıyorum.

Lojik analyser'dan tepit ettiğim kadarıyla High süresi 1320 us civarı. Fakat bu süre +-5us değişiyor.

Alıntı YapÇok önemli olduğunu düşündüğüm bir ayrıntıya dikkatini çekmek isterim. Süre karşılaştırmasında düşük değerlikli bitleri dikkate alırsan işin içinden çıkamazsın.

Bu kısmı anlamış değilim aslında. Zaman ölçme işini timer1 ile yapıyorum. Gerçekte MCU'yu 4Mhz harici kristal ile çalıştırıp timer1 ilede 1us artım elde edeceğim. Süre ölçüm işlemini bu şekilde yapıyorum. Timer1'in süre ölçmeden başka bir görevi yok sanırım.

Ben şuanda uzun low'u nasıl yakalayacağım onu düşünüyorum. Bu işlemlerin hepsini harici ext_int rutini içerisinde yapmaya çalışıyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Low sürelerine bakman konusunda ısrar etmeme rağmen sen hala high konusunda ısrarlısın. Umarım bir bildiğin vardır ama benimde bir bildiğim var. Sesli düşünelim.
Uzun low sinyalini yakaladın. O sinyalin hemen ardından gelen High süresini nasıl ölçeceksin? Ama high dan sonra gelen low süresini hem yakalamak daha kolay hemde ölçmek daha kolaydır.
Komutların gecikmesi olduğunu unutma. Bu nedenle low yakalamanı öneriyordum.
Kesme bayrağı kullan ama kesme kullanma bana kalırsa. Tmr1 sayacını sıfırla , bölme 1/1 kullan ve kesme bayrağınıda sıfırla. Sinyal değişince timer sayacını durdur. Kesme oluşmayacak muhtemelen. Ancak bir konumda kesme oluşabilir oda usun low yakalanırken sinyal gelmeyebilir zaten kesme oluşmuş ise işe yeni baştan başlamak gerek. Sinyal konum değiştirince tmr1 değeri sana süreyi verecektir.
Ete

Mucit23

Hocam High yakalamak dan vazgeçtim. Sadece low sürelerine bakarak yapmaya çalışıyorum. LOW süresini ölçmek için yine yukarıda verdiğim kodlardaki mantığa benzer bir mantık ile yapmaya çalışıyorum şuanda. Benim yaptığım RB0 kesmesinin düşen kenarda veya yükselen kenarda oluşacağını değiştirip low süresini ölçüyorum. Sonrasında ölçtüğüm değeri karşılaştırıyorum. Lojik 0 için gereken değer ise dizi değişkenin ilgili bitine 0 yazıyorum. Eğer okunan süre lojik 1 için gereken değer ise dizi değişkenin ilgili bitine 1 yazıyorum. Sonrasında işlemler tekrarlanıyor.

Bu şekilde iyi kötü bir sonuç aldım sayılır ama düzgün çalışmıyor. Sizin nasıl yaptığınızı hala tam olarak kavrayabilmiş değilim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

kullandığım mantığı ve püf noktalarını sana açıkladım. Daha fazladını vermem mümkün değil.
3 farklı low sinyalinin uzun olanını yakalamak zor olmasa gerek. Önce high ararsın onun birimi de low sinyali ölçersin. Beklediğin uzunluktan kısa ise bir sonrakine bakarsın. İstersen önceden high bakmasanda olur. Uzun low yakaldıktan sonra bütün low ları süre olarak dizi değişkenine yerleştirip elindeki sürelerle karşılaştırman gerekiyor. Böylece gelen bitleri tespit edersin.
Süreleri birebir karşılaştırma sorun olurda demiştim.
Kullandığın C dilinde bu nasıl olur ben bilemem kullanmadığım bir dil çünki. Basicde çok kolay bu iş.
While giris=1:wend dedinmi sinyal high olduğu sürece bu satırda takılır program.
Bu satır öncesinde timerı sıfırlayıp sadece enable bitini bu satırdan sonra timer enable bitini set edersen ve ardından while giris=0:wend dersen ve hemen satır sonrasında timer değerini kendi değişkenine aktarırsan low süresini ölçmüş olursun.
Daima sinyalin başını bulmak ve ona göre işlem yapmak önemli.
Ete

Mucit23

Hocam anladigim kadariyla siz herhangi bir harici kesme veya capture vs kullanmiyorsunuz. While ile giriş okuma aynı şekilde c de yapılıyor ama ven kesme kullandigimdan dolayı While döngusune gerek duymadım. 

Bu iş için harici bir mcu kullanacagim biraz ugrasayim kesme ile işin olur içinden çıkmazsam mantığı biraz daha Basitleştirip kesme olmadan yapacağım. 

Ama sizin dediginiz süre kaydetme işide aklıma yattı.  Ben şimdiye kadar sorgulama işini kesme içerisinde yapıyordum. Buda vakit kaybına neden oluyor
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam son hali ile bir test videosu çektim.
https://www.youtube.com/watch?v=dFA_r8_ga2g
Büyük bir kısmını hallettim. Videoda Bit yazısının yanındaki değer veri geldiği zaman 1 oluyor. Diğerleri gelen 24 bitlik değerler.

Bunun dışında Aklıma yatmayan birkaç nokta var. Butonu bıraktığım zaman dizideki değerler değişiyor. Bu sorunda buton bırakıldığı anda gelen paket yarıda kesilirse gerçekleşiyor. Bu sorunu henüz çözebilmiş değilim. Gelen paketin yarıda kesilmesi durumuna karşı bir önlem almam lazım. Videoda butonu bıraktığım anda değerlerin değişmesinin sebebi budur.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bu encoderi bilmiyorum ama pt serisinde aynı paket belirli sayıda arka arkaya tekrarlanır. Bu arada sistem aradan bir paketi algılamalıdır. Sende de aynısı olmalı. Bu nedenle pakeyin yarıda kesilmesi sorun olmamalı. Elbette bir butonun basıldığını anlayabilmen için basıldığında ne geldiğini yada geleceğini bilmen gerekir. İşte bu ilede öğrenme deniliyor. Akıllı kumandaların sistemi budur. Önce butonları öğretirsin ardından gelen buton ilgisini öretilenle karşılaştırırsın. Paket elbette yarım kalabilir bu bilgi gelmiyor anlamında değerlendirilmelidir. Zaten bir yerde buton bırakıldığında aynı olay meydana gelecektir.
Ete

Mucit23

Bende sistem hızlı çalıştığı için neredeyse gelen bütün paketleri kaçırmadan yakalıyor.  Gereksiz derece hızlı.  Bu yüzden videoda Bit yazısının bitisigindeki hane sürekli 1 veya 0 oluyor. Bu sorunu çözersem hedefime ulaşmış olacağım. 
Aslında Lojik analyserda bakınca verinin yarida kesilmesi durumunda neler olduğunu gördüm.  Sorunun sebebinide anladım gibi. Bugün biraz daha ugrasacagim.

C de şöyle bir zorluk var. Kesme olmadan basit bir şekilde döngüler bu işi yapayım dedim ama c de zor oluyor. Basicde bu iş daha kolay

Öğrenme işine gelirsek sanırım bastaki 20 bitlik sifreyi kaydetsem yeterli. Sonra bunlarin karşılaştırması yapılır.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Doğru yoldasın. Devam.
Ete

Mucit23

Ete hocam selamlar,

Hocam birkaç mesaj üstte çalışma videosu eklemiştim. Program son hali ile öyle kaldı. Şimdi birazdaha bakayım dedim ve ufak bir test yapınca anladımki kumanda ile alıcı arasındaki mesafe artınca sistem çalışmamaya başlıyor. Bu zamanlama işi ile başım çok ağrıyacak gibi. Sanırım mesafe arttıkça zamanlar değişiyor.

Farklı bir yöntem arayışındayım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bana kalırsa asıl sorun karşılaştırma problemin. Önceden de dediğim gibi süre ölçümleri her seferinde aynı değeri vermiyor maalesef. Arada bir daha kısa yada daha uzun süreler çıkabiliyor. Ama çok ufak farklar olduğu için bunları göz ardı edebiliyorsun. Bununda yolu küsürat bitlerini göz ardı etmekten geçiyor. Basic de bir komut var, NCD priority encoded bit number. Bu sana sürenin en yüksek değerlikli bit değerini verir. Bunu kullan. Merak etme sonuçta sapmalar olmaz çünki farklar epeyce büyük.

Yardımı olacak ise kullandığım LOW yakalama alt ptogramını vereyim.
LOWBAK:       
       H=0:TMR1L=0:TMR1H=0:T1CON=1
LOWBIR:       
       while RF=1
         IF TMR1H>20 THEN CIK   'önce HIGH bakıyoruz ve çok uzun bir High var ise çıkıyoruz çünki sinyal yok demek oluyor.
       wend
       
       TMR1L=0:TMR1H=0:H=0  'bu satıra ulaşınca low yakalandı demek oluyor
       WHILE RF=0
        IF TMR1H>160 THEN CIK   'çok uzun low ise sinyal kesildi demek oluyor çıkıyoruz
       WEND
       T1CON=0:NUMS.LowByte=TMR1L:NUMS.HighByte=TMR1H
       RETURN 

Bu kod low süresini us olarak veriyor. Çünki bölme oranımı 1/1 ve sayacın saydığı değer direk us oluyor.
Önemli olan bunu nasıl kullanacağımızdır. Bu nedenle süreyi direk değil sürenin en yüksek değerlikli bit değerini karşılaştırmalarda kullanmamız gerekiyor. Bu işin püf noktası aslında bunu keşfedinceye kadar epeyce zorlanmıştım. Bu sayede süreleri değil sadece en yüksek değerlikli karşılığını kullanarak bu sorunu aşmıştım.
Diğer bir konu da dediğim gibi süre kaydında yanızca LOW sürelerine bakmak. Zira bir lojik bit iki bitten oluşuyor.
HIGH= Uzun HIGH+Kısa LOW , LOW=Kısa HIGH+Uzun LOW
SÜre kaydı esnasında temel fikir Uzun LOW (paket başı) yakalanır yakalanmaz ardından gelen yalnızca LOW ların sürelerini kayda almak. Bu aşamada başka işle meşgul olmamak gerek. Sinyal gelir ve gider. Süre kaydı bittikten sonra onları değerlendirip normal şifre yada data bitlerine çevirmek gerekiyor. Bunu okuma esnasında yapmamak gerekir çünki vakit kaybedersin.
Ete

Powered by EzPortal