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

[Atmega16][C][C#] - Zabezpieczenie komunikacji USART, mikrokontroler -PC

kiabonov 24 Lip 2013 18:23 1494 6
REKLAMA
  • #1 12556885
    kiabonov
    Poziom 9  
    Witam
    Od pewnego czasu buduję urządzenie typu Pick&Place w oparciu o mikrokontroler Atmega16 oraz program sterujący PC w C#. Niestety, pomimo że wszystko działa błędy występujące w komunikacji USART uniemożliwiają przeprowadzenie dokładnego sterowania. Przesyłam dane z komputera w pakiecie 8x8 bitów bez żadnych zabezpieczeń. Niestety nie miałem do czynienia z zabezpieczeniami transmisji i w trakcie komunikacji ginie mi niewielka ilość danych. Z tego powodu, że piszę program w C# dla kontroli Atmegi przez PC, sprawa staje się nieco bardziej skomplikowana i rozwiązania takie jak stosowanie CRC stwarzają problemy w implementacji. Bardzo proszę o wskazówki, jakieś pomysły, lub wskazanie odpowiedniej literatury wyjaśniającej metody zabezpieczeń transferu danych przez USART.
  • REKLAMA
  • Pomocny post
    #2 12556937
    piotrva
    VIP Zasłużony dla elektroda
    CRC jest przecież bardzo proste, sam USART ma też bity parzystości, możesz dodatkowo każdą komendę potwierdzać ze strony urządzenia, ale powinno to wyglądać tak:
    1. PC wysyła ramkę z bitami parzystości + CRC
    2. Układ sprawdza parzystość (sprzęt) + CRC (program)
    3. Jeśli CRC + parzystość zgodne to wysyłamy ACK, w przeciwnym razie prosimy o ponowne przesłanie danych
  • REKLAMA
  • Pomocny post
    #3 12557145
    tmf
    VIP Zasłużony dla elektroda
    1. Jak długie jest połączenie PC-MCU?
    2. Jaka jest szybkość transmisji?
    3. Czy ATM16 jest taktowana kwarcem? O jakiej częstotliwości?
    Duża ilość błędów może sugerować niedokoładne dopasowanie szybkości USART po stronie PC i MCU. Przelicz jaki masz błąd.
  • REKLAMA
  • #4 12557552
    kiabonov
    Poziom 9  
    CRC i bity parzystości są łatwe do napisania w C dla Atmegi. Niestety muszę też brać pod uwagę program komputerowy pisany w C# i tutaj pojawia się problem. Nie znalazłem żadnych bibliotek dla CRC, a dokładnego algorytmu kompatybilnego z Atmegą nie tak łatwo napisać metodą prób i błędów. Dlatego jeżeli CRC jest najlepszym rozwiązaniem, bardzo przydatny byłby chociaż algorytm blokowy. Nie chce też przepisać jakiegoś programu bezmyślnie tylko mieć jakieś pojęcie co się dzieję. Dlatego też kieruje się do bardziej doświadczonych ludzi.

    Długość przewodu 2m
    Prędkość przesyłu to 9600 bit/s
    Taktowanie oscylatora wewnętrznego ustawione jest na 1MHz, Start-up time 6 CK + 64 ms
  • REKLAMA
  • Pomocny post
    #5 12557625
    Sparrowhawk
    Poziom 22  
    Oscylator wewnętrzny nie nadaje się do wykorzystywania, kiedy w układzie działa USART. Jest on mało stabilny. I stąd pewnie masz błędy.

    Algorytmy dla CRC są trudne dla implementacji w C# i AVR? No bez przesady.

    Ale, żeby nie było, że jestem taki zły ;)

    Dodaj do Atmegi zewnętrzny kwarc (Dobierz odpowiednią wartość zgodnie z datasheet'em).

    Proste CRC. Wysyłasz 8 bajtów, więc dodaj 9, który będzie sumą poprzednich ośmiu. Odbierz 9 bajtów, oblicz sumę ośmiu i porównaj z dziewiątym. Jeśli się zgadza, to OK, a jeśli nie, to prośba od AVR o powtórzenie transmisji.
  • Pomocny post
    #6 12557765
    BlueDraco
    Specjalista - Mikrokontrolery
    Takie coś nazywa się sumą kontrolną. CRC to zupełnie inna bajka, dużo odporniejsza na grupy błędów niż suma kontrolna lub XOR. Gotowy kod CRC łatwo znaleź w sieci praktycznie w dowolnym języku, jednak do tego zastosowania XOR lub suma w zupełności wystarczą.
  • #7 12557902
    kiabonov
    Poziom 9  
    Dziękuję wszystkim za pomoc i poświęcony czas, biorę się do roboty :)
REKLAMA