PIC haberleşmesi

Başlatan kılıckaya, 02 Ekim 2014, 23:29:31

kılıckaya

Ete Hocam, forumda bir arkadaşın benzer bir konuyu açması bana cesaret verdi. Konulara yazılanlar karışmasın diye burada farklı bir başlık altında açıyorum. Haberleşme konusunda çok acemiyim,mutlaka bariz hatalarım olacaktır,bunlardan dolayı kusura bakmayın.
Konuyu kısaca açıklayayım; ulaşabildiğim bilgiler şunlar:
bilgiyi gönderen Pic 9600 Baud'da ve çift paritede çalılıyor diyor (burada çift parite ile ne anlatılıyor?)
Pic farklı bir çok bilgi gönderiyor ama ben sade olması bakımından yanlızca 2 adet bilgiyi yazıyorum.
    50 04 68 32 11 1F      ve    50 04 68 32 10 1E
Alıcı olarak 16f887A düşünüyorum. Gönderici olan Pic'den "50 04 68 32 11 1F " gelmiş ise Port B.0=1 olacak.  Gönderici olan Pic'den "50 04 68 32 10 1E  " gelmiş ise Port B.1=1 olacak. 
Aşağıya arkadaşın yazmış olduklarını kendi mantığıma göre küçük değişiklikler yaparak tekrar yazıyorum. Burada merak ettiğim "IF AL=50 04 68 32 11 1F  THEN PORTB.0=1 " şeklinde bir şey yazabilir miyim? Yoksa "50 04 68 32 11 1F" değerini farklı bir şekilde mi gönderici Pic'den almam gerekiyor? Acemiliğimden dolayı kusuruma bakmayın. Bir başka arkadaşımın fikirlerini kendime mal etmek gibi bir düşüncem yok. Anlayışınız için teşekkür ederim.

@ DEVICE pic16F877a
@ DEVICE pic16F877a, WDT_OFF
@ DEVICE pic16F877a, PWRT_ON
@ DEVICE pic16F877a, PROTECT_OFF
@ DEVICE pic16F877a, HS_OSC

define OSC 20
ON INTERRUPT GoTo KESME
OPTION_REG=%10000101      'Pull up dirençleri İPTAL- Bölme oranı 101=1/64.
INTCON=%10100000          'Kesmeler aktif ve TMR0 kesmesi aktif
ADCON1=7
TMR0=0
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 0.16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

PORTB=0
PORTC=0
TRISB=%00000000   'B portu tamamı çıkış yapıldı.
TRISC=%01000000 ' C6 pini ( TX Pini) giriş yapıldı
AL VAR  BYTE
'-------------------- ANADÖNGÜ-----------------------------------
BASLA:
IF AL=50 04 68 32 11 1F  THEN PORTB.0=1 : AL=0 ' bu şekilde olur mu?
IF AL= 50 04 68 32 10 1E THEN PORTB.1=1: AL=0
GOTO BASLA
END

ete

Seri haberleşmede veri paketi kullanılır. Senin   50 04 68 32 11 dediğin şey 5 adet byte dan oluşan bir veri paketidir. Bu paketin 50 04 68 32 olan kısmı sabit bir değer dikkat edersen . Yani 4 byte lık bir işaretçi yerleştirilmiş bu paketin önüne. Dolayısıyla bunları test etmen gerekmiyor.
Senin AL olarak kullandığın değişken byte cinsinden ve bu paketin ancak 1 byte lık kısmını alıp taşıyabilir. Dolayısıyla bu şekilde kullanımda en sondaki byte 10 veya 11 iken bunlardan birini alabilir.
Bu nedenle aşağıda kullandığın ,
If AL=50 04 68 32 11. Şeklindeki ifade yanlıştır. IF AL=50 desen doğru çünki 50  bir byte lık bir değerdir.  Toparlarsak,
Veri paketi başına işaretçi eklenir "E","T","E" gibi bu gelen paketin senin istediğinmi yoksa başka bir şeymi olduğunu ayırd edilmesini sağladığı gibi veri paketinin başını da belirlemiş olur.
İşaretçi arkasından byte cinsinden bir veya bir kaç veri yollarız  . Senin örnekte işaretçi ardından iki veri yollanıyor . Birinde 10 1E, diğerinde 11 1F. O halde gelen veri kaç adet byte ise alıcıda okadar byte lık değişken kullanması gerekir. Senin örneğine bakacak olursak,
HSERIN [wait 50,04,68,32,AL1, AL2]. Şeklinde bir alma komutu eklenmesi gerekirdi.
Rakamlarla çalışmak her zaman zordur işaretçi genelde karekter olarak kullanılır.
HSERIN[WAIT("ETE ", AL1, AL2] şeklinde kullanmak daha anlamlıdır.
Bu şekilde veri alındıktan sonra ana program kısmında ,
IF AL1=$11 and AL2=$1E then portB.0=1 şeklinde kullanarak gelen bilgiye göre port pini set edilebilir.

Burada yalnızca port pini set edilecek ise 2 byte yollamakda anlamsız . Tek byte ile bu yine yapılabilir ve alma kısmında yalnızca tek değişken de kullanılabilir.
W
Senin programda daha bir sürü eksik var. Kesme kısmı yazılmamış. Usart kesmesi aktif edilmemiş.
Örnekleri incele bence.
Ete

kılıckaya

Teşekkür ederim. Anlattıklarınız doğrultusunda hareket edeceğim.

Powered by EzPortal