CAN je bezpecna zbernica primarne urcena pre male vzdialenosti.
Nizsia bezpecnost oproti RS485 je dana uz len tym, ze log.1 je makka, aby sa dala “prebit” niekym, kto prave vysiela log.0. Na kratke vzdialenosti to nie je kriticke a je to vyvazene jednoduchou realizaciou multimastrovej zostavy procesorov.
Ale iba procesorov, ktore maju priamo CAN implementovany alebo ktore komunikuju so specializovanym cipom pre obsluhu CAN. MAX3050 rozhodne takymto svabom nie je, je to len obycajny budic linky, nieco ako MAX485 (75146, SP485 a podobne) pre RS485. CAN komunikacia nie je klasicka UARTovska napr. typu 8N1, ale prenasa sa naraz viac bitov. To v nejakom jednoduchom jednocipe (na rozdiel od UARTu) tak lahko nenaprogramujes - vratane sledovania stavu linky.
RS485 je principialne odolnejsia prave pre aktivne vysielanie log. 0 i log.1 a to este v diferencialnom stave. Preto sa vyborne hodi pre prenos na vacsie vzdialenosti. I ked na tie uplne najvacsie (desiatky km) sa stale pouzivaju prudove linky. Ale len na prepojenie iba dvoch zariadeni.
Multimaster sa na RS485 riesi nasledovne:
Protokol typu Tokenring. Mastre si postupne posuvaju token, t.j. pravo vyuzivat zbernicu. System je dost narocny na managovanie.
Protokol typu casove okno. Hlavny procesor odvysiela nejaku synchro sekvenciu. Kazdy Slave, ak ma co povedat definovany cas po ukonceni synchrosekvencie odvysiela v jemu pridelenom casovom okne to, co potrebuje. System zabera velmi vela casu, ked sa caka na odpoved (okno treba vyhradit pre maximalnu dlzku spravy od Slave).
Protokol typu Ethernet. Kto co ma, to odvysiela. Podstata je, ze ten co spravu inicializuje caka, ze dostane potvrdenie o jej prevzati. Stanica pocuva linku. Ak nik nevysiela, odvysiela co chce. Aknedostane potvrdenie prevzatia spravy, asi bolo rusenie alebo bola kolizia a v jej dosledku dosla sprava skomolena. Stanica definovany cas pocka (kazda musi mat nastaveny iny cas cakania) a pokusi sa spravu odvisielat znovu.
Horeuvedene sposoby su pouzitelne, ale su vo svojej podstate bud nepruzne, alebo komplikovane.
Pre systemy s dobou odozvy sa najviac osvedcila (tu uz dost ohrnana ) metoda Master-Slave. Master postupne oslovuje vsetkych podriadenych a ti mu odpovedaju. Tento system je velmi jednoduchy na implementaciu a aj ked Slave nema nic aktualne, je dobre vediet, ze zije a je OK.
Casova narocnost procesu komunikacie nemusi byt vacsia ako par percent behu procesora. Ak pouzijes 19200 8N1 a rozumny procesor s HW UARTom. Pri pouziti ATmega32 (14.7MHz) pocas hw odvisielania jedneho bajtu spravi tento procesor cca 700 instrukcii, pocas ktorych sa komunikacii venovat nemusis. A spracovanie jedneho bajtu (samozrejme pod prerusenim, ako inak) stihnes v priebehu 30-100 instrukcii.
Ak sa ovsem program nespravi tak blbo, ze pocas vysielania jednej spravy procesor caka na jej odvisielanie.
Komunikaciu mozes naprogramovat tak, ze jednotlive Slave iba odpovedaju kratkou spravickou, mam nieco/nemam nic.
Ani nepisem o tom ako ma vyzerat struktura spravy, ako ma byt chranena aspon CHS, ako ma vyzerat binarny protokol, ako ASCII a preco, o tom sa tu ani rozpisovat nebudem, uz to tu bolo mnoho krat popisane. Pripadne si prestuduj definiciu protokolu MODBUS. Aj ked sa Ti to bude zdat na prvy pohlad zlozite, oplati sa do toho lepsie zahlbit.
Pouzit system Master/Slave s nejakym ASCII protokolom je v konecnom dosledku to najjednoduchsie, ako Tvoj problem riesit.