<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=55&amp;t=1183&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-06-30T16:39:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=55&amp;t=1183&amp;mode</id>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-30T16:39:30+01:00</updated>
<published>2012-06-30T16:39:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8831#p8831</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8831#p8831"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8831#p8831"><![CDATA[
No obiecałem że dziś zakończymy to przynudzanie i będzie można sobie podyskutować o CAN-ie i nie tylko<br />upał trochę zelżał i po spacerze mam trochę energii (alternatywnej oczywiście i z odnawialnych źródeł).<br />Więc możemy powoli zakończyć ....<br /><br />Jak poprzednio wspomniałem jedna z zalet magistrali CAN (lub bardziej precyzyjnie to określimy -&gt; kontrolera CAN) jest <br />fakt umożliwiający filtrowanie wiadomości. Nasz kontroler posiada 2 filtry dla bufora 0 i jeszcze 4 na buforze 1. Dzięki <br />temu wiadomości które nie są przeznaczone dla naszego urządzenia , mogą być &quot;odfiltrowane&quot; bez użycia Mikrokontrolera.<br />Częściowo przedstawię zależności filtrów w tabelce :<br /><br /><br /><br />Jak widzicie poszczególne bity ID Wiadomości są używane do filtrowania tylko wtedy gdy jest ustawiony odpowiedni Bit w MASCE.<br />Jeśli więc chcecie po testować otrzymywanie wszystkich komunikatów, wystarczy w masce ustawić wszystkie bity na dominujące,<br />czyli 0. Kontroler będzie wtedy wiedział że wszystkie wiadomości niezależnie od ID zostaną przekazane do bufora.<br />Popatrzcie tak wygląda kompletny kod inicjalizacji dla naszego MSP2515:<br /><br />[syntax=c]void mcp2515_init(void)<br />{<br />    // Inicjalizacja SPI<br />    spi_init();<br />    <br />    // Wprowadzenie MCP w tryb konfiguracji<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    spi_putc( SPI_RESET );<br />    _delay_ms(1);<br />    PORT_CS |= (1&lt;&lt;P_CS);<br />    <br />    // Trzeba dać chwilkę czasu by MCP mogło się ustawić<br />    _delay_ms(10);<br />    <br />    /* <br />     *  Dostosowanie Bit Timings<br />     *  <br />     *  Fosc       = 16MHz<br />     *  BRP        = 7                <br />     *  TQ = 2 * (BRP + 1) / Fosc  (=&gt; 1 uS)<br />     *  <br />     *  Sync Seg   = 1TQ<br />     *  Prop Seg   = (PRSEG + 1) * TQ  = 1 TQ<br />     *  Phase Seg1 = (PHSEG1 + 1) * TQ = 3 TQ<br />     *  Phase Seg2 = (PHSEG2 + 1) * TQ = 3 TQ<br />     *  <br />     *  Bus speed  = 1 / (Total # of TQ) * TQ<br />     *             = 1 / 8 * TQ = 125 kHz<br />     */<br />    <br />    // BRP = 7<br />    mcp2515_write_register( CNF1, (1&lt;&lt;BRP0)|(1&lt;&lt;BRP1)|(1&lt;&lt;BRP2) );<br />    // regulacja fazy dla SEG1<br />    mcp2515_write_register( CNF2, (1&lt;&lt;BTLMODE)|(1&lt;&lt;PHSEG11) );<br />    <br />    // Wake-up wyłączony , dopasowanie fazy SEG2<br />    mcp2515_write_register( CNF3, (1&lt;&lt;PHSEG21) );<br />    <br />    // Właczenie przerwania Rx Bufor<br />    mcp2515_write_register( CANINTE, (1&lt;&lt;RX1IE)|(1&lt;&lt;RX0IE) );<br />    <br />    <br />    <br />    // Bufor 0 : Odbieranie wszystkich wiadomości<br />    mcp2515_write_register( RXB0CTRL, (1&lt;&lt;RXM1)|(1&lt;&lt;RXM0) );<br />    <br />    // Bufor 1 : Odbieranie wszystkich wiadomości<br />    mcp2515_write_register( RXB1CTRL, (1&lt;&lt;RXM1)|(1&lt;&lt;RXM0) );<br />    <br />    // Wszystkie bity MASKI ustawiamy na 0<br />   <br />    mcp2515_write_register( RXM0SIDH, 0 );<br />    mcp2515_write_register( RXM0SIDL, 0 );<br />    mcp2515_write_register( RXM0EID8, 0 );<br />    mcp2515_write_register( RXM0EID0, 0 );<br />    <br />    mcp2515_write_register( RXM1SIDH, 0 );<br />    mcp2515_write_register( RXM1SIDL, 0 );<br />    mcp2515_write_register( RXM1EID8, 0 );<br />    mcp2515_write_register( RXM1EID0, 0 );<br />    <br />    // Ustawienia funkcji PINÓW IO<br />    <br />    // wyłaczenie Pinów RXnBF --&gt; ustawienie na HIS  (High Impedance State)<br />    mcp2515_write_register( BFPCTRL, 0 );<br />    <br />    // TXnRTS ustawiamy jako wejścia <br />    mcp2515_write_register( TXRTSCTRL, 0 );<br />    <br />    // Przełączenie MCP w tryb offsetowy (normalny tryb pracy)<br />    mcp2515_bit_modify( CANCTRL, 0xE0, 0);<br />}[/syntax]<br /><br />Oczywiście można to zrobić bardziej elegancko i wysłać cały zestaw danych prosto do rejestrów, ale <br />byłoby to mało czytelne.  Jak więc widzicie doszliśmy do takiego momentu naszego wywodu , w którym <br />już niewiele nam brakuje by wysłać pierwszą wiadomość przez CAN. Żeby nie utrudniać zajmiemy się <br />wysłaniem wiadomości z ID 11bit. Oczywiście jak będziecie chcieli bez problemu przerobicie sobie<br />do ID rozszerzonych czyli 29 bitów.  W tym miejscu wypadało by jednak bym tradycyjnie coś namieszał <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Co zresztą uczynię z premedytacją i pełną świadomością faktu że jest to moja złośliwość <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br />Więc bez dalszego owijania w bawełnę czy coś innego powiem wam w tajemnicy, że nasz malutki kontroler <br />jakim jest dzielny MCP2515 ma aż 3 bufory nadawania i do tego z niezależnymi  ustawieniami priorytetu. <br />Dzięki czemu nasze zadanie czyli wysłanie wiadomości jest banalnie proste i sprowadza się tylko<br />do rejestracji odpowiedniego ID, wypełnienia pola danych i już ... można wysłać wiadomość <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Oczywiście jest jednak jedno małe ale .....<br />mianowicie są trzy różne sposoby by wysłać wiadomość <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />-- przez ustawienie odpowiednich bitów w rejestrze TXBnCTRL<br />-- przez wysłanie poleceń RTS  po SPI<br />-- ustawienie stanu niskiego dla odpowiednich bitów TXnRTS buforów<br /><br />Przykład wysłania wiadomości może być następujący:<br /><br />[syntax=c]// Wysyłamy wiadomość z bufora0<br />// 2 bajty danych (0x04, 0xf3)<br />// ID: 0x0123<br /> <br />uint16_t id = 0x0123;<br /><br />// ustawiamy Bufor na najwyższy priorytet<br />mcp2515_bit_modify( TXB0CTRL, (1&lt;&lt;TXP1)|(1&lt;&lt;TXP0), (1&lt;&lt;TXP1)|(1&lt;&lt;TXP0) );<br /><br />// ID <br />mcp2515_write_register(TXB0SIDH, (uint8_t) (id&gt;&gt;3));<br />mcp2515_write_register(TXB0SIDL, (uint8_t) (id&lt;&lt;5));<br /><br />// Długość wiadomości + zestaw bitów  RTR<br />mcp2515_write_register(TXB0DLC, 2);<br /><br />// Dane<br />mcp2515_write_register(TXB0D0, 0x04);<br />mcp2515_write_register(TXB0D1, 0xf3);<br /><br />//Można wysyłać ....<br />PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />spi_putc(SPI_RTS | 0x01);<br />PORT_CS |= (1&lt;&lt;P_CS);[/syntax]<br /><br />Jakoś poszło no nie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ale to mało elegancki sposób takie pakowanie bezpośrednie bardziej optymalne jest wysyłanie do bufora <br />określonych danych co też umożliwi nam wymianę danych między funkcjami i dlatego w tym celu lepiej pakować dane <br />w struktury <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> np. tak:<br /><br />[syntax=c]typedef struct <br />{<br />    uint16_t  id;<br />    uint8_t   rtr;<br />    uint8_t   length;<br />    uint8_t   data&#91;8&#93;;<br />} CANMessage;<br /><br />// Utwórz nową wiadomość<br />CANMessage message;<br /><br />// Dane<br />message.id = 0x0123;<br />message.rtr = 0;<br />message.length = 2;<br />message.data&#91;0&#93; = 0x04;<br />message.data&#91;1&#93; = 0xf3;<br /><br />// Wyślij wiadomość<br />can_send_message(&amp;message);[/syntax]<br /><br />Prawda że lepiej to wygląda ?? teraz wystarczy strukturę przekazać do Funkcji wysyłającej :<br /><br />[syntax=c]void can_send_message(CANMessage *p_message)<br />{<br />    uint8_t length = p_message-&gt;length;<br />    <br />    // ID Wiadomości<br />    mcp2515_write_register(TXB0SIDH, (uint8_t) (p_message-&gt;id&gt;&gt;3));<br />    mcp2515_write_register(TXB0SIDL, (uint8_t) (p_message-&gt;id&lt;&lt;5));<br />    <br />    //  RTR &quot;Remote Transmit Request&quot;<br />    if (p_message-&gt;rtr)<br />    {<br />        // wiadomość RTR ma długość , ale nie zawiera danych<br />        <br />        // Ustawienie długości  + RTR<br />        mcp2515_write_register(TXB0DLC, (1&lt;&lt;RTR) | length);<br />    }<br />    else<br />    {<br />        // Ustawienie długości komunikatu<br />        mcp2515_write_register(TXB0DLC, length);<br />        <br />        // Czas na DANE<br />        for (uint8_t i=0;i&lt;length;i++) {<br />            mcp2515_write_register(TXB0D0 + i, p_message-&gt;data&#91;i&#93;);<br />        }<br />    }<br />    <br />    // Wszystko pasuje można wysyłać wiadomość<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    spi_putc(SPI_RTS | 0x01);<br />    PORT_CS |= (1&lt;&lt;P_CS);<br />}[/syntax]<br /><br />Oczywiście można funkcje bardziej rozbudować , i używać dzięki temu do wysyłania pierwszego wolnego buforu<br />w którym bit TXREQ  w rejestrze TXBnCTRL  gdzie  n to numer bufora. Jest tęż to łatwiejsze dzięki dodatkowym poleceniom <br />SPI <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> jaką jest np. komenda RSI  (Read Status Instruction).<br /><br />W przeciwieństwie jednak do powyższych przykładów teraz nie będziemy korzystać z &quot;prefabrykowanych&quot; funkcji rejestrów,<br />dodatkowo przyspieszymy transmisję wysyłając dane bezpośrednio na SPI, które następnie będą przechowywane <br />w odpowiednich rejestrach MCP2515.<br /><br />[syntax=c]uint8_t can_send_message(CANMessage *p_message)<br />{<br />    uint8_t status, address;<br />    <br />    // Odczyt statusu MCP2515<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    spi_putc(SPI_READ_STATUS);<br />    status = spi_putc(0xff);<br />    spi_putc(0xff);<br />    PORT_CS |= (1&lt;&lt;P_CS);<br />    <br />    /* Znaczenie bitów statusu:<br />     *<br />     * Bit  Funkcja<br />     *  2   TXB0CNTRL.TXREQ<br />     *  4   TXB1CNTRL.TXREQ<br />     *  6   TXB2CNTRL.TXREQ<br />     */<br />    <br />    if (bit_is_clear(status, 2)) {<br />        address = 0x00;<br />    }<br />    else if (bit_is_clear(status, 4)) {<br />        address = 0x02;<br />    } <br />    else if (bit_is_clear(status, 6)) {<br />        address = 0x04;<br />    }<br />    else {<br />        // Wszystkie bufory są w użyciu --- nie można wysłać wiadomości<br />        return 0;<br />    }<br />    <br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);    // CS = Low<br />    spi_putc(SPI_WRITE_TX | address);<br />    <br />    //11bitowego ID <br />    spi_putc((uint8_t) (p_message-&gt;id&gt;&gt;3));<br />    spi_putc((uint8_t) (p_message-&gt;id&lt;&lt;5));<br />    <br />    //29bitowe  ID <br />    spi_putc(0x00);<br />    spi_putc(0x00);<br />    <br />    uint8_t length = p_message-&gt;length;<br />    <br />    if (length &gt; 8) {<br />        length = 8;<br />    }<br />    <br />    // czy pojawił się RTR  --  &quot;Remote Transmit Request&quot; ?<br />    if (p_message-&gt;rtr)<br />    {      <br />        // Ustawienie długości + RTR <br />        spi_putc((1&lt;&lt;RTR) | length);<br />    }<br />    else<br />    {<br />        //ustawienie długości komunikatu<br />        spi_putc(length);<br />        <br />        // Dane<br />        for (uint8_t i=0;i&lt;length;i++) {<br />            spi_putc(p_message-&gt;data&#91;i&#93;);<br />        }<br />    }<br />    PORT_CS |= (1&lt;&lt;P_CS);      // CS = High<br />    <br />    asm volatile (&quot;nop&quot;);<br />    <br />    // Wysyłamy komunikaty do ...<br />    // 3 ostatnie bity w poleceniu RTS określają który bufor ma być wysłany<br /><br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);    // CS = Low<br />    if (address == 0x00) {<br />        spi_putc(SPI_RTS | 0x01);<br />    } else {<br />        spi_putc(SPI_RTS | address);<br />    }<br />    PORT_CS |= (1&lt;&lt;P_CS);      // CS = High<br />    <br />    return 1;<br />}[/syntax]<br /><br />Teoretycznie może się też zdarzyć tak, że  będziecie wysyłać wiele wiadomości jedna po drugiej. Pamiętajcie, że jako pierwszy<br />zostanie wysłany ten bufor , który ma najwyższy priorytet. Aby temu zapobiec , powinniście się starać o to by zawsze mieć <br />bufor z którego chcecie wysyłać wiadomości bieżące ustawiony na najniższy priorytet i zwiększać priorytet pozostałych <br />o 1. Wtedy macie pewność że wiadomości będą wysłane w takiej kolejności w jakiej były wpisane do buforów. <br /><br />I pozostało nam już w zasadzie tylko odbieranie wiadomości.<br /><br />No tu troszkę schodów nas czeka  bo musimy określić czy wiadomość jest nowa , a to zależy od konfiguracji MCP2515<br />i można oczywiście to tez zrealizować na kilka sposobów.<br /><br />--- stanem piny RXnBF<br />--- LInią IRQ<br />--- Poleceniami SPI<br /><br />Oczywiście, żeby było trudniej można te sposoby łączyć ze sobą . Bardzo przydatne jest w jednym z przypadków uruchomienie<br />IRQ i sprawdzenie stanu na Mikrokontrolerze, wtedy widać czy są nowe wiadomości czy nie, a następnie pobrać przez <br />polecenia SPI bufora, w którym jest wiadomość. I w sumie tym przypadkiem zajmiemy się teraz.<br /><br />W celu wykorzystania IRQPin i sprawdzeniu czy jest nowa wiadomość jak sie zapewne domyślacie musimy go najpierw ustawić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Wykonujemy to podczas Inicjalizacji  i potem możemy sobie cierpliwie czekać aż na IRQPin pojawi się stan NISKI, co informuje<br />nas o tym że możemy odczytać nową wiadomość. Ale musimy też ustalić teraz gdzie jest ta nowa wiadomość (w którym buforze) <br />, a może jest to coś innego ?? np (STD ID, EXT ID, RTR itp <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jest to proste bo MCP2515 ma taką extra komendę SPI pozwalającą na alternatywną ocenę rejestru CANINTF <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]uint8_t mcp2515_read_rx_status(void)<br />{<br />    uint8_t data;<br />    <br />    // /CS = LOW<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    <br />    spi_putc(SPI_RX_STATUS);<br />    data = spi_putc(0xff);<br />    <br />    // Ponowne wysłanie danych<br />    // Musimy ocenić więc 1 z 2ch  bajtów<br />    spi_putc(0xff);<br />    <br />    // /CS  uwolniony :)<br />    PORT_CS |= (1&lt;&lt;P_CS);<br />    <br />    return data;<br />}[/syntax]<br /><br />Dlatego łatwiej i lepiej jest najpierw sprawdzić czy IRQPin  jest w stanie Niskim czy nie i jeśli  jest to odbieramy <br />mową wiadomość:<br /><br />[syntax=c]uint8_t can_get_message(CANMessage *p_message)<br />{<br />    // Odczyt stanu<br />    uint8_t status = mcp2515_read_rx_status();<br /><br />    if (bit_is_set(status,6))<br />    {<br />        // Wiadomość w buforze 0<br />        <br />        PORT_CS &amp;= ~(1&lt;&lt;P_CS);    // CS = Low<br />        spi_putc(SPI_READ_RX);<br />    }<br />    else if (bit_is_set(status,7))<br />    {<br />        // Wisdomość w buforze 1<br />        <br />        PORT_CS &amp;= ~(1&lt;&lt;P_CS);    // CS = Low<br />        spi_putc(SPI_READ_RX | 0x04);<br />    }<br />    else {<br />        /* BŁĄD:  Brak nowych wiadomości !*/<br />        return 0xff;<br />    }<br />    <br />    // dla Standardowego ID<br />    p_message-&gt;id =  (uint16_t) spi_putc(0xff) &lt;&lt; 3;<br />    p_message-&gt;id |= (uint16_t) spi_putc(0xff) &gt;&gt; 5;<br />    <br />    spi_putc(0xff);<br />    spi_putc(0xff);<br />    <br />    // długość odczytu<br />    uint8_t length = spi_putc(0xff) &amp; 0x0f;<br />    p_message-&gt;length = length;<br />    <br />    // Odczyt danych <br />    for (uint8_t i=0;i&lt;length;i++) {<br />        p_message-&gt;data&#91;i&#93; = spi_putc(0xff);<br />    }<br />    <br />    PORT_CS |= (1&lt;&lt;P_CS);<br />    <br />    if (bit_is_set(status,3)) {<br />        p_message-&gt;rtr = 1;<br />    } else {<br />        p_message-&gt;rtr = 0;<br />    }<br />    <br />    // Flaga przerwania skasowana<br />    if (bit_is_set(status,6)) {<br />        mcp2515_bit_modify(CANINTF, (1&lt;&lt;RX0IF), 0);<br />    } else {<br />        mcp2515_bit_modify(CANINTF, (1&lt;&lt;RX1IF), 0);<br />    }<br />    <br />    return (status &amp; 0x07);<br />}[/syntax]<br /><br />Jak widać praktycznie rutynowa obsługa SPI <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> , pobieramy informacje o typie wiadomości, i buforze z wiadomością . Następnie<br />odczytujemy dane z właściwych rejestrów. Dla komunikatów z EXT ID (29bit) jest obsługa w pierwszej kolejności. Funkcja <br />Filtrująca zwraca numer , przez który wiadomość zostanie wysłana z powrotem, a jeśli niema żadnych nowych wiadomości <br />do odczytania zwraca komunikat o błędzie - wartość 0xff. I to by było na tyle jęsli chodzi o implementacje CANA dla <br />mikrokontrolerów AVR jak nasza ATMega8 użyta do testu. Teraz powinniście już umieć wysłać i odebrać wiadomość<br />przez magistrale CAN. Oczywiście nasz tort jeszcze nie ma wiśienki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  bo pewnie się już połapaliście że używam jakiejś <br />magicznej biblioteki i plików dodatkowych. TAk to prawda dlatego też przygotuje tą wisienkę wraz z małym programikiem<br />który wysyła i odbiera bzdury z CANA <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, a właściwie to wykonuje tylko inicjalizacje MSP2515, przełącza w tryb pętli zwrotnej <br />co powoduje że wiadomość jest wysłana tylko wewnętrznie,  odbiera ją i przechodzi do normalnego trybu, w którym ponawia<br />wysłanie wiadomości na magistrale CAN i oczekuje przychodzących.<br /><br />Mam nadzieję że was nie zanudziłem na śmierć , i że zrozumieliście że CAN jest ciekawą alternatywą dla USARTA i pożądaną,<br />a jednocześnie nie jest ani skomplikowany , ani kosztowny w implementacji. Oczywiście polecam korzystać ze sprzętowego<br />SPI. Czytać notę, i odpowiednie rozdziały traktujące o SPI w książce Mirka. <br /><br />TO JUŻ WSZYSTKO PANOWIE ....<br />PLIKI UMIESZCZĘ TUTAJ JAK BĘDĄ GOTOWE DO PUBLIKACJI , ORAZ ODPOWIEDNI ZESTAW INO dla ARDUINOWCÓW.<br /><br />-- 1 lip 2012, o 14:38 --<br /><br />Obiecałem, że będzie też CAN dla Arduinowców  ... tu sprawa jest prosta i wręcz nie wymagająca żadnego opisu, jak to w Arduino.<br />Całość sprowadza się do zakupienia lub zrobienia sobie CAN-Shielda. Wszystko co potrzeba jest dostępne na stronie<br />sparkfuna  :  <!-- m --><a class="postlink" href="http://www.sparkfun.com/products/10039" >http://www.sparkfun.com/products/10039</a><!-- m --><br />a biblioteka dla Arduino jest do pobrania pod tym adresem:<br /><!-- m --><a class="postlink" href="http://code.google.com/p/sparkfun-arduino-can-shield-code/downloads/detail?name=CANInterface.zip&amp;can=2&amp;q=" >http://code.google.com/p/sparkfun-ardui ... p&amp;can=2&amp;q=</a><!-- m --><br />Użycie jak to w Arduino jest proste i bez problemowe  więc nie będę się rozwodził nad tym. <br /><br />Życzę miłej zabawy ..  z magistralą CAN oraz zapraszam do dyskusji w nowym temacie.<br /><br />-- 1 lip 2012, o 22:27 --<br /><br />Jak obiecałem , oto przykładowy programik demonstrujący działanie kontrolera CAN, <br />Na tej podstawie możecie już napisać co wam się podoba panowie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />I przesyłać co chcecie przez magistralę CAN.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;inttypes.h&gt;<br /><br />#include &quot;uart.h&quot;<br />#include &quot;mcp2515.h&quot;<br />#include &quot;global.h&quot;<br />#include &quot;defaults.h&quot;<br /><br />// ----------------------------------------------------------------------------<br /><br />#definePRINT(string, ...)printf_P(PSTR(string), ##__VA_ARGS__)<br /><br />static int putchar__(char c, FILE *stream) {<br />uart_putc(c);<br />return 0;<br />}<br /><br />static FILE mystdout = FDEV_SETUP_STREAM(putchar__, 0, _FDEV_SETUP_WRITE);<br /><br />// -------------------------------------------------------------------------------------------------------------------<br />void print_can_message(tCAN *message)<br />{<br />uint8_t length = message-&gt;header.length;<br /><br />PRINT(&quot;id:     0x%3x\n&quot;, message-&gt;id);<br />PRINT(&quot;len: %d\n&quot;, length);<br />PRINT(&quot;rtr:    %d\n&quot;, message-&gt;header.rtr);<br /><br />if (!message-&gt;header.rtr) {<br />PRINT(&quot;dane:  &quot;);<br /><br />for (uint8_t i = 0; i &lt; length; i++) {<br />PRINT(&quot;0x%02x &quot;, message-&gt;data&#91;i&#93;);<br />}<br />PRINT(&quot;\n&quot;);<br />}<br />}<br /><br />// ------------------------------------------------------------------------------------------------------------------<br />// Program Główny<br /><br />int main(void)<br />{<br />// UART<br />uart_init(UART_BAUD_SELECT(9600UL, F_CPU));<br /><br />// Włączenie Przerwań<br />sei();<br /><br />// Przekierowanie standardowego wyjścia =&gt; Od teraz możemy użyć printf ()<br />stdout = &amp;mystdout;<br /><br />// MCP2515 <br />if (!mcp2515_init()) {<br />PRINT(&quot;Błąd: MCP2515 nie gotowy\n&quot;);<br />for (;;);<br />}<br />else {<br />PRINT(&quot;MCP2515 aktywny\n\n&quot;);<br />}<br /><br />PRINT(&quot;Tworzenie wiadomości\n&quot;);<br />tCAN message;<br /><br />// Niektóre wartości<br />message.id = 0x123;<br />message.header.rtr = 0;<br />message.header.length = 2;<br />message.data&#91;0&#93; = 0xab;<br />message.data&#91;1&#93; = 0xcd;<br /><br />print_can_message(&amp;message);<br /><br />PRINT(&quot;\Tryb Loopback\n\n&quot;);<br />mcp2515_bit_modify(CANCTRL, (1&lt;&lt;REQOP2)|(1&lt;&lt;REQOP1)|(1&lt;&lt;REQOP0), (1&lt;&lt;REQOP1));<br /><br />// Wyślij wiadomość<br />if (mcp2515_send_message(&amp;message)) {<br />PRINT(&quot;Wisdomość zapisana w buforze\n&quot;);<br />}<br />else {<br />PRINT(&quot;Błąd: Nie można wysłać wiadomości\n&quot;);<br />}<br /><br />// No to chwilkę poczekamy<br />_delay_ms(10);<br /><br />if (mcp2515_check_message()) {<br />PRINT(&quot;Odebrano wiadomość!\n&quot;);<br /><br />// odczyt wiadomości z buforów<br />if (mcp2515_get_message(&amp;message)) {<br />print_can_message(&amp;message);<br />PRINT(&quot;\n&quot;);<br />}<br />else {<br />PRINT(&quot;Błąd: Nie można odczytać wiadomości\n\n&quot;);<br />}<br />}<br />else {<br />PRINT(&quot;Błąd: Nie odebrano wiadomości\n\n&quot;);<br />}<br /><br />PRINT(&quot;Powrót do normalnego trybu\n\n&quot;);<br />mcp2515_bit_modify(CANCTRL, (1&lt;&lt;REQOP2)|(1&lt;&lt;REQOP1)|(1&lt;&lt;REQOP0), 0);<br /><br />// Ponowne podłączenie do magistrali CAN<br /><br />PRINT(&quot;Próba wysłania wiadomości przez CAN\n&quot;);<br /><br /><br />if (mcp2515_send_message(&amp;message)) {<br />PRINT(&quot;Wiadomość została napisana w buforze\n\n&quot;);<br />}<br />else {<br />PRINT(&quot;Błąd: Nie można wysłać wiadomości\n\n&quot;);<br />}<br /><br />PRINT(&quot;Oczekiwanie na odebranie wiadomości\n\n&quot;);<br /><br />while (1) {<br />// Czekaj, aż pojawi się wiadomość<br />if (mcp2515_check_message()) {<br />PRINT(&quot;Odebrano wiadomość!\n&quot;);<br /><br />//  Czytanie wiadomości z buforów MCP2515<br />if (mcp2515_get_message(&amp;message)) {<br />print_can_message(&amp;message);<br />PRINT(&quot;\n&quot;);<br />}<br />else {<br />PRINT(&quot;Nie można odczytać wiadomości\n\n&quot;);<br />}<br />}<br />}<br /><br />return 0;<br />}[/syntax]<br /><br />No panowie mam nadzieję że jest to jasne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Potrzebna biblioteka i pliki nagłówkowe w załączniku , nie jest mojego autorstwa , ale używam jej dosyć często <br />i wiem że jest OK, po za tym niema potrzeby wymyślania koła od nowa w tym akurat przypadku <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Polecam również zapoznać się wieloma opracowaniami i dokumentami w sieci , którymi również się posiłkowałem<br />materiałów jest ilość spora aż nie sposób wyliczyć...<br />Teraz możecie się bawić CANEM już do WOLI.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 30 cze 2012, o 16:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-29T22:14:51+01:00</updated>
<published>2012-06-29T22:14:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8803#p8803</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8803#p8803"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8803#p8803"><![CDATA[
No wreszcie temperatura opadła , procek ma chłodzenie zaczynam myśleć na tyle logicznie, ze mogę pisać dalej.<br /><br />Nasze małe MCP2515 posiada Pin CLKOUT , zapewnia on pin zegara CLK dla innych układów jeśli jest to konieczne.<br />Czyli pin CLKOut jest wyjściem sygnału zegarowego. Co ciekawe można też sobie włączyć wewnętrzny PRESCALER,<br />który jak wiecie z książki Mirka dzieli sygnał zegara przez zadaną wartość , co pozwala uzyskać różne wartości<br />sygnału zegarowego. W przypadku naszego układu interfejsu dołączymy do MCP kwarc 16Mhz , dzięki takiemu<br />posunięciu będziemy mieli możliwość uzyskania CLK o wartościach :<br />16/8/4 i 2 MHz.<br />Pin CLKOut jest kontrolowany przez 3 ostatnie bity rejestru CANCTRL.  Niemniej trzeba wiedzieć że jeśli chcemy<br />z niego skorzystać do generowania CLK dla ATmegi i nie mamy 2ch linii RESET (dla MCP i Atmegi) możemy mieć problem<br />dosyć duży z programowaniem ATmegi. Dlatego że resetowanie AVR odbywa się stanem niskim i jeśli do Lini RST <br />Podłączymy MCP i podamy stan Niski, to MCP przejdzie ładnie w stan zerowania i ..... wyłączy pin CLKOut. A jak wiadomo <br />bez sygnału zegarowego  nie zaprogramujemy ATmegi ...  W takim wypadku można jednak sobie poradzić <br />wystarczy zrobić 2 odrębne linie RESET (oddzielnie dla MCP i ATmegi) oraz podciągnąć RST w MCP osobnym PULL-Upem <br />do VCC. Trzeba zawsze pamiętać podczas inicjalizacji  MCP2515 że po resecie pojawia sie określony STAN początkowy <br />na pinie CLKOut. <br /><br />[syntax=c]<br />// Prescaler ustawiony na 0<br />// CLKOut =&gt; Xtal (16Mhz) <br />mcp2515_bit_modify ust CANCTRL, 0x07, ( 1 &lt;&lt; CLKEN ) ) ;<br />[/syntax]<br /><br />jutro pokażę jak obsługiwać Filtry akceptacji i maski oraz zajmiemy się  buforami , wysyłaniem i odbieraniem wiadomości<br />i w zasadzie to będzie koniec wywodu na temat CAN i ATmegi... w GCC  natomiast dla duinowców będzie wsad PDE/INO<br />na tyle prosty że nie trzeba go tłumaczyć oraz zestaw potrzebnych plików i bibliotek. Z pewnością otworzę nowy temat <br />do prowadzenia dyskusji o CAN tak by tu zatrzymać konieczną wiedzę. <br /> <br />Mam nadzieję że jest to wszystko klarowne i zaczyna mieć jakiś sens dla was ...  i że nie marnotrawię tym wywodem <br />niepotrzebnie miejsca w bazie danych. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 29 cze 2012, o 22:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-29T15:50:20+01:00</updated>
<published>2012-06-29T15:50:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8787#p8787</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8787#p8787"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8787#p8787"><![CDATA[
W zasadzie to upały dają się we znaki , ale jak się już powiedziało A trzeba by powiedzieć B<br />więc polecimy dalej ..... jak daleko  nie wiem jeszcze , ale nie chcę tu mącić tak od razu więc ... do roboty <br />bo pewnie wieczorem mi się nie będzie chciało <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Nasze MCP2515 ma też taka ciekawą i bardzo przydatną funkcję  BIT-Modify, która określa <br />czy bity są tylko ustawione czy też zostały wyczyszczone. Przykładem uwidaczniającym może być <br />np inicjowanie gdzie powinien być włączony tryb pracy.<br /><br />Jednak tak kolorowo  nie jest funkcja ta ma zastosowanie tylko do niektórych rejestrów , szczegóły w Nocie (str.59)<br />Tylko te bity które są tu ustawione można później zmieniać. Dopiero po tym są przesyłane nasze dane. Jednak jeśli <br />bit jest ustawiony &quot; w masce&quot; i usunięty z danych , to odpowiedni bit w rejestrze MCP2515 tez zostanie usunięty.<br />Analogicznie jeśli będzie ustawiony. W sumie teraz już można się pokusić o wysyłanie i odbieranie komunikatów CAN.<br />Jedyne trudności możemy mieć podczas inicjowania i szybkości transmisji na magistrali.  Wydaje się z noty że aby <br />ustawić rejestry konfiguracyjne MCP2515 należy najpierw włączyć ją w tryb konfiguracji. W tym trybie tylko możemy<br />zarejestrować filtry, Bit Timing i maski w rejestrach : CnF1, CnF2, CnF3, TXRTSCTRL. Nasza kostka ma jeszcze parę innych <br />trybów które są dość dobrze opisane w nocie więc sobie je tutaj daruję <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> (z czystego lenistwa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />)<br /><br />BIT TIMING<br /><br />Hmmm... się trochę wpakowałem , bo jest to dosyć trudny temat, ale nieco sobie ułatwimy życie , zakładam że macie notę <br />pod ręką więc przejdziemy do gotowych wartości rejestrów dla różnych szybkości transmisji. Bit Rate ustawia się w trzech<br />rejestrach CnF1 do CnF3  w zasadzie wygląda to tak:<br /><br />[syntax=c]/ CAN Szybkość transmisji bitów 125 kbps <br /># define R_CNF1 (1 &lt;&lt; BRP2) | (1 &lt;&lt; BRP1) | (1 &lt;&lt; BRP0) <br /># define R_CNF2 (1 &lt;&lt; BTLMODE) | (1 &lt;&lt; PHSEG11) <br /># define R_CNF3 pkt 1 PHSEG21 &lt;&lt;) <br /><br />/ / CAN Szybkość transmisji bitów 250 kbps <br /># define R_CNF1 (1 &lt;&lt; BRP1) | (1 &lt;&lt; BRP0) <br /># define R_CNF2 (1 &lt;&lt; BTLMODE) | (1 &lt;&lt; PHSEG11) <br /># define R_CNF3 (1 &lt;&lt; PHSEG21 ) <br /><br />/ / CAN Szybkość transmisji bitów 500 kbps <br /># define R_CNF1 (1 &lt;&lt; BRP0) <br /># define R_CNF2 (1 &lt;&lt; BTLMODE) | (1 &lt;&lt; PHSEG11)    <br /># define R_CNF3 (1 &lt;&lt; PHSEG21) <br /><br />/ / CAN szybkość transmisji 1Mbps <br /># define R_CNF1 0 <br /># define R_CNF2 (1 &lt;&lt; BTLMODE) | (1 &lt;&lt; PHSEG11) <br /># define R_CNF3 (1 &lt;&lt; PHSEG21)[/syntax]<br /><br />Po szczegóły odsyłam do noty strona 37 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />A Co trzeba trochę się wysilić panowie bo się wam jeszcze zwoje mózgowe wyprostują jak banany w EU <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />I teraz zajmiemy się przerwaniami w MCP2515:)  tak ...  no ma przerwania i co gorsza jest ich aż 8:)<br /><br />1. Messages ERROR<br />2. WakeUp IRQ<br />3. ERROR IRQ ENABLE (gdy wystąpi wiele źródeł w rejestrze EFLG)<br />4. Transmit Buffer 2 Empty Interrupt<br />5. Transmit Buffer 1 Empty Interrupt<br />6. Transmit Buffer 0 Empty Interrupt<br />7. Receive Buffer 1 Full Interrupt<br />8. Receive Buffer 0 Full Interrupt<br /><br />Gdy uaktywnimy jedno z tych przerwań, to za każdym razem pojawi się &quot;0&quot; jeśli warunek będzie spełniony. Elektrycznie<br />Linia zostanie sprowadzona do LOW dopóki warunki wszystkich przerwań są spełnione.  Możemy to zastosować w programie<br />do zapełniania bufora przerwań w celu sprawdzenia czy wiadomość dotarła. Jest oczywiście wiele więcej możliwości, które<br />zostały szczegółowo opisane na stronie 49 noty. Aby skorzystać z przerwań musimy je włączyć co sprowadza się do ustawienia<br />odpowiedniego bitu rejestru CANINTE<br /><br /><br />Identycznie posługujemy się pinami TXnRTS, które możemy ustawić jako wejścia cyfrowe. Wszystko oczywiście w rejestrze <br />TXRTSCTRL który jest opisany na stronie 19 noty, a używa się go na tej samej zasadzie co RXnBF. <br /><br />dobra zostawię na razie bo strasznie gorąco , a jeszcze mam sporo w planie pisania , może wieczorem ..<br />a może jutro... już i tak uważacie mnie za dziwaka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  ale co tam .. jakoś dobrniemy powoli do końca mam taką nadzieję ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 29 cze 2012, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-28T19:38:49+01:00</updated>
<published>2012-06-28T19:38:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8711#p8711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8711#p8711"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8711#p8711"><![CDATA[
---- No i stało się <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  wszyscy się wreszcie cieszą zapewne bo już jest schemat i możemy zacząć <br />wreszcie po zbudowaniu interfejsu go oprogramowywać , jak pisałem będzie i GCC i C++.<br /><br />Zacznę więc mało elegancko od ............<br />............. <br />.............<br /><br />haha nie prawda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> bo od GCC:)<br /><br />Nasz interface podłączymy sobie do Atemegi ...........&lt;chwila potrzebna na pogrzebanie w statystykach i  organizerze&gt;<br />8 skoro już Wylazła nam ATMega8 niech będzie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Zaczynamy.....<br /><br />Całość  podzielę na 3 części. Mianowicie <br /><br /><strong>1. Inicjacja MCP2515<br />2. Przekazywanie wiadomości <br />3. Odbieranie wiadomości</strong><br /><br />Jest to konieczne by łatwiej było wam zrozumieć ideę oraz ... na końcu nie dostaniecie gotowego programu<br />a będzie waszym zadaniem na podstawie poznanych tu szczegółów i funkcji napisać program, który <br />pozwoli na wymianę danych miedzy 2ma urządzeniami na magistrali CAN np termometrem i LCD <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Dlaczego takie urządzenia ??--- bo przecież każdy z was umie je już obsłużyć prawda ??<br />Po co więc tu CAN ??  -- dla celów poznawczych choćby bo zakres używalności jest CAN-a <br />choćby w instalacjach typu HOME INTELIGENCE  gdzie można  zaszaleć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jeśli więc jesteście gotowi to możemy zaczynać.<br /><br /><br /><strong><em>1.   Inicjacja MCP2515 </em></strong><br /><br /><br />Jak już wiecie nasz bohater pierwszej linii jest tworem który z nami będzie chętnie rozmawiał , ale <br />tylko przez interfejs SPI <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> W zasadzie jako adepci sztuki tajemnej po przeczytaniu 1 tomu opasłej trylogii<br />pisanej prozą i popełnionej  przez zaiste Wielkiego Mistrza Zakonu Obrońców 8 bitowego &quot;C&quot;  (wiecie kogo<br />mam na myśli) więc imienia jego nie będę wzywał nadaremno....  (ci co nie wiedzą niech się idą z żalu utopić &lt;niewskazane&gt;<br />  pędzą skruszeni na stronę sklepu Atnel w celu zamówienia obu już opasłych tomów <br />wiedzy tajemnej)  potraficie mam nadzieję zainicjować połączenie SPI jeśli nie to ............<br />wasz problem <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> i zamiast czytać o CAN ie  zacznijcie od pierwszej literki tego skrótu ..... <br /><br />No dobra  w celu zainicjowania SPI możemy następującej procedury ... tak jestem zwolennikiem <br />rozbijania wszystkiego na funkcje , procedury itp ... łatwiej znaleźć problemy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dlatego warto się <br />takiego stylu pisania nauczyć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />[syntax=c]<br />void spi_init(void)<br />{<br />    // Aktywacja pinów dla SPI<br />    DDR_SPI  |= (1&lt;&lt;P_SCK)|(1&lt;&lt;P_MOSI);<br />    PORT_SPI &amp;= ~((1&lt;&lt;P_SCK)|(1&lt;&lt;P_MOSI)|(1&lt;&lt;P_MISO));<br />    <br />    DDR_CS   |= (1&lt;&lt;P_CS);<br />    PORT_CS  |= (1&lt;&lt;P_CS);<br />    <br />    // Aktywacja SPI w trybie MASTER , fosc = fclk / 2<br />    SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br />    SPSR = (1&lt;&lt;SPI2X);<br />}<br />[/syntax]<br /><br />Jak widzicie SPI pracować będzie w trybie master. Dla naszego SPI  wybieramy prędkość maksymalna (FOSC/2 = 8Mhz CLK dla <br />Kwarcu 16Mhz pędzącego Procka ). Na szczęście dla nas MCP2515 potrafi obsłużyć transmisje SPI do 10MHz. <br />W przypadku kiepskich stykówek może być z taką prędkością problem .... <br />&lt;żeby nie było że nie uprzedzałem&gt;  Jednak w tym wypadku prędkość musi być ustalona. Na czas testu można uruchomić<br />SPI na prędkości około 3.7Mhz  (7.3728Mhz  ze względu na ATmegę) i transmisja będzie/powinna przebiegać prawidłowo.<br /><br />Podczas inicjacji należy pamiętać o ustawieniu właściwych pinów jako wyjście (SCK, MOSI, \CS) i wejście (MISO). Gdyz w przeciwieństwie do innych pinów obsługujących np UART, TWI itd , w przypadku SPI nie jest to wykonywane automatycznie:)<br />W celu łatwiejszego dostosowania kodu do innych AVR proponuje nauczyć się korzystać z dobrodziejstwa języka C <br />i zdefiniować sobie potrzebne piny poprzez znana wam już z książki  instrukcję<em><strong> #define</strong></em>. Dzięki czemu zmiany <br />będą wprowadzane w jednym miejscu kodu i jeśli będziecie chcieli zdefiniować  np. \CS &lt;pozostałe 3 są specyficzne dla <br />AVR i nie można ich zmieniać  -- chyba że będziecie korzystać z programowego SPI -- my jednak zajmiemy się sprzętowym&gt;.<br /><br />Przykładowo nasze definicje pinów mogą wyglądać następująco:<br /><br />[syntax=c]<br />#define DDR_CS      DDRB<br />#define PORT_CS     PORTB<br />#define P_CS        2<br /><br />#define DDR_SPI     DDRB<br />#define PORT_SPI    PORTB<br />#define P_MISO      4<br />#define P_MOSI      3<br />#define P_SCK       5<br />[/syntax]<br /><br />Oczywiście w celu ułatwienia sobie życia poprzez #define  możemy sobie też zdefiniować adresy rejestrów naszego MCP2515<br />i potem zarejestrowanych nazw lub nazw bitowych  używać w kodzie. Ja to wszystko mam pliku nagłówkowym *.h<br />który na końcu wam udostępnię. <br /><br />Teraz po takiej ładnej inicjacji już prosto możemy wypychać bajty przez SPI:<br /><br />[syntax=c]<br />uint8_t spi_putc( uint8_t data )<br />{<br />    // Wysyła bajt<br />    SPDR = data;<br />    <br />    while( !( SPSR &amp; (1&lt;&lt;SPIF) ) )<br />        ;<br />    <br />    return SPDR;<br />}<br /><br />[/syntax]<br /><br />Na magistrali SPI dane mogą być wysyłane i odbierane jednocześnie. Więc by otrzymać bajt musimy użyć tzw. Dummy-Byte <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]<br /><br />// Dane wysłane<br />spi_putc(0xaa);<br /><br />// Dane odebrane<br />data = spi_putc(0xff);<br /><br />[/syntax]<br /><br />No od teraz możemy już rozmawiać z naszym MCP2515.   Komunikacja zawsze będzie się odbywać według <br />tego samego wzorca:<br /><br />-- /CS  ustawione na stan niski (LOW)<br />-- SPI  Inicjacja   <br />-- transmisja danych  odbiór/nadawanie<br />-- /CS ustawione na stan wysoki (HIGH)<br /><br />Teraz zobaczycie funkcje odczytu i zapisu rejestrów  MCP2515 ...<br /><br />--- ZAPIS ----<br /><br />[syntax=c]<br /><br />void mcp2515_write_register( uint8_t adress, uint8_t data )<br />{<br />    // /CS na LOW<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    <br />    spi_putc(SPI_WRITE);<br />    spi_putc(adress);<br />    spi_putc(data);<br />    <br />    // /CS na HI <br />    PORT_CS |= (1&lt;&lt;P_CS);<br />}<br /><br />[/syntax]<br /><br />----- ODCZYT ---------<br /><br />[syntax=c]<br /><br />uint8_t mcp2515_read_register(uint8_t adress)<br />{<br />    uint8_t data;<br />    <br />    // /CS na LOW<br />    PORT_CS &amp;= ~(1&lt;&lt;P_CS);<br />    <br />    spi_putc(SPI_READ);<br />    spi_putc(adress);<br />    <br />    data = spi_putc(0xff);  <br />    <br />    // CS na HIGH <br />    PORT_CS |= (1&lt;&lt;P_CS);<br />    <br />    return data;<br />}<br /><br />[/syntax]<br /><br />dobra dziś wystarczy ...  dalszy opis jutro ??? no może pojutrze  .... hehehe<br />Miłego czytania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 28 cze 2012, o 19:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-28T18:01:44+01:00</updated>
<published>2012-06-28T18:01:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8706#p8706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8706#p8706"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8706#p8706"><![CDATA[
No i nieuchronnie idzie ku pełnoletności ....<br /><br />Zasadniczo możemy się pokusić o budowę interfejsu ,  Niemniej zanim do tego przejdziemy<br />chciałbym przedstawić jeszcze 2 możliwości - w zasadzie drogi do naszej sieci CAN.<br /><br />BASICAN --- to taki uproszczony układ zawierający prosty filtr 8 bitowy, który pozwala <br />na zgrubną preselekcję identyfikatorów. Chodzi tu o to, że ID są przepuszczane grupowo, <br />np tylko zakres 600 - 606. Niemniej wybór 1 ID jest wykonalny ale tylko w tedy gdy zostanie<br />przeprowadzona dalsza selekcja z użyciem mikrokontrolera. Ramki zdalne, które są przeznaczone dla <br />danego urządzenia także przechodzą przez filtr zanim dotrą szczęśliwie do mikrokontrolera, a wtedy <br />ten szczęśliwy że ma coś do roboty może wygenerować właściwe dane i skierować je do sterownika<br />CAN niejako w odpowiedzi.<br /><br />FullCAN -- Tutaj sprawa ma się znacznie lepiej, możemy zaprogramować bardzo dokładnie i dokonać <br />selekcji pojedynczego ID. Czyli możemy sobie dokładnie sprecyzować jakie ramki mają być akceptowane <br />przez nasze urządzenie. Np ma tylko odbierać ID 667 czyli niech to będzie zapytanie o temperaturę.<br />Ma to tez wady. Układ taki nie będzie przepuszczał wielu ramek bo ustaliliśmy, że ma się on interesować<br />tylko tą jedną.  <br /><br />Jak więc widać budując nasz kawałek CAN-a musimy jeszcze brać to pod uwagę. Ważnym dla nas <br />Jest :  <br />- Ile ramek o różnych ID ma być odbieranych.  <br />Jeśli wiele powinniśmy skorzystać z układu BasiCAN. Musimy też pamiętać, że wtedy znaczna cześć<br />selekcji będzie musiała przejść na mikrokontroler, który będzie musiał dysponować  odpowiednią <br />mocą obliczeniową . Niemniej FullCAN ma zalety np. umożliwia zaprogramowanie w sterowniku CAN<br />odpowiedzi na RTR. Czyli gdy nadejdzie dozwolona ramka dla tego urządzenia , może ono wysłać<br />w odpowiedzi ramkę danych z pominięciem mikrokontrolera.  Obecnie rozwój magistrali CAN zaczyna<br />zacierać różnice między BasiCAN i FullCAN, a sprawność kontrolerów FullCAN jest coraz wyższa <br />i umożliwia wybieranie coraz większych zakresów ID.<br /><br />Miedzy standardami 2.0A i 2.0B istnieje pewna zgodność i można w ramach jednej magistrali używać<br />obu standardów, ale trzeba być ostrożnym dlatego trzeba dobrze się zastanowić nad wyborem <br />kontrolera CAN. Dla kontrolerów 2.0A możliwe jest przetwarzanie tylko ramek standardowych, <br />a gdy trafi na ramkę rozszerzoną generuje ramkę błędu. Może to wstrzymać nawet całkowicie działanie <br />systemu, co za tym idzie mogą być używane tylko w sieciach gdzie nadawane są tylko ramki <br />standardowe. Zaś dla kontrolerów z możliwymi 2.0A i biernymi cechami 2.0B  akceptacja obejmuje <br />ramki rozszerzone, a po przeprowadzeniu próby błędu odpowiadają bitem ACK lub ramką błędu.<br />W tym wypadku łączność nie zostaje zakłócona, ale ramki z 29bitowym ID nie są ani zapisywane,<br />ani przepuszczane ponieważ przewidziano te kontrolery do przetwarzania tylko ramek z ID 11bitowym.<br />Ale nadają się do systemów hybrydowych gdzie są stosowane oba standardy 2.0A i 2.0B.<br />Natomiast Kontrolery 2.0B zapisują,przepuszczają i przetwarzają oba typy ramek. <br /><br />Tak więc podczas podejmowania decyzji o zakupie sterownika CAN , czy też mikrokontrolera<br />z wbudowanym już w rdzeń sterownikiem CAN. Należy dokładnie się zastanowić co jest nam potrzebne<br />warto też zapoznać się z najpopularniejszymi układami CAN  jak  Choćby ATMEL , Microchip, Texas Instruments<br /><br />Dlaczego o tym wspomniałem ?? dlatego , że my oprzemy się o produkty Microchipa, ale wygodniej <br />było by nam użyć np mikrokontrolera AT90CAN128 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> z którego często sam korzystam , choć często <br />muszę dołączyć do CAN istniejące urządzenie które nie posiada CAN-a i muszę się posiłkować<br />właśnie tandemem MCP2551 i 2515. Oczywiście interfejs CAN możemy zbudować w oparciu o dowolny<br />przeznaczony i dedykowany sterownik np. popularny SJA1000  a wspominam o tym dlatego, że możliwe<br />iż ktoś ma alergię na Microchipa ...<img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  <br /><br />Schemat blokowy SJA1000 wygląda następująco:<br /><br /><a href="http://img819.imageshack.us/i/przechwytywanierx.jpg/"  class="postlink"><img src="http://img819.imageshack.us/img819/6942/przechwytywanierx.jpg" alt="Obrazek" /></a><br /><br />sam interfejs jest tez jakby bardziej skomplikowany i wymaga oprócz transceivera dedykowanego<br />PCA82C250 również 2ch szybkich optocouplerów 6N137 pracujących do 10Mbit/s.<br /><br />Dla nas bazowy będzie następujący schemat:<br /><br /><a href="http://img338.imageshack.us/i/caninterface.png/"  class="postlink"><img src="http://img338.imageshack.us/img338/9792/caninterface.png" alt="Obrazek" /></a><br /><br />Jest to możliwie najprostsza forma interfejsu CAN ... <br /><br />Jeśli ktoś mnie posłuchał wcześniej i zapoznał się z notami naszych faworytów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Już wie że nasz kontroler CAN pracuje na magistrali SPI  dzięki czemu łatwo go podłączyć do dowolnego<br />miktokontrolera, postaram się jednak bazować na 2ch rozwiązaniach,  pozwalających  na pracę  <br />z CAN prze nasze ATmegi , mianowicie GCC i C++  oczywiście nie będę nic mieszał w kodach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Wiem że się spodziewacie po mnie masakry jakiejś , ale będą to czyste kody dla obu języków osobne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Następnym RAZEM bierzemy się za ujarzmianie potwora  ....  od strony programowej, czyli zajmiemy się <br />naszym MCP2515  bo tylko z nim będziemy gadać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> a niejako transceiver MCP2551 zajmie się sam sobą<br />i poza zajmowaną przestrzenią na schemacie i płytce  od strony programowej nas nie interesuje ...<br /><br />Zatem do zaś...<br /><br />Zapoznajcie się jednak ze schematem interfejsu oraz  notami układów obu, a ze szczególną uwagą <br />MCP2515. Ja preferuje wersje smd , ale są one też w wersji DIP dla stykowców .... nie polecam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />bo chcę uniknąć problemu 200000000000000 pytań czemu mam błędy i czemu nie działa. <br />To działa Interfejs ten stosuje od dawna i nie mam z nim problemów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 28 cze 2012, o 18:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-25T21:03:59+01:00</updated>
<published>2012-06-25T21:03:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8548#p8548</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8548#p8548"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8548#p8548"><![CDATA[
Upss już tak późno ... no dobra pozbierajmy wreszcie te dziwne wiadomości których się może nawet nauczyliście <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jak już wiecie są 2 standardy/wersje CAN:<br /><br />CAN20A - z formatem ramki standardowej;<br />CAN20B - z formatem ramki rozszerzonej <br /><br />oto ich porównanie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /> <a href="http://img195.imageshack.us/i/przechwytywanievc.jpg/"  class="postlink"><img src="http://img195.imageshack.us/img195/527/przechwytywanievc.jpg" alt="Obrazek" /></a><br /><br />Jak widać CAN to łakomy kąsek stanowiący efektywny i niezawodny system transmisji danych, to wiem że od <br />samego początku zastanawiacie się jak można go wykorzystać praktycznie ...<br /><br />W końcu składa się z bitów dominujących i recesywnych, 11bitów ID, 15bit CRC, 1bit ogranicznika, <br />7bit EOF, 6bit ramka błędu i cała masa tym podobnych dziwadeł. Nic nie kojarzy się ze strukturą<br />8bitowego Mikrokontrolera , ba nawet 16 bitowego. <br /><br />Czy możliwe wiec jest zaprogramowanie AVRa zgodnie z protokółem ?? <br /><br />Tak to poważne pytania, ale nie powinniście się tym martwić dla sieci jest wiele gotowych i tanich, <br />a przede wszystkim popularnych układów i modułów przez co kan zyskał tak dużą popularność.<br />Typowe interfejsy CAN  to tylko 3 układy, a jedyne co musi robić mikrokontroler to tylko wpisać<br />8 bajtów danych do wysłania, wypełnić ID i DLC oraz ustawić RTR. Całą nudna resztą czyli:<br />- obliczenie CRC<br />- dodanie pozostałych pól do ramki<br />- połączenie z magistralą <br />- Transmisja danych<br />- wykrywanie i korekta błędów <br />Wykonuje kontroler CAN, dane zaś są wprowadzane do magistrali poprzez transceiver CAN , który jest zresztą<br />bezpośrednio do niej podłączony. Mickrokontroler otrzymuje potwierdzenie wysłania danych, albo info o błędzie,<br />po czym podejmuje odpowiednie działania. Przy odbiorze danych jest podobnie zresztą. Wymagania CAN <br />nie są wielkie, a zbudowanie 2 stopniowego interfejsu CAN proste.   Można więc zająć się wreszcie budową <br />interfejsu ..... HURAAAAA !!!!!! KONIEC NUDY ........<br /><br />hehe tak ale jeszcze musimy coś ważnego omówić zanim przedstawię interface mianowicie kilka istotnie waznych spraw jedną z nich może być  tzw/  Filtrowanie akceptacyjne ,  dlaczego warto poruszyć w tym akurat miejscu ??<br />to proste ......  Jak wiecie CAN20A działa w standardowym formacie ramek co pozwala na przetworzenie <br />aż 2048 różnych identyfikatorów. Nie wymaga się oczywiście , by każde urządzenie na magistrali otrzymało <br />wszystkie ramki bo było by to bezsensowne prawda ??  Np w naszej sieci dla urządzenia G istotne są tylko<br />ramki z ID  50, 1234, 2000, a  2045 pozostałych jest bez znaczenia.  Ważne jest wiec wprowadzenie właściwej<br />selekcji ID , tak by dany mikrokontroler w urządzeniu dostawał tylko to co potrzebuje i taka własnie selekcja <br />nazywa się filtracja akceptacyjna. Umożliwia ona takie zaprogramowanie sterownika CAN , by sprawdzał wszystkie wiadomości, wraz z korekcją błędów ale przekazywał mikrokontrolerowi określone ramki o określonych ID <br />przez co przetwarzanie danych jest szybsze. D filtrowania akceptacyjnego możemy zastosować 2 różne układy<br />scalone.<br /><br />Ale o tym może już jutro co ....   <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />hehehe jeszcze was trochę podręczę  i potrzymam w słodkiej niepewności .... choć może nie zdajecie sobie<br />z tego sprawy , ale już z tymi wiadomościami możecie zbudować swój interfejs. Ja później będę bazował<br />na specjalizowanym mikrokontrolerze AT90CAN128 firmy ATMEL, który zawiera w sobie już kontroler CAN ..<br />.....<br />.....<br /><br />hahaha mam was trochę was rozczarowałem co <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> owszem mogę go użyć bo mam i często je używam, <br />ale obiecałem że zrobimy to na zwykłym AVR więc tak będzie jedynie co będziemy potrzebować to:<br /><br />MCP2515  -  czyli kontroler CAN z SPI<br /><br /><!-- m --><a class="postlink" href="http://ww1.microchip.com/downloads/en/DeviceDoc/21801F.pdf" >http://ww1.microchip.com/downloads/en/D ... 21801F.pdf</a><!-- m --><br /><br />MCP2551  -  Szybki Transceiver CAN<br /><br /><!-- m --><a class="postlink" href="http://ww1.microchip.com/downloads/en/devicedoc/21667d.pdf" >http://ww1.microchip.com/downloads/en/d ... 21667d.pdf</a><!-- m --><br /><br />proponuję byście się zaprzyjaźnili z tymi dwoma scalaczkami oraz zapoznali z ich notami.<br />Bo właśnie ich użyjemy do budowy naszego interfejsu, i pamiętajcie <br />że zbudować trzeba minimum 2  by nawiązać transmisje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Na razie dość jutro jeszcze troszkę ponudzę i zaprezentuję schemat , choć po przejrzeniu not  <br />nie będzie stanowić to dla was problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 25 cze 2012, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-25T17:19:35+01:00</updated>
<published>2012-06-25T17:19:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8517#p8517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8517#p8517"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8517#p8517"><![CDATA[
Heh tym sposobem przebrnęliśmy przez rys historyczny, normalizację i podstawy struktury oraz <br />protokół transmisji w sieci CAN...  Wiem, strasznie przynudzałem i wysypałem tu niezrozumiały <br />językowy jazgot,  wybaczcie , jeszcze trochę muszę ponudzić i pomarudzić, ale postaram się <br />teraz też poza teorią  poruszyć już zastosowania praktyczne oraz aspekty moralne z użytkowania<br />CAN.<br /><br />---&gt;&gt;&gt; JEDZIEMY <br /><br />W CAN najbardziej ciekawą, wręcz zjawiskową formą jest niesamowita zdolność do wykrywania <br />wielu błędów występujących w trakcie transmisji danych i sposoby reagowania na nie. <br />Zastosowano tu odstęp Haminga, nazywany czasem - nie bezpodstawnie z resztą - odstępem <br />sygnałowym -  równy (=) 6.  <br /><br />Cóż to jest ?? zaś wymyślił jakieś dziadostwo !!  <br />Tak brzmi strasznie ale to banalnie prosta sprawa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Odstęp sygnałowy występujący między 2ma słowami dwójkowymi o tej samej długości jest <br />po prostu liczbą bitów na odpowiadających sobie pozycjach w szeregu, muszą one mieć różne<br />wartości. Dla przykładu bo brzmi to jak bezsensowny bełkot -  odstęp sygnałowy między słowami<br />dwójkowymi  11011010 oraz 10000110 = 4  Dlaczego skoro pisałeś że 6 ?? <br /><br />No przecież to proste popatrzcie na bity :   3; 4; 5 i 7 (liczymy od prawej żeby potem nie było <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />)<br />różnią się wartościami prawda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> i tych różnic jest tylko 4 <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Co za bydle ze mnie co <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  No ale luzik, wiecie już że CAN może przesyłać dane z dużą szybkością<br />nawet 500kbitów/s. To dużo, ale teraz sobie wyobraźcie że na każde 0,7s pojawia się jeden <br />zbłąkany błędny bit - zapomniany przez Boga i ludzi niechciany zwykle biedaczek ten jest <br />spowodowany przez zakłócenia zewnętrzne.  Co to ma do rzeczy ?? Wyobraźcie sobie więc,<br />że cała nasza sieć będzie pracować 8h/dobę przez 365 dni w roku. Wbudowany system <br />zabezpieczeń przed błędami gwarantuje nam iż przez 1000 lat pracy tylko 1 bit nie będzie <br />wykryty. Daje do myślenia co nie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Oczywiście błędy mogą  występować  i będą taka ich uroda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />ale skoro są rozpoznawane to można je naprawić prawda ??  Dokładnie TAK JEST !!<br />Tylko nierozpoznane błędy mogą zafałszować wyniki pomiarów, aby zminimalizować ryzyko błędu<br />zastosowano tu równocześnie kilka różnych sposobów ich wykrywania:<br /><br />Detekcja błędnego bitu  - jak wiemy każde urządzenie podłączone do CAN zawsze odbiera zwrotnie<br />swoją własną transmisję, Dlatego by po arbitrażu  jeśli znajdzie się choć tylko jedno ustrojstwo<br />na magistrali, które otrzymało zwrotnie inny różniący się od wysłanego bit - to jest oczywiste, że <br />wystąpił błąd. W takiej sytuacji urządzenie przechodzi w tryb korekcji błędu.<br /><br />Błędne bity dodatkowe - CAN w swojej specyfikacji ma określone wyraźnie, że gdy w ramce danych<br />transmitowane jest kolejno więcej niż 5 bitów o tej samej  wartości  (np 8 razy 0 w jakimś polu), to każda grupa pięciu bitów jest poprzedzana przez bit komplementarny (w tym przypadku 1). Ten bit, <br />nie zawiera oczywiście żadnej informacji, jest bitem dodatkowym, a po zakończeniu transmisji jest usuwany z danych i tylko pierwotna wiadomość jest przetwarzana. Bity dodatkowe mogą więc być <br />użyte do kontroli błędów bowiem jeśli odbiorca wiadomości wykryje w ramce więcej niż 5 bitów <br />o takiej samej wartości (za wyjątkiem EOF), to oczywistym jest że nie jest to poprawny odczyt,<br />i że pojawił się błąd podczas transmisji czyli wystąpił dodatkowy bit lub jego wartość została<br />odwrócona lub też więcej takich bitów) w odpowiedzi na takie coś odbiorca zawiesza działanie<br />i uruchamia procedurę poprawiania błędów.<br /><br />Błędy CRC - to teraz będzie bardzo prosto bowiem proces ten polega na oszacowaniu sumy kontrolnej<br />w urządzeniu odbiorczym, a gdy odebrana i obliczona są różne od siebie odbiorca co robi ??<br />- TAK uruchamia procedurę korekcji błędów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Błąd potwierdzenia - kiedyś tam wspomniałem o czymś takim jak Bit ACK  - czyli bicie przerwy na <br />potwierdzenie - ta zaraza jest wysyłana przez urządzenie jako bit recesywny. Każde urządzenie,<br />które odebrało poprawnie poprzednią ramkę nadpisują ten bit bitem dominującym. Urządzenie nadające <br />wykrywa to i można powiedzieć, że &quot;wie&quot; iż przynajmniej jedno urządzenie  odebrało dane poprawnie.<br />Jeśli jednak nadawca stwierdzi, że jej bit w czasie ACK nie został nadpisany, to jest to jasna informacja, że nikt nie odebrał wiadomości poprawnie i w takim razie .....   co robi ??<br />No oczywiście co innego by mogła zrobić  -- zawiesza działanie i przechodzi do procedury korekcji błędów. <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Błąd formatu  -- tu stosuje się fakt, że w ramce jest kilka miejsc, które muszą mieć ZAWSZE określoną<br />zawartość, a są to: bit końca CRC, ogranicznik potwierdzenia i EOF wartości te zawsze są recesywne.<br />Jeśli w tych polach zostaną wykryte bity dominujące, to takie coś może być tylko i wyłącznie spowodowane przez błąd transmisji i co robi nasze urządzenie  ....... ??<br />znów to samo - uruchamia procedurę korekcji błędów  .... jakie to monotonne  ....<br /><br />To skoro już tak przy nudziłeś to może wreszcie powiesz co to za dziadostwo ta korekcja błędów ..<br /><br />No owszem powiem, proszę bardzo ...<br /><br />Więc procedura korekcji błędów to procedura zajmująca się korekcją błędów <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />  - macie co chcieliście<br />hehehe <br /><br />Dobra żartowałem .... a jest to tak :<br /><br />W przypadku błędu transmisji jest realizowana nasza &quot;ukochana procedura&quot; w dwóch wariantach.<br /><br />1.  Ramki, w których stwierdzono jakiś błąd są natychmiast odrzucone przez odpowiednie urządzenie<br />     i nie są przetwarzane.<br />2.  Jeśli któreś z urządzeń w systemie wykryje błąd, to natychmiast wysyła ramkę informującą o błędzie,<br />     która składa się z 6 bitów dominujących (tzw: sygnalizacja błędu) i ogranicznika ramki błędu<br />     zawierającego 8 bitów recesywnych. <br /><br />W skutek czego bity recesywne na magistrali zostają nadpisane, tak że występuje na niej tylko 6 bitów <br />dominujących, ale ....  jest to naruszenie zasady, że nie więcej niż 5 bitów może mieć tą sama <br />wartość.  Wszystkie urządzenia na magistrali wykrywają ten stan i uznają właśnie odebraną ramkę <br />jako błędną  i odrzucają ją oraz wysyłają ramkę sygnalizacji błędu.  Można powiedzieć że urządzenie, <br />które wykryło błąd celowo wykłada całą transmisję w taki sposób że wszystkie urządzenia odbierają <br />ja jako błędną. Czyli jak widzicie o błędzie lokalnym jednego urządzenia natychmiast wiedzą wszystkie<br />pozostałe. Wszystko to dlatego, że głównym założeniem i celem sieci jest aby każde urządzenie <br />odbierało poprawne dane, które są mu potrzebne lub by wszystkie urządzenia dostawały błędne dane <br />i je odrzucały. Faktem jest też to że urządzenie które nadało taką wiadomość  tez stwierdzi, że <br />zawiera ona błąd, poprawi ją i wyśle ponownie.<br /><br />A gdy wystąpi błąd wewnątrz urządzenia -  samo stwierdzi, że jest uszkodzone ??, czy będzie<br /> wysyłać dane z nieodpowiednią  szybkością lub odbierać tylko błędne dane ?? <br />TAK to przypadek można można powiedzieć śmiertelny, takie urządzenie wysyłające ramkę błędu<br />mogłaby spowodować  blokadę całej sieci.  ........<br /><br />ale na szczęście CAN jest odpowiednio zabezpieczony przed takim przypadkiem i nie musimy się <br />nim przejmować po szczegóły odsyłam do specyfikacji CAN. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Na tą chwile wystarczy, wieczorem pójdzie mam nadzieje koniec  gdzie już otrę się o wspomniane na<br />początku walory i aspekty użytkowe.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 25 cze 2012, o 17:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-24T13:58:45+01:00</updated>
<published>2012-06-24T13:58:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8484#p8484</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8484#p8484"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8484#p8484"><![CDATA[
Po długiej przerwie chorobowej pozostało mi dokończyć lakoniczny opis CAN-a. Przepraszam też zainteresowanych za tak długie oczekiwanie, teraz już w zasadzie z górki bo zostało nam już tylko omówienie korekcji błędów , jednak nim do niej <br />dojdziemy .... niechcący mogłem ominąć bardzo ważną sprawę mianowicie RAMKĘ ZDALNEGO ŻĄDANIA TRANSMISJI (RTR -<br />Remote Transmision Request) dlatego w tym miejscu poświęcę się jej.<br /><br />W sieci CAN  - RTR  spełnia jedna z najważniejszych funkcji. Dlaczego ...  popatrzmy na taki przykład...<br /><br />Urządzenie C transmituje co 5 min dane o temperaturze z 3ch czujników  z ID np 598, oznacza to, że dane w ramce danych zawierają 3 bajty, które są odbierane i przetwarzane przez kilka innych urządzeń na magistrali. Ale urządzenie<br />I potrzebuje pilnie wartości pomiaru temperatury i sprawa jest na tyle pilna że nie może ona czekać 5min na następną <br />transmisję. I tu właśnie pojawia się RTR <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Mianowicie nasze urządzenie I może zażądać  wyników bezpośrednio <br />od urządzenia C. W celu realizacji takiego &quot;obejścia&quot; normalnego cyklu transmitowania danych nadaje ramkę RRF, <br />jest ona podobna w budowie do ramki danych DF jednak jest z kilkoma różnicami , a oto one :<br /><br />-- ID Urządzenia, do którego wysyłane jest żądanie (nasze 598) zostaje podane w polu Identyfikatora.<br />-- Liczna przydatnych bajtów w wywoływanej wiadomości (3) jest podana w polu DLC, <br />-- Bit RTR, jest to bit dominujący (0) jest transmitowany jako recesywny (1).  <br />-- W RRF nie występuje pole danych , a pole DLC znajduje się bezpośrednio przed CRC  <br /><br />Jak więc widać RRF ma konstrukcje podobna do DF  tylko liczba bajtów danych wynosi 0.<br /><br />Realizacja funkcji zdalnego żądania transmisji jest realizowana następująco: <br />Wszystkie urządzenia na magistrali odbierają RRF i po ustawieniu bitów  RTR  rozpoznają, <br />że jakieś tam urządzenie żąda określonych danych od innego. Nasze urządzenie C też odebrało <br />RRF i co ...??  a właśnie ustaliło sobie że ID zawarte w ramce jest takie jak  JEGO  własne ID , w związku<br />z czym natychmiast przesyła swoja odpowiedź w postaci ramki DF zawierającej żądane dane.<br />Urządzenie I odbiera i ma frajdę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />mam nadzieję że jasne jest teraz działanie tej ramki.<br /><br />Wieczorem korekcja błędów i przechodzimy wreszcie do budowy sprzętu.... oraz do pierwszej transmisji<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 24 cze 2012, o 13:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-18T21:10:12+01:00</updated>
<published>2012-06-18T21:10:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8185#p8185</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8185#p8185"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8185#p8185"><![CDATA[
Słowo się rzekło więc troszeczkę koniecznie i bezwzględnie , żeby nie powiedzieć <br />&quot; z uporem maniaka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> &quot; będę wam kładł prastarą wiedzę szamańską -- no dobra <br />nie aż tak starą <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />------------- Arbitraż  .....   trochę zawiłości technicznych <br /><br />To co teraz napiszę odnosi się do uproszczenia napisanego wyżej , celem moim w tym wywodzie <br />nie jest teraz mieszanie wam w głowach ..... aczkolwiek zupka ze świeżych umysłów .... dosyć kuszące <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />niemniej musimy choć w minimalnym stopniu poznać budowę stopni wejściowych urządzeń dołączonych<br />do magistrali CAN  by zrozumieć zjawisko Arbitrażu -- czyli pola decyzyjnego, które odpowiada za <br />wagę wiadomości i pozwala uniknąć wielu przykrych sytuacji podczas przesyłu danych.<br /><br />Do dzieła ......<br /><br /> <a href="http://img6.imageshack.us/i/przechwytywaniern.jpg/"  class="postlink"><img src="http://img6.imageshack.us/img6/2329/przechwytywaniern.jpg" alt="Obrazek" /></a><br /><br />powyższy obrazek stanowi dosyć duże uproszczenie obwodów dołączających , urządzenia <br />do magistrali CAN. Zasadniczo &quot; stopnie wejściowe &quot; są w konfiguracji otwartego kolektora <br />co tworzy tzw. iloczyn galwaniczny - można powiedzieć takie &quot;zwarte AND&quot;.<br />Jeśli odniesiemy się w naszym przypadku do układu 1 (ten po lewej) to nadawany recesywnie <br />bit 1 zagwarantuje że tranzystor w stopniu wejściowym nie będzie przewodził.<br />Cała magistrala zostanie wiec ustawiona wstępnie na stan recesywny (1) po czym urządzenie <br />odczytuje stan magistrali, i jeżeli teraz zostanie wysłany bit dominujący (0) to nasz tranzystor <br />zostanie włączony a co za tym idzie linia magistrali będzie zwarta do masy. Czyli znajdzie się <br />w stanie dominującym (0), a nasze urządzenie 1 ponownie odczyta otrzymany z powrotem wysłany bit. <br /><br />W przypadku naszego przykładu jeśli tylko jedno z naszych urządzeń nada bit dominujący to spowoduje <br />to zmianę stanu na linii magistrali na 0 w efekcie czego oba urządzenia odczytają ten stan. <br /><br />Wynika z tego właśnie realizacja procedury dostępu do magistrali.  Jak to ???  -- teraz pewnie chcecie spytać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Przecież jest to oczywiste. Załóżmy że oba nasze urządzenia są gotowe do wysłania własnych ramek <br />z różnymi identyfikatorami np. U1 - ID361, a U2 232 ...  hmmm oba rozpoczynają uzgadnianie dostępu tak zwaną <br />fazą arbitrażową czyli nadają bit SOF, jest on bitem dominującym, co powoduje że obydwa doczyta <br />zwrotnie swój własny wysłany ...  no tak ale się okazuje że oba są poprawne więc oba mogą nadawać !<br />Spoglądnijmy więc na mały rysuneczek pozwalający zrozumieć co się będzie działo i dlaczego:)<br /><br /><a href="http://img96.imageshack.us/i/przechwytywanie2n.jpg/"  class="postlink"><img src="http://img96.imageshack.us/img96/1753/przechwytywanie2n.jpg" alt="Obrazek" /></a><br /><br />Tak to prawda ale oba zaczynają nadawanie identyfikatorów, następnie podczas &quot;b&quot;  wysyłają bit dominujący i wszystko jest tak jak powinno, podczas &quot;c&quot;  dalej nic się nie zmienia, ale podczas &quot;d&quot;  1 wysyła bit recesywny <br />podczas gdy 2 dalej nadaje dominujący. Wiec co się stanie ??<br /><br />1 połapie się po odebraniu zwrotnym że wysłany stan 1 został zmieniony na 0 co oznacza że właśnie straciła<br /> dostęp do magistrali na rzecz 2jki.  W takiej sytuacji nasze U1 przechodzi na tryb odbiorczy (mimo że uparcie próbuje dalej nadawać swoje dane)  natomiast U2 kontynuuje transmisje. Jak widać U2 wygrała i może wysłać <br />swoje dane bez przeszkód.  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Zapewne zauważyliście że jako pierwsza w tym wypadku dostało zgodę na transmisję to urządzenie które<br />nadawało najmniejszy ID -- oznacza to że uzyskało najwyższy priorytet wysyłki.  Jak więc się domyślacie ----<br />przynajmniej powinniście -- no chyba, że nieuważnie czytaliście ten trochę nudny opis --  w ID zawarte jest <br />również automatyczne pierwszeństwo w transmisji wiadomości.  <br /><br />Pamiętajcie więc że dane z ID = 0  będą zawsze przesłane PIERWSZE !!!,  a np z ID 2000  ... trochę sobie poczeka<br />bo ma najniższy priorytet ....<br /><br /><br />Ufffff.....    <br />ale to jeszcze nie koniec .....  czeka nas jeszcze trochę drogi przez mękę , mam nadzieję ze ten opis uproszczony <br />arbitrażu pozwolił wam zrozumieć jak to działa , Sprawa jest prosta , ale wypada wiedzieć co, gdzie, z kim i za ile <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Nic wiec teraz pójdę sobie ... a co tu będę taki sam siedział   .... chlip chlip <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 18 cze 2012, o 21:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-17T19:35:46+01:00</updated>
<published>2012-06-17T19:35:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8160#p8160</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8160#p8160"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8160#p8160"><![CDATA[
echhh .... strasznie mi się nie chce przynudzać dalej , ale co zrobić ...<br />tak będziemy ciągnąc dalej słowotok tym razem postaram się opisać w miarę dokładnie całą ramkę <br />oraz ... a to się jeszcze okaże ... <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Zaczynamy ......    skupcie się choć trochę ...  wiem wydaje się trudne , ale nie taki diabeł straszny <br />popatrzcie na rysunek ramki w poście wyżej ... z lenistwa nie chce mi się kopiować .... hihihihi<br /><br />SOF ....<br /><br />tak nazywa się bit startowy ramki, zawsze jest on bitem dominującym czyli jego poziom  = 0<br />Każde urządzenie na magistrali swoje wewnętrzne stopnie odbiorcze właśnie z nim synchronizują,<br />a dokładnie z jego zboczem narastającym.<br /><br />Pole arbitrażu ...<br /><br />ma ono długość 12bitów i zawiera tylko określenie dostępu do magistrali, w uproszczeniu <br />jest to sekwencja decyzyjna <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Identyfikator ....<br /><br />zawiera on 11bitów ID ramki. Słowo 11 bitowe, z którego składa się ID umożliwia utworzenie <br />aż 2048 rożnych identyfikatorów.  Wprawdzie dostępnych jest tylko 2032 bo pozostałe <br />są zarezerwowane dla funkcji specjalnych.  W zasadzie to i tak wiele bowiem jeden sterownik <br />potrafi poradzić sobie z przetworzeniem 2032 różnych wiadomości które mogą zawierać <br />wiele danych jak wyniki pomiarów, pozycje przełączników czy różne sygnalizacje  i wiele innych...<br /><br />Dla nas pewnie to już jest wystarczająca ilość przynajmniej na tym etapie wiedzy , ale warto <br />napomnieć, że okazuje się iż jest to za mało w wielu zastosowaniach. Spowodowało to powstanie <br />ramki EFF (Extended Frame Format), która posiada 29 bitowy ID czyli właśnie wspomniany wcześniej <br />CAN 2.0B. Przy ID 29Bit możliwe jest przetworzenie aż 536 870 912 ramek. <br /><br />RTR ......<br /><br />jak wspomniałem jest to bit zdalnego żądania transmisji (Remote Transmision Request), odpowiada on<br />za zaadresowanie i wysłanie wiadomości do określonego urządzenia na magistrali. Zwykle jest on ustawiony<br />na stan 0 czyli jest bitem dominującym. Bit ten jest dosyć ważny gdy jakieś dane są pilnie potrzebne. <br /><br />Pole sterujące .......<br /><br />w 6 bitach tego pola  zawiera się  informacje o budowie ramki danych. <br /><br />IDE ...<br /><br />jest to bit rozszerzenia identyfikatora (Identifier Extension). <br />Ustawienie tego bitu informuje nas o standardzie formatu :<br />Gdy IDE = 0  format standardowy  ID-11<br />Gdy IDE = 1 format rozszerzony  ID-29<br /><br /><br />r0 .... <br /><br />mało istotny zapasowy bit w razie kolejnych mutacji  ....<br /><br />DLC  .......<br /><br />zawiera 4 bity, które wskazują ile bitów jest kolejno transmitowanych, w CAN specyfikacja <br />określa pole danych w rozmiarze od 0 do 8bajtów na ramkę.<br /><br />Pole danych ......<br /><br />jak już pewnie się domyślacie ma długość 8bajtów danych do transmisji <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />CRC ....<br /><br />aż 15 bitów dodatkowych informacji, które mają na celu zabezpieczyć transmitowane dane<br />przed błędami transmisji.  nadajnik generuje 15 bitowa sumę kontrolną , na podstawie transmitowanych<br />danych i wysyła je wraz z ramka danych, a odbiornik oblicza na podstawie odebranych danych podobna <br />sumę CRC i porównuje z odebrana jeśli są identyczne transmisja może być kontynuowana, a jeśli nie<br />uruchamiana jest procedura korekcji błędu. CRC jest zakończone bitem ograniczającym zazwyczaj przesyłanym w stanie 1.<br /><br />Potwierdzenie ...  <br /><br />2 bity tego pola służą do wysłania potwierdzenia  poprawności transmisji danych.<br /><br />ACK .....<br /><br />zawiera tylko 1bit zwykle recesywny czyli w stanie 1 i może zostać nadpisane bitem w stanie 0,<br />który wysyła  inne urządzenie na magistrali. Daje to możliwość odbiorcom potwierdzenia poprawnego<br />odbioru danych. Czyli ACK to bit okienka przerwy, podczas którego mozliwe jest przez nadajnik debranie<br />potwierdzenia od odbiorników. ACK jest zamykane transmisja 1 w tym bicie (ACK delimiter)<br /><br />EOF .....<br /><br />nie no panowie toż wiadomo że to End of FRAME czyli koniec RAMKI <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, ale składa się on aż z 7 bitów<br />w stanie 1 czyli recesywnych zamykających kompletna ramke.<br /><br />Zanim zaczniemy nadawanie kolejnej ramki musimy chwilkę poczekać aż odbiorniki na naszej magistrali<br />przetworzą lub przynajmniej zapamiętają odebrane dane.  Ta przerwa a właściwie jej długość określona jest<br />przez 3 bitowe pole przerwy kończące każdą ramkę, które są wystawione w stan recesywny.<br /><br />UFF... przebrnęliśmy przez ramkę teoretycznie więc jesteśmy w stanie ja skompletować i mam nadzieje że ja rozumiecie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />jak nie to czytać jeszcze raz <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> bo zacznie się problematyka użytkowania magistrali CAN  mianowicie występowanie   <br />konfliktów, które mogą się przytrafić w przypadku jednoczesnego nadawania 2ch lub więcej urządzeń. Wypadało by jednak<br />jakoś kontrolować i decydować które urządzenie może nadawać, a które musi poczekać.  <br /><br />Ale to omówimy trochę później. nadmienię teraz tylko iż istnieje specjalna procedura dostępu do magistrali, która pozwala <br />kontrolować gadatliwość urządzeń i ważna role odgrywa tutaj pole decyzyjne  (Arbitration Field), a właściwie bity recesywne <br />lub dominujące zawarte w tym polu. Każde urządzenie na magistrali CAN  MUSI !!!  przestrzegać tej procedury.  <br /><br />Wygląda strasznie no nie <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" />??<br />To prawdziwy horror użytkowników CAN bójcie się bardzo się bójcie .... ta procedura to istne maniactwo pełne zawiłości i niejasności.<br />ustrojstwo tak paskudne jak płytka stykowa bez styków w środku ..... albo jeszcze coś gorszego ....<br /><br /><br />....<br />....<br />...<br />..<br />.<br /><br /><strong>Strach ma wielkie oczy ....................................................</strong><br /><br />W sumie to pokrótce opiszę ta zarazę w miarę możliwości ....<br /><br />W uproszczeniu wygląda to tak ... w zasadzie żadne uproszczenie bo ten mechanizm jest banalnie prosty choć strasznie <br />zawile opisany w specyfikacji <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Całość funkcjonalna sprowadza się do tego że: <br /><br />(<span style="color: #FF0000"><strong>uwaga tylko dla czytelników pełnoletnich o  mocnym sercu i braku problemów <br />z hemoroidami i tym podobnymi .....</strong></span>:)<br /><br />Każdy układ na magistrali CAN który nadaje ....  odbiera swoje dane (echo jak na terminalu) czyli każdy jeśli np termometr wyśle jakiś<br />bit , odbierze go z powrotem, wtedy następuje porównanie go z wysłanym , jeśli  są one identyczne oznacza to, że może nadawać, <br />a jak nie to jest problem bo nie wolno nadawać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> to właśnie  zawarte w polu decyzyjnym bity recesyjne mogą zostać nadpisane przez <br />inne urządzenie bitem dominującym. Ale dlaczego tak się dzieje wyjaśnimy później bo mam na razie dość  po za tym nie chciałbym <br />by ktoś dostał palpitacji wątroby lub powyrywał sobie wszystkie włosy z połyskującej w zachodzącym słońcu, wypolerowanej na <br />wysoki połysk łysiny <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 17 cze 2012, o 19:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-17T14:00:23+01:00</updated>
<published>2012-06-17T14:00:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8134#p8134</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8134#p8134"/>
<title type="html"><![CDATA[Re: Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8134#p8134"><![CDATA[
----   <strong>Wymiana DANYCH.......</strong><br /><br />Wymiana danych w CAN może się odbywać na dwa sposoby, mianowicie możemy:<br />- odwołać się do określonej stacji  (orientacja na stację)<br />lub<br />- podanie określonej wiadomości (orientacja na wiadomość)<br /><br />Wynika z tego ze stacje mogą być adresowane, a powoduje to że &quot;nadawca&quot; adresuje &quot;odbiorcę&quot; <br />podając po prostu adres stacji.  Przykładowo  Termometr  chce wysłać wynik pomiaru do sterownika <br />wentylatora. Niech to będą nasze umowne Stacje 10 i 60.   W tym celu najpierw ustalane jest <br />połączenie &quot;rzeczywiste&quot; pomiędzy nadawcą , a odbiorcą. Pakiet danych zawiera w sobie adres <br />zarówno Termometru jak i Sterownika. Jeśli mamy na linii inne urządzenia np Woltomierze, inne <br />termometry , sterowniki oświetlenia itd..   to ignorują one ten pakiet bo nie jest do nich adresowany.<br />Nasz sterownik wentylatora po odebraniu wiadomości zwykle wysyła potwierdzenie, a jeśli wystąpi<br /> błąd transmisji lub brak potwierdzenia, termometr będzie powtarzał transmisję.<br /><br />W drugim przypadku  wiadomość ma nadany niepowtarzalny identyfikator  i zostaje wysłana magistralą<br />- np. nasz termometr wysyła wynik pomiaru temperatury wody z identyfikatorem 678.  Tu nie ma wyspecyfikowanych <br />adresów i nadajnika i odbiornika , czyli wiadomość może być skierowana do kilku odbiorców dołączonych do magistrali. <br />Urządzenia  korzystają z niej w zgodzie z zasadą :<br /><br />Bierz to co jest ci potrzebne !<br /><br />Czyli wszystkie urządzenie odbierają pakiet , ale muszą zadecydować czy jest im potrzebna czy nie.<br /><br /> Wymiana informacji w magistrali CAN jest realizowana na zasadach rywalizacji kontrolowanej, poprzez<br />opatrzenie wiadomości odpowiednim priorytetem lub nadaniem właściwej ramki. W rzeczywistości jak <br />już wspomniałem transmisja danych nie jest realizowana w postaci tradycyjnych 0 i 1, ale poprzez bity<br />dominujące i recesywne.  Co ciekawe stan recesywny na magistrali może być nadpisany przez stan <br />dominujący. Czyli jeśli jedna stacja nadaje stanem recesywnym,  a inna dominującym to magistrala<br />automatycznie ustala pierwszeństwo dla bitu dominującego. Reasumując stany logiczne na magistrali<br />są ustalone następująco:<br /><br />0 - reprezentuje stan dominujący , a 1 stan recesywny<br /><br />Taki stan w sumie tworzy podstawy specyfikacji CAN i powinniście to zapamiętać i dobrze zrozumieć.<br /><br />Wymiana danych w CAN jest zasadniczo oparta na 4rech ramkach : danych, zdalnego wywołania,  błędu<br />i przepełnienia.<br /><br />Ramkę danych stosuje się w celu wysłania na linię informacji.  <br />Standardowo wygląda ona następująco:<br /><br /><a href="http://img7.imageshack.us/i/przechwytywaniemgo.jpg/"  class="postlink"><img src="http://img7.imageshack.us/img7/4809/przechwytywaniemgo.jpg" alt="Obrazek" /></a><br /><br />jest to zgodne ze specyfikacją CAN2.0A a opisem ramki zajmiemy się wieczorem .....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 17 cze 2012, o 14:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-06-17T12:28:58+01:00</updated>
<published>2012-06-17T12:28:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8129#p8129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8129#p8129"/>
<title type="html"><![CDATA[Magistrala CAN -- technologia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1183&amp;p=8129#p8129"><![CDATA[
Jak wspomniałem w poprzednim temacie magistrala Controller Area Network (CAN) opracowana przez<br />niemiecką firmę BOSCH na potrzeby komunikacji w przemyśle samochodowym<br />(ABS, sterowanie silnikiem), jest standardem multipleksowanej magistrali szeregowej. Jej<br />niezaprzeczalne cechy użytkowe sprawiły, że z pozycji magistrali przeznaczonej do<br />pojazdów przeszła do technologii popularnej w przemyśle i określonej przez<br />międzynarodowy standard ISO 11 898. <br /><br />W ostatnich latach wprowadzono do stosowania<br />również standard wojskowy MIL CAN. <br /><br />Szeroki zakres zastosowań obejmuje między innymi:<br /><br />------------ zastosowania w technice cywilnej:<br />- inteligentne budynki,<br />- przemysł lotniczy,<br />- przemysł samochodowy - samochody osobowe i ciężarowe,<br />- ciężki sprzęt budowlany,<br />- pojazdy specjalne (np. wozy strażackie),<br />- przemysłowe układy automatyki i sterowania;<br />------------ zastosowania w technice wojskowej:<br />- transportery opancerzone - kołowe i gąsienicowe,<br />- stacje radiolokacyjne – morskie i lądowe,<br />- mosty przewoźne,<br />- symulatory,<br />- inne;<br />------------- inne zastosowania:<br />- sworznie pomiarowe,<br />- czujniki i przetworniki pomiarowe,<br />- sterowniki plc,<br />- pulpity i konsole operatorskie,<br />- konwertery.<br /><br />Z w/w jest kilka którymi zajmuje się na co dzień, ale zakres tego zastosowania <br />jest nieco poza możliwościami tego tematu więc skupmy się na podstawach <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Jak więc wiemy z poprzedniego tematu Podstawą standardu pracy magistrali CAN <br />jest siedmiowarstwowy model odniesienia  ISO/OSI.  W przypadku systemów <br />komunikacji m/in w magistrali pojazdów  warstwy 3..6 są puste, i tylko warstwy 1,2 i 7 <br />są wyspecyfikowane szczegółowo.<br /><br />Czym więc są te owe warstwy ?? no cóż prawie jak w torcie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ciasto/masa/ciasto/masa/ <br /><img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> no dobra obiecałem że się poznęcam nad wami wiec jazda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />----- Warstwa 1<br /><br />   Jest to warstwa fizyczna , w tej warstwie znajduje się specyfikacja medium transmisji<br />danych oraz złączy, poziomów przesyłania oraz elementów nadawczo-odbiorczych.<br />Wiąże się ona bezpośrednio z dwoma standardami CAN:<br /><br />ISO11529-2 -  mała szybkość<br />ISO11898    -  duża szybkość<br /><br />----- Warstwa 2<br /><br /> To warstwa łącza danych.  Tu określa się sposób dostępu do medium przesyłania danych<br />w odniesieniu do faktu gdy jakaś cześć systemu chce nadawać, oraz tworzony jest  komunikat<br />(adres, sterowanie,  dane i zabezpieczenie przed błędami CRC) oraz ustalany jest protokół <br />przesyłania danych.  Warstwa 2 była modyfikowana  i dziś są 2 jej wersje  CAN2.0A i CAN2.0B<br />O właściwościach obu będziemy mówić później <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Przez ostatnie lata opracowano 3 obszerne gałęzie CAN dla róznych aplikacji, są to:<br /><br />CANopen, DeviceNET i SDS (Smart Distributed System). Specyfikacje ich są zbyt obszerne jak na<br />tak małą prezentację w tym poście że pozwolę sobie jedynie  na podsumowanie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  <br />a więc w skrócie ze są one kompatybilne z Warstwami 1 i 2 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /> <br /><br />Dla chcących zgłębić temat i poszerzenie wiedzy o w/w  gałęziach proponuję odwiedzenie <br />strony : <a href="http://www.can-cia.de"  class="postlink">http://www.can-cia.de</a><br /><br />Jak więc zauważyliście w WF jest zawarta cała specyfikacja topologi sieciowej dla magistrali CAN<br />i dołączania do niej kolejnych stacji.  Termin topologia sieci - jednoznacznie mówi nam o fizycznej <br />konstrukcji systemu komunikacyjnego i odpowiada na nasuwające się wam pytania.<br /><br />Czyli gdybyście chcieli mnie teraz zapytać --  Jak stacje/elementy są podłączone do magistrali CAN??<br />odpowiedzią jednoznaczną z mojej strony było by stwierdzenie : TOPOLOGIA SIECI !<br /> <br /><br />No ale jak na nieopierzonych newbie przystało wcale nie musicie wiedzieć co ja mam na myśli mówiąc <br />TS <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> więc już pędzę wyjaśnić i radzę dobrze to zapamiętać gdyż TS odnosi się nie tylko do CAN ale i <br />wielu innych magistral, ale to stanie się jasne już za chwilę:<br /><br />Wiec CAN jak już wiecie  wykorzystuje topologię sieci (czasem nazywaną topologią magistrali) co oznacza że wszystkie bez wyjątków urządzenia i elementy są połączone z pojedynczą skrętką<br />pary przewodów mogącej mieć ekran lub nie zakończoną na obu końcach odpowiednią rezystancją <br />terminującą co widzicie poniżej:<br /><br /> <br /><br />Taka organizacja zapewnia, że każda stacja/element może komunikować się z każdym innym <br />w sieci bez żadnych ograniczeń. <br /><br />Jak widzicie wyżej  układ  transceiwera R/TX  sieci CAN jest połączony z medium przez 2 sygnały<br />CAN-H (Can High) i CAN-L (CAn Low), uwzględniąc wymagane zabezpieczenie przed błędami, <br />w rzeczywistym przesyle danych zastosowano różnicowe sygnały napięciowe, oznacza to tyle,<br />że różnica napięcia między obydwoma liniami czyli CAN-H i CAN-L jest skwantowana.<br />W standardzie ISO11898 wyspecyfikowane są dwa różne zakresy napięć różnicowych, służących<br />do reprezentacji danych, a więc :<br /><br />- recesywny i dominujący <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> (cokolwiek to znaczy no nie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />)<br /><br />Jest jednak ku temu ważna przyczyna, mianowicie zwykła logika 0 i 1 tu nie jest stosowana. <br />teraz nie będę pisał dlaczego i po co, ale zauważcie że :<br />( to jest ważne radzę czytać uważnie bo później będzie tylko coraz dziwniej i trudniej)<br /><br />- gdy napięcie różnicowe pomiędzy CAN-H i CAN-L wynosi 0,5V - to status linii jest -- RECESYWNY,<br />- zaś gdy napięcie różnicowe  wynosi 0,9V  - to mamy status magistrali -- DOMINUJĄCY<br /><br />Poziom nominalny magistrali jest wyznaczany w odniesieniu poszczególnych LINI do MASY LOKALNEJ<br />co widać poniżej:<br /><br /> <br /><br /><br />Oczywiście w praktyce nie jest tak fajnie i poziomy te maja swoje tolerancje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Napięcie różnicowe <br />może nawet osiągać maksymalny dopuszczalny poziom widoczny w ostatnim wierszu tabelki <br /><br />Specyfikacja CAN-L w ISO11519-2 jest nieco inna, ale jako że ISO11898 może być zastosowane dla<br />małych i dużych prędkości obecnie stosuje się tylko tą specyfikację. <br /><br />Użytkownik nie musi się w tym przypadku zajmować tak prozaicznymi zajęciami jak konstrukcja łącz<br />TRX, ponieważ wielu producentów oferuje gotowe układy , które zostały zoptymalizowane <br />w szczególności kładąc nacisk  na eliminacje zakłóceń elektromagnetycznych (EMC), ale też<br />przeciążeń termicznych występujących w przypadku zwarcia linii CAN-L i H, oraz wyjściowego <br />standardu poziomów sygnałów dla magistrali CAN. Odpada więc wszystko co jest niezbędne <br />do zestawienia łącza CAN i dołączenia  go do magistrali. Jedyne czym musimy się zająć to<br />upewnić dla jakiego standardu CAN układ został zbudowany. JA preferuję ISO11898.<br /><br />Powinniście na tym etapie wiedzieć tez że w praktyce używa się również innych sposobów<br />różnicowego przesyłu danych, które też mogą być użyte do  przesyłania sygnałów CAN, <br /><br />Np ..... i tu was zaskoczę ....<br /><br />RS485 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co zdziwieni ??   ....  w takim razie widać ile jeszcze przed wami tajemnic do odkrycia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Ostatecznie na tym etapie są jeszcze 2 sprawy których nie sposób lekceważyć, a dotyczą one <br /><br />- maksymalnej długości i związanej z tym szybkości magistrali  <br />oraz <br />- ilości możliwych do dołączenia na magistrali stacji bądź elementów<br /><br />Zasadniczo dyktuje nam te zagadnienia tylko i wyłącznie zastosowane medium, wspomniałem już we wprowadzeniu jak to wygląda  w tabelce , ale teraz nieco rozszerzymy wiadomości i przypomnimy sobie:)<br /> <br /><br />Widzicie tu korelacje między szybkością przesyłu , a długością i terminatorami na końcach magistrali.<br />Z doświadczeń wynika że najlepszym medium jest skrętka  pary przewodów o przekroju 0.34 do 0.6<br />mm2, z terminatorami o rezystancji 127om, przy czym rezystywność przewodów nie powinna być<br />większa niż 60mOm/m, warunek ten jest spełniony gdy przekrój poprzeczny przewodu jest większy niż <br />0,30mm2. <br /><br />Przy dołączaniu stacji bezpośrednio do magistrali CAN długość przewodów linii doprowadzających nie<br />powinna być dłuższa niż 2m jeśli szybkość ma wynosić 250kb/s, natomiast nie więcej niż 30cm  jeśli <br />chcecie uzyskać większe szybkości. I tu mała uwaga !!!<br /><br />Długość &quot;CAŁKOWITA&quot; wszystkich linii doprowadzających nie powinna być większa niż 30m.<br /><br />Na razie starczy ... ale pojawi się tu ciąg dalszy  zanim przystąpimy do praktycznego używania.<br />...<br />Uffff ...<br /><br /><strong><em>-- dodano 17 cze 2012, o 13:50 --</em></strong><br /><br />Myślę że wprowadzenie i zgrubne opisy standardów oraz podstawy budowy CAN <br />mamy za sobą i że wieczorkiem zajmiemy się już zagadnieniami przesyłania danych oraz budową ramki <br />, a potem zbudujemy nasz interfejs CAN ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 17 cze 2012, o 12:28</p><hr />
]]></content>
</entry>
</feed>