25 bitlik binary okuma

Başlatan UGR, 17 Kasım 2016, 00:26:05

UGR

Merhabalar
25 bitlik bir binary sayıyı tek seferde okunabinir mi?
Bu sayıyı pt2240b kodluyor. İlk 21 bir adress sonraki 4 bit data ve son bit stop biti olarak biliyorum.  picbasic ile decode yapmak mümkünmüdür?


İlyas KAYA

Eğer soru sadece picbasic ile yapılabilir mi ise cevap EVET. Hemde diğer dillere nazaran çok daha kolay. Ama soru nasıl yaparım ise;

PULSIN komutunu inceleyin. Pulsin ile gelen puls sürelerini ölçün ve "1" mi "0" mı karar verin.
Bunları da bir byte  içine uzunlukları olacak şekilde kayıt edin.

Entegrenin gönderdiği data puls uzunluğunu bilmiyorum.Datasheetinden sürelerini görebilirsiniz.

Diyelim ki ilk puls süresi 15 milisaniye ARTI sonraki 40 ms EKSİ. Bu 1 olarak alınıyordur. Datasheetlerinde hangi pulslerin 1 hangilerinin 0 olacağı yazılıdır. Ayrıca bir de senktron biti vardır. İlk senkron bitini yakalayın sonrası gelir.

Bence bir tane LCD yapın ve alıcıdan gelen tüm ARTI ve EKSI pulslerin sürelerini ölçüp LCD de gösterin. Daha iyi anlayacaksınız.

Ben size senkron bitini ve bundan sonra gelen dataların uzunluğunu nasıl yakalayacağınızı gösteren kodu veriyorum.
Kodlarda temel olanları verdim. tanımlar vs yoktur.



define pulsin_max 1600 ' pulsin komutunun pals yakalama süresini kısıtladık. Aksi hade 65535 e kadar bekler.

datalar var byte [48] ' kaçtane data gelecek ise ona göre açılır ben 48 dedim. 24 bit data için 48 olması lazım. Her bit genelde 2 puls ile gönderiliyor.
define osc 4 ' tüm hesaplar 4 mhz sistem saatine göredir. farklı bir osilatör kullanacaksanız değerlerin hepsini buna göre değişmesi gerekir.

x var byte
senkron var word
clear


BASLA:
         
       
                   
  PULSIN PORTA.0,0,senkron     ' ilk senkron palsi SIFIR ise senkron palsini yakalıyoruz

  IF senkron < 850 THEN  ' 850 değeri sizin senkron bitinin uzunluğuna göre değişir. Bu rakam çok büyük olursa kumandanın yolladığı senkron bitini hiç alamazsınız. Çok düşük olursa da çok fazla etraftan gelen parazitleri alır. Kumandaya bastığınızda ENDIF satırından sonrasına gidiyor ve normalde program burada kalıyor ise sorun yok demektir. Ayarlayacağınız değer de buna göre olmalıdır. Arada sırada bizim senkron bitinin uzunluğunda pals ler gelebilir bu da normaldir.

goto basla
       endif

' buradan itibaren artık dataları pulsin komutu ile yakalamamız gerekir.

FOR X = 0 TO 47                               ' 48 adet palsi datalar adlı diziye yerleştiriyoruz. Her pals'in uzunluğunu buradan kontrol etmeniz lazım.
     
      PULSIN PORTA.0,1,datalar(X)
  NEXT

' bundan gayrısını sizin çözmenizi istiyorum. Zaten gelen tüm verileri datalar adlı diziye yerleştirdik. Uzunluklarına bakarak 1 mi 0 mı karar veren kodlamayı yaparsınız. diyelim ki; "50 ise 0", "150 ise 1" gibi..

FOR X=0 to 47                 
LCDOUT $fe,1,DATALAR[X]        ' DATALAR dizisini LCD ye 1 sn aralıklar yazıyoruz. Gelen uzunlukları böylece görebilirsiniz.
Pause 1000
next


goto basla

END


Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

#2
Soru nun soruluş şeklinden bu entegreden gelen veri paketinin okunabilir standartta geldiği varsayılarak okunup bir kerede bir değişkene yerleştirilebilirmi diye soruluyor şeklinde algıladım.
Soru  bu ise işte cevabı,
Değişkenler genelde 8 - 16  ve 32 bit şeklinde sınıflandırılıyor. PBP derleyicisi 18F serisi için 32 bitlik değişken kullanımına izin veriyor. Bu durumda okunacak bilgi bir adet LONG tipi değişkene yerleştirilerek işinizi görebilirsiniz.
PT2240B data sheetine bakılırsa bir süreleri şöyle;
LOW biti = 32 peryot HIGH ve 96 Peryot LOW
HIGH biti= 96 peryot HIGH ve 32 Peryot LOW.
Senkron biti ise 32 peryot HIGH ve 992 peryot LOW sinyalinden oluşmaktadır.
Çalışma frekans aralığı 100 Khz ile 600 Khz aralığında değişmekte ama gördüğüm genelde 200 Khz lik OSC ler kullanılmaktadır.
200 Khz lik OSc kullanılır ise bu süreler şöyle olacaktır;
LOW biti=160us HIGH + 480us LOW
HIGH Biti=480us HIGH + 160us LOW
Senkron = 160us HIGH + 4.96 ms LOW şeklinde verilmektedir.
Kullanılan osilatöre göre bu süreler fark edecektir.

Bu entegrenin okunabilmesi için işlem sırası şöyledir;
- Önce senkron bitini yakalarsın. Burada ip ucu, uzun olan LOW bitidir.
- Daha sonra peşinden gelen sinyalin yalnızca LOW kısımlarını süre bazında kayıt altına almak gerekir.
- tüm bitler okundıktan sonra bir döngü içinde okunan bit kısa ise HIGH uzun ise LOW şeklinde karar vererek bitlerin tamamı değerlendirilerek kod çözülmüş olur.
Kod çözme işinde bana kalırsa değişkenin boyutunun hiç bir önemi yok. Sebebi basit. Veri paketi hazır bir kod ile çözülemeyecek yada alınıp bir değişkene yerleştirilemeyecek şekilde farklı formatta geliyor. Yani siz onu bir kerede okuyup okunan değeri bir değişkene atabileceğiniz bir formatı yok. Verinin önce okunup sonra işlenmesi gerekmektedir. O halde değişken 8 bit olmuş 32 bit olmuş pekde önemli değil bence ve bu işi 8 bitlik değişkenlerle de yapmak mümkün.


Ete

UGR

Cevaplar için teşekkür ederim yardımlarınız ile çözüme ulaştım.
-Ilk olarak lojik prob ile encoderin gönderdiği kodu ölçerek senron arasi  uzunluğunu buldum. irek encoderin çıkışını kullanarak rf katına gitmeden.
- 13, 75 milisaniye lowda kalıp ardından kodu aktarıyor encoder pulsin ile bu sureyi yakalayıp sonraki high pulslerini ölçerek  4 adet 8 bit değişkene desimal olarak aktarıp seri porttan pc ye aktardım. 3 adet değişkenlede aktarim saglanabilir.

Değerleri artık görebiliyorum ilginiz için teşekkür ederim.




İlyas KAYA

Çözüme ulaştığına sevindim. Forumlarda sık sorulan sorulardan bir tanesi de RF kumandayı nasıl okutabilirim di.

Yukarıda verdiğim kod bu işi yapan kısmın en temel halidir. Gerisi tamamen hayal gücünüze kalıyor.

Biraz daha mantık kurarak RF kumandalarınızı bir buton ile PIC'e okutabilirsiniz..
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal