avatar_ete

Uzaktan Kumanda İle Saat Ayar Sistemi

Başlatan ete, 13 Aralık 2012, 17:43:41

Dtmf

Hocam soyle anladim tus 255 diyoruz tus=%11111111 oluyor tus.bit0 diyerek tus degiskenin 0.bitinden baslayarak sola dogru kayarak her bir bitin I dizisindeki surelere gore bitlerin bir veya 0 almasi gereken degerleri yukluyor.buradaki tus.bit0 0.bitten baslamasini soyluyor dogrumu hocam

ete

Tespitin doğru. Oraya Bit0 yazmak bir format gereğidir (Tus.0[I] veya Tus.bit0[I] şeklinde). Ama döngü sayesinde bit_0 dan balanıp 7.ci bite kadar sadece sıfır olanları sıfırlıyor. Bitler başlangıçta hepsi 1 konumunda zaten.

Ete

Dtmf

Sagolun hocam vakit ayirdiginiz icin.

Dtmf

Hayirli sabajlar ete hocam ir tv kumanda ile ugrasmaya basladim bu projede kullanacagim.elimde sony ve tunex marka kumanda var kumandalarin pulsin ile hedir sinyalini aldim sony(0)i olctum 251 (1) i olctum 54,tunex markada ise 0 lar 930 1 ler 227 doru yoldamiyim

ete

Bence yanlış yoldasın.
Yapman gereken şu, Sonu header sinyalinin (sinyal başlangıcının) resmini yazıcıdan çıktı alarak önüne koy ve üzerine HIGH ve LOW sürelerini yaz.
Böylece sinyalin yalnızca bir peryodunu değerlendirmeyeceğini kolaylıkla anlarsın.
TUNEX dediğin neyse onu tanımıyorum zaten. Onunda ya biir skop görüntüsüni yada lojik analizör görüntüsünü alman ve mevcut protokoller ile kaşılaştırman lazım.

Header denilen sinyal başlangıcını genellikle uzun bir LOW süresinden sonra kısa bir HIGH peryodu olarak algılıyoruz. Dolayısıyla sinyalin LOW süresi ana sinyalin içindeki LOW süreleri ile mukayese edilmeyecek kadar farklı olduğu için bunu Header olarak ayırt edebiliyoruz.

Ete


Dtmf

ıyı aksamlar ete hocam dedıgınızı yaptım sony kumanda sırc protokolu ıle calısıyormus.data peryotlarında preamble sınyalı 2.4ms hıgh sınyalını ısaret edıyor bnde adım adım ılerlemek ıcın soyle bır program yazdım tk19 dan dırek cıkıs alırsam her tustan 251 deger alıyorum 2sc945 transıtor ıle cıkıs alırsam her tustan preamble sınyal degerı 54 alıyorum
Device=16F877A
XTAL=4
ALL_DIGITAL TRUE
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0
TRISE=0:PORTE=0
Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1 
Dim OKU As Byte
;===================================
Print At 1,1,"  IR KUMANDA  "
BASLA:
OKU=PulsIn PORTC.0,1  ;PREAMBLE SINYALINI YAKALIYORUZ EN UZUN LOW OLCULUYOR
If OKU>50 And OKU<252 Then Print At 2,1,Dec OKU      ;OKUNAN DEGER 54
DelayMS 1000
OKU=0
Print At 2,1,"               "
GoTo BASLA

Dtmf

#21



Dtmf

#22
Hocam preamble den sonra 7 bit komut sonra 5 bit adress yaziyor

ete

Göz çıkışından direk sinyal aldığın zaman Verilen sinyalin aynısını alırsın. Header sşinyali üzerinden konuşursak 2,4ms lik HIGH sinyalini alman gerekir.
Göz çıkışına sinyali ters çeviren bir transistör eklersen bu sefer yollanan sinyalin tersini alırsın. Yani 2,4ms lik HIGH yerine 2,4Ms lik LOW sinyali ölçmen gerekir.
Hangisini kullanacak isen programında ona göre olmalı. Programndaki okuma komutu şu;
OKU=PulsIn PORTC.0,1   Bu komutta ölçülen sinyal şekli HIGH oluyor. Yani senin transistörsüz devre kullanman gerekiyor. Transistör kullanırsan o zaman komut OKU=PulsIn PORTC.0,0
şeklinde olmalı.
Bu komutta kullanılan OKU değişkenin ne olmalı onu tartışalım şimdide.
Okuman gereken süre 2400us Pulsin komutu daima 10'a bölünmüş (4Mhz OSC frekansında) değeri vereceği için okuman gereken miktar 240 olacak en fazla. Bu duruma Byte değişkeni kullanılabilir. Zira bekleyeceğin OKU değeri 240-250 aralığında bir değer olacaktır.
Ama daha uzun süreler için OKU değişkenin Word tipinde olmalı.
Bu durumda okuduğun 251 değeri en azından doğru sonuca en yakın değer oluyor ama yinede pek doğru sayılmaz. Zira 2510us lik süreye tekabül ediyor. Ya okuma hatası var yada devrende sorun var yada kullandığın vericideki sinyal gerçekten böyle. Sinyal şeklini görmeden bir şey söylemek mümkün değil.
SIRC protokolü toplam 12 bitten oluşuyor. Bunun 5 biti adres ve 7 bitide komut oluyor.

Ete


Dtmf

ete hocam preamble sınyalını yakaladım sonra gelen verılerden ılkının suresını olctum soyle. 1 numaralı tus sure=66 olctum. 2numaralı tus sure=127 olctum.

Device=16F877A
XTAL=4
ALL_DIGITAL TRUE
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0
TRISE=0:PORTE=0
Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
Dim AL As Byte
Dim PL As Word
Dim I As Byte
Dim SAY[12] As Word
;===================================
Print At 1,1,"  IR KUMANDA  "
BASLA:
AL=PulsIn PORTC.0,1
     If AL>200 And AL<253 Then   ;preamble sınyalı yakalama
     For I=0 To 11
     PL=PulsIn PORTC.0,1
     SAY[I]=PL  ;GELEN 12 verıden ılkının suresını olctum
     Next
     Print At 3,1,"SURE: ",Dec SAY[0]
     DelayMS 2000
     Print At 3,1,"         "
     EndIf

GoTo BASLA

Dtmf

Ete hocam proton bu sekilde program ekledigimde surelere gore son.bit0 degiskeninin bitlerini degistirmeye calistigimda hata veriyor.
if sonuc(say)>67 then son.bit0[say]=1
if sonuc(say)<127 then son.bit0[say]=0

(Dim son as byte
Son degiskeninin bit lerini degistiremedim)

Dtmf

ete hocam programın son halı asagıda her bır tusun verılerını almayı basardım 1.tus 00001000 2.tus 00001002 öernegın not aldım.gerı basa sarıp tuslara bastıgımda kodlarda karısıklık olmadı aynısı gıbı aldım.bıde sız gozden gecırsenız eksıgım kusurum varsa yazsanız sıze zahmet.bu arada degıkenın bıt degıstırme ıslemını soyle yaptım hocam
SON=%111111111111     
For I=0 To 12
If SAY[I]<70 Then ClearBit SON,I 
If SAY[I]>126 Then SetBit SON,I

;========================================
Device=16F877A
XTAL=4
ALL_DIGITAL TRUE
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0
TRISE=0:PORTE=0
Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
Dim AL As Byte
Dim PL As Word
Dim I As Byte
Dim SAY[12] As Word
Dim SON As Word
Dim A As Byte
;===================================
Print At 1,1,"  IR KUMANDA  "
BASLA:
AL=PulsIn PORTC.0,1
If AL>200 And AL<253 Then   ;preamble sınyalı yakalama

     For I=0 To 12
     PL=PulsIn PORTC.0,1
     SAY[I]=PL  ;GELEN 12 verıden ılkının suresını olctum
     Next
SON=%111111111111     
For I=0 To 12
If SAY[I]<70 Then ClearBit SON,I 
If SAY[I]>126 Then SetBit SON,I
Print At 2,1,Dec SAY[0],Dec SAY[1],Dec SAY[2],Dec SAY[3],Dec SAY[4],Dec SAY[5],Dec SAY[6]
Next
Print At 3,1,"VERI:",BIN SON
DelayMS 5000
Print At 3,1,"                    "
Print At 2,1,"                    "
EndIf

GoTo BASLA

ete

#27
Sırf şu komut satırını fazladan yazmamak için, If SAY[I]>126 Then SetBit SON,I en başta bitleri HIGH yaptık. (SON=%111111111111 bu komut satırı bitleri önceden HIGH yapıyor işte)
O halde o satıra gerek yok.
Döngüyü For I=0 To 12 şeklinde kurarsan 13 tane bit (sıfır dahil) ayarlaman gerekir. Halbuki bit sayımız 12 o halde döngü 0 to 11 şeklinde olmalı.

Bir sürü şey yazmaktansa olması gerekeni yazayım en iyisi;

IR_BIR:      
      PuLSIN IR_Goz,1,PAKET        
      if PAKET<200 OR PAKET>254 then IR_BIR
        
      for I=0 to 11
        pulsin IR_Goz,1,IR_AL(I)
      next
      
      Tus=127
AYIKLA:
      For I=0 to 6
        if IR_AL(I)<80 then Tus.bit0[I]=0
      next

      Tus = Tus + 1
      If Tus=10 then Tus=0

      Cihaz=%00011111
      for I=0 to 4
        IF IR_AL(7+I)<80 then Cihaz.Bit0[I]=0
      next
 
Format PBP formatı sen protona çevirirsin artık.

Ete

Dtmf

Ete hocam sagolun ilginiz icin ama ben bu satiri protona ceviremedim bir turlu o yuzden
 if IR_AL(I)<80 then Tus.bit0[I]=0 

ete

#29
if IR_AL(I)<80 then Tus.bit0[I]=0 
komut satırı Protonda şöyle oluyor sanırım.

IF IR_AL[I]<80 THEN CLEARBIT TUS,I

Ete

Powered by EzPortal