RS 232Haberleşme

Başlatan canakkale_ece, 08 Aralık 2005, 09:24:55

canakkale_ece

Selam arkadaşlar,

5gündür PIC 16f84a ile PC yi haberleştirmeye çalışıyorum.

Fakat hiç bir şekilde pcden veri alamıyor ve/veya göndermiyorum.

PIC in PortB.0 ın ucuna bir led bağladığımda ise PIC in veri gönderdiğini görebiliyorum.

Arkadaşlar bununla ilgili örnek devre şeması ve kod bulabilirmiyim?

Yapmak isteiğim 16f84ile 9600bps,8,n,1 de veri alışverişi yapmak.

Yardımcı olan arkadaşlara çok teşekkürler.
Mail: [email]canakkale_ece@mynet.com[/email]

Petek

şemayı google da  max232 yi aratırsan bulursun.

Yazdığın programı göndermemişsin, bu şekilde nasıl yardım bekliyorsun?
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

ftsahin

16f84 ile sanırım 9600 bps veriyi sağlıklı bir şekilde göndermek mümkün değil. Bence en iyisi 2400 bps ile veri göndermek. Max232 olmadan Pic ve PC haberleştirilebiliyor ama ben sadece Pic'ten PC'ye veri gönderdim bu şekilde sorunsuz çalışıyor.

Yazdığım kod şu şekilde :
Serout Portb.0,N2400,[veri1,veri2,veri3....]

Bağlantı Şekli :

Pic..............PC Seri Port
6.......................2
5.......................5

Sonucu Hyperteminal'de görebilirsin.

canakkale_ece

Yazdığım kod :

define osc 4
   include "modedefs.bas"

trisa=%1111
trisb=%00000000
vel:

serout2 portb.0,N2400,["at"]
pause 500

goto vel


end

ama hyper terminalden hiç bir göremiyorum hiç bişi gelmiyor.


Alıntı yapılan: "ftsahin"16f84 ile sanırım 9600 bps veriyi sağlıklı bir şekilde göndermek mümkün değil. Bence en iyisi 2400 bps ile veri göndermek. Max232 olmadan Pic ve PC haberleştirilebiliyor ama ben sadece Pic'ten PC'ye veri gönderdim bu şekilde sorunsuz çalışıyor.

Yazdığım kod şu şekilde :
Serout Portb.0,N2400,[veri1,veri2,veri3....]

Bağlantı Şekli :

Pic..............PC Seri Port
6.......................2
5.......................5

Sonucu Hyperteminal'de görebilirsin.
Mail: [email]canakkale_ece@mynet.com[/email]

Petek

Jal için yazılmış Jseriala.jal dosyasını indir ve oradaki assembler rutinlerden faydalan. Normalde uart emulasyonu ile çok yüksek boud ratelere kadar yüksek hassasiyette haberleşme gerçekleştirebilirsin. Zamanlama hataları donanım uart modülündeki kadar büyük olmaz.

Picbasic pro yu bilmiyorum. Ama CCS ile yapmak isteseydin, CCS sana en az iki port uart emulasyonu sunabilirdi. Kolay gelsin.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

CaFFeiNe

Max232 kullanıyorsan T2400 yazman gerekiyor diye hatırlıyorum
N2400 ise seri port ile PIC i direnç vasıtası ile bağladığın zaman kullanacaksın

canakkale_ece

Ben direkt bağladım N2400 le çalışmadı.

Alıntı yapılan: "CaFFeiNe"Max232 kullanıyorsan T2400 yazman gerekiyor diye hatırlıyorum
N2400 ise seri port ile PIC i direnç vasıtası ile bağladığın zaman kullanacaksın
Mail: [email]canakkale_ece@mynet.com[/email]

ftsahin

Serout komutunu neden kullanmıyorsun ?(Serout2 yazmışsın) Son olarak bir de şunu dene :

Serout portb.0,N2400,[97,98,99]

bu komutla PC'ye "abc" stringi gitmesi gerekiyor.Hyper terminalde abc şeklinde çıkması lazım.
Bir de seri portla uğraşırken port arızalanmış olmasın. Veya Pic'in 6 nolu ucu da bozulmuş olabilir. Ben bu kodu bir kaç bilgisayarda denedim sorunsuz çalışıyor.


Alıntı yapılan: "Petek"Jal için yazılmış Jseriala.jal dosyasını indir ve oradaki assembler rutinlerden faydalan. Normalde uart emulasyonu ile çok yüksek boud ratelere kadar yüksek hassasiyette haberleşme gerçekleştirebilirsin. Zamanlama hataları donanım uart modülündeki kadar büyük olmaz.

Picbasic pro yu bilmiyorum. Ama CCS ile yapmak isteseydin, CCS sana en az iki port uart emulasyonu sunabilirdi. Kolay gelsin.


Picbasic pro aslında seri iletim için oldukça kolay ama bir o kadar da yavaş. Normalde 4 MHz kristalli bir Pic'te sadece bir uca gelen darbeleri belli bir zaman aralığında saymak için yükselen kenar mantığını kullanarak saniyede 15 KHz'e kadar darbe sayılabildiği halde bu bilgileri bir PC'ye göndermek istersek bu sayı max. 100'e düşüyor. Bu da sadece bir tek sayı için. Gönderilen veri sayısı çoğaldıkça süre daha da uzuyor ve okunabilen darbe sayısı çok fazla azalıyor. Yani darbeleri kayıpsız saymak için PC'ye bilgi gönderirken geçen süre, bir darbenin süresinden kısa olmak zorunda.  Böyle olunca Picbasic'te hem hızlı darbe okuyup hem de PC ile veya başka bir PIC'le bağlantı kurmak zorlaşıyor.
CCS'de bu işlemi yapsak mesela iki ayrı uca gelen darbeleri sayıp aynı anda saniyede 1 defa bu bilgileri PC'ye göndermek istesek kayıpsız okuyabileceğimiz maksimum darbe sayısı kaç olurdu acaba?

canakkale_ece

@ftsahin:

serout komutu çalıştı. :) Hatta 9600bps olarakta denedim veriyi pcden alabiliyorum .
çok çok teşekkürler.

--------
Şimdi seri olarak veri almaya çalışıyorum. Fakat almıyor.

PC nin 3 nolu ucunu porta.0 nolu bitine bağlıyorum
Fakat veriyi almıyor. :(

Bunun içinde ;

serin porta.0,N9600,[GERIDONEN]

i kullanıyorum .

yardımcı olabilirmisiniz?
Mail: [email]canakkale_ece@mynet.com[/email]

Petek

Alıntı yapılan: "ftsahin"Picbasic pro aslında seri iletim için oldukça kolay ama bir o kadar da yavaş.  Normalde 4 MHz kristalli bir Pic'te sadece bir uca gelen darbeleri belli bir zaman aralığında saymak için yükselen kenar mantığını kullanarak saniyede 15 KHz'e kadar darbe sayılabildiği halde bu bilgileri bir PC'ye göndermek istersek bu sayı max. 100'e düşüyor. Bu da sadece bir tek sayı için.

Gönderilen veri sayısı çoğaldıkça süre daha da uzuyor ve okunabilen darbe sayısı çok fazla azalıyor. Yani darbeleri kayıpsız saymak için PC'ye bilgi gönderirken geçen süre, bir darbenin süresinden kısa olmak zorunda.  Böyle olunca Picbasic'te hem hızlı darbe okuyup hem de PC ile veya başka bir PIC'le bağlantı kurmak zorlaşıyor.
CCS'de bu işlemi yapsak mesela iki ayrı uca gelen darbeleri sayıp aynı anda saniyede 1 defa bu bilgileri PC'ye göndermek istesek kayıpsız okuyabileceğimiz maksimum darbe sayısı kaç olurdu acaba?

Ben jal deki seri haberleşme emulasyonunu (4800 bps likti) 9600 bpse çıkartmıştım. Rutin assemblerla yazılmış olduğu için bu işlem için biraz uğraşmıştım. Temel mantığı şu: diyelimki 9600 bps haberleşme yapmak istiyorsun. bir baytlık bilgi göndermek için göndermen gereken bit sayısı 8n1 için 1 start biti, 8 data, 0 parite, 1 stop biti toplam 10 bit ediyor. her bir bit için gerekecek süreyi hesaplayabilirsiniz kolaylıkla. yaklaşık 0.1 ms. yani 100 us. ilk start birtini gönderdikten sonra 100 us gecikme sağlayacaksınız, göndermek istediğiniz bilgiyi LSB ilk gidecek şekilde her bir bit gönderiminden sonra 100 us bekleyeceksiniz, en son stop biti göndereceksiniz onda çok fazla beklemenize gerek yok.

Bu rutin aynı anda hem gönderme hem alma için kullanılamaz. Önce alma işlemi tamamlanır sonra gönderme işlemi yürütülür.

alma işlemi de gnderme işlemi gibidir fakat başlangıcta biraz farklı işe başlıyor. start biti tespit edildikten sonra bir darbe genişliğinin yarısı kadar bir bekleme süresinden sonra okuma işlemi stop bitini tekrar okumayla başlıyor, her 100 us sonunda data bitleri okunuyor, en son stop biti okunuyor ve sonraki start bitini bekleme moduna geçiliyor yada rutinden çıkılıyor (siz nasıl programlamış iseniz). Bu şekilde 38200 bpste bile sorunsuz gönderme alma işlemi yapılabilir.

CCS nin bahsettiğiniz gibi aynı anda bilgi alırken gönderme yapmaya izin verip vermediğini bilmiyorum ama şunu söyleyeyim, bu C nin mantığına aykırı bir şey. Siz bilgiyi al komutunu girdiğinizde o komut bitinceye kadar başka komut işlenemez. Sadece assemblerda gönderme veya alma rutininin içerisine o mantığı yerleştirebilirsiniz.

Dediğiniz işlem hardware uart modülü olan pic lerde işlemcinin işleyişinden bağımsız yapılıyor, ama iş software emulasyona gelince farklı oluyor. Giriş olarak tanımladığını pini, okuma işlemi yapmak istediğiniz zaman dinleyeceksiniz. Ya da bir interrupt kaynağına bağlayacaksınız, normal işleyişte bilgi geldiğinde işinizi kesip gelen bilgiyi alacaksınız. Burada önemli olan, uygulama, algoritma, uygun işlemci seçimi, maliyet optimizasyonunu iyi yapmak.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mmengi

Neredeyse 16nxxx serisi bütün pic lerde usart standart gibi oldu en basiti kolayca bulabileceğiniz 16f628 de bile bu usart bulunmakta ve işinizi çok rahat bir şekilde görmekte. Datasheet inden 3-5 sayfalık bir bilgiyle bunu C basic asm de kullanabilirsiniz. Yok ben illa 16f84 kullanacağım derseniz software ile kısıtlıda olsa bunu çözebilirsiniz ama 16f84 kullanmak maddi ve manevi bir şey katmayacaktır.

Pic i bir direnç ile pc ye bağlayıp data alabilirsiniz ama gönderme yapacaksanız bu iş yapılmaz değil ama sağlıklı olmaz. Bu yüzden max232 tarzı bir level converter ile bağlamak her zaman daha sorunsuz bir yöntem.
Çok fazla kurcalamakta iyi değil direk bağlantıyı pc nin portunu yakabilirsiniz yazık olur pc ye artık seri portlar anakart üzerinde olduğundan çözümde bulmak çok zor böle bir durumda, ancak pci a takılan bir seri port kartı kullanabilirisiniz.

Petek

Alıntı yapılan: "mmengi"Neredeyse 16nxxx serisi bütün pic lerde usart standart gibi oldu en basiti kolayca bulabileceğiniz 16f628 de bile bu usart bulunmakta ve işinizi çok rahat bir şekilde görmekte. Datasheet inden 3-5 sayfalık bir bilgiyle bunu C basic asm de kullanabilirsiniz. Yok ben illa 16f84 kullanacağım derseniz software ile kısıtlıda olsa bunu çözebilirsiniz ama 16f84 kullanmak maddi ve manevi bir şey katmayacaktır.

16F84 değil de 12F675 gibi yada 10FXX gibi işlemciler için gerekiyor. UART emulasyonun şöyle bir faydası da var, gönderme ve alma işlemini aynı pinden gerçekleştirebiliyorsunuz (CCS de Rx ve Tx i aynı pin tanımlayın oluyor, max232 ile pic arasındaki bağlantıya dikkat edin. max232 den çıkp pic e gelen hatta 2klık direnç koymak gerekiyor). Özellikle 12F675 gibi kısıtlı kaynakları olan işlemciler için başka çare yok.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

ftsahin

Alıntı yapılan: "Petek"CCS nin bahsettiğiniz gibi aynı anda bilgi alırken gönderme yapmaya izin verip vermediğini bilmiyorum ama şunu söyleyeyim, bu C nin mantığına aykırı bir şey. Siz bilgiyi al komutunu girdiğinizde o komut bitinceye kadar başka komut işlenemez. Sadece assemblerda gönderme veya alma rutininin içerisine o mantığı yerleştirebilirsiniz.

Dediğiniz işlem hardware uart modülü olan pic lerde işlemcinin işleyişinden bağımsız yapılıyor, ama iş software emulasyona gelince farklı oluyor. Giriş olarak tanımladığını pini, okuma işlemi yapmak istediğiniz zaman dinleyeceksiniz. Ya da bir interrupt kaynağına bağlayacaksınız, normal işleyişte bilgi geldiğinde işinizi kesip gelen bilgiyi alacaksınız. Burada önemli olan, uygulama, algoritma, uygun işlemci seçimi, maliyet optimizasyonunu iyi yapmak.

Demek istediğim tam olarak bu şekilde değil. PIC'in bir portunu haberleşme sırasında hem giriş hem de çıkış olarak kullanmak istemiyorum. Harici bir sinyal kaynağından gelen darbeleri okuyup toplam darbe sayısını saniyede bir defa PC'ye gönderecek. Sinyal kaynağı 10'a kadar çıkabilir ve hepsinden gelen darbeleri kayıpsız olarak sayacak. Ve saniyede 1 defa darbelerin hepsini PC'ye gönderecek. Gönderme sırasında toplam darbe sayısı 255'ten büyük olursa word tipi değişken kullanılacağından her bir değişken 2 byte uzunluğunda oluyor ve Pic, PC'ye toplam 20 byte'lık bilgi gönderiyor. Bu da uzun zaman alıyor ve gönderme sırasında sinyalleri kaçırıyor. Bunun için de dediğiniz gibi kendi rutinimizi kendimiz yazmamız gerekiyor. Picbasic'in hazır haberleşme rutini yavaş kalıyor. Veya USART'lı bir Pic kullanıp sorunu bu şekilde çözmemiz gerekiyor.

ftsahin

Alıntı yapılan: "canakkale_ece"
Şimdi seri olarak veri almaya çalışıyorum. Fakat almıyor.

PC nin 3 nolu ucunu porta.0 nolu bitine bağlıyorum
Fakat veriyi almıyor. :(

Bunun içinde ;

serin porta.0,N9600,[GERIDONEN]

i kullanıyorum .

yardımcı olabilirmisiniz?

mmengi arkadaşımızın bahsettiği gibi seri portla direk bağlantı yapmak her iki tarafa da zarar verebilir. Zaten normal olarak PC'nin  seri portunun 3 nolu ucunda sürekli -10V vardır. Bu durumda doğrudan haberleşmek mümkün değil Max232 kullanmak gerekmektedir.  
Kolay gelsin

Petek

Alıntı yapılan: "ftsahin"Demek istediğim tam olarak bu şekilde değil. PIC'in bir portunu haberleşme sırasında hem giriş hem de çıkış olarak kullanmak istemiyorum. Harici bir sinyal kaynağından gelen darbeleri okuyup toplam darbe sayısını saniyede bir defa PC'ye gönderecek. Sinyal kaynağı 10'a kadar çıkabilir ve hepsinden gelen darbeleri kayıpsız olarak sayacak. Ve saniyede 1 defa darbelerin hepsini PC'ye gönderecek. Gönderme sırasında toplam darbe sayısı 255'ten büyük olursa word tipi değişken kullanılacağından her bir değişken 2 byte uzunluğunda oluyor ve Pic, PC'ye toplam 20 byte'lık bilgi gönderiyor. Bu da uzun zaman alıyor ve gönderme sırasında sinyalleri kaçırıyor. Bunun için de dediğiniz gibi kendi rutinimizi kendimiz yazmamız gerekiyor. Picbasic'in hazır haberleşme rutini yavaş kalıyor. Veya USART'lı bir Pic kullanıp sorunu bu şekilde çözmemiz gerekiyor.
Benim de demek istediğim pic in tek bacağından hem gönderme hem alma yapması değildi, bu işi farklı bacaklardan yapsa da aynı anda biri işi yapabilir demek istemiştim. Her neyse sizin bahsettiğiniz olay benim yazdıklarımdan farklıymış.

Sizin harici darbe kaynağınızın frekansı (darbe sıklığı) nedir? yada en fazla kaç olabilir? Kullanacağınız işlemcide donanım UART modülü olacak mı? Yoksa haberleşmeyi yazılım emulasyonu ile mi yapacaksınız? işlemciniz 4 MHzlik mi yoksa 20 MHzlik mi yada 18 serisi için 40 MHz lik mi (10MIPS) olacak?

Bir soru daha, darbe sayısını ölçerken sabit örnekleme aralığında darbelerin değişip değişmediğine mi bakıyorsunuz? öyleyse bu sıklığın süresi ne kadar? 20 baytı birden bu arada göndermek yerine gönderme işini birer birer her bir örneklemenin arasına sıkıştırmak mümkün değil mi?
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein