avatar_ete

RF_KONTROL

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

enginkanat

hocam istediğiniz düzeltmeyi yaptım ve tekrar denedim ama çalışmadı. daha sonra bu sistem iki farklı kaynaktan çalışmak zorunda diye düşündüm sonuçta kablosuz iletişim yapacağız ama beslemeleri aynı yerden alıyoruz. bende beslemeleri ayırdım. şimdi çalışıyor.
daha önceleride çok kez deneyip başaramamıştım demek sorun buymuş.

ete

Mantığa uymuyor bu söylediğin ama çalışıyorsa üzerinde fazla kafa yormamak lazım.

Ete

enginkanat

Hocam,
sistem şu anda gayet güzel çalışıyor alıcı devre üzerinde porta.1 a bağladığım led enerji verlir verilmez enerjileniyor. programda başta porta=0 komutu verdim, low porta.1 komutu verdim ama sürekli enerjide. bunu engelleyemedim,

sormak istediğim asıl soru şimdi burada bir kesme çalışıyor. veri geldiğinde kesme oluşuyor ve işlemleri yapıyor. ben 2 yada 3 7segment ile kullanmak istesem 2. kesmeyi nasıl kullanacağım?






ete

Birinci sorun için BASLA satırından evvel ;
YENI=0:BILGI=0
satırını yerleştir. Mutlaka açılışta değişkenler rastgele değer alıyordur.

İkinci konuya gelince,
Bütün kesmeler daima bayraklarından kontrol edilir.
Programda bir kesme oluştuğu zaman program Kesme etiketine gelecektir.
Orada hangi kesme bayrağı set edilmiş ise ona ait işlem yapılarak kesme işlemleri bir birlerinden ayrılmış olur.
7 segment sürünce TMR0 kullanacaksın demektir. diğeri ise USART kesmesi olacaktır.
Elinde iki kesme var ise her ikisinin bayraklarını ayrı ayrı test etmeye gerek olmaz. Birisi değilse diğeridir mantığını kullanırsın.
Bu durumda TMR0 kesmesi gelmişmi ona bakarsın ve gelmiş ise ona ait işlemleri yapar sonunda bayrağını sıfırlayıp çıkışa (RESUME - ENABLE) gönderirsin. TMR0 değilse mutlaka USART kesmesidir deyip ona ait işlemleri yaparsın ve TEMP=RCREG ile kesme bayrağını sıfırladıktan sonra çıkışa gelirsin.
Hepsi bu kadar.

Ete


enginkanat

hocam sağolun keşke yazmadan önce araştırsaydım. zaten bu konu işlenmiş.
GIE=0
IF TOIF=1 THEN TMR_KESME
HSERIN ......
TEMP=RCREG
US=1
RCIF=0
GOTO KESME_CIK
TMR_KESME:
.........


gibi bir işlem yapmam gerekli.
tamamiyle çalıştırabilirsem paylaşacağım

enginkanat

#20
hocam temeli size ait olan program benim yaptığım eklemeler ile aşağıdaki gibidir.
ben 16f628a kullanarak bu programı çalıştırmak istersem USART aktif olduğu için PORTB.1 ve PORTB.2 pinleri dolu olacak.

PORTB=BIRLER
PORTB=ONLAR

komutlarını kullanamayacağım gibi görülüyor.

Bu atamaları pin pin yapmak nasıl olur?  yada öneriniz işlemciyimi değiştirmek mi olur, ama siz yinede bu atamaları pin pin nasıl yapabiliriz onu öğretin bende işlemciyi değiştireyim.




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 TOIF=INTCON.2
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
SIRA var BYTE 'display gösterim sırası
BIRLER var BYTE 'sayımızın birler hanesi
ONLAR VAR BYTE 'sayımızın onlar hanesi
YUZLER VAR BYTE 'sayımızın yüzler hanesi
BINLER VAR BYTE 'sayımızın binler hanesi
j VAR BYTE 'döngü değişkenimiz
SAYI VAR BYTE 'çevirme değişkeni
X VAR BYTE 'ara değişken
SYMBOL Disp0=PORTA.0 ' birler hanesi ortak uç
SYMBOL Disp1=PORTA.1 ' onlar hensie ortak uç
SYMBOL Disp2=PORTA.2 ' yüzler hanesi ortak uç
SYMBOL Disp3=PORTA.3 ' binler hanesi ortak uç
BILGI var BYTE 56
I     VAR BYTE 57
TEMP  VAR BYTE 58
GELEN VAR BYTE 59
YENI  VAR BIT
SAYAC VAR WORD
ADET VAR BYTE
AYAR VAR BYTE
PORTA=0
PORTB=0
TMR0=99
SAYAC=0
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KES
YENI=0:BILGI=0
BASLA:
                 
   IF YENI=1 THEN GOSUB TUSBAK
   GOSUB DELAY
   PORTB=0
   HIGH PORTB.3
   GOTO BASLA
   
TUSBAK:   
   IF GELEN<10 AND GELEN>40 THEN
   YENI=0
   BILGI=0
   RETURN
   ENDIF
   IF GELEN=10 THEN SAY
   
   IF GELEN=20 THEN SAYAC=SAYAC-1
   
   IF GELEN=30 THEN MENU
   
   IF GELEN=40 THEN SAYAC=SAYAC+1
   
   RETURN
SAY:
ADET=ADET+1
IF ADET=AYAR THEN
    SAYAC=SAYAC+1
    ADET=0
        IF SAYAC=999 THEN SAYAC=0
    X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
    X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
    X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
ENDIF

GOTO BASLA
AL: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
MENU:
RETURN
DELAY:
      FOR I=0 TO 255
      PAUSEUS 1
      NEXT
      RETURN   
           
DISABLE
KES:
    GIE=0
    IF TOIF=1 THEN TMR_KES
    hSerIn 15,ATLA,[WAIT ("ETE"),BILGI]
    TEMP=RCREG
    GELEN=BILGI
    YENI=1
TMR_KES:
SIRA=SIRA+1:IF SIRA>2 then SIRA=0 'hangi hanenin ekrana verileceğini belirliyor

IF SIRA=0 then 'ilk hane yani birler hanesi ise
DISP2=0 'önce bir önceki gösterime ait display kapatılıyor
PORTB=BIRLER 'Haneye ait bilgi porta (segmentlere) veriliyor
DISP0=1 'Display açılıyor.
ENDIF

IF SIRA=1 THEN
DISP0=0
PORTB=ONLAR
DISP1=1
ENDIF

IF SIRA=2 THEN
DISP1=0
PORTB=YUZLER
DISP2=1
ENDIF

TMR0=99 '5 ms lik süreyi yaratacak olan TMR0 değeri registere yükleniyor.
TOIF=0 'TMR0 Kesme bayrağı sıfırlanıyor
GOTO ATLA
END
ATLA:
     
    GIE=1
    Resume
    enable           
             
END
               
                         


ete

8 bitlik bir değişken değerini tek tek pinlere vermek pek akıllıca değil maalesef.
yapılabilecek en iyi şey, BIRLER değişkenini tam ortadan ikiye bölerek ilk yarısını PORTA.0-A.3 pinlerine vermek diğer yarısını ise PORTB.4-B.7 pinlerine vermek.
PortA.0-A3 arasında ortak uçları süren pinler var ama bunlar tek tek tanımlanıp sürülebilir. Bu nedenle onları kalan pinlere ver.
Bu durumda işlemi şöyle yapabilirsin.
ILKYARIM=BIRLER & %00001111
SONYARIM=BIRLER & %1111000
PORTA=(PORTA & %11110000)+ILKYARIM
PORTB=(PORTB & %00001111)+SONYARIM

Umarım anlamışsındır

Ete

enginkanat

anladım hocam teşekkür ederim. bir ara bunu deneyeceğim. 877A ile devam etme kararı aldım.

ete

#23
RF sistemlerinde sıklıkla kullanılan Manchester kodlama sisteminden bahsedeceğim biraz. Bu sistemde tek bitlik değer 2 bitle ifade edilerek değeri "0" olan bit %01 şeklinde değeri "1" olan bit ise %10 şeklinde gösterilerek kodlama yapılır.
Örnek vermek gerekir ise;
elimizdeki 6 bitlik bilgi %00101101 şeklinde olsun. Bunu manchester koduna çevirdiğimiz zaman elde edilen şekil şöyle olur.
%0101100110100110 . Bu bilgi vericiden yollandıktan sonra alıcı tarafından alınır ve yeniden eski heline çevirilmesi gerekir. Bu seferde yaptığımız işlemin tersini yapmalıyız. Yani sağdan sola doğru ikişer ikişer bitler alınarak;
- %01 olan bitleri "0"
- %10 olan bitleri "1" olarak düzenleyerek asıl 8 bitlik bilgiye dönüştürmüş oluruz.
Şimdi bu işi programla nasıl yaparız ona bakalım.

Önce manchester koduna çevirmeyi deneyelim. Bu işlemde kullanacağımız değişkenlerimiz, INDEX (byte) , MANCHESTER (çevrilmiş kod word tipinde) ve Bilgi (çevrilecek 8 bitlik değişkenimiz) olacaktır.
Çevrim açıklamasına geri dönecek olursak  0==>01 şeklini alıyor veya 1==>10 halini alıyor.
Burada dikkat ederseniz bit'in orjinali ilk bit tam tersi halini alıyor ikincisi ise orjinal bitin aynısı oluyor. İşte bu ip ucumuz olacaktır. Bit 0 ise ilk bit 1 ikincisi 0 olacak demektir. Yani 01 yada bit 1 ise ilk bit tersi 0 ve ikincisi 1 olacak demektir.
Bu işi bilgi değişkeninin ilk biti için yapacak olsak;
Manchester.0=~Bilgi.0     '......ilk bit orjinal bitin tersi olacak idi
Manchester.1=Bilgi.0       '......ikinci bit orjinal bitin aynısı olacak idi
şeklinde yapmamız gerekirdi.  Ancak amacımız bir döngü içinde bütün bitleri otomatik şekilde çevirmek olacağına göre bu açıklamaya biriki ilave yaparak işimizi halledeceğiz. Index değişkenine bağlı olarak otomatik işlem için;
Manchester.0[index]=~Bilgi.0[Index]
bu eşitliğin açıklaması şöyle Index=0 iken manchester değişkeninin sıfırıncı biti (Manchester.0[0])  eşittir;
~Bilgi.0[Index] , yani Not Bilgi daha doğrusu ters çevrilmiş olan Bilgi.0[0]  biti anlamına gelir.
Sade bir dille açıklarsak Manchester değişkeninin sıfırncı biti bilgi değişkeninin sıfırıncı bitinin tersine eşittir demek olur.
İlk biti hallettik. Manchester ikinci bitini ayarlamak için;
Manchester.0[Index+1]=Bilgi.0[Index] şeklinde olacaktır. Yani manch. ikinci biti ,orjinal bitin aynısı olmuş oldu.
Index değişkeni döngü içinde bir artırılınca bu yazdıklarım işi otomatik yapamayacak durumdadır.
Zira,
Manchester.0[1]=~Bilgi.0[1] olurki bu bizim bir evvelki işlemde ayarladığımız Manc. 1. bitini bozar. Dikkat ederseniz İndex değişkeni 8 bitlik bilginin bitlerini ayarlıyor. Manchester değişkeninin bitleri 2 şer artmalıdır. Yani sıra Manch.0[2] ye gelmiştir. O halde ufak bir değişiklik yapmamız lazım formülde;
Manchester.0[Index*2]=~Bilgi.0[Index] şeklinde yazarsak Manchester tarafı bitleri 2 şer artarak gidecektir.
Benzer şekilde ikinci bit eşitliğinide Manchester.0[(2*Index)+1]=Bilgi.0[Index] şeklinde yazarsak her şey yerli yerine oturacaktır. Bu açıklamaya bvağlı olarak çevirim programımızı yazabiliriz artık.

Bilgi=%00101101 olsun yine.
8 adımlık bir INDEX döngüsü kuruyoruz,
For INDEX=0 to 7
  Manchester.0[2*index]=~Bilgi.0[index]
  Manchester.0[(2*Index)+1]=Bilgi.0[Index]
Next
Bu 4 satırlık program Bilgi değişkeni içindeki değeri manchester koduna çevirerek 16 bit haline getirir.

Şimdi bu işin tersini yapacak programı yazalım.
%01 şeklindeki bitler 0 haline, %10 şeklindeki bitler ise 1 haline dönüştürülecek.
Yine bir index döngüsü kuralım.
For INDEX=0 to 7
  Bilgi.0[Index]=~Manchester.0[Index<<1]
Next
Burada hemen (Index<<1 ) komut satırının ne iş yaptığını açıklayayım.
Index=0 iken Index<<1=0 olur
Index=1 iken Index<<1=2 olur
Index=2 iken Index<<1=4 olur
Tek tek yazmaktansa Index değişkeninin alacağı değerleri yazalım en iyisi (0,2,4,6,8,10,12,14)
Bu işi başka bir şekilde daha yapabiliriz. Şöyle;
x=0
For Index=0 to 15 step 2
   Bilgi.0[X]=~Manchester.0[Index]
X=X+1
Next

Buraya kadar hem 8 bitlik bilgiyi Manchester koduna çevirmiş hemde manchester koduna çevrilmiş bir bilgiden tekrar 8 bitlik bilgiyi elde etmiş olduk.

İlişikteki RF kontrol sisteminde Manchester kodlaması kullanılmıştır.

Ete

enginkanat

sizin öğretmenliğiniz, meslek lisesi ve üniversite hocalarına ders olur inşallah. bir forum sitesinden tüm ülkeye hitap eden ve öğrencileri yaptıkları işlerde başarılı olan kaç hoca vardır dünyada. sadece sayın ETE için yazmadım bunu bu forumdaki diğer değerli öğretmenler içinde yazdım.
soru ne kadar saçma olursa olsun yine de cevap yazan siz değerli hocalarıma teşekkürler.

santo@hope

#25
PIC 16F628A&8 KANAL RF KONTROL

Hocam güzel bi çalışma olmuş deneme amacı ile sadece 2 kanalı kullandım dahili osilatör bazen saçmalıyor bunun içinde 4mhz rezonatör sorunu çözdü...

anlhlc

#26
Merhaba arkadaslar konudaki devreyi farklı bir amaç için yapacagım. Verici proteus baskısını hazırladım ihtiyacı olan arkadaslar alabilirler. Ayrıca bir yanlıslık var mı diye kontrol edebilir misiniz sayın hocam ve saygıdeger arkadaslar. Alıcıyı da cizip göndericem. İyi çalışmalar...

anlhlc

Alıcı ve Vericiyi çizdim ekte bulabilirsiniz arkadaşlar. Kolay gelsin...

anlhlc

Herkese merhaba hocam ben bu devreyi yaptım çalışıyor fakat mesafe 10 mt yi geçmiyor. Antene bataryanın - kutbunu bağlayanlar var bu mesafeyi arttırabilmem için neler yapmalıyım kullandığım alıcı http://www.ersinelektronik.com/RXA1-43392-B-Hybrid-ReceiverKondansatorlu,PR-6894.html verici http://www.ersinelektronik.com/TXC1-43392-Mhz-Hybrid-Transmitter,PR-6895.html

ete

Sorun modüllerde olsa gerek. Başka bir modül ile denemeye çalış. 10m mesafe çok az en az 30-50 m arasında olmalı.

Ete

Powered by EzPortal