HSERIN HSEROUT NASIL, 433 RF, MAX232, ROALAN BT232

Başlatan kasif, 11 Aralık 2005, 02:58:21

kasif

Merhabalar

PC ile pic i birbiri ile haberleştirmeye çalışıyorum. Çok da yol aldım.

serin, serout ile PC tarafında da visual basic kullanarak byte veri gönderme ve iki byte veri alma işlemini şimdilik sorunsuz yapabiliyorum.

Yaklaşık 2 2,5 m uzunluğunda kablo ile 9600,N,8,1 ayarında(ki genelde bu hızda sorun yaşardım) %85 doğruluk derecesinde çalışıyor.

Sorunlarım
1. max232 bağlantılarını o kadar kontrol ettim, sorun görünmüyor fakat çalışmıyorda. Bende seri portun 2 nolu ayağını pic e vermeden önce 22k direnç kullandım, diğer ayak ise düz bağlı. Bir kaç değişik max232 denedim. Acaba bende mi probnlem var.

2. hserin ve hserout kullanmak istiyorum, bununla sistemimin daha stabil çalışacağını düşünüyorum, ama nette adam gibi hem pic basic pro kaynak kodları hem visual basic kaynak kodları olan bir proje bulamadım, böyle bir çalışmaya sahip olan veya bile varsa, gönderebilir veya linkini verebilir mi

3. Kablosuz uygulamalarım için " Roalan wireless serial RS232 Converter ( BT232 ) " yi almıştım. Bu parça ile bluetooth bağlantısına sahip sistem(pc notebook palm vs) ile kablosuz bir seri porta sahip oluyorum (?). Az önceki denememde sadece pic in gönderdiği verileri alabildim, pc den pic e gönderdiğim verileir hiç alamadım, hatalı veri bile gitmedi. Acaba ben mi yanlış anladım yoksa bu alet çift yönlü iletişim yapamıyor mu?
(Not: Bu tip birşeyle hiç uğraşmayın derim, verdiğim paraya mı yanayım, gelen dandik ürüne mi bilmiyorum, kablosuz seri port olayına girecekseniz biraz daha fazla para verip www.kabloyok.com daki modülleri alın, kapsama alanı birşeye benzesin)

4. Elimde değişik markalardan 433 Mhz lik 3 verici ve 5 alıcı var. Vericiler normal çalışıyor(sanırım) ama alıcılarımda sorun var. Daha vericiye enerji vermeden alıcıya enerji verdiğimde anormal bir veri alışı oluyor, ekran(2 satır LCD) bir sürü veri gösteriyor. Regüleli sistem kullandım, pil(güç kaynağı, antenli antensiz denedim, ne yaptıysam gürültüden kurtulamadım. Bazen bir kaç saniye çalışıyor, sonra tekrar gürültüye boğuluyor. Bundan kurtulmak için ne yapmalıyım?

#. Saat 3 e 5 var, tahmin ediyorum yazımda birçok hata vardır. Özür dilerim.

ete

Sorunlarının sebeplerini tam olarak çözmüş değilim. Ancak benzeri konularda uğraştım ve tecrübelerimi aktarmak istiyorum.

-Her şeyden önce %85 doğruluk demek sistemin hiç çalışmadığını göstergesi. Bunu biraz doğru çalışıyor diye algılamayın.
- Pic ile yapılan seri haberleşme projelerinde kesinlikle 9600 veri aktarım hızını kullanmayın. Çünki pic bu hıza çıkamıyor (4-10 Mhz arası kristalli olanlar için konuşuyorum). Bana kalırsa denemelerinizi sürekli 2400 ile yapın hatta dahada aşağıya inebilirsiniz. Sonuçta çok fazla veri aktarmayacak iseniz hızın size yeterli olduğunu göreceksiniz. Hele RF kullanırsanız en güvenli hız 600 oluyor. RF sistemleri daha hızlıda çalışıyor ancak veri kaybu kaçınılmaz oluyor zaman zaman. Ancak 600 de hiç problem yok. Bizzat deneyerek yaşadım.
- RS232 haberleşme sistemi kablo boyu açısından sorunlu bir sistemdir. Şayet PC ile pic arasında mesafe uzun olacak ise bana kalır ise 2 m.den büyük ise kesinlikle RS485'e dönün derim. Bu sayede istediğiniz uzunlukta çalışabilirsiniz. Bunuda denediğim için söylüyorum. Belki diyeceksiniz 2m ile 2,5 m. arasında ne fark eder. Çok şey ediyor.
- Seri haberleşme konusunda benim ders notlarım olacak idi baktınızmı?.

  http://rapidshare.de/files/5932331/Ders-1-5.rar.html
  http://rapidshare.de/files/5932453/BASIC-DERS-6-10.rar.html
Sorularınız olursa bana yazabilirsiniz.
- Kablosuz RS232 konusunda fikir beyan edemiyeceğim.
- RF modülleri konusunda vericilerin tamamında bir gürültü seviyesi var. Bu sonuçta haberleşmenizi fazlaca etkilemez. Bu gürültü firmaların verdiği teknik açıklamaya göre kaçınılmaz imiş. Bende aynı sorunları görmüş ve yaşamıştım. Ben UDEA modülleri kullandım. Benzer sorunlar için firma ile sürekli görüştüm. Sağ olsunlar çok yardımcı oldular ve sonunda problemi onların önerisi ile aştım. Önerileri sinyalin başına preambl (uyandırma) sinyali eklemek idi epeyce işe yaradı.
Seri haberleşmede ister RF ister kablolu haberleşin en önemli nokta bir header (yakalama) sintalinizin olmasıdır. Bu genelde baştan bir veya bir kaç karekter dizisi göndermekle yapılıyor. Örneğin verici kısmında mesajınızın başına "VER" şeklinde bir başlık ekler ve alıcı kısmında önce bu VER geliyormu diye bakarsanız ve bu VER'i yakaladıktan sonra peşinden gelenleri alırsanız haberleşmede sorun yaşamazsınız.
Tabiiki başta birde uyandırma sinyali olacak. Bu en baştan verici kısmında
binary olarak yazıyorum;
%11111 peşinden %00000 peşinden %101010 şeklinde bir sinyal göndermektir. Bu sinyaller karşı tarafın alıcı kısmını sinyal geliyor şeklinde uyaracak ve sisteminiz peşinden gelen VER bilgisini aramaya başlayacaktır.
Söyleyeceklerim. Bu kadar. RF lis sistemler yaparsanız anten boyu ve şeklininbu işte ne kadar önemli olduğunu ayrıca PCB üzerinde anten girişinin yeterli empedansa sahip olması gerektiğini belirtmek isterim. BU bilgileride UDEA dan aldım. Kısaca PCB üzerinde yerleştireceğiniz enten bağlantı pad'i etrafına yeterli GND powerplane yapmanız yani pad'in etrafını GND kanalı ile çevrelemeniz lazım. Bütün bu hususlara dikkat ederseniz projeniz doğru çalışacaktır emin olun.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

kasif

Ete,

Hazırladığın dersler bir harika, ellerine sağlık. Şu zamana kadar aldığım incelediğim bir çok kitaptan daha iyi olduğunu düşünüyorum. Bunlar ile web sayfası veya kitap hazırlayıp maddi olrak birşeyler kazanabilirsin(belkide kazanıyorsundur ben bilmiyorum).

% 85 doğruluk derken değeri 100 verip 85 alıyorum değildi. Sanırım ben anlatamadım. PC den gönderdiğim 3 byte lik 100 paketin 85 tanesi doğru geliyor. kalan 15 pakette ise, 3 byte ın 1 veya 2 byte ı hatalı görünüyor. Zaten işin içinden çıkamazsam şöyle bir şey yapacağım. her byte için 3 byte gönderip(ki bu durumda 3 x 3 = 9 byte) bu 3 byteı karşılaştırmak ve eğer herhangi 2 byte birbirine eşit ise bu değeri kabul etmek olacak.

pic den pc ye gönderdiğim verilerde ise hiç sorun yaşamıyorum. Hatta senkronizasyon bozulacak mı diye 20 dk ya yakın sürekli pic den PC ye veri göndermeyi denedim ve tek bir bit bile hata olmadı.(9600 N,8,1 ve bluetooth rs232 ile)

600 hızı biraz düşük sayılır ben en az saniyede 40 byte veri alışverişi düşünüyorum. Matematiksel olarak yeterli gibi görünüyor fakat header gibi ek bilgi falan da varsa yeter mi bilmiyorum?

Birde visual basic bekleme işlemini nasıl yapabilirim. Pic basic deki wait komutu gibi.

Teşekkürler

engin_

Visual basic te timer nesnesini kullananarak zamanlama işlerini yapabilirsin.

Toolbox da saat şeklinde olan nesne.Formuna ekle , Properties de interval kısmına milisaniye olarak değer verebilirsin.Bu değer aralıkları ile timer  alt programına yazacağın ködları çalıştırır.

kasif

Ben kod falan istemiyorum

Sadece 0.1 ~ 0.2 saniye program hiçbirşey yapmadan beklesin.

Ama şimdi aklıma birşey daha geldi.

Teşekkürler

engin_

Modülde kullacaksan
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

veya form da kullanacaksan

Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Apisini ekleyerek ,istediğin bir yerde

sleep süre_milisaniye

örnek:
sleep 100

şeklinde kullanabilirsin.

kasif

Ya hiç aklıma gelmemişti (niyeyse)

Bir timer koydum, ve timerin içine sinyal gönderme kodlarımı koydum. timeri 0.2 saniyeye ayarladım gönderilen(pcden) verinin hata oranı %20 nin altındaydı. Alınan veri ise hatasız geliyor.

Bu değerleri 25 dakikalık sürekli bağlantı ile sağladım yani bir bit kayması falan olmadı.

Gelen verideki hatayı gidermek için, her 1 byte için 3 veya 5 byte alıp çoğunluk veriye göre hareket edeceğim. Doğruluğun artması için 5 byte alıp en az 4ünün birbiri ile aynı olup olmadığına bakacağım.

Şimdi sorunlarım roalan dan aldığım bt232 nin neden iki yönlü iletişim yapmadığı. 433 MHz alıcı modüllerimin çok gürültü alması. Hserin ve hserout komutları ile yapılmış bir pc pik bağlantı uygulaması.

nonstradam

selam 433Mhz alıcı modüle enerji verir vermez lcd ye bir şeyler yazıyor demişsin. böyle bir problemle bende karşılaşmıştım. alıcı modüller ilk enerjilendiğinde biraz saçmalıyorlar. modüle enerji vermeden seri portunu aktif etme (cren=0,spen=0 gibi). modüle enerji verdikten bir süre (örnek 50ms)sonra seri portu aktif et sorun büyük ihtimal çözülecektir. yada gönderdiğin paketin başına tanımlayıcı bir bilgi (ete hocamın dediği gibi VER, paket sonunada checksum bilgisi ekle. alıcı tarafında paket başını ve sonunu kontrol et farklıysa kafaya takma de)kolay gelsin.

kasif

Teşekkürler,

Aslında bu konuyu geçen sene açmıştım, yine de sağol.

LCD veya diğer parçaların "kendine gelme süreleri" ihtiyacı için bol bol pause kullandım.

Son olarak işi 18F452 ile yapayım dedim, mükemmel çalıştı. Ama niye diye sorarsan, bilmiyorum.

kasif

Merhabalar,

Yeni konu açmaktansa ilgili bir konuya ekleyeyim, diye yeni konu açmadan bir soru soracağım.

PC nin seri portunda serin2 serout2 komutları ile haberleşen bir devre kurdum. Devreyi yukarıda bahsettiğim "roalan bluetooth serial port" ile kullanıyorum.

Bilgisayar dan, Visual Basic ile 6 Byte veri gönderiyorum, işlemci bunları LCD ekranda yazıp, ilk iki btye ve "satır sonu" ve "alt satır" olmak üzere 4 byte ile bana geri gönderiyor.

Sorunum şu,

Visual Basicde verileri
sData = MSComm1.Input

komutu ile okuyor ve
hbb1 = Asc(Mid$(sData, 1, 1))
hbb2 = Asc(Mid$(sData, 2, 1))

ile alıyorum.

Okuma işini buton ile yapıyorum.
işlemci LCD kullanırken titreme olmaması için bir miktar pause kullanıyorum.

Eğer veriyi gönderip hemen veri okumaya basarsam
sData = MSComm1.Input

satırından dolayı program hata veriyor.(Visual basic, de debug seçeneğini seçinde bu satır çıkıyor.)

Tahmin ediyorum, gelen veriler bir buffere doluyor, acaba bu bufferin dolu olup olmadığını kontrol edebileceğim bir komut var mı? Eğer dolu değilse bilgi almaya da çalışmam, programında hata verme durumu kalkmış olur.

kasif

Kendi soruma kendim cevap veriyorum.

Mscomm Kütüphanesinde "InBufferCount" diye bir komut buldum, istediğim işe yaradığını öğrendim. Test ettim, istediğim gibi çalıştı.

Private Sub Command6_Click()
    Text9.Text = MSComm1.InBufferCount
End Sub

Şeklinde bir deneme yaptım. Programın daha öncesinde
MSComm1.InputLen = 4

kullandığım için, buffer da 4 byte dan fazla veri olduğu halde 4 byte gösterdi.
sData = MSComm1.Input

ile okuma yaptıktan sonra, tekrar bufferi kontrol ettiğimde geri kalanların boyutunu gösterdi. Onlarıda alınca, buffer "0" değerini verdi.


Kendi sorunumu çözmüş olsamda bu bilgiyi yeni öğrendim ve paylaşmak istedim.

kasif

Merhabalar,

Yine konu açmayayım diye problemimi buraya yazıyorum.

DEFINE HSER_RCSTA 90H 
DEFINE HSER_TXSTA 20H 
DEFINE HSER_BAUD 9600 
DEFINE HSER_CLROERR 1
veya
DEFINE HSER2_RCSTA 90H 
DEFINE HSER2_TXSTA 20H 
DEFINE HSER2_BAUD 9600 
DEFINE HSER2_CLROERR 1

tanımlamalarını da yaptığım halde,
HSERIN 5000,basla,[str SERIGEL\6] 
HSEROUT [serigel[0],serigel[1],13,10]
veya
HSERIN2 5000,basla,[str SERIGEL\6] 
HSEROUT2 [serigel[0],serigel[1],13,10]
kodları
SERIN2 PORTD.0,84,5000,BASLA,[str SERIGEL\6]
SEROUT2 PORTD.1,84,[serigel[0],serigel[1],13,10]

kodlar gibi çalışmıyor, o kadar denememe rağmen sadece bir defa doğru, birkaç defa da alakasız veriler aldım.

Hserin veya Hserin2 bana tam olarak ne kazandırır bilmiyorum fakat daha stabil çalışacağını düşünürken hiç çalıştıramadım. Nerede yanlışım var?