avatar_ete

RF_KONTROL

Başlatan ete, 12 Aralık 2012, 13:49:42

Acuf

Hocam yanlış anlaşıldı galiba 100 adet alıcı yok sadece bir tane alıcı var. Yani 100 verici, 1 tane alıcı olan bir sistem. Örneğin 14 nolu verici devrede butona basıldığında alıcı taraf 14 nolu butona basıldığını algılayacak. 66 nolu verici devrede butona basıldığında aynı alıcı bu sefer 66 nolu butona basıldığını algılayacak. Neticede PT2262 ile biz adres ve data bacaklarıyla 12 Bitlik bir veri gönderiyoruz. Her bir verici devredeki PT2262 entegresiyle o vericiye özel 12 bitlik veri tanımlarız(Adres ve data pinlerini farklı farklı bağlayarak). Bu şekilde sinyal gönderilince alıcı rf modülünün data çıkışını PT2272 DIN pinine bağlamak yerine gelen bu 12bitlik bilgiyi bir şekilde çözersek zaten kimden geldiğini anlarız şeklinde mantık yürütüyorum. Gelen bu 12 bitlik veriyi çözmenin bir yolu var mı yoksa PT2262 ye gerek yok rf seri haberleşme kullanman daha mantıklı mı dersiniz?

ete

100 tane verici aynı ortamda zaten çalışmaz. Bir birlerini bozarlar. Modulasyon bozulması olur ve hiç birisi çalışmaz.
Tabiiki 100 vericiden yalnızca birisi çalışacak ise soeun olmaz. Ama aynı anda iki veya daha fazla verici aktif olursa sistem çöker.
100 alıcı yada 100 verici farketmez. Sistem mantığı aynıdır.

Ete

Acuf

Hocam mesela şöyle bir ürün yapmışlar ve bunu rf haberleşme ile yapmışlar.

http://www.syscall.com.tr/urun-7-ST_800_3B_Kablosuz_Cagri_Butonu.html

Garson çağırma butonu. Örn 100 masalı bir kafe düşünelim ve her bir masaya da bu butondan yerleştirelim. 1 tane Garsonda da çağrı alıcı kol saati olsun o da aşağıdaki linkte.

http://www.syscall.com.tr/kategori-2-Kablosuz_Cagri_Alicilari.html

Adamların yaptığı bu sistem şöyle çalışıyor: Butonlara önce numara tayin ediliyor. Alıcı kol saatinde no1 seçiliyor ve butonlardan birine basılınca o butonu no1'e atıyor, artık o butona basıldığında 1 nolu butona basıldı şeklinde alıcı saat uyarı veriyor. Diğer bütün butonlar da bu şekilde tanımanıyor ve çalışıyor.

Bu sistem şu anda stabil çalışıyor. Büyük ihtimal butonlara aynı anda basılma olasılığı  algılama milisaniye mertebesinde olduğundan çok düşüktür. En kötü ihtimal müşteri 2. kez basmak zorunda kalır ilkinde diğeriyle birbirlerini bozdukları için. Ben bu sistemi yapacağım araştırma yapıyorum. Vericilere nasıl kimlik atarım? Bu konuda en mantıklı ana yol haritası belirtmeniz benim için yeterli geri kalanını araştırarak öğrenirim. Teşekkür ederim.

ete

2,4Ghz bandında çalışan NRF serisi RF sistemleri Pipe denilen bir mantıkla çalışır ve bunlar aynı anda birlikte çalışabiliyorlar. İşin temelinde veri,ci frekansında ufak da olsa farklılık yaratmak yatıyor. Bu sistemleri yapabilmek için çok pahalı ekipmanlarınız olması gerek. Amatör ruhla yapılabilecek işler değil çünki ekipman gerekir.

Vericilere iki türlü ID verilir. Birisi program ile. Her vericiye bir numara verirsin ve böylece her vericinin programı ID açısından farklı olur. Yada verici sisteminde bir dipswitch kullanırsın. Dip sw ile numarayı ayarlarsın program ilk çalıştığında bu numarayı okur ve çalıştığı sürece o nuarayı bilir.
Ete

designer.21




Ete Hocam merhabalar, pratik yapmak için bu devrede biraz değişiklik yapıp veya .INC dsoyasındaki sigorta ayarlarının önüne noktalı virgül koyup Compile yaptığımda şöyle bir uyarı çıkıyor. Bunun sebebi ve çözümü nedir acaba.

ete

Dosya adı yada dosyayı kaydettiğin yol (path) 67 karekterden fazla ise (dosya adı dahil) bu hata meydana gelir.
Ya başka bir klasöre kaydet oradada derle yada yol ve dosya adını kısaltarak 67 karekterin altına inmeye çalış.

Ete

designer.21

Ete hocam çok teşekkür ederim sorun çözüldü sonunda.

Fakat sigorta ayarlarıyla ilgili anlamadığım bir konu var,

@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

örneğin kodların başına bu yukarıdaki ayarlar yapılınca .INC dosyasındaki ayarları iptal mi etmemiz gerekiyor.
.INC dosyasındaki ayarların başına ";" olsa da olmasa da, kodların başına bu yukarıdaki ayarları yazınca compile yaptığımda ekteki resimde görüldüğü üzere bazı hatalar veriyor, fakat bu kodları sildiğimde ise herhangi bir hata vermeden derleniyor.


ete

#82
Derleme esnasında tek bir yerdeki sigorta ayarları işleme sokulmalıdır.
INC dosyasında bu ayarlar var ve sende programa koyunca iki defa işlemek zorunda kalıyor derleyici ve hata veriyor. Buraya kadar olanı neden tek yerde sigorta ayarı vermek zorunda kaldığımızın izahıdır.
Diğer konu ise ve asıl seni ilgilendiren tarafı sigorta ayarlarının veriliş formatıdır.
32 bit derlemede PBP kendi assembler programı ile derleme yapıyor ve sigorta formatı senin programın başında verdiğin şekildedir. Anlayacağın o tip sigorta ayarı verme PBP kendi assembleri ile derlerken gerekli.

Ama iş 64 bit makinada derlemeye gelince mutlaka MPASM ve onun assemblerini kullanmak gerekiyor.
MPASM deki sigorta formatı ise farklı. Mesela senin işlemciye ait format aşağıdaki şekilde, Zaten o INC dosyasındaki kapattığın sigorta ayarlarına bakarsan formatı orada da görebilirsin.
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

Hemen farkedeceğin üzere birisi " @ Device" şeklinde başlıyor diğeri "@ _Config" şeklinde başlıyor. Sende meydana gelen hata format hatası. Yani 64 bit derlemede verilmesi gereken format yerine 32 bit makinaya ait formatı veriyorsun derleyicide haklı olarak hata veriyor.

Aşağıdaki linklerde verilen bilgileride okumanda yarar var.

https://etepic.com/index.php/topic,1687.0.html 
https://etepic.com/index.php/topic,300.0.html

Ete

designer.21

Ete Hocam cevaplarınız için çok çok teşekkür ederim. verdiğiniz tüm bilgiler benim için altın değerinde. üniversitedeki hocalar dahil kimseden destek ve yardım alamadığım için  hep yarım yamalak bırakmak zorunda kaldığım pic'i tekrar sevdirdiniz ve Allah nasip ederse bu işi devam ettirecem inşallah.

tekrar belirtmek isterim ki buradan isteyeceğim yardımlar, araştırıp deneme yanılmalar yaptıktan sonraki istekler olacaktır.

başta Sayın Ete Hocam ve diğer hocalarıma tekrar tekrar tesekkurlerimi sunuyorum.

designer.21

Hocam bu devreyi ve başka rf devrelerini hazırlıyorum proteusta ve devre üzerinde kablolu deneyince sorunsuz çalışıyor.  fakat alıcı verici ile denediğimde kararsız ve dengesiz bir çalışma sistemi olduğu gibi mesafeside 3 - 5 metreye kadar oluyor.

ayrıca kullandığım alıcı ve verici modülünü 16f84A pic'i bulunan başka bir rf devresinde kullanıyorum mesafesi 100 metreye kadar çıkan bir çalışma sistemi oluyor. hemen her yolu denedim, iki üç tane farklı alıcı verici modülü kullandım, 16f84A'da sorunsuz çalışıyor ama bu 628A'larda bir dengesizlik oluyor.

dahili osilatörden olabilir diye _XT_OSC ile 6Mhz ve _HS_OSC ile 8 Mhz lik kristalleri denedim yine olmadı.

dahili osilatör olarak kullandığım sigorta ayarları aşağıdaki gibidir.

@ __config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT


buraya örnek olarak ALICI VERICI kodlarını yazayım dedim ama başta bu konu başlığındaki kodlar olmak üzere bulduğum ve yaptığım kodlarda aynı sorun çıktığı için gerek yoktur diye düşündüm.

neden dengesiz ve kararsız bir çalışma sistemi oluyor ve mesafesi 3-5 metre ile sınırlı kalıyor acaba bunlarla ilgili fikir ve yardımlarınıza ihtiyacım var. şimdiden çok teşekkürler

designer.21

Bu arada ete hocamın konu başlığında yazdığı ve benim dahili osilatör ile yukarıda belirttiğim sorunları yaşadığım kodlar.

VERICI
@ __config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

CMCON=7

DEFINE OSC 4
TRISA=%00000000
TRISB=%11111111 
OPTION_REG.7=0 
BILGI VAR BYTE


symbol LED=PORTA.1
SYMBOL VERIOUT=PORTA.0 

MAIN:      
            BILGI=~PORTB
           
            IF BILGI>0 THEN 
              GOSUB VER
              while portb<255:wend
              BILGI=0:GOSUB VER
            ENDIF
            
            pause 10
            low porta.1
            GOTO MAIN            
       

VER:
      HIGH portA.1 
      serout2 VERIOUT,396,[REP$AA\5,REP$00\5,REP$FF\5] 
      serout2 VERIOUT,396,["E","T","E",BILGI]
'      serout2 VERIOUT,396,["E","T","E",BILGI]
'      serout2 VERIOUT,396,["E","T","E",BILGI]
'      serout2 VERIOUT,396,["E","T","E",BILGI]
      RETURN
     
END
          



ALICI
@ __config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

CMCON=7
DEFINE OSC 4
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00000010 
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
'SYMBOL VERIIN=PORTA.0

BILGI var BYTE 56
I     VAR BYTE 57
TEMP  VAR BYTE 58
GELEN VAR BYTE 59
YENI  VAR BIT

PORTB=0

RCIE=1
PEIE=1
GIE=1 
ON INTERRUPT GOTO KES
 
BASLA:
                 
   IF YENI=1 THEN GOSUB TUSBAK
'   IF BILGI=16 THEN
'     PORTB=128
'   ENDIF  
   GOSUB DELAY
   PORTB=0
   GOTO BASLA
   
TUSBAK:   
   SELECT CASE BILGI
   CASE 0
   YENI=0:BILGI=0
   return
   CASE 1
   PORTA=(PORTA & %11111111) ^ %00000001
   YENI=0
   CASE 2
   PORTA=(PORTA & %11111111) ^ %00000010  
   YENI=0
   CASE 4
   PORTA=(PORTA & %11111111) ^ %00000100 
   YENI=0
   CASE 8
   PORTA=(PORTA & %11111111) ^ %00001000 
   YENI=0
   CASE 16
   HIGH PORTB.3
   CASE 32
   HIGH PORTB.4
   CASE 64
   HIGH PORTB.5
   CASE 128
   HIGH PORTB.6
   END SELECT
   RETURN

DELAY:
      FOR I=0 TO 255
      PAUSEUS 1
      NEXT
      RETURN   
            
DISABLE
KES:
'    GIE=0
    hSerIn 15,ATLA,[WAIT ("ETE"),BILGI]
    GELEN=BILGI 
    YENI=1
ATLA:
    TEMP=RCREG 
'    GIE=1
    Resume
    enable           
             
END

designer.21

şimdi ben foruma tekrar bakındım biraz görmediğim baya bi konu varmış. buradan edindiğim bilgiler doğrultusunda zaten 6 Mhz lik kristal zaten kullanılmıyormuş bu pic'e : ) Ete hocamın kod satırlarındaki DEFINE 4 OSC kodundan dolayı harici 4 Mhz lik bir kristal kullandım ve sorunum biraz düzelmiş gibi oldu. eskisi gibi alıcı ledler kendi kendine yanıp sönmüyor ve 10 metreye kadar mesafe arttı. daha fazla mesafede biraz zorlanıyor. tüm bunlardan dolayı takdir sizin tabi ama benim tahminim, sorunum büyük ihtimalle kristal ile ilgili olduğunu düşünüyorum.

bu olanlardan sonra bir de 8 Mhz lik kristal kullanayım dedim ve _HS_OSC ile DEFINE OSC 8 yaptım : ) hiç olmadı :(

sayfayı baya bi meşgul ettiğim için de kusura bakmayın. bu sorun dert oldu çözmek istiyorum. yardımlarınız için şimdiden teşekkürler

ete

Verdiğin kodlara bir baktım da;
Verici de şöyle bir satır var
IF BILGI>0 THEN 
         GOSUB VER
         while portb<255:wend
         BILGI=0:GOSUB VER
      ENDIF
Bilgi=~PORTB olduğuna göre PortB yi pullup ile kullanıyorsun. Tuşa basılmadığı yada giriş olmadığı zaman Bilgi=0 oluyor demektir. Bu tamam sorun yok. Bir giriş oldu ve Blgi>0 oldu. If satırların çalışmaya başlayacak. Önce GOSUB VER ile BİLGİ karşıya aktarılacak. Burasıda tamam. İşte bu noktada artık portB nin yani Bilgi nin tekrar sıfır olmasını beklemen gerekiyor. Ama sen tersini yapıp Bilgi sıfır olmadan oradan ayrılıyorsun. TUşa basılmaya devam ediliyor Bilgi<255 (hepsine birden basılmıyor ise) program hemen While PORTB<255:Wend satırını atlayıp geçecektir. Buda karşıya sürekli olarak veri yollanması anlamına gelir. Sistem veri yollamaktan alıcıya veri değerlendirmesi yapma imkanı tanımaz bu şekilde.
Doğrusu şöyle olmalı.
BILGI=~PORTB
           
      IF BILGI>0 THEN 
        GOSUB VER
        while portb>0:wend
        BILGI=0:GOSUB VER
      ENDIF
Böylece port sıfır oluncaya kadar bekler program orada ve sıfır olunca sıfır bilgisini yollar ve tekrar MAIN kısmına gidip yeni tuş basılmasını bekler.
Verici kısmında veri aktarımı için SEROUT2 komutunu kullanmışsın. Alıcıda ise HSERIN komutunu. Bu iki komutun tam uyumlu olup olmadığını hatırlayamadım. Uyumlu ise sorun yok ama prensip olarak bir tarafta USART komutları kullandı isen diğer tarafta da USART kullanmalısın. 16F84 de USART olmadığı için belki bu yola girdin ama işlemci değiştirmek zor değilki!!!.

Alıcıya gelince;
DISABLE
KES:
'    GIE=0
    hSerIn 15,ATLA,[WAIT ("ETE"),BILGI]
    GELEN=BILGI 
    YENI=1
Bu tür işlerde çok fazla parazitik sinyal olur. USART kesmesi her paraziti veri geldi zannedip kesmeye gider. Senin programda doğru veri geldiği zaman YENI=1 olmalı parazit geldiği zaman YENI=0 ile dönmeli. Bunun tedbirini almamışsın. Bu nedenle programın sürekli meşgul ediliyor.
Orada GIE=0 yerine YENI=0 yazsan daha uygun olurdu. Yada onun yanına YENI=0 da eklemen gerekir. Böylece veri gelirse program bir alt satıra geçip YENI=1 komutunu görür. Gelmez ise yani parazit ise ATLA etiketine gider direk ve YENI=0 ile dönmüş olur.
Sonuçta kristallere ve işlemcilere kabahat bulma. Programlarını tutarlı akışkan çalışacak şekle getir ondan sonra şikayet et.
Unutma eski işlemcilerde işlemci adının sonunda /04 veya /20 gibi ifadeler vardır. Bu onun en fazla 4 mhz yada 20mhz kristal ile çalışabileceğini gösterir. Yeni nesil işlemcilerde bu ortadan kalktı hepside her türlü (max. 20Mhz olmak üzere ve PLL si olanların daha yüksek) frekanslarda çalışabiliyor.

Ete

designer.21

cevabınız için çok teşekkürler Ete Hocam; dediklerinizi düzeltip tekrar deneyeğim.

sizden rica etsem kod satırlarınızda bulunan aşağıdaki satırı açıklayabilir misiniz acaba

CASE 1
  PORTA=(PORTA & %11111111) ^ %00000001
  YENI=0

öğrenmek istediğim aşağıdaki satırın ne ifade ettiği
bu satırın nasıl bir kullanımı olduğunu merak ediyorum

PORTA=(PORTA & %11111111) ^ %00000001

ete

PORTA=(PORTA & %11111111) ^ %00000001
Bu komut önce (PORTA & %11111111) komutu ile PORTA nın değerini okur yada alır. SOnra yalnızca Bit.0'ı diğer bitlere dokunmadan Toggle yapar Burada '^' işareti XOR işaretidir. Kısaca Port okunup ilk bit (Bit.0) 1 ise o biti sıfır yapar, bit 0 ise o biti 1 yapar. Burada amaç portun diğer bitlerine dokunmadan sadece ilk bitin toggle yapılmasıdır.

Ete

Powered by EzPortal