logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wydajność Atmega328 z MCP2515 w sieci CAN - problemy z przechwytywaniem danych

rosak 24 Maj 2017 19:44 1284 3
REKLAMA
  • #1 16493756
    rosak
    Specjalista liczniki samochodowe
    Posty: 1789
    Pomógł: 142
    Ocena: 559
    Witam,
    w ramach eksperymentu oraz wstępu do dalszych projektów, nagrałem kilka minut ruchu w sieci CAN podczas jazdy samochodem.
    Nagrałem to modułem na STM32 po SocketCAN.
    Teraz próbuję to nagranie przechwycić modułem na Atmega328 (16MHz) z MCP2515. Używam do tego bibliotek Arduino z https://github.com/coryjfowler/MCP_CAN_lib

    Wgrałem standardowy przykład CAN_receive.ino w Arduino IDE:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz z STM32 odtwarzam plik który zawiera 53328 ramek a na Atmega na serial monitorze dostaję tylko ok 35000. Wszystkie ramki to standard ID.
    Sieć jest ustawiona na 125kbps i w pliku jest ok 250 ramek na sekundę. Wg moich obliczeń, zakładając, że każda ramka ma 8 bajtów, choć w rzeczywistości niektóre mają 8 a niektóre 2 itd. wychodzi, że:
    11(ID) + 64(8x8) x 250(ramek na s) = 16011, czyli 16kbps więc daleko do 125.

    Moduły są połączone przewodami o długości ok 5cm, ten sam wynik uzyskuję z terminacją 120ohm jak i bez terminacji.

    Czy to jest zbyt wiele dla Atmega328 czy to wina kodu?
    Wiem, że sam kod który podałem wyżej, dałoby się uprościć używając Port Register zamiast DigitalRead, ale nie do końca wiem, jak to napisać dla DigitalRead (bardziej to rozumiem dla DigitalWrite).
    Wiem też, że bezpieczniej byłoby się bawić w CAN z STM32 zamiast Atmega ale nie mam pojęcia o programowaniu STM, a brak czasu nie pozwala na naukę.

    Pozdrawiam
  • REKLAMA
  • #2 16499396
    trol.six
    Poziom 31  
    Posty: 1650
    Pomógł: 151
    Ocena: 381
    rosak napisał:
    nagrałem kilka minut ruchu w sieci CAN podczas jazdy samochodem.
    Nagrałem to modułem na STM32 po SocketCAN.
    Teraz próbuję to nagranie przechwycić modułem na Atmega328 (16MHz) z MCP2515

    rosak napisał:
    Teraz z STM32 odtwarzam plik który zawiera 53328 ramek a na Atmega na serial monitorze dostaję tylko ok 35000.

    Nie możesz dać odstępów między kolejnymi ramkami i zobaczyć jak to wpłynie na ilość odczytanych?
    rosak napisał:
    Czy to jest zbyt wiele dla Atmega328 czy to wina kodu?

    Może kwestia bibliotek.
  • REKLAMA
  • #3 16499442
    rosak
    Specjalista liczniki samochodowe
    Posty: 1789
    Pomógł: 142
    Ocena: 559
    trol.six napisał:
    Nie możesz dać odstępów między kolejnymi ramkami i zobaczyć jak to wpłynie na ilość odczytanych?


    Spróbuję, choć to mi nie rozwiąże sprawy.
  • Pomocny post
    #4 16500378
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    Próbujesz przepchać ramki CAN 125Kbps poprzez Serial 115.2k, jako stringi generowane z sprintf'a.
    E: Rzeczywisty transfer jest znacznie mniejszy, ale wciąż każdy bajt jest przesyłany jako 5 + wcześniejsze stringi.

    Nie wiem czy biblioteka do MCP będzie się wyrabiać, ale podbijanie prędkości uarta w Arduino kończy się gdzieś przy 300-500kbps. Z sprintf'em jest jeszcze gorzej.

    Najlepiej byłoby podpiąć się analizatorem pod uarta,SPI,CAN0_INT i obserwować co się nie wyrabia.
REKLAMA