pc'den pic'e seri iletişim

Başlatan tebesir, 19 Şubat 2006, 21:32:30

tebesir

arkadaşlar ben pc den pice seri iletişimle bilgi gönderen bir uygulamayı ilk kez yapacağım. pc yazılımını visual basic ile, pic yazılımını ise pic basic pro ile yazacağım. pcden alınan bir bytelık veriyi porta.2'den alıp portb'ye bağlı ledlerde görmek istiyorum. şu şekilde bir program yazdım ama her bilgi gönderdiğimde portb'deki tüm ledler yanıyor. pc ve pic kodlarını aşağıya yazıyorum:

PC KODU:

Private Sub Command1_Click()
MSComm1.Settings = "2400,n,8,1"
MSComm1.PortOpen = True
MSComm1.Output = Chr(3)
MSComm1.PortOpen = False
End Sub


PIC KODU:

include "bs1defs.bas"
deger var byte
baud con 16780      '2400 baud, paritysiz ve terslenmiş

portb=0
trisb=0
porta=0
trisa=%11111111

dongu:
   serin2 porta.2,baud,[deger]
   portb=deger
goto dongu

end


bu programda bir hata mı var? bana bu konuda yardımcı olursanız çok sevinirim. çünkü seri portu yeni öğrenmeye başladım. şimdiden teşekkürler...

_PICMAN_

Merhabalar..


Sana VB ve PIC Basic kodları veryim bunları incele daha iyi anlarsın.


Visual Basic ile Seri Port iletişim

Visual Basic ile seri porttan veri alışverişi için ilk önce Microsoft Comm Control 6.0 (Mscomm32.ocx) nesnesini forma yerleiştiririz.

Daha sonra hazırladığımız devreyi PC nin seri portuna bağlayın.

Seri portun çalışabilmesi için ilk önce portumuzu istenilen özelliklerde ayarlayarak açmalıyız. Bunlar; baud fızı, com port, gelen veri sayısı gibi özelliklerdir.

Seri Portu ayarlamak ve açmak:
   MSComm1.RThreshold = 1
    MSComm1.InputLen = 1
    MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.PortOpen = True


Bu örnekte, ilk 2 satır veri alma esnasında bir kez de kaç veri alıcağını belirtiyor. burada "1" yazmışız bunun anlamı 1 byte lık veri geldiğinde kesme attif olacak ve MSComm1_OnComm eylemi çağıracak. 3. Satır da ise;
9600: Veri iletişim hızı
N: Verinin terslenmiş olduğunu belirtiyor.
8: 8 bitlik veri transferi.
1: 1 adet stop biti

PC den karekter göndermek için:
MSComm1.Output = "A"

Bu örnekte "A" karekteri bir seferde ASCII kodları gönderilir.
PC den sayı göndermek için:
MSComm1.Output = Chr(100)

Bu örnekte ise "100" sayısı seri porttan gönderilir.

Not: Bu komut ile MSComm1.Output sadece karekter gönderimi yapılır ve istenilen sayılarda karekter ard arda gönderilebilir.

Veri almak için ise bir kaç yöntemi vardır.
sData = MSComm1.Input Komutu ile okunur. Burada sData String bir değerdir. Bu komut belirdiğimiz alıcı buffer ın içeriğini okur ve değişkene yazar. Her seferinde buffer ın içeğini okumak zor olabilir. Bu işlemi buffer dolduğunda MSComm1_OnComm() eylemini çağırarak yapabiliriz.

Diyelim 2 byte lık veri alışı yapacağız ve ayarlarımız 2 byte a ayarladık ve portumuzu açtık.

Private Sub MSComm1_OnComm()

Dim sData As String
Dim veri1 As Variant
Dim veri2 As Variant

If MSComm1.CommEvent = comEvReceive Then

    sData = MSComm1.Input
    veri1 = Asc(Mid$(sData, 1, 1))
    veri2 = Asc(Mid$(sData, 2, 1))

End if

End Sub


Bu örnekte if then ile alıcı buffer dolu olup olmadığı kotrol edilir.  Buffer daki 2 byte lık string değer sData ya alınır ve Mid$ ile 1. ve 2. karekterler ayrı ayrı alınarak ASC koduna çevrilir. İstenilen değerler veri1 ve veri2 nin içine sayı olarak yazılır.


PIC Basic ile PIC Hardware ser iportu ile iltişim örneği aşağıdaki gibidir.

PIC serilerinde bulunan USART ile asenkron ve senkron seri veri gönderip alabilirsiniz. Usart terminali; CRT terminaller, PC ler, çecre birimleri, AD yada DA dönüştürüceü yongalar, seri EErpmlar gibi yongalarla haberleşebilir.

USART biriminn önemli yazaçlarından RCSTA ve Baud hız kaynağı SPBRG yazmaçlarıdır. SPBRG, 8 bitlik bir zamanlayıcıdır. Veri tablolarıincelenerek, gerekli baud hızı seçilir. Asenkron çalışılacaksa BRGH (TXSTA 2.bit) de baud hızını kontrol edebilir. bu biti "0" ve "1" olma konumlarına göre tablodan seçilir. Senkron modda BRGH gerekmez. Baud hızı ile yazmaçlar TXSTA, RCSTA, SPRG dir. SPRG, bir baud hızı kaynağıdır. (Tablodan: 19H değerine karşılık, 10MHz için 96,15 KBaud hız üretilir. %0,16 hata ile.)




USART Asenkron modunda, stardart 1 başlatma (start) biti, 8 veya 9 veri biti, 1 bitiş (Stop) bitinden oluşan paket, en çok kullanılan biçimdir. USART modülü, aktarmakta ve almakta, önce en düşük çöcelikli biti seçer. Parite biti donanım tarafından yakalanmaz, ,stenilirse yazılım tarafından yakalanabilir. Verinin 9. biti parite biti olarak kullanılırsa, parite yazılımla kolayca seçilir. USART uyuma (sleep) modunda çalışmaz. SYNC bit TXSTA 4.bit seçilirse asernkron mod başlatılır. 4 önemli eleman vardır; ilki baud hızı kaynağı, diğerleri Örnekleme devresi, Asenkron iletim,  Asenkron alıcı. Asenkron iletim yazmaçları; PIR, RCSTA, TXREG, PIE, TXSTA, SPBRG dir.




PBP ile nasıl seri veri gönderilir???

ilk olarak DEFINE komutu ile USART ı ayarlaamız gerekecektir. Yukarıdaki tablolardan isdeğiniz baud hızını seçerek SPBRG numarasına bakacaksınız...

Not: USART TX pini Portc.6, RX pini Portc.7

Örneğin; 20 MHz lik bir PIC de 2400 Baud Rate lik bir iletişim yapmak istiyorum bunun için tablodan bakarsak en iyi BRGH = 0, SPBRG = 129 bu ayarlar için PBP kodu:
DEFINE  OSC  20
DEFINE  HSER_RCSTA      90H
DEFINE  HSER_TXSTA      20H
DEFINE  HSER_BAUD       2400
DEFINE  HSER_SPBRG      129


Eğer BRGH = 1 modunda olsaydı TXSTA nın içeriği 24H olcaktı.

Daha sonra veri gönderimi için PBP kodu:
HSEROUT [Veri1]

Bu örnekte Veri1 içeriği USART tan gönderiklir.

HSEROUT [dec Veri1]

Veri1 değişkenin 10 tabanındaki değerini gönderir.

HSEROUT [hex Veri1]

Veri1 değişkenin 8 lik tabanındaki değerini gönderir.

HSEROUT [bin Veri1]

Veri1 değişkenin 2 lik tabanındaki değerini gönderir.

HSEROUT [rep Veri1\4]

Veri1 değişkeni 4 defa gönderilir

HSEROUT [dec Veri1, 10]

Veri1 değişkenin 10 tabanındaki değerini gönderir ve ardından 10 sayısını gönderir.

PBP ile nasıl seri veri alınır???

PBP USART ile veri almakomutu:
HSERIN [Veri1]

USART dan gelen 1 bytlık seri veriyi Veri1 değişkenine saklar.

Bu tür ifadelerde satır işlendiği zaman buffer dolu ise değişkene saklar eğer boş ise bu komut uygulanmaz. Bunun için Komuta veri yok ise dallanacağı yeri ve süresini belirtmemeiz gerekiyor.

Örneğin 2 byte lık veri alımı yapılacak:
main:
HSERIN main, 100, [Veri1, Veri2]
........... verilerin işleceği komutlar.........
Goto main


Eğer USART a veri gelmiyorsa her 100 ms de bir sürekli main başlığına gidecektir. Eğer veri gelirse 2 bytlık veriyi Veri1 ve Veri2 değişkenine saklar bir sonraki adıma geçer.

Bu tür döndüler sizin programınızı zorlaştıracak ise kesme ile de seri veri alımı yapılır. Bu şekilde programınızda gereksiz göngüler kullanmazsınız. Bunun için ilk önce USART RX kesmesini açmalısınız.
OPTION_REG = %10000000
    INTCON	   = %11000000  'CEVRESEL KESMELER AÇIK
    PIE1       = %00100000  'SERI PORT KESMESI AKTIF			
    ON INTERRUPT  GoTo  SERI_KESME


Daha sonra programınızın en sonuna aşağıdaki kodu yazın;
Disable
SERI_KESME:

        IF RCIF = 1 THEN
	       RCIE = 0
	       RCIF = 0
	       HSERIN [Veri1, Veri2]
                       ............Verilerin işleneceği komutlar............
	       RCIE = 1
        ENDIF

        Resume

Kesme alt programına başlamadan önce mutlaka Disable komutu yazlılmalıdır. RCIF biti ile buffer dolu olup olmadığı kontrol edilir, dolu ise 2 byte lık veri alınır ve istenilenn işlemler yapılır.

Umarım bunlar işine yarar...

tebesir

sevgili _PICMAN_;

cevabınız için çok teşekkür ederim. verdiğiniz örnekleri ve dökümanları inceliycem. eğer takıldığım bir nokta olursa tekrar sorularımı gönderirim.

tekrar teşekkürler.... :)

_PICMAN_

Alıntı yapılan: "tebesir"sevgili _PICMAN_;

cevabınız için çok teşekkür ederim. verdiğiniz örnekleri ve dökümanları inceliycem. eğer takıldığım bir nokta olursa tekrar sorularımı gönderirim.

tekrar teşekkürler.... :)
Bir şey değil... ;)