RF ile seri haberleşme yardım lütfen

Başlatan Canermyn, 13 Mart 2016, 12:55:53

Canermyn

Merhaba,
Seri olarak RF üzerinden veri göndermeye çalışıyorum.
alıcı kısım bu şekilde;
include "modedefs.bas"
DEFINE LCD_DREG    PORTB
DEFINE LCD_DBIT     0
DEFINE LCD_RSREG    PORTB
DEFINE LCD_RSBIT    4
DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT     5
DEFINE LCD_BITS     4
DEFINE LCD_LINES    2

kelime var byte[16]

    i var byte
    j var byte
    b0 var byte
   
TRISA = 255
    ADCON1 = 7
   
    PORTB.6=0
Lcdout $fe, 1   
Lcdout "Gelen" 
pause 500
ana:
Dongu:
   
    IF PORTA.0=0 THEN GOTO Dongu
    for j=0 to 15
    Serin PortA.0, T1200, b0
    kelime[j]=b0
    next j
     
göster:
    Lcdout $fe, 1   
for i=0 to 15
    b0=kelime[i]
    Lcdout B0
    next i
    Goto ana     
end

burdaki sorun gelen seri bilgi değişken olduğu için boyutu bilinmiyor ve  kelime var byte[16] dediğim zaman gelen bilginin 16 karakter olmasını bekliyor yani bilgisayardan seri dönüştürünün TX i pic in RX e bağlayıp klavyeden 16 karakter yazıp gönder dediğim zaman sıkıntı yok fakat daha az sayıda bilgi gelince olmuyor.Burda ya dinamik dizi tanımlamam lazım yada gelen bilginin boyutunu öğrenmem gerekiyor.

verici;
INCLUDE "modedefs.bas" 
   
 
B0 var byte[5]
    B1  var byte
    i var byte
    j var byte
    bilgi var byte[5]
       
TRISB = %11110111            
TRISA = %11111001       
    CMCON = %00000111      
Pause 500       
clear   

Dongu:
               
IF PORTA.3=1 THEN GOTO Dongu
    for j=0 to 4
    Serin PortA.0, T1200, [b1]
    b0[j]=b1
    next j
    pause 50
for i=0 to 4
    serout PORTA.1, T1200, [b0[i] ]
    next i           

pause 200                   
Goto Dongu
    End

bir de bunlara RF ile haberleşme kısmı var onu yapamadım.RF de senkronizasyon için önce 5 kere 0x55 5 kere 0x0F yolladığım halde RF den sonuç alamadım.RF modül olarak XY-MK-5V 433Mhz RF alıcı ve FS1000A/XY-FST RF 433Mhz verici kullanıyorum.Yardımcı olursanız sevinirim.Teşekkürler

ete

#1
Öncelikle dizi ile çalışınca artık sabit sayıda veri yollamak şart oluyor. 16 karekterden oluşan dizide diyelimki 8 adedi dolduruldu, sonuna bir sonlandırma karekteri eklersin. Bu normalde gönderilmeyecek bir karekter olur ama yinede 16 byte her seferinde yollanmalı. Boş olanlarda sıfır olabilir ve son karekter bu durumda sıfır olarak da kabul edilebilir. Alan taraf her zaman 16 byte alır ama içinde son karekter olan sıfırı gördüğü an diğerlerini dikkate almaz.

Bu tür sistemlerin çalışabilmesi için kesin Usart modülü kesme ile birlikte kullanılmalıdır. Aksi halde sistemin çalışması şansa bağlı kalır. Özellikle hem alıp hem veren sistemlerde de kesin olarak transceiver kullanılması neredeyse zorunluluktur. Yoksa çok zor haberleşirsiniz. Unutmayın aynı ortamda birden fazla verici aynı anda açık olamaz. Olursa kimse bir şey alıp veremez.

Ete

Canermyn

teşekkürler ete hocam, bilgi sonu karakterini ekleyip deneyeceğim.
hocam usart modülü ve  transceiver ile tam olarak ne kastettiniz anlayamadım.biraz daha açarsanız sevinirim.

ete

Usart modülü pic içinde donanımsal olarak geri planda çalışan haberleşme modülüdür. 16F628 , 16F877A gibi işlemcilerde vardır. Modülün standart TX çıkış pini ve RX giriş pini vardır. Bu işler için başka pin kullanılamaz.

Transceiver ise bir tek haberleşme modülü olup üzerinde hem verici ve hemde alıcı modül bir arada bulunur.
Udea ve Dorji firmalarının ürünlerine Tranceiver diye aratarak bakabilirsin.
Bu ürün işlemciye sadece TX ve RX pinleri ile bağlanır.

Kullanımda epeyce bir kolaylık sağlar. Biraz pahalıdır ama pek çok durumda başka alternatifi yoktur.

Ete

Canermyn

hocam usart modülü kullanıyorum pic in RX ve TX pinlerinden işlem yapıyorum yani,kodda usart kesmesi kullanmadığım için ön tanımlamalara gerek yok diye düşündüm.olması gerekiyor muydu?
Son olarak ete hocam transceiver rf alıcı verici modül oluyor sanırım dediğiniz şekilde aratınca rf alıcı verici modüller çıktı karşıma ki ben
RF modül olarak XY-MK-5V 433Mhz RF alıcı ve FS1000A/XY-FST RF 433Mhz verici kullanıyorum.işimi görmez mi hocam.
Teşekkürler...

ete

Verici kodlarına bakılırsa hem alıyor hemde veriyor. Yani bu kart üzerinde hem TX modül hemde RX modül olması gerekiyor.
Peki Vericinin alış yapabilmesi için kim veri yolluyor? orası belli değil. Bunu bilmeden bir cevap vermem mümkün değil.
Alıcı yalnız alıyor ama vericiye kim veri yolluyor acaba?

Ete

Canermyn

Hocam vericiye bilgiyi normalde ps2 klavyeden gelecek ama o konuda da sıkıntılarım var.Şuanlık bilgasayardan usb-seri dönüştürücü ve arayüz ile seri bilgi gönderimi söz konusu.arayüz programında usbden bağlantı yapıp gönderilecek veriyi yazıp gönder diyorum.modülün TX ucundan picin RX e bağlayıp gönderiyorum. rf çalışmadığı için alıcının da Rx ini usb-seri dönüştürücünün TX e bağladığım zaman onuda öyle denemiş oldum.Alıcıda vericide sıkıntısız çalışıyor fakat araya rf bağladığım zaman çalışmıyor hocam.

ete

Verici şayet kablolu olaraak PS2 klavyeden veri alacak ise o zaman transceiver gerekmez. Ben o bilgininde RF aracılığı ile geleceğini düşünmüştüm.

Gerek alıcı ve gerek vericide düşündüğün mantık ile bu işin olması biraz zor gözüküyor. Bir dafa veri kısmında giriş pinleri LOW ise bekle diyorsun. Bu mantık PS2 den gelenbilgi için doğru olabilir ama RF kısmında giriş pini sürekli parazit etkisi altındadır ve sürekli konum değiştirir. Bu nedenle aynı mantık orada çalışmaz.
Sorunun çözümü işaretçi kullanımında olmalı.
Gerek PS2 de ve gerekse RF vericiden veri yollanırken;
- 5 adet $AA ardından 5 adet $00 ve yine ardından 5 adet $FF bilgisi uyandırma sinyali olarak yollanmalıdır.
- Ardından yollanacak 16 adet bilgi başınabir işaretçi eklenmeli ve bu işaretçi en fazla 3 karekter olmalı mesela "ETE" gibi.
- Sonra madem USART pinlerini kullanıyorsun o halde kesme kullanmadan usart komutlarınıda kullanabilirsin demektir. Ama programın başına;
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 51  ' 1200 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

satırlarını ekle. Bu tanımlamalar programın 4 Mhz frekans ile çalıştığı varsayılarak belirlendi. Farklı frekanslarda tanımlamalar değişecektir. Maalesef program kaç Mhz ile çalışıyor belli değil.

- Sonra verici programda Dongu altındaki satırları  yani;
    IF PORTA.0=0 THEN GOTO Dongu
    for j=0 to 15
    Serin PortA.0, T1200, b0
    kelime[j]=b0
    next j

aşağıdaki ile değiştir

Dongu:
HSERIN 10,Dongu, [WAIT("ETE"),Kelime\16\0]

Bu komutun açıklaması Seri port dan bilgi gelmesini bekle Gelen bilginin başında ETE işareti varmı bak. Yok ise buluncaya kadar bekle . Var ise 16 adet karekteri al ve sıfır karekteri gördüğünde bu işlemden çık. Bu durumda 12 karekter alıp 13cü karekter sıfır ise işlem sona erecektir. Alınan karekterleri sırası ile Kelime isimli dizi değişkenine yerleştir.

Verici isimli programda yine Dongu altındakileri yani;
Dongu: 
               
IF PORTA.3=1 THEN GOTO Dongu
    for j=0 to 4
    Serin PortA.0, T1200, [b1]
    b0[j]=b1
    next j
    pause 50
for i=0 to 4
    serout PORTA.1, T1200, [b0[i] ]
    next i           

pause 200                   
Goto Dongu

Aşağıdakiler ile değiştir;
Dongu:
HSERIN 10,Dongu,[WAIT("ETE"),Kelime\16\0]

HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
HSEROUT ["E","T","E", STR Kelime\16]
Goto Dongu

Bu tür programlarda pause leri kaldırmak gerekir. Çünki iki ünitenin haberleşmesi aralarındaki senkron'un tutturulması ile mümkündür. Biri yollarken diğer alma konumunda beklemeli ve geleni almalıdır. Pause ler ise senkron bozucu komutlardır. Bekleme esnasında veri gelirse haberleşme olmayacaktır.

Dediklerimi bir dene istersen.
Ete


Canermyn

tmm hocam bu şekilde deniyim bi çok teşekkürler denedikten sonra geri dönüş yaparım...

Canermyn

hem alıcıda hem vericide
HSERIN 10,Dongu,[WAIT("ETE"),Kelime\16\0]
hata veriyor
HSERIN 10,Dongu,[WAIT("ETE"),Kelime]
şeklinde değiştirdiğim zaman derliyor hocam.

ete

#10
16\0 ibaresindeki \0 kısmını kaldırıp bir dene bakalım.
Kelime isimli dizi değişkeni tanımlanmış olması gerekir bunu unutma

Ete

Canermyn

dizi değişkeni Kelime var byte [16] olarak tanımlı
HSERIN 10,Dongu, [WAIT("ETE"),Kelime\16] olarak olmadı malesef hocam

ete

#12
Şu şekilde olacak;
HSERIN [WAIT("ETE"),STR KELIME\16\0]
sondaki sıfır rakamıdır (\0]
Ete

Powered by EzPortal