avatar_POWER

ır kumanda

Başlatan POWER, 13 Aralık 2021, 21:55:36

ete

#60
O satırlardaki amacımız yaklaşık 12ms civarında olan uzun HIGH peryodunu yani sinyal başını yakalamak idi. Bütün kısa pulsleri atla ve en uzununu yakala gibi bir açıklaması olabilir.
Sen 180 den küçük demişsen bu 1800 us den yani 1,8ms den küçük ise bunları atla demişsin.
Şöyle bir düşünür isek,
- en kısa pulslerin pulsin değeri yaklaşık 50-60 aralığında değişiyor bunları atlıyor
- orta uzunluktaki pulsler ki bunlarda 1200 us-1500us ler aralığında yada pulsin değeri olarak 120-150 civarında seyrediyor bunlarıda atlıyor.

Geriye bir tek en uzun puls kalıyor ve onu yakalıyor olsa gerek.
Bana göre sinyal 1000 den küçükse goto TEKRAR demekle sinyal 180 den küçükse goto TEKRAR demek arasında fiziksel bir fark yok ama biri çalışıyor biri çalışmıyor. Buda bize bir şeyi gösteriyorki oda gelen sinyaller arada birde olsa şaşıyor olsa gerek. Ama 180 kullanınca hep uzunu yakalıyor demekki. 180 yerine 200 de yazsan çalışacaktır bence. hatta 300-350 gibi değerlerde çalışacaktır. Hatta 180-900 aralığının hepsinde çalışacaktır öyle gözüküyor. Bunların hepside en uzunu yakalamaya yönelik değerler. Görünen o ki uzun puls aradabir 1000 değerinin altında ve 900-1000 aralığıda olabiliyor ve buda bizim sistemi şaşırtıyor. Sinyal şakası gibi. Bu kumandanın düşük kaliteli olmasını gösteriyor aslında zira sinyal süreleri değişik olmamalı.

Enteresan sonuç . Bu sonuçtan çıkartacağımız hisse şu sinyalleri incele ve en uzunu yakalamak için ara sinyallerden biraz büyük bir değer ver. Bizde ara sinyaller 120-150 aralığında 180 den itibarende uzunu yakalamış oluyoruz. Olay budur.

Ete

POWER

#61
iyi geceler hocam,
geçen zaman içinde denemeler yaptım olumsuzluk olmadı.Kumandanın kalitesizliğine katılıyorum hocam. zira 3 ayrı tuştan çıkan sinyaller aynı.atladığım bir yer varmı diye sinyalleri uzun uzun inceledim ciddi bir fark bulamadım.dolayısıyla bu 3 tuşun işlevleri birbirine karışıyor.hocam dediğiniz gibi 200-300-350 hatta 900,1000 de dahi çalışıyor.1000 den sonra kararsız çalışmaya başlıyor.
Bu sonuçtan çıkartacağımız hisse şu sinyalleri incele ve en uzunu yakalamak için ara sinyallerden biraz büyük bir değer ver.
burasını anlayamadım hocam.

ete

Anlatayım.
Ara sinyaller bitleri oluşturan sinyaller. Malum iki kısa yan yana gelince "0", bir kısa bir uzun olunca da "1" oluyor. İşte burada bir kısa bir uzun olan sinyalin uzun olanlarını teker teker ölçmen ve ölçtüğün sürelerden biraz uzun bir değer vermen lazım.
Diyelimki 1100 us (110 ölçersin) 1200us (120 ölçersin) 1300 us (130 ölçersin) sonuçlarını aldın. Bu durumda 130 biraz geçen değer olarak mesela 140 vermen gerekir. Böylece sinyal başını kolaylıkla yakalamış olacaksın. Aslında sonuç pek de değişmiyor boşuna uğraşma bu hali ile bırak daha iyi bir sonuç yakalayacağını sanmıyorum.
Ete

POWER

Yoğunluktan deneme imkanım olmamıştı.Bu gün söylediğiniz değerleri vererek denedim.Yine söylediğiniz gibi değişen pek bir şey olmadı.Fakat bu haliyle sıkıntısız çalışıyor.Bir olan sinyalin uzun değerleri 1,212-0,894-1,209-1,536-1,211 ms şeklinde.Ayrıca
.....Then LED=1-LED
şeklinde kullanımıda ilk defa gördüm hocam.

ete

Benim icadımdır o. Bir ara toggle komutu çalışmamıştı. Sebebini bilemiyorum. Bende ne yapabilirim dedim bunu buldum. Başka kullanan görmedim bu güne kadar ama mutlaka akıl eden başkalarıda vardır.  Bit değişkenlerini Toggle çalıştırmanın bir başka yolu işte.
Bir başkasıda var. "Led=!Led" de aynı işi yapıyor. !işareti not (Değil) yerine geçiyor.Değişkeni tersine eşitlemiş oluyorsun tersi mevcutken yine tersine eşitlersen düzünü yakalamış olursun. Kısaca 1 sıfır olur Sıfır ise 1 olur.

Ete

POWER

#65
bu mesaj silinebilir.


POWER

#66
define OSC 4
Include "MODEDEFS.BAS"
@ DEVICE pic16F628A
@ DEVICE PIC16F628A, WDT_Off
@ DEVICE PIC16F628A, LVP_Off
@ DEVICE PIC16F628A, PWRT_ON            
@ DEVICE PIC16F628A, MCLR_Off
@ DEVICE PIC16F628A, PROTECT_off        
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

DEFINE PULSIN_MAX 1500

TRISA=%00000000
TRISB=%00000001        
PORTA=0
PORTB=0

OPTION_REG=%10000000  
CMCON = 7
SYMBOL IR_Goz=PORTB.0
SYMBOL LED=PORTA.1

TAMAM  VAR WORD 58
Tus    Var Byte 60
IR_AL  var BYTE(32)62
X      var Byte 100
SAY    VAR WORD 102
ALDIM  VAR BIT

INTCON=%10010000          'Kesmeler aktif ve RB0/INT kesmesi aktif
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

BASLA:
      SAY=0
    while ALDIM=0
      SAY=SAY+1
    WEND
      ALDIM=0
      TUS=0
  for X=0 to 7
      IF IR_AL(16+X)>70 then TUS.0[X]=1 
  next 

IF Tus=2 THEN          
  TOGGLE LED
ENDIF
                GOTO BASLA          
DISABLE 
KESME:  
        PULSIN IR_Goz,1,TAMAM  
        IF TAMAM >400 AND TAMAM<500 THEN        
        for X=0 to 31      ' 31
          pulsin IR_Goz,1,IR_AL(X) 
        next 
        ALDIM=1 
        ENDIF 
GECGIT:
      SAY=0      
      INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
      Resume      'geldiğin yere dön.
  Enable          'kesmeler yeniden aktif.
End
Hekese iyi akşamlar,
Vermiş olduğum kodu,önceden bir kaç tane Nec protokolüne göre çalışan kumandada sorunsuz kullandım.Gördüğüm kadarıyla protokol aynı olsada, kumandadan kumandaya farklılıklar oluyor.Şu an elimdeki kumandada nec protokolüne göre çalışıyor.Fakat tuşa basılı tuttuğum sürece aynı kodu sürekli gönderiyor.Yukarıdaki proğramda,tuşa basılı tutunca led yanıp sönüyor(flaş yapıyor.)Ben on-off şeklinde çalışmasını istiyorum.Yani tuşa bastığım zaman led yansın,basmaya devam etsem dahi led yanık kalsın.tuşu bırakıp tekrar bastığım zamanda,basılı tutsam dahi sönsün şeklinde.Kullandığım kumandanın bir tuşuna ait sinyal süreleride şu şekilde.
1-4,48ms low
2-4,52ms hıgh
3..............
4-.............
5-.............
Low sinyaller 0,57ms
Hıgh sinyaller 1,71ms
İki sinyal arasında 44,38ms lik hıgh sinyali mevcut.Sinyal toplam 32 bit.



ete

#67
Programın formatı bu işe pek uygun değil. Yinede bir iki deneme yapılabilir.
Bu isteğini yerine getirebilmek için, tuş ayıklama işini bir alt programa vermek gerekir.
Daha sonra TUS=2 yakalandıktan sonra belirli bir süre aynı tuş geliyormu bakmak lazım. Geldiği müddetçe orada oyalanmak ve tuş değiştiği zaman veya vakit dolduğu zaman oradan ayrılmak gerekir.

Burada tek sorun tuşu bıraktığın zaman kumanda tuş bırakıldı bilgisi yollamıyor olsa gerek. Bu durumda farklı bir tuşa basmazsan program o döngüden ayrılmaz. Bu nedenle birde süre tutmak gerekir. Örnek veriyorum 1000 ms içinde hiç tuş kodu gelmemiş ise demekki tuş bırakıldı diye düşünebiliriz.
Bu düşünceye uygun bir kodun sadece senin programda değişmesi gereken yerler olarak aşağıda veriyorum. Kopyala ve yapıştır. Umarım çalışır.

Ete

BASLA:
          SAY=0
        while ALDIM=0
          SAY=SAY+1
        WEND
     GOSUB AYIKLA 
     
    IF Tus=2 THEN          
      TOGGLE LED
      
TEKRAR:
      say=0:TUS=0
      WHILE SAY<1000
       IF ALDIM=1 THEN GOSUB AYIKLA
       IF TUS=2 THEN TEKRAR 
       SAY=SAY+1:PAUSE 1
      WEND 
    ENDIF
    GOTO BASLA          
    
AYIKLA:
       ALDIM=0
       TUS=0
       for X=0 to 7
          IF IR_AL(16+X)>70 then TUS.0[X]=1 
       next 
       RETURN

POWER

Alıntı yapılan: ete - 29 Haziran 2022, 22:58:35Burada tek sorun tuşu bıraktığın zaman kumanda tuş bırakıldı bilgisi yollamıyor olsa gerek.
Evet hocam böyle bir bilgi yollanmıyor.Verdiğiniz kod sorunsuz çalışıyor hocam.Tuş bırakıldıktan sonra başka tuşa basmak için biraz beklemek gerekiyordu.Bende tuş bırakıldı bilgisi  için tutulan süreyi 700 yaptım ve pause 1 kaldırdım.Çok teşekkür eder kolaylıklar dilerim hocam.

Powered by EzPortal