Elektroda.pl
Elektroda.pl
X
Metal Work Pneumatic
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

MCP2515 CAN BASCOM jak rozpocząć programowanie mcp

szun 21 Gru 2011 17:41 16782 33
  • #1 21 Gru 2011 17:41
    szun
    Poziom 19  

    Chciałbym się podzielić z kolegami jak zacząłem moją przygodę z magistralą CAN
    Na niemieckim forum odnalazłem kod źródłowy obsługi MCP2515 w bascomie .
    Nie jest to kompletny kod ale warto go przeanalizować .
    Na podstawie tego kodu , stworzyłem program do wysyłania ,odbierania ramek ,filtracji wiadomości.
    Aby testować oprogramowanie zbudowałem węzły magistrali CAN
    Zastosowałem Atmega8 ,MCP2515, PCA82C51
    I tak niewielkim kosztem stworzyłem na stole magistrale gotową do testowania i nauki.
    Jest to początek aby dokładnie poznać CAN z zastosowaniem MPC
    I apel do bardziej doświadczonych kolegów o pomoc i wsparcie w dalszym dokładnym poznaniu wszystkich możliwości MCP2515


    CAN-Basom
    http://www.roboternetz.de/community/threads/13688-can-bus-programmieren
    Warto zapoznać się jest to w C ale bardzo przydatne na początek.
    http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515

    1 29
  • Metal Work Pneumatic
  • #2 23 Gru 2011 21:21
    Fredy
    Poziom 27  

    Trzymam za Ciebie kciuki. Temat Cana jest wybitnie tajemniczy. Ci co wiedzą nic nie chcą powiedzieć, w w książkach nie znajdziesz przykładów tak jak to jest np z RSem, SPI, I2C o których uginają się już półki w księgarniach. W interencie też jest niewiele, głównie ogólniki.
    Ten kto złamie ten temat i ujawni będzie zasługiwał na nagrodę.
    Dlatego nie dziw się że nikt wątku nie podjął.

    0
  • #3 28 Gru 2011 14:47
    szun
    Poziom 19  

    Przedstawiam pierwszy program który ożywia MCP
    Programik nie wysyła nie odbiera ramek CAN ,natomiast wstępnie konfiguruje MCP i uruchamia wyjście sygnału zegarowego CLKOUT .
    Moim zdaniem jest to najprostszy sposób aby nawiązać pierwszy kontakt z MCP .
    Jest pomocny do testowania komunikacji Atmega-MCP po SPI

    Kod: Bascom
    Zaloguj się, aby zobaczyć kod


    Przedstawiony program uaktywnia wyjście zegarowe MCP pin 3 .
    Realizujemy to przez ustawienie bitu CLKEN w rejestrze CANCTRL
    Wyjście CLIKOUT może być wykorzystane jako sygnał zegarowy dla innych urządzeń.

    1
  • Metal Work Pneumatic
  • #4 08 Sty 2012 11:56
    szun
    Poziom 19  

    Kolejnym etapem zabawy z CAN będzie wysłanie wiadomości .
    Konstrukcja MCP2515 umożliwia ustawianie różnych trybów pracy kontrolera.
    Rejestr CANCTRL obecnie wygląda - &B10001000
    W programie zmieniamy Can_init()

    Kod: bascom
    Zaloguj się, aby zobaczyć kod


    Dopisujemy stałe Txb
    Kod: bascom
    Zaloguj się, aby zobaczyć kod

    Deklarujemy Wysyłam
    Kod: basicom
    Zaloguj się, aby zobaczyć kod

    Deklarujemy funkcje
    Kod: basicom
    Zaloguj się, aby zobaczyć kod


    W pętli głównej programu umieszczamy bufor Txb0

    Kod: bascom
    Zaloguj się, aby zobaczyć kod


    Program wysyła standardową ramkę 100kbs ID 038H 01 02 03 04 05 06 07 08
    Jest to chyba najbardziej prosty sposób aby wysłać ramki na magistralę CAN

    3
  • #5 08 Sty 2012 12:32
    nibbit
    Poziom 19  

    Cytat:
    Temat Cana jest wybitnie tajemniczy. Ci co wiedzą nic nie chcą powiedzieć

    Ja się bardzo chętnie podzielę wiedzą ale używam CANopen na opensourcowym stosie CANfestival i oczywiście w C. A i jeszcze z CAN wbudowanym w procka.

    Ale zgodzę się, że środowisko osób używających CANa jest dosyć "zamknięte".

    1
  • #6 07 Lut 2012 12:04
    szun
    Poziom 19  

    Dalsza zabawa polegała na odebraniu ramki .
    Istnieje możliwość wysyłania i odbierania ramki przez ten sam węzeł.
    W rejestrze CANCTRL bit7-5 REQOP ustawiamy 010 = tryb sprzężenia zwrotnego.
    Tryb sprzężenia zwrotnego jest bardzo cenny ponieważ umożliwia to zabawę z MCP mając tylko jeden węzeł .

    Do programu musiałem dopisać.
    deklarujemy:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Zmiana w pętli głównej
    wysyłamy standardową ramkę z zawartością Txb0d0 C0
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Zmiana w can_init() ustawiamy tryb sprzężenia zwrotnego.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    wstawiamy funkcje odczytu zawartości rejestrów RXB
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Aby zobaczyć efekt swojej pracy (bo na magistrali nic się nie dzieje)
    Zapaliłem diodę LED podłączoną do Portc.0
    Wysyłając &B11000000 MCP zapisał tą wiadomość w rejestrze odbiorczym RXBO
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Migająca dioda podłączona do Portc.0 świadczy że wiadomość &B11000000 dotarła do rejestru odbiorczego RXB0

    1
  • #7 08 Lut 2012 11:39
    kamyczek
    Poziom 34  

    Brawa dla odważnego CAN to świetna alternatywa dla RS485 tym bardziej że znacznie szybsza i bezpieczniejsza ;) a od zabawy kolegi już krok do budowy własnego analizatora CAN ;)

    0
  • #8 03 Mar 2012 00:32
    ljmp
    Poziom 14  

    Ogólnie podoba mi się kolegi idea ale zmieniłbym środowisko programowania z BASCOMa na C. Sam kiedyś programowałem w BASCOMie i nadmiar jego wad zmusił mnie do przejścia na AVRStudio. Sam też bawiłem się w obsługę MCP2515 i mam nawet napisaną bibliotekę w C. A co do "zamkniętego" środowiska CAN to nie mogę się z tym zgodzić bo wszystko jest bardzo jasno opisane w setkach publikacji od których aż się roi w internecie. Natomiast jeżeli myślą koledzy o wyższych warstwach sieci, np. CANopen, DeviceNet czy J1939 to w tym przypadku nie wszystko jest za darmo ale na pewno nie jest "zamknięte" ale proszę się temu nie dziwić ponieważ to są protokoły przemysłowe nad którymi ktoś się musiał napracować a zapłacenie 40€ za specyfikację warstwy aplikacji J1939-71 to chyba nie jest tak dużo.

    0
  • #9 05 Mar 2012 23:29
    fantom
    Poziom 31  

    Fredy napisał:
    Trzymam za Ciebie kciuki. Temat Cana jest wybitnie tajemniczy. Ci co wiedzą nic nie chcą powiedzieć, w w książkach nie znajdziesz przykładów tak jak to jest np z RSem, SPI, I2C o których uginają się już półki w księgarniach. W interencie też jest niewiele, głównie ogólniki.
    Ten kto złamie ten temat i ujawni będzie zasługiwał na nagrodę.
    Dlatego nie dziw się że nikt wątku nie podjął.


    Ze co ? Standard CAN-a jest otwarty, wystarczy poczytac. Nastepnie trzeba wziac jakiegos proca z kontrolerem CAN (albo tak jak tutaj zewnetrzny kontroler) i przestudiowac. Jesli chodzi o samochody to nie dziwcie sie ze producenci nie ujawniaja szczegolow, kazdy ma swoje implementacje ogolnie przyjetych ale najczesciej platnych standardow. Jest darmowy AUTOSAR ale i tak wiekszosci z was nic nie powie bo to naprawde wysoko poziomowy ogolnikowy opis. Zreszta nawet ja pracujac w projekcie jednego z producentow samochodow znam tylko specyfikacje jednej z ich magistral a w samochodzie jest ich kilka...

    0
  • #10 14 Maj 2012 08:22
    woszu
    Poziom 15  

    Witam.
    Mam mały problem z tym programem.
    Potrzebuje tylko wysyłać ramkę ID602 01 02 03 04 05 06 07 08 do sieci CAN co 500ms ze standardową prędkością 100kbs.

    Zmodyfikowałem przedstawiony program wg wskazówek, jednak układ ramki nie wysyła. Natomiast aktywowało się wyjście zegarowe na pinie 3 MCP2515.

    szun mógłbyś zerknąć co jest nie halo?


    Code:
    '**************************************************************************
    
    'ATMEGA8 MCP2515
    '**************************************************************************
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 80
    $framesize = 90

    Declare Sub Can_init()
    Declare Sub Wysylam
    Declare Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Byte)
    Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)

    Const Cmd_read = &H03
    Const Cmd_write = &H02                                      '
    Const Cmd_bitmodify = &H05                                  '
    Const Cmd_readstatus = &HA0                                 '
    Const Cmd_read_rx_status = &HB0                             '
    Const Cmd_reset = &HC0                                      '
    Const Cmd_rts0 = &H81                                       '
    Const Cmd_rts1 = &H82                                       '
    Const Caninte = &H2B                                        '
    Const Canctrl = &H0F                                        '
    Const Canintf = &H2C                                        '
    Const Canstat = &H0E                                        '
    Const Eflg = &H2D                                           '




    Const Cnf3 = &H28                                           '
    Const Cnf2 = &H29                                           '
    Const Cnf1 = &H2A                                           '
    Const Txb0ctrl = &B00110000                                 '
    Const Txb0sidh = &B00110001                                 '
    Const Txb0sidl = &B00110010                                 '
    Const Txb0eid8 = &B00110011                                 '
    Const Txb0eid0 = &B00110100                                 '
    Const Txb0dlc = &B00110101                                  '
    Const Txb0d0 = &B00110110                                   '
    Const Txb0d1 = &B00110111                                   '
    Const Txb0d2 = &B00111000                                   '
    Const Txb0d3 = &B00111001                                   '
    Const Txb0d4 = &B00111010                                   '
    Const Txb0d5 = &B00111011                                   '
    Const Txb0d6 = &B00111100                                   '
    Const Txb0d7 = &B00111101                                   '
    Mcp2515cs Alias Portb.2
    Config Mcp2515cs = Output

    '********************- SPI-*******************************************
    Config Portb.4 = Input                                      'miso
    Config Portb.3 = Output                                     'mosi
    Config Portb.5 = Output                                     'sck
    Spcr = &B01010010

    '**************************************************************************

     Call Can_init()
       Do
     Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011
     Mcp2515_write Txb0sidh , &B11000000                        'ID602
     Mcp2515_write Txb0sidl , &B01000000                        'ID602
     Mcp2515_write Txb0eid8 , &B00000000                        'ID602
     Mcp2515_write Txb0eid0 , &B00000000                        'ID602
     Mcp2515_write Txb0dlc , &B00001000                         '8 bitów
     Mcp2515_write Txb0d0 , &B00000001
     Mcp2515_write Txb0d1 , &B00000010
     Mcp2515_write Txb0d2 , &B00000011
     Mcp2515_write Txb0d3 , &B00000100
     Mcp2515_write Txb0d4 , &B00000101
     Mcp2515_write Txb0d5 , &B00000110
     Mcp2515_write Txb0d6 , &B00000111
     Mcp2515_write Txb0d7 , &B00001000
     Call Wysylam
     Waitms 500
       Loop
     End

    '**************************************************************************

    Sub Can_init()
       Local Can_tmp As Byte
       Reset Mcp2515cs
       Can_tmp = Cmd_reset
       Spdr = Can_tmp
       Do
       Loop Until Spsr.spif = 1
       Set Mcp2515cs
       Waitms 20
       Mcp2515_write Canctrl , &B10001000
       Mcp2515_write Cnf1 , &B10001001
       Mcp2515_write Cnf2 , &B10010001
       Mcp2515_write Cnf3 , &B00000001
       Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000
    End Sub

    '**************************************************************************

    Sub Wysylam
       Reset Mcp2515cs
       Waitus 10
       Spdr = Cmd_rts0
       Do
       Loop Until Spsr.spif = 1
       Waitus 10
       Set Mcp2515cs
    End Sub

    '**************************************************************************

    Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Byte)
       Local Can_tmp2 As Byte
       Mcp2515cs = 0
       Can_tmp2 = Cmd_write
      Spdr = Can_tmp2
      Do
      Loop Until Spsr.spif = 1
      Waitms 2
      Spdr = Reg_add
      Do
      Loop Until Spsr.spif = 1
      Spdr = Reg_val
      Do
      Loop Until Spsr.spif = 1
      Mcp2515cs = 1
    End Sub

    '**************************************************************************

    Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
      Local Can_tmp2 As Byte
      Mcp2515cs = 0
      Can_tmp2 = Cmd_bitmodify
      Spdr = Can_tmp2
      Do
      Loop Until Spsr.spif = 1
      Waitms 2
      Spdr = Reg_add
      Do
      Loop Until Spsr.spif = 1
      Spdr = Reg_mask
      Do
      Loop Until Spsr.spif = 1
      Spdr = Reg_val
      Do
      Loop Until Spsr.spif = 1
      Mcp2515cs = 1
    End Sub

    0
  • #11 14 Maj 2012 22:03
    szun
    Poziom 19  

    Kod jaki zamieściłeś działa (sprawdziłem).
    Węzeł wysyła standard ramkę 602h z prędkością 100KBit/sek.
    Pokaż na jakim schemacie testujesz ,może tam jest problem?

    Dodano po 22 [minuty]:

    Osobiście do testowania programów zaprojektowałem i wykonałem moduł.
    Płytkę wykonałem na laminacie jednostronnym 43mm x35mm .

    MCP2515 CAN BASCOM jak rozpocząć programowanie mcp

    0
    Załączniki:
  • #12 14 Maj 2012 23:10
    woszu
    Poziom 15  

    dzieki za sprawdzenie.
    W sumie to korzystalem troche z Twojego schematu, znalezionego na forum, ale tak sie skupilem na programie, ze moze walnalem jakiegos babola na plytce. Schemat pokaze rano. Czy bedziesz mial mozliwosc odpisania do poludnia?

    U mnie na pinach 1 i 2 mcp2515 jest caly czas stan wysoki a na pinie 3 dziala wyjscie zegarowe:/

    0
  • #13 15 Maj 2012 01:57
    szun
    Poziom 19  

    Po resecie MCP ustawia rejestr CANCTRL &B11100111
    Sygnał na wyjściu zegarowym pojawia się kiedy :
    1. MCP jest po resecie przed programowaniem.
    2. Kiedy uaktywniasz wyjście zegarowe ustawiając odpowiednio CANCTRL str.58 PDF.

    Po twoim opisie wygląda że MCP oczekuje na programowanie po SPI .

    woszu napisał:
    Czy bedziesz mial mozliwosc odpisania do poludnia?


    Chyba się udało odpisać do południa :D

    0
  • #14 15 Maj 2012 06:17
    woszu
    Poziom 15  

    Chodzilo o odpisanie do poludnia, jak rano schemat zamieszcze:)

    MCP2515 CAN BASCOM jak rozpocząć programowanie mcp

    No i co z tym schematem? Są jakieś błędy???

    0
  • #15 16 Maj 2012 09:21
    Dar.El
    Poziom 40  

    Witam
    Jeżeli chcesz korzystać z ADC, podłącz 5V do AVCC przez dławik. Każda para pinów zasilających ma mieć kondensator 100nF.

    0
  • #16 16 Maj 2012 09:27
    woszu
    Poziom 15  

    Nie korzystam z ADC. Atmega ma tylko wysyłać sygnał po SPI do MCP 2515. Nic więcej nie robi i nie będzie robiła. Wprowadzę dodatkowe kondensatory, ale to chyba nie jest powód niedziałania układu?

    0
  • #17 16 Maj 2012 15:12
    woszu
    Poziom 15  

    Dobra, alarm odwołany.
    Polutowałem drugą płytkę na nowych elementach i wszystko gra.
    Musiał być jakiś zonk na płytce:/

    0
  • #18 16 Maj 2012 22:10
    szun
    Poziom 19  

    woszu napisał:
    No i co z tym schematem? Są jakieś błędy???

    Schemat ubogi ale jest Ok .
    Proponowałbym podłączenie przerwania z MCP pin 12 może się przydać.

    Dar.El napisał:
    Witam
    Każda para pinów zasilających ma mieć kondensator 100nF.

    Niepotrzebny alarm.
    woszu przecież ma umieszczone kondensatory 100nF na schemacie :
    C8 -atmega
    C12-MCP
    C13-PCA
    woszu moje gratulacje pierwsza ramka wysłania :idea: .

    0
  • #19 16 Maj 2012 22:17
    woszu
    Poziom 15  

    Tak jak wspominałem, to nie jest układ rozwojowy i nic więcej oprócz wysyłania jednej konkretnej ramki nie będzie robił, więc nie ma sensu nic więcej podłączać:)

    0
  • #20 16 Maj 2012 22:30
    szun
    Poziom 19  

    Kolego ale dla przyzwoitości jak wysłałeś ramkę to i odbierz ,to co wysłałeś.
    A tak na serio to jak odczytujesz ramki ?

    0
  • #21 17 Maj 2012 07:32
    woszu
    Poziom 15  

    Zewnętrznym węzłem CAN z oprogramowaniem na laptopie.
    Mam taki w pracy.
    Jak będę się coś jeszcze bawił canem, to odbiorę ramkę;]
    Na razie mój problem rozwiązany;]

    0
  • #22 19 Sty 2013 23:00
    woszu
    Poziom 15  

    Witam.
    Temat CANa wrócił:)
    Teraz zastanawiam się, czy można zrobić coś takiego, że układ będzie odbierał przychodzące ramki, a następnie wysyłał je dalej, oprócz jednej konkretnej, którą zablokuje?
    Układ będzie musiał być wpięty w sieć CAN w taki sposób, aby ją przerywał (między urządzeniem docelowym, a resztą sieci). Prawdopodobnie będzie trzeba podpiąć do uC dwa węzły CAN jeden jako wejście, a drugi wyjście. I uC będzie przekazywał ramki z jednego na drugi za wyjątkiem ramki blokowanej.

    W dobrym kierunku idę?:) Tylko czy da się prosto zrobić to kopiowanie ramek?

    0
  • #23 24 Sty 2013 00:01
    ljmp
    Poziom 14  

    W dobrym kierunku idziesz.

    Urządzenie które tworzysz nazywa się repeater, tylko u Ciebie ma wyciąć określoną ramkę. Działanie repetearów w magistrali CAN nie jest takie banalne jakby się wydawało, że niby tylko powtarza sygnał. CAN to komunikacja multi-master i po obydwóch stronach repeatera mogą jednocześnie nadawać dwa mastery. Cały bajer ma polegać na tym, żeby Twój repeater nie gubił ramek w momencie, gdy przegra arbitrację z drugą stroną, dlaczego? Otóż między jednym a drugim CANem stoi repeater, a master który będzie nadawał sygnał nie ma pojęcia co się dzieje po drugiej stronie, jeżeli master przegra arbitrację po swojej stronie to łatwo to zauważy, po drugiej stronie nie. To co się dzieje po drugiej stronie widzi tylko repeater i to on musi obsługiwać buforowanie i powtórne wysyłanie ramek gdy przegra arbitrację.

    pozdrawiam

    0
  • #24 24 Sty 2013 07:16
    woszu
    Poziom 15  

    No to moje "iście" w dobrym kierunku się skończyło:)
    Widać z moim doświadczeniem w CAN nie mam szans zrobić tego tak, żeby dobrze działało nie gubiąc ramek....

    Może kiedyś jak czas pozwoli, to siądę nad tym CANem głebięj....

    0
  • #25 09 Lut 2013 13:38
    kogiel
    Poziom 16  

    Mam pytanko dlaczego według was predkosc wynosi 100KBit/sek.

    według noty katalogowej wyglada to tak:

    bit 7-6 SJW: Synchronization Jump Width Length bits <1:0>
    11= Length = 4 x TQ
    10= Length = 3 x TQ
    01= Length = 2 x TQ
    00= Length = 1 x TQ
    bit 5-0 BRP: Baud Rate Prescaler bits <5:0>
    TQ= 2 x (BRP + 1)/FOSC

    wiec wpisując wartosc Cnf1 , &B10001001
    ostatnie bity to 9 wiec TQ= 2 x (9 + 1)/16MHz
    nijak nie wychodzi 100KBit/sek.

    Jak to obliczyć

    1
  • #26 15 Lut 2013 22:36
    ljmp
    Poziom 14  

    Po pierwsze poznajmy sposób tworzenia bitu. Każdy bit składa się z kilku segmentów czasowych o pewnych określonych funkcjach, których wyjaśnianie nie ma znaczenia dla tego przykładu, oto z czego składa się bit:

    BIT_TQ = SYNC + PROP_SEG + PS1 + PS2, gdzie:

    BIT_TQ - liczba kwantów czasu w bicie (o kwantach czasu poniżej)
    SYNC - synchronizacja
    PROG_SEG - segment propagacji
    PS1 - segment fazowy 1
    PS2 - segment fazowy 2

    Każdy z tych segmentów może mieć różną i nawet programowalną długość (poza SYNC). Długości tej nie wyraża się w sekundach tylko w tak zwanych kwantach czasu. Kwant czasu to nic innego jak czas wynikający z okresu zegara systemowego z uwzględnieniem preskalera i innych cech danego układu (MCP2515 ma dzielnik przez 2), wzór na kwant czasu:

    TQ = 2 * BRP / FOSC

    TQ - kwant czasu
    BRP - preskaler
    FOSC - częstotliwość oscylatora

    Prędkość transmisji wynika natomiast z liczby kwantów czasu w bicie:

    BAUD = 1 / (BIT_TQ * TQ)

    Po podstawieniu wzorów otrzymamy:

    BAUD = 1 / (BIT_TQ * 2 * BRP / FOSC)

    Wygląda to strasznie ale wcale tak nie jest bo jak się temu przyjrzeć to zamyka się to w logiczną całość. Jaką funkcję pełnią te kwanty czasu ? Kwanty czasu decydują o jakości transmisji, im więcej kwantów na dany bit przypada tym lepsza jakość bo kontroler widzi bit z większą rozdzielczością, dzięki czemu może lepiej się dosynchronizować do pozostałych uczestników transmisji. Przy wyższych prędkościach transmisji lub przy większej liczbie kwantów będzie potrzebny szybszy kwarc. Po co tyle segmentów ? A no po to żeby użytkownik mógł sobie skonfigurować system wedle swojego uznania. Segmenty decydują o zakresie synchronizacji oscylatorów poszczególnych uczestników transmisji, o szerokości szczeliny czasowej propagacji, a także o momencie próbkowania stanu logicznego linii.

    Obliczmy sobie przykład żeby z kwarcu 16MHz uzyskać wymagane 100kbps. Po pierwsze zdecydujmy się na pewną liczbę kwantów, standardowa wartość to 8 (16 to wartość bardzo dobra co z resztą nie jest problemem uzyskać dla 100kbps przy 16MHz). Wiemy, że zawsze SYNC = 1 zatem zostaje nam 7 do rozdysponowania. Musimy spełnić warunek PROP_SEG + PS1 >= PS2, zatem dla PROP_SEG = 1, PS1 = 3 i PS2 = 3 mamy warunek spełniony. Oczywiście warunek ten będzie spełniony tak samo, gdy PROP_SEG = 1, PS1 = 4 i PS2 = 2, ale pierwsze wartości są lepsze z tego powodu, że w momencie zakończenia okresu PS1 kontroler testuje stan bitu na linii a dokumentacja zaleca, żeby testowanie stanu linii odbywało się w granicach 60% długości bitu, zatem w pierwszym przypadku mamy testowanie w punkcie 5/8 = 62,5% a w drugim 6/8 = 75%. Mamy wyznaczoną liczbę kwantów oraz długości segmentów, czas na preskaler. Przekształćmy sobie ostatni wzór na BAUD żeby wyciągnąć BRP i otrzymujemy:

    BRP = FOSC / (2 * BAUD * BIT_TQ)

    Podstawmy wartości do wzoru:

    BRP = 16 / (2 * 0,1 * 8) = 10

    Zatem preskaler należy ustawić na wartość 10.

    Oczywiście można eksperymentować z różną liczbą kwantów ale osobiście zalecam takie wartości przez które wartość oscylatora jest podzielna bo wtedy nie ma problemu z uzyskaniem standardowych prędkości transmisji. Czasami może się okazać, że przy pewnych założeniach projektowych wartość BRP wyszła ułamkowa wtedy trzeba zmieniać liczbę kwantów czasu, wartość oscylatora lub zastanowić się, czy prędkość transmisji jaką chcemy osiągnąć nie ma jakiejś dziwnej wartości, np 197,3kbps.

    A co do SJW to nie ma nic wspólnego z żądaną prędkością transmisji, jedynie z zakresem synchronizacji oscylatorów uczestników magistrali. Wiemy, że oscylatory mają tolerancje i nigdy nie uzyskamy 100% synchronizacji. Kontroler ma wbudowany programowalny PLL którym potrafi tak regulować aby dopasować punkty próbkowania stanu logicznego linii w momencie gdy sygnał zaczyna się rozsynchronizowywać. Jak to robi? Mamy ustawiony punkt próbkowania poprzez wartości PS1 oraz PS2 i gdy synchronizacja zaczyna uciekać to kontroler tak manipuluje tymi wartościami aby punkt próbkowania stanu logicznego linii odbywał się w optymalnym położeniu. Poprzez SJW jesteśmy w stanie ustawić możliwość regulacji zakresu synchronizacji wyrażonego w kwantach czasu. Dla małych kwantów czasu synchronizacja będzie przebiegała w małych krokach dla dużych może przebiegać w większych. Co lepsze? Nie ma definitywnej odpowiedzi. Małe kroki to większa stabilność regulacji ale wolniejsza odpowiedź na szybkie rozsynchronizowywanie. Duże kroki to mniejsza stabilność ale łatwiejsze synchronizowanie się w sieciach o gorszej tolerancji.

    pozdrawiam

    1
  • #27 16 Lut 2013 16:50
    kogiel
    Poziom 16  

    Dzieki wielkie !!!
    Nie liczyłem na az tak wyczerpującą odpowiedz
    Jeszcze gdybys wskazał zródło gdzie mozna uzyskac tak szczegółowe informacje
    byłbym niezmiernie wdzieczny

    0
  • #28 16 Lut 2013 17:22
    ljmp
    Poziom 14  

    W dokumentacji MCP2515 :D . Chcę tylko zaznaczyć, że ta wartość wyliczona preskalera to nie jest wartość którą masz wpisać do rejestru konfiguracji preskalera. Do rejestru wpisuje się o jeden mniej. Czyli jak częstotliwość chcesz dzielić przez 10 to do rejestru wpisujesz 9. W załączniku masz akrusz excela do przeliczania wartości rejestru preskalera.

    1
  • #29 05 Sty 2016 00:26
    qwo
    Poziom 10  

    Witam wszystkich ciałem odkopać ten temat, na elektrodzie ani nigdzie indziej nie ma zadnych informacji na temat MCP w BASCOMIE sam osobiscie staram sie wysłać ramkę do samochodu mam nawet analizator CAN aby sprawdzić czy ramka wychodzi z MCP i lipa układ coś tam nadaje ale CANALANYZER nie rozpoznaje zadnej ramki

    0
  • #30 05 Sty 2016 01:23
    kamyczek
    Poziom 34  

    Jeśli kolega używa MCP to może trzeba jeszcze pobawić się analizatorem ttl i zobaczyć co się wysyła z atmelka do mcp po spi . Poza tym może jakiś schemat lub ogólna informacja co jest z czym jak połączone .

    0
  Szukaj w 5mln produktów