16F84A 4 kanallı RF projesi - ÇALIŞIYOR -

Başlatan xcyqp09k2, 29 Nisan 2014, 23:11:58

xcyqp09k2

Öncelikle devre denemiştir çalışıyor. bunu belirteyim dedim. aşağıda youtube video linki mevcut.

Merhabalar arkadaşlar. 433 mhz hazır RF alıcı verici modül kullanarak  16F84A ile yapılmış 4 kanallı bir projem vardı. bitirdim. paylaşmak istiyorum. dileyenler pic donanımına göre daha fazla kanal ekleyebilir. kodları kopyalayıp yeni değişkenler atamanız yeterlidir.

özellikle benim yaptıktan sonra ve yaparken hoşuma giden bir mevzu, alıcının sinyal alıp almadığını bir led aracılığıyla belirtmesi, bu işlemi alıcı port.pinini =1 olursa başka bir portu high yap diyerek gerçekleştirdim. basit. fakat asıl çalışması gereken ledleriniz çalışmadığında acaba sinyal geliyor mu alıyor mu vs gibi sorularınızı gidermesi açısından hoş.

bunun yanında daha önemli bir mevzuu, port.pinlerine değişken atadım. bunun daha kısa yolu direk komple bütün portu örn.PORTB yi herhangi bir değişkene atamaktı ama deli dürttü ve böyle yaptım. kodların esprisi şu. x y z ve t gibi byte cinsinden değişkenleri port.pinlerine tanımladım. bu protonda şöyle

dim x as portb.0
dim y as portb.1
dim z as portb.2
dim t as portb.3

evimizin salonu ile kendi mahremim arasında baya kalın duvarlar uzun vadiler girinti çıkıntılar var. aradaki mesafe 15 mt civarı. dışarıda deneme fırsatım olmadı. ama bu şartlarda gayet iyi çalışıyor.

çalışmanın C, HEX, BAS, resim ve ısıs dosyalarını aşağıdaki yandex diskime yükledim. inşallah silmem uzun süre  ;D

http://yadi.sk/d/aNV9HMHlNggmw


alıcı:
Device = 16F84A                 ' çalışacağımız cihazı belirledik
Xtal 4                          ' 4 MHZ hızlı osilatörümüzü belirttik
Include "modedefs.bas"          ' RF komutları olan serin ve serout komutlarının çalışmas için gerekli kütüphaneyi ekledik
All_Digital True                ' çıkış girişlerin dijital olacağıını belirttik 1=(5V) 0=(0v)
TRISA=%11111                    ' tris komutuyla hangi portların giriş çıkış olacağını belirrtik. 1 giriş, 0 çıkış için 
TRISB=%00000000                 ' 16f84a da 5 adet a portu var bu yüzden % den sonra 5 adet birim girdim. b portu ise 8 adettir bu picte.

Low PORTA                       ' başlangıçta a portunu temizledim
Low PORTB                       ' b portunu da başlangıçta temizledik

Dim x As PORTB.0                ' genelde '' dim a as byte veya dim degisken as word gibi atamalar yapılır fakat ben burada 
Dim y As PORTB.1                ' Dim yani Tanımlama komutunu kullanarak portların her bir pinine değişken atadım
Dim z As PORTB.2                ' böylece sadece bu değişkenleri göndererek, karşı tarafta 2 veya daha fazla ledi aynı anda yakabiliyoruz
Dim t As PORTB.3                ' daha önce böyle bir çalışma görmemiştim. dileyenler bu şekilde de yapabiliyor. bunun için üzerinde duruyorum.
                                ' normal if porta.0 = 1 then x=10
                                ' if porta.1 = 1 then x=20 vs.. gibi fonksiyonlarda iki tuşa birden basıldığında karşıda x = 10 mu 20 mi belli olmuyordu. 
                                ' burada yazılan şekilde ise bütün port okunup o bilgi karşıya gönderiliyor. 



BASLA:                         '  başla etiketi

If PORTA.0=1 Then              '  eğer alıcımız sinyal alıyorsa. yani arada bir sinyali yüksek geldiği yerlerde high oluyorsa b nin 7. pinini 
DelayUS 10                     '   high yapması için bunu yazdım. böylece alıcıdaki 4 kanal ledler yanmıyorsa fakat sinyalin
High PORTB.7                   ' gelip gitmediğini merak ediyorsanız burdan anlayabilirsiniz.
DelayUS 10                     ' alıcı devre sinyali doğru veya bozuk birşekilde aldığı sürece b7 deki pin aktif olacaktır.
Else 
DelayUS 10 
Low PORTB.7
DelayUS 10
EndIf
DelayUS 10


SerIn PORTA.0, 396, [Wait("A"), x,y,z,t]   ' veri alma kodu. bu kodun çalışması için yukarıda modedefs.bas kütüphanesini ekledik.
DelayUS 10                                 ' alıcı pini porta.0 dır. bilgi buradan gelecek. alırken de önce A bilgisini bekleyecek
                                           ' ardından aldığı bilgileri sırası ile x y z t değişkenlerine eşitleyecek
 x = PORTB.0
 y = PORTB.1                               ' bu kısımda da x y z t değişkenleri 1 veya 0 (vericide nası kodlandılarsa artık) olarak 
 z = PORTB.2                               ' portb nin pinlerine atayacak. bu şekilde ledler 1 veya 0, on off olacak
 t = PORTB.3	
GoTo BASLA                                 ' koşmaya başlayan programımızı tekrar başla etiketine gönderiyoruz.



verici:

Device = 16F84A                      ' çalışacağımız cihazı belirledik
Xtal 4                               ' 4 MHZ hızlı osilatörümüzü belirttik
Include "modedefs.bas"               ' RF komutları olan serin ve serout komutlarının çalışmas için gerekli kütüphaneyi ekledik
All_Digital True                     ' çıkış girişlerin dijital olacağıını belirttik 1=(5V) 0=(0v)
                                     
                                     
TRISA=%11110                         ' tris komutuyla hangi portların giriş çıkış olacağını belirrtik. 1 giriş, 0 çıkış için 
TRISB=%11111111                      ' 16f84a da 5 adet a portu var bu yüzden % den sonra 5 adet birim girdim. b portu ise 8 adettir bu picte.

PORTA=0                              ' başlangıçta a portunu temizledim
PORTB=0                              ' b portunu da başlangıçta temizledik



Dim x As PORTB.0                      ' genelde '' dim a as byte veya dim degisken as word gibi atamalar yapılır fakat ben burada
Dim y As PORTB.1                      ' Dim yani Tanımlama komutunu kullanarak portların her bir pinine değişken atadım
Dim z As PORTB.2                      ' böylece sadece bu değişkenleri göndererek, karşı tarafta 2 veya daha fazla ledi aynı anda yakabiliyoruz
Dim t As PORTB.3                      ' daha önce böyle bir çalışma görmemiştim. dileyenler bu şekilde de yapabiliyor. bunun için üzerinde duruyorum.
                                ' normal if porta.0 = 1 then x=10
                                ' if porta.1 = 1 then x=20 vs.. gibi fonksiyonlarda iki tuşa birden basıldığında karşıda x = 10 mu 20 mi belli olmuyordu. 
                                ' burada yazılan şekilde ise bütün port okunup o bilgi karşıya gönderiliyor. 

BASLA:                          ' basla etiketi.



SerOut PORTA.0,396,["A",x,y,z,t]    ' veri verme kodu. bu kodun çalışması için yukarıda modedefs.bas kütüphanesini ekledik.
SerOut PORTA.0,396,["A",x,y,z,t]    ' verici pini porta.0 dır. bilgi buradan gidecek. verirken de önce A bilgisini gönderecek
SerOut PORTA.0,396,["A",x,y,z,t]    ' ardından daha önce portb pinlerinden atadığı x y z t  bilgileri sırası ile gönderecek.
GoTo BASLA                          ' koşmaya başlayan programımızı tekrar başla etiketine gönderiyoruz.



----http://www.youtube.com/watch?v=lVL-FMNFVIo----
16F84A