CANBUS mask ve filter ayarlaması

Başlatan AKIL, 23 Mayıs 2012, 15:29:35

AKIL

S.A
arkadaslar protonda canbus haberlesmesi yazdım ancak maske ve filtre bolumunu anlayamadım
merkezde duran bir (1) nolu node unite   bus'a baglı (4)nolu node unite ye bilgi gondersin microcontrolu
mesgul etmesin diyede alıcı konumundaki nodemize (4)adresini maske ve filtrelerden nasıl ayarlamalıyımki sadece (4)nolu node dısındakıler almasın
ornekte alttakı gıbı ayarladım filtreye (3)verince uzerindekileri alıyor  altındakılerı almıyor ancak sadece 4 alsın uzerindekileride almasın  diye maske ve filtreleri nasıl ayarlarım

CAN_INIT: '---------------CAN  MODUL INITIALIZATION ----------------------------
CANSetOperationMode [CAN_OP_MODE_CONFIG,NO] '
CANInitialise [CAN_CONFIG_VALID_STD_MSG] '                                                                                                                                                           
'---BUFFERLERİ TEMİZLEME   
    TXB0D0 = 0 :TXB0D1 = 0 :TXB0D2 = 0 :TXB0D3 = 0:TXB0D4 = 0 :TXB0D5 = 0 :TXB0D6 = 0 :TXB0D7 = 0'Clear Transmit buffer 0 bytes     
    TXB1D0 = 0 :TXB1D1 = 0:TXB1D2 = 0 :TXB1D3 = 0:TXB1D4 = 0 :TXB1D5 = 0 :TXB1D6 = 0 :TXB1D7 = 0 'Clear Transmit buffer 1 bytes   
    TXB2D0 = 0 :TXB2D1 = 0:TXB2D2 = 0 :TXB2D3 = 0:TXB2D4 = 0 :TXB2D5 = 0 :TXB2D6 = 0:TXB2D7 = 0 'Clear Transmit buffer 2 bytes   
    RXB0D0 = 0 :RXB0D1 = 0:RXB0D2 = 0:RXB0D3 = 0:RXB0D4 = 0:RXB0D5 = 0:RXB0D6 = 0:RXB0D7 = 0'Clear Receive buffer 0 bytes       
    RXB1D0 = 0 :RXB1D1 = 0:RXB1D2 = 0:RXB1D3 = 0:RXB1D4 = 0:RXB1D5 = 0:RXB1D6 = 0:RXB1D7 = 0'Clear Receive buffer 1 bytes   
CANSetBaudRate [1,4,6,8,5,CAN_CONFIG_PHSEG2_PRG_ON & CAN_CONFIG_SAMPLE_THRICE & CAN_CONFIG_LINE_FILTER_OFF]' 125k 20mhz-

CANSetMask [CAN_MASK_B0,3,0,0,0,STD] ',%00010100,%01100000,0,0,STD]
CANSetMask [CAN_MASK_B1,3,0,0,0,STD] ',%00010100,%01100000,0,0,STD]

CANSetFilter [CAN_FILTER_B0_F1,3,255,0,0,STD] '     
CANSetFilter [CAN_FILTER_B0_F2,3,255,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F1,3,255,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F2,3,255,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F3,3,255,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F4,3,255,0,0,STD]

CANSetOperationMode [CAN_OP_MODE_NORMAL,NO] .
Return   
'------------------------------------------------------------------------------------------

CLR

Sadece 4 nolu node'nin mesajlarını alacaksan İlgili nodenin filtresine sadece 4'ün ID'sini yazmalısın.
Knowledge and Experience are Power

AKIL

#2
uicroarm hocam
zaten sorunum nasıl yapacagımı bilmiyorum

dogrudan ID yi yazdıgımda o ID yi hic almaz oluyor digerlerine gec diyor

maskede;
RXM0   ------bu varken
RXM1   ------bu ne ise yarıyor

filtrede;
RXF0     ------bu varken alttakiler ne işe yarıyor
RXF1     ------
RXF2     ------
RXF3     ------
RXF4     ------
RXF5     ------

bu kısmı cozsem gerisi gelecek
su kadarını biliyorum 11110000  degerini verince (1) kısmı gecmiyor (0) kısmı geciyor

birde şu var
11 bit haberlesmede bitler 5 bit sola kaydırılıp gonderiliyor ID miz us bitlere tasınıyor yani sıfırıncı bitten bitten baslamıyor ornek
00000000 00000011=(3) bu iken 5 bit<< kaydırınca 00000000 01100000=96 olarak yuklenip postalanıyor
alınca 3 olarakmı 96 olarak mı filtrelememiz lazım

CLR

RXMx mask registerdir yani gelen mesajı maskeler. Yazdığın işlemcide 2 tane maskeleme registeri 6 tane filtreleme registeri var. Eğer maskeleme modunu seçersen maskeleme registerlerini kullanacaksın, filtreleme modunu seçersen filtreleme registerlerini kullanmalısın. Mesela sadece filtrelemeleri kullanırsan bu işlemci maksimum 6 tane karttan(işlemciden) can mesajı alabilir. Maskeleme registerlerini kullanırsan ise istediğin kadar çok işlemciden msj alabilirsin ama bu defa senin filtrelemen gerekir yani ID'leri karşılaştırman gerekir. Örneğin maskeleme registerlerini kullanarak son 4 biti maskelersen(silersen) bu durumda 16karttan okuma yapabilirsin ama geri kalan 4 biti sen filtrelemen gerekir hangi karttan geldiğini anlamak için. Sanırım bu açıklayıcı olmuştur.

Bit kaydırma olayısı ise PIC'e özgü, Extended ID ile standart ID registerleri ortak kullanılıyor bu nedenle bahsettiğin gibi bit kaydırma işlemi yapılarak doğru adrese doğrı ID yerleştiriliyor bu olay PIC'in special registerleriyle alakalı bir durum yani.  Eğer 6'dan fazla karttan msj almayacaksan filtreleme registerlerini kullanmanı öneririm yoksa işlemcin paso can interrupt'a gider.
Knowledge and Experience are Power

AKIL

uicroarm hocam cok tesekkurler
verdiğin bilgiler ısığında uygulamaya çalasacagım
buraya kadar yanlıs bildigim tx_ID olarak yukleyıp  gonderdigim kimlik bilgisini alıcının kimliği olarak biliyordum
gonderenin kimliği oldugunuda sizden oğrenmiş oldum dolayısı ile  tasların yeri degişti
zaten filtre çalısacagım ama maskenin neden iki adet oldugunuda
rxm0 node_ID yi
rxm1 ise maseaj_ID yi  maskelemek için oldugunu anlıyorum
tekrar tesekkurler

tmcone

Alıntı yapılan: uicroarm - 23 Mayıs 2012, 21:47:51
RXMx mask registerdir yani gelen mesajı maskeler. Yazdığın işlemcide 2 tane maskeleme registeri 6 tane filtreleme registeri var. Eğer maskeleme modunu seçersen maskeleme registerlerini kullanacaksın, filtreleme modunu seçersen filtreleme registerlerini kullanmalısın. Mesela sadece filtrelemeleri kullanırsan bu işlemci maksimum 6 tane karttan(işlemciden) can mesajı alabilir. Maskeleme registerlerini kullanırsan ise istediğin kadar çok işlemciden msj alabilirsin ama bu defa senin filtrelemen gerekir yani ID'leri karşılaştırman gerekir. Örneğin maskeleme registerlerini kullanarak son 4 biti maskelersen(silersen) bu durumda 16karttan okuma yapabilirsin ama geri kalan 4 biti sen filtrelemen gerekir hangi karttan geldiğini anlamak için. Sanırım bu açıklayıcı olmuştur.

Bit kaydırma olayısı ise PIC'e özgü, Extended ID ile standart ID registerleri ortak kullanılıyor bu nedenle bahsettiğin gibi bit kaydırma işlemi yapılarak doğru adrese doğrı ID yerleştiriliyor bu olay PIC'in special registerleriyle alakalı bir durum yani.  Eğer 6'dan fazla karttan msj almayacaksan filtreleme registerlerini kullanmanı öneririm yoksa işlemcin paso can interrupt'a gider.

Identifier ile mask register ları  birbirinden bağımsız görülmemeli. STM32'lerdeki Mask mod ile Identifier List mod yanlış bir değerlendirmeye sebep olmuş(konu hakkında hiçbir bilgisi olmayanlar için).  Gelen mesaj bu iki registerdaki değer dikkate alınarak kabul ya da red edilir. Mask registerındaki değer ID(filter) registerindaki hangi bitlerin karşılaştırmada kullanılacağını belirtir. Bu değer mikroişlemci mimarileri arasında farklılık gösterebilmekte. Örneğin dspic33f ve dspic30f lerde n. mask bitinin 1 olması ID registerındaki n. bitin gelen mesajın id'sindeki n. bit ile karşılaştırmada dikkate alınacağını gösterir. Eğer mask registerındaki bit  0 ise ID registerındaki ilgili bitin değerinin hiçbir önemi yoktur yani dikkate alınmaz. Buna karşın Freescale MSCAN modülünde ise mask bitinin 0 olması ilgili bitin karşılaştırmada kullanılacağını belirtir.  Dolayısıyla bu registerları atama yapmadan önce  işlemcinin ref. manual ini iyice okumak gerekli.

@AKIL
Kullandığın işlemciyi belirtmemişsin. 6 filtren olması 6 farklı ID registerına sahip olduğunu gösterir. Muhtemelen her bir filtre için 2 mask registerından birini seçebilirsin (dspic33flerde buna benzer bi yapı mevcut). Ayrıca gelen mesajın hangi filtreden geçip kabul edildiğini gösteren bir registerin olmalı (FILHIT vb.)


CLR

#6
Alıntı yapılan: tmcone - 23 Mayıs 2012, 23:38:13
Identifier ile mask register ları  birbirinden bağımsız görülmemeli. STM32'lerdeki Mask mod ile Identifier List mod yanlış bir değerlendirmeye sebep olmuş(konu hakkında hiçbir bilgisi olmayanlar için).  Gelen mesaj bu iki registerdaki değer dikkate alınarak kabul ya da red edilir. Mask registerındaki değer ID(filter) registerindaki hangi bitlerin karşılaştırmada kullanılacağını belirtir. Bu değer mikroişlemci mimarileri arasında farklılık gösterebilmekte. Örneğin dspic33f ve dspic30f lerde n. mask bitinin 1 olması ID registerındaki n. bitin gelen mesajın id'sindeki n. bit ile karşılaştırmada dikkate alınacağını gösterir. Eğer mask registerındaki bit  0 ise ID registerındaki ilgili bitin değerinin hiçbir önemi yoktur yani dikkate alınmaz. Buna karşın Freescale MSCAN modülünde ise mask bitinin 0 olması ilgili bitin karşılaştırmada kullanılacağını belirtir.  Dolayısıyla bu registerları atama yapmadan önce  işlemcinin ref. manual ini iyice okumak gerekli.

@AKIL
Kullandığın işlemciyi belirtmemişsin. 6 filtren olması 6 farklı ID registerına sahip olduğunu gösterir. Muhtemelen her bir filtre için 2 mask registerından birini seçebilirsin (dspic33flerde buna benzer bi yapı mevcut). Ayrıca gelen mesajın hangi filtreden geçip kabul edildiğini gösteren bir registerin olmalı (FILHIT vb.)


Yazdıklarım yanlış anlaşılmış olabilir, Filter registerler ile mask registerleri ister beraber kullanırsın istersen ayrık, ister sadece maskeleme yaparsın istersen sadece filtreleme veya ikiside, bu programı yazana kişiye kalmış. Can mantığı tüm işlemcilerde aynıdır sadece filtre sayısı, maske register sayısı, Rx ve tx buffer sayısı vs değişir. Mesela hiç maskelemezsin busta 50 tane can source olsun hepsinin bastığı datayı alırsın veya bir filtre kullanırım sadece içinden 1'ini alırsın.   
Knowledge and Experience are Power

AKIL

hocam kullandıgım microcontroller pic 18f4680  ve 18f2680    sadece  3-4 nolu nodelerden gelen bilgiyi almak istersem asagıdakı degerlerımı lutfen yazarmısınız.

                                              0 1 2 3----------------byte sırası boyle 11 bit oldugu icin 0 ve 1 kullanılacak
CANSetMask [CAN_MASK_B0,0,0,0,0,STD] '
CANSetMask [CAN_MASK_B1,0,0,0,0,STD] '

CANSetFilter [CAN_FILTER_B0_F1,0,0,0,0,STD] '     
CANSetFilter [CAN_FILTER_B0_F2,0,0,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F1,0,0,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F2,0,0,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F3,0,0,0,0,STD]
CANSetFilter [CAN_FILTER_B1_F4,0,0,0,0,STD]


CLR

Basicten hiç anlamam,
Sadece bileceğin mask0 ile filtre registerlerinden 0 ve 1 kullanılır diğerleri mask 2 registeriyle kullanılır. Sen mask 0 veya mask1 ikisidenden birini kullanabilirsin. Mask registerlerinden geçmesini istediğin kadar biti 0 yapıyorsun yani maskelemiyorsun, gelen geçiyor. Diğerlerini 1 yapıyorsun. mesela mask0 registerini kullanırsan Filtre 0 ve 1'e, senin 3. ve 4. node'ler için kullandığın TX ID'lerini yazıyorsun. Tümü bu kadar. Böylece bu ID2ler geçer diğerleri geçemez
Knowledge and Experience are Power

AKIL


M_B

Merhabalar;
Toplam elimde 6 adet modul ( node) var. Modulun bir tanesini Master yapıp diğer 5 adetinden
belli aralıklarla bilgi almak istiyorum.
node ların hepsine bir ID tanımlayıp Master istedigi ID den bilgiyi alacak.
node lar Masterden gelen bilgi (istek ) dogrultusunda cevap verecek. nodelar arasında filtreleme
yapmak istiyorum ama nasıl yapıldığını ve mantıgını anlayamadım. Yani node lar kendi arasında iletişim kurmasını istemiyorum.
Can bus 'ın da filtreleme ozelliğini öğrenmek ve kullanmak istiyorum.

_CAN_FILTER_B1_F1 = 0,
    _CAN_FILTER_B1_F2 = 1,
    _CAN_FILTER_B2_F1 = 2,
    _CAN_FILTER_B2_F2 = 3,
    _CAN_FILTER_B2_F3 = 4,
    _CAN_FILTER_B2_F4 = 5;

burdaki tamımlamalardaki değerlerin anlamı nedir. Nasıl bir işlem yapıyor/yaptırıyor. İstenilen bitleri mi maskeliyor.

Nette buldugum ornek ve acıklama
CANSetMask(_CAN_MASK_B2, 0xFFFFFFFE, _CAN_CONFIG_XTD_MSG);      
 CANSetFilter(_CAN_FILTER_B2_F4, 12345, _CAN_CONFIG_XTD_MSG);

Alıntı Yap
This will set mask for second receive buffer to 0xFFFFFFFE which means that Least Significant Bit (LSB) in ID will be ignored.
Also it will set fourth filter for second buffer to ID = 12345.

As result of this, when message with ID 12345 or 12344 occur it will be accepted and stored in second receive buffer.

As you can see this way you set one mask and one filter and are able to receive two different IDs.
All you need to do is to list all IDs that you want to accept and accordingly set both masks and all filters.
Burdaki acıklamadan bir şey anlayamadım.
Kısaca anlatabilecek/acıklayacak arkadaşa şimdiden teşekkür ederim.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ErsinErce

ethernet teki ip adres ve subnet mask olayını biliyorsanız o yapı burada da geçerli
can_filter IP adres olurken can_mask subnet mask oluyor.

Filtre 12345 ayarlı ve maske (255)(255)(255)(254) 0xFFFFFFFe ayarlı ise 12344 ve 12345 mesajları gelirse okuyabiliyorsunuz