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

Atmega328p-pu,RS232,TWI - Zabezpieczenie przed błędną ramką.

lbrycht 19 Sty 2014 14:31 1203 3
  • #1 13194609
    lbrycht
    Poziom 8  
    Witam,

    Stworzyłem przetwornik do pomiarów kątów w przestrzeni. Z procesora Atmega 328p-pu (zewnetrzy kwarc 16MHz, BaudRate 9600) wysyłam ramkę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po stronie odbiorczej napisaną mam aplikację w Visual C# Express. Tam dane rozdzielam do tablicy dane na podstawie przecinka.
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Jednak Co jakiś czas pojawiają się błędne w postaci np. :
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    W tym przypadku widać błąd w [2] . Czy błędy te wynikają z niedopasowania Baudrate (ubrr?) do częstotliwości procesora? W jaki sposób zabezpieczyć się przed błędną ramką, aby nie była brana pod uwagę? Wprowadzić sumę kontrolną? Detekcje niepoprawnej sumy kontrolnej realizować na mikroprocesorze?
    --------------------
    Inna sprawa:
    Stworzyłem wskaźnik graficzny kompasu, jednak przy przeskoku z ekstremalnej wartości 359 stopni na 0 i odwrotnie, nie wykonuje obrotu o jeden stopień lecz robi obrót ("na około") tzn. przelatuje cały obrót w drugą stronę do tej wartości.

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #2 13194786
    tmf
    VIP Zasłużony dla elektroda
    Jeśli błędy są często to wynikają one najpewniej z niedopasowania baudrate. Policz jaki masz błąd dopasowania.
    Zabezpieczenie jest jedno - CRC + resetowanie maszyny stanu dłuższą przerwą pomiędzy znakami (w końcu trzeba transmisję ponownie zsynchronizować). Na ATMega328 CRC musisz liczyć programowo, gdybyś wykorzystał nowszy AVR, coś z rodziny XMEGA, to CRC jest tam liczone sprzętowo. Ogólnie dopóki nie wykorzystujesz w 100% mocy procka, jest to bez znaczenia.
  • #3 13196962
    lbrycht
    Poziom 8  
    Błędy nie pojawiają się bardzo często,, dodatkowo jeszcze zmieniałem dopasowanie i teraz błąd jest poniżej 0.2%.

    Co to jest resetowanie maszyny stanu?
    Czy CRC mogę liczyć jako suma poszczególnych dziesiętnych wartości moich zmiennych czy trzeba to wykonywać binarnie bądź szesnastkowo?
  • #4 13197717
    Eagle
    Poziom 24  
    Powinieneś zacząć od Cykliczny_kod_nadmiarowy tu masz przykładowe źródła dla typowego CRC16

    Naturalnie możesz wybrać coś prostszego jak suma poszczególnych elementów lub ich xor.

    Nie bardzo rozumiem pytania dotyczącego sumy poszczególnych wartości w różnych systemach reprezentacji. Dla przykładu wyobraź sobie jakąś odległość np między ścianami pokoju w którym siedzisz, czy odległość będzie różna jeśli zmierzysz ją w calach, stopach, metrach ? Nie, odległość między ścianami się nie zmieni się, zmieni się system w którym będziesz robił obliczenia, ale wciąż będziesz mógł dokonać konwersji z cali na stopy czy metry co da ten sam wynik. Bo nikt nie chce porównywać wartości wyrażonej w różnych systemach.
    Wiec wracając do twojego przypadku użyj systemu liczb całkowitych bez znaku, zsumuj wszystkie dane, dołącz do pakietu tą sumę ( lub fragment sumy), a po stronie odbiorczej zsumuj odebrane dane i porównaj sumę (lub fragment).

    Maszyna stanu ma określone stany np:
    czekanie na nagłówek
    odbieranie nagłówka
    czekanie na dane
    odbieranie dane
    czekanie na CRC
    odbieranie CRC
    licznie CRC

    Maszyna ma zdefiniowane,z którego stanu może przejść do następnego i pod jakim warunkiem. Resetowanie maszyny stanu to powrót do stanu początkowego, typowo w transmisji gdy pomiędzy odbieranymi danymi zostanie przekroczony ustalony czas tz. TimeOut.
REKLAMA