SIRC kodunu mikrodenetleyiciye okutmam gerekiyor daha önce.

Başlatan remzi, 28 Şubat 2008, 13:31:38

remzi

Elimde akıllı kumanda diye tabir edilen bir kumanda var. osilaskopta sinyallerini inceledim. SIRC protokolünü kullanıyor. Daha önce bu kodu CCS de okutan oldumu? Kullandığım denetleyici 12F629 . Osilatörü 4Mhz lik dahili osilatör kullanıyorum?

Hazır bir kod yok ise kumanda sinyallerini okumam için nasıl bir yöntem izlemem gerekiyor? İç içe if döngüleri ile yapmaya denedim ama iyi olmadı. Bu şekilde yapınca gürültülere çok duyarlı oluyor. Özellikle florasan lambadan çok etkileniyor.

Ayrıca dahili osilatörlü mikrodenetleyicilerin osilatörlerinin toleransı ne kadardır. Mesela bir pulse in genişliğini ölçsem, dahili osilatörlü mikrodenetleyici ile kristal osilatörlü mikrodenetleyici arasında bir fark olurmu?

Tavsiyelerinizi bekliyorum. iyi çalışmalar...

OG

CCS bilmiyorum, basic de dahili osc (4MHz) ile 38KHz lik pulsleri problemsiz alıyorum. Fakat tsop benzeri alıcı göz kullanmak şart, bu eleman ile filtre ve amplifikasyon yapıldığından harici girişimleri yüksek oranda engeller.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

remzi


OG

12f675 kullanıyorum ama 12f629 ile adc hariç aynı entegredir.

IR_boyu var word(13) ' Array
xx var Byte
x2 var byte
Command	Var Byte
cihaz var byte


giris var GPIO.5

''' Boşluk palsi beklenir, boşluk pulsi süresi 2,4msn dir
Getstartbits0: 
PuLSIN giris,0,IR_boyu(0) ' LOW seviyesindeki puls sürelerini ölç        
if IR_boyu(0) < 220 then getstartbits0 '2200usn den küçük ise tekrar
if IR_boyu(0) > 270 then getstartbits0 '2700usn den büyük ise tekrar

'LOW süresi 2,2ms-2,7ms arası gelirse header geldi kabul edilir. Bu süre hassasiyet için oynanabilir. 

''----- Header Geldi ---------------
'' 12 adet puls boyu alınacak     
for xx=1 to 12
pulsin giris,0,IR_boyu(xx)  
next  xx  


'' puls boylarına göre data bilgisi elde edilecek
displaybits: 
for xx=1 to 7
x2=xx-1
    if IR_boyu(xx) < 100 then ' 1000usn den küçük ise
    Command.0[x2] = 0  ' Command'ın ilgili bitini 0 yap
    Else	
    Command.0[x2] = 1 '1000usn den büyükse ilgili biti 1 yap
    endif  
next  xx 
''1000usn yani 1ms çok toleranslı bir deger, hassasiyet için oynanabilir. 

'' SIRC daki TV video vs bilgisi 
cihaz=0         ' 5 biti alttaki dongude alınır
for xx=8 to 12
x2=xx-8
    if IR_boyu(xx) < 100 then
    cihaz.0[x2] = 0 
    Else	
    cihaz.0[x2] = 1
    endif  
next  xx  


''''  Tuş Değeri Düzeltme '''''''
'SIRC da 0-9 arası gönderim yaparken 0-9 arası birebir gitmez, kayma vardır bunlar düzeltilirse kullanım kolaylaşır.
' Tuş1=0, Tuş2=1 ... Tuş9=8 , Tuş0=9  (Bunlar düzelecek)
' Wolume(+)=18, Volume(-)=19, Mute=20, Power=21, Standby=47
' Channel(+)=16, Channel(-)=17

if Command<9 then       '1-9 tuşları arası data düzeldi 
Command=Command+1
goto atladik
endif

if Command=9 then       '0 tuşu düzeldi 
Command=0
'goto atladik
endif     

atladik:
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

remzi

Kodu inceledim biraz.( basic den hiç anlamam ama) zannedersem pulse uzunluğu ölçülerek karar veriliyor değilmi?

İlk önce header süresi ölçülüyor daha sonra sıra ile gelen palsler kontrol ediliyor gibi görünüyor.

İyi çalışmalar...

OG

Evet, mantığı süre ölçme üzerine kurulu. LOW seviyesindeki puls sürelerinin dikkate alınmasına sebep, tsop 38KHZ lik IR palsleri gördüğü sürece çıkışını LOW a çeker. 38KHz IR yoksa çıkışı HIGH durumundadır.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

remzi

Teşekkür ederim. Kodu başarıyla okudum...

İyi çalışmalar...