avatar_Mucit23

EV1527 Decode işlemi

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

Mucit23

Kesme ile ilk başta problem oldu. Şimdi kesme olmadan yapacağım. Bana kalırsa tetikleme geldiği anda işlemcinin kesmeye gidip gelmesi bile vakit kaybı oluşturuyor. Gerek yok zaten bu iş için bir MCU ayırdım. Sadece bu iş ile uğraşacak. Main döngüsünde bunu yapacak.

Dediğiniz gibi en büyük hatalardan biride sanırım karşılaştırmayı aynı anda yapmak. Yanlış bir durum. Onun yerine bit uzunluğu kadar 16 bit değişkenler tanımlayıp gelen süreleri sırasıyla diziye kaydedeceğim sonrası analiz işi.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam mesafe arttıkça çalışmama sorunu alıcıdanmış. Alıcı bozukmuş yani. Şuan başka bir alıcı ile denedim. Mesafe bayağı arttı. Birde pilim bitmiş. Artık test yapa yapa pili bitirdim herhalde, Pil voltajım 12V dan 6 küsür voltlara inmiş. Ondan dolayı mesafe sorunum var şuanda. Şuanda yazılımı bitirdim sayılır. Videodakine göre oldukça stabil çalışıyor.
C de aşağıdaki fonksiyonu yazdım.

int1 recieve_rf_packet(void)
{
   int1 exit=0;
   int8 rpp_bits=0;

   while(TRUE)
   {
      while(input(rfin)){} //ilk önce girişin 1 olmasını bekliyoruz, Bir olduğu sürece burada kalacak.
      set_timer1(0); //sinyal 0 olunca timeri sıfırlayıp sıfır olma süresini ölçüyoruz
      while(!input(rfin))  //sinyal sıfır olduğu sürece burada kalacak.
      {
         if(get_timer1()>12500) exit=1;//Eğer timer değeri 12900 den büyükse start yakalandı demektir.
         
         if(exit) break;
      } 
      if(exit) break; //bir sonraki aşamaya geçiyoruz.
   }
   
   exit=0;
   
   output_high(pin_b1);
   rpp_bits=24; //Alinacak bit sayısı 

   while(rpp_bits)
   {
     set_timer1(0);  //Timeri sıfırlıyoruz
     while(!input(rfin))  //sıfırda kalma süresini ölçüyoruz, overflow olduysa sinyal kesildi demektir.
     {
       if(get_timer1()>1400)exit=1;  //sinyal kesildi
     }
     
     set_timer1(0);   //Timeri sıfırla.
     while(input(rfin)){} //birde kalma süresini ölçüyoruz
     
     rf_code[24-rpp_bits]=get_timer1();  // birde kalma süresini kaydediyoruz.
     rpp_bits--; //bir sonraki bit değeri için rpp_bits değerini bir azalt.
     
     if(exit) break;  //Hata oluştu
   }
   output_low(pin_b1);

   
   return exit;
}


Main içerisinde de şöyle bir kod parçası kullanarak analiz yapmam gerekiyor.

       ready_flag=recieve_rf_packet();
       
       if(!ready_flag)
       {
          for(i=0;i<24;i++)
          {
             if(rf_code[i]>1200)
             {
               c[i]=1;
             }
             else
             {
               c[i]=0;
             }
          }
       }


Ufak tefek düzenlemeler yapmam lazım. Tam olarak bitmiş değil.
Birde alıcı ile ilgili sorum olacak.

Ben alıcıları şu oto kumanda alıcılarının içinde söküyorum. Elimde bir sürü hurda oto kapı kilit beyni var. Onların içerisindeki 433mhz alıcıları modül halinde çıkarabiliyorum.
Örnek bir alıcı.

Bu alıcıların üzerinde LM358 var. Kristal felanda yok sanırım bobinli osilatör var. Kumanda sinyali gelmediği zaman dış sinyallerden çok fazla etkileniyorlar. Sürekli DATA çıkışında parazit sinyaller görünüyor. Bunları azaltmanın bir yolu var mıdır? Kristalli alıcılara göre çalışmada çok fark yaratırmı?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Alıcılarda parazit olayı dezavantaj ve kristalli olanlardapek farklı değil. Senin kullandıkların daha iyidir bana kalırsa.
Ete

Mucit23

Hocam selamlar, Yazılımımı bitirdim, Öğrenme işi vs herşey halloldu. Güzel çalışıyor şuan.

Mesafe sorunu sanırım RX modülle ilgiliymiş. Hazır RX11B denen kristalli alıcılardan kullandım. Bunlar diğer oto alıcılarının içinden söktüğüm modüllere göre daha iyi çalışıyorlar. Belkide kullandığım modüller bozuktu emin değilim, Birkaç tane daha sökmem lazım.

Her neyse son bir sorum olacak. Siz yaptığınız sistemde harici 4Mhz kristal kullanma gereği duydunuzmu? Pic16F628 gibi bir MCU'nun dahili RC osilatörü böyle bir proje için yeterli kararlığa sahipmidir?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Çok nadir kristalli osc kullanıyorum. Hep dahili osc ile çalışıyorum. Bir sorun olmuyor.
Ete

ete

Aradan zaman geçmiş ama bu EV 1527 nin Lojik analizör sinyal çıktısı varmı elinizde acaba .
Özellkle preambl sinyal sürelerini görmek istiyorum.
Ete

atoo

HOCAM MERHABA BENDE EV1527 DECODE YAPMAK İÇİN PROJE ÖDEVİ ALDIM YARDIMCI OLABİLİRMİSİNİZ ARDUNİODAN ŞİFRELERİ GÖRDÜM FAKAT HOCAM CCS'DEN YAPMAMIZI İSTİYOR 16F628A RB0 PİNİNDEN RDA KESMESİYLE YAPABİLİCEĞİM KONUSUNDA İPUCU VERDİ HOCAM YARDIMCI OLURSANIZ SEVİNİRİM   

ete

Anlaşılan çok yenisin bu sitede. Ben Basic bilirim CCS den anlamam maalesef.
Anlayanbirisi var ise yardımcı olsun.
Öncelikle yapman gereken bir lojik analizör ile kodu incelemen. Yada İnternetden sinyal şekline gösteren bir şekil görürsen gerisi mantık hesabına dayanıyor kolayca çözülür.
Dediğim gibi ancak kod çözmenin adımlarını söylerim uygularsın.

Ete

İlyas KAYA

#23
Bu kodları arduino içine atın. RF modülünün data çıkışını Arduino pin2 ye bağlayın.

#define SAMPLESIZE 500

static unsigned int timings[SAMPLESIZE];
static unsigned int pos = 0;
static unsigned long lastTime = 0;

static int receiverPin = 2;
static int interruptPin = 0;

void setup() {
  interruptPin = digitalPinToInterrupt(receiverPin);
  Serial.begin(9600); 
  attachInterrupt(interruptPin, handleInterrupt, CHANGE);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop() {
    for (int i = 5; i>0; i--) {
      Serial.print(i);
      Serial.print("... ");
      delay(900);
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
    }
    Serial.println();
      
    detachInterrupt(interruptPin);
  
    int finalstate = digitalRead(receiverPin);
    
    char s = Serial.read();
    
    for (unsigned int i = pos + finalstate; i< SAMPLESIZE; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }
 
    for (unsigned int i = 0; i < pos; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }

    Serial.println("");
    Serial.println("Reset your Arduino to scan again...");

    while(true) {} 
  
}

void handleInterrupt() {
  const long time = micros();
  timings[pos] = time - lastTime;
  lastTime = time;
  if (++pos > SAMPLESIZE-1) {
    pos = 0;
  }
}


- Arduino ide Serial monitörü açın.
- Arduinoya Reset atın ve geri sayımı bekleyin
- Geri Sayım sonunda uzaktan kumanda butonuna basılı tutun.

Serial monitörde bir takım rakamlar göreceksiniz. Bunlarıb hespini seçip sağ CTRL+C kombinasyonu ile kopyalayın.

ŞU LİNKE GİRİN: https://test.sui.li/oszi/

Ekrandaki alana arduino serial monitördeki rakamları yapıştırın ve gönder tuşuna basın.

Aynı adımları 3 kez tekrar edin.

Elinizde 3 tane kare dalga formu oluşmuş olacak. Uzun low sinyalini bulun.
Bu kare dalgaları kaydırıp üst üste denk getirin.

Bunlar RF verilerinizdir. kaç ms high kaç ms low geldiğini rakamları ile görmüş olacaksınız.

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

fatih88

Ilyas abi biliyon bu iş zor bir iş ben 12gun uğraşmıştım eğer ardunio ile olacaksa zaten hazır kütüphanesi var ccs ile yapacaksa timer kullanmayı bilecek skop görüntüsünü yorumlayıp nasıl alması gerektiğinin senaryosunu yapabilmesi gerekiyor bu konuda ete hocamda kod paylaşmıyor ticari uygulamalardan dolayı işin özü ilk uzun sinyali yakalayabilmek sonrası alınıyor bir şekilde
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

İlyas KAYA

#25
Burada arduino scope yerine kullaniyoruz. Malûm herkesde scope yok. Scope da süre ölçme içinde uğraşmıyor direk high ve low puls lerin süresini görebiliyorsunuz. Kaydirma vb isleri de kolaylastirmis oluyoruz.

Tamamen yardımcı bir uygulama.
Yoksa altı üstü pulsin komutu ile bu iş yapılıyor. :))
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

fatih88

anladım abi onu hiç düşünmemiştim  :D
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Daha öncede NEC kod okuma kodlarını paylaşmıştım. Paylaşmıyor diyerek haksızlık ediyorsun.
Çok basit bir iş. Kod okuma kısmını buraya yeniden koyuyorum.

Koymadan önce bir define komutuna dikkat çekmek isterim. Bunu koymadan PULSIN ile kod çözmek zor.  DEFINE PULSIN_MAX 1000 'Maximum counts allowed before pulsin times out

Ardından kod okuma kısmını kesme de yapıyorum. PORTB.0 kesmesini aktive edip Yükselen kenarda kesme yaratıyorum.Bunun sebebi düşen kenara en baştan ulaşmak. AKsi halde ufak sayac farkları kaçırılmış oluyor.

DISABLE     
KESME:  
         PULSIN PORTB.0,0,TAMAM
         IF TAMAM >400 AND TAMAM<500 THEN        
         for I=0 to 31
           pulsin IR_Goz,0,IR_AL(I)   'YALNZCA low BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next 
         ALDIM=1 
         ENDIF 
         
GECGIT: SAY=0      
        INTCON.1=0   
        Resume       
	    Enable       
End	
Kesme den ALDIM=1 ile çıkınca ana program kısmında ALDIM=1 ise programı tuş kodunu ayırmaya yönlendiriyorum. Ama unutmayınki her kesme oluştuğunda program doğru yerden sinyalin içine girmez. Bu nedenle belkide 30-40 pulsin içinden yalnızca birisi Header olacak ve ancak o zaman doğru kod yakalanmış olacaktır. Arada yakalananlar doğru olmayabilir. Ama Aldım=1 ise doğru kod yakalanmış demektir.
Tuş ayıklama şöyle yapılıyor,
TUSBAK:
       TUS=255
       for I=0 to 7
         IF IR_AL(16+I)>70 then 
           TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
         ELSE
           TUS.0[I]=0 
         ENDIF  
       next 
       RETURN
Bu kod dizisi yalnızca basılan tuşun kodunu tespit eder. Chaz kodu bana lazım olmadığı için onu ayıklamadım ama IR_AL 0-16 bitleride cihaz kodunu veriyor. Benzer şekilde ayıklanabilir.
Gerisi artık yapmak istediğinize bağlı olarak değişecek şeyler. İşin kalbi bunlar.

Bir kaç gündür öğrenebilen bir sistem üzerinde çalışıyordum onuda yaptım. Merak uyandırsın diye bildireyim dedim.

Ete

Powered by EzPortal