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

Maxymalna prędkość badów w zależności od czasu wykonywania się programu

xamrex 17 Kwi 2012 22:13 975 9
  • #1 17 Kwi 2012 22:13
    xamrex
    Poziom 28  

    Witam,
    Jako, że ostatnio zainteresowałem się komunikacją RS232, to mam kilka pytań odnośnie przeliczania badów na prędkość.....

    Załóżmy, że mam uC taktowany kwarcem 20MHz,

    I mamy jakiś program np.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz tak:
    Jeśli bady będą niskie (np. 9200) to mimo, że inny program będzie się wykonywał AŻ/TYLKO 1ms, to nasz uC zdąży odebrać wszystkie dane z RS'a.

    Jeśli prędkość transmisji byłaby większa to już niestety nie zdąży..

    Czy da się w jakiś sposób policzyć jaka może być max wartość badów, aby program, który np. wykonuje się 1ms nie powodował utrady danych nadlatujących z RSA?

    Czyli może zwięźlej,
    Jeśli ustawimy baud rate na 9600 i włączymy obsługę przerwań ISR( USART_RXC_vect ) to co ile ms wystąpi te przerwanie?

    Czy jest jakiś sposób na policzenie tego?

    0 9
  • #2 17 Kwi 2012 22:16
    gaskoin
    Poziom 38  

    W programie który podałeś nie ma znaczenia ten delay bo przecież wywołujesz funkcję blokującą a nie wątek :D

    xamrex napisał:
    Jeśli ustawimy baud rate na 9600 i włączymy obsługę przerwań ISR( USART_RXC_vect ) to co ile ms wystąpi te przerwanie?


    Może nie wystąpić nigdy.

    0
  • #3 17 Kwi 2012 22:27
    xamrex
    Poziom 28  

    Napisze dokładniej o co chodzi

    Wysyłam poprzez RSA plik ~100KB(wartości kolorów pixeli)
    Potem w funkcji 'wyrzucam' te dane na wyśw i towrzy się obraz.

    Tylko jeśli moja funkcja będzie się zbyt długo wykonywała, lub prędkość będzie za duża, to zdarzy się, że pominę bajty dbierane z RSA,
    Dlatego chciałbym wyliczyć jaka może być max prędkość badów jeśli program wykonuje się np. 1ms

    Albo tak jak pisałem łatwiej do zrozumienia:

    xamrex napisał:
    Jeśli ustawimy baud rate na 9600 i włączymy obsługę przerwań ISR( USART_RXC_vect ) to co ile ms wystąpi te przerwanie?

    0
  • #4 17 Kwi 2012 22:31
    mirekk36
    Poziom 42  

    taka tylko uwaga ;) nie badów - a bodów

    0
  • #5 17 Kwi 2012 22:42
    xamrex
    Poziom 28  

    Myślałem nad buforem cyklicznym..
    Ale max rozmiar to ok 1024bajtów(na wiecej nie mam miejsca), więc i on niewiele pomoże w porównaniu do przesłania 130KB..
    Tak czy owak i tak musiałbym wiedzieć co ile przychodzi kolejny bajt z RSA gdy np body są ustawione na 9600.

    Czy ktoś ma w ogóle pomysł jak to policzyć?

    Mogę ustawić timer w uC i włączyć przy pierwszym przerwaniu ISR( USART_RXC_vect ) i stopować przy drugim przerwaniu, wtedy wiedziałbym co ile przychodzą dane i sprawdzić do dla wszystkich prędkości, ale może jest jakiś łatwiejszy sposób?

    0
  • Pomocny post
    #6 17 Kwi 2012 22:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    xamrex napisał:
    Napisze dokładniej o co chodzi

    Wysyłam poprzez RSA plik ~100KB(wartości kolorów pixeli)
    Potem w funkcji 'wyrzucam' te dane na wyśw i towrzy się obraz.

    Tylko jeśli moja funkcja będzie się zbyt długo wykonywała, lub prędkość będzie za duża, to zdarzy się, że pominę bajty dbierane z RSA,
    Dlatego chciałbym wyliczyć jaka może być max prędkość badów jeśli program wykonuje się np. 1ms

    Albo tak jak pisałem łatwiej do zrozumienia:
    xamrex napisał:
    Jeśli ustawimy baud rate na 9600 i włączymy obsługę przerwań ISR( USART_RXC_vect ) to co ile ms wystąpi te przerwanie?


    To zależy od długości ramki RS. Ale zakłądając że masz standardowo bit startu + 8 bitów danych + bit stopu to masz 10 bitów, transmisja jednego to 1/9600, czyli masz przerwanie co 1/960 s, czyli trochę wolniej niż co 1 ms. Ponieważ masz 1 bajtowy bufor, więc czasami funkcja może się wykonywać ciut dłużej i będzie ok pod warunkiem, że potem będzie się wykonywać krócej. Aby nie gubić znaków musisz zastosować bufor, a to będzie wymagało sporo pamięci. Z drugiej strony 1ms na przerobienie bajtu danych to wieczność. Ale ty o ile pamiętam miałeś transmisję koło 1Mbps? Czyli bajt co 10us - to już gorzej, wstawka w asemblerze by się przydała, UASRT + przerwania i dobrze przemyślana całość jest wymagana.

    0
  • #7 18 Kwi 2012 21:31
    xamrex
    Poziom 28  

    Udało mi się odpalić program na prędkości 312500 bodów (koleje dane z RSA przychodzą co 32us) , ale nie jest to granica możliwości:

    Mam taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po odpalanie debugera otrzymuję że pętla wykonuje się w czasie 33us.
    3 rzeczy strasznie wydłużają czas.
    Problem 1) Funkcja strtol (jej się z pewnością pozbęde, dane nie będą wysyłane jako stringi (tak jak jest to teraz a jako wartości hex)
    Problem 2)Nie wiem czemu to tak długo się wykonuje.. Chyba jest to przez modulo
    Problem 3)Również nie wiem czemu tka długo to trwa. Również obstawiam na modulo

    Z pierwszym problemem sobie poradzę, ale czy ktoś wie jak przyspieszyć działanie 2) i 3) ??
    Czy tak długo to już się musi wykonywać i nic się nie da zrobić?

    0
  • #8 18 Kwi 2012 21:49
    sulfur
    Poziom 24  

    Problem drugi i trzeci obejdziesz stosując dwie pętlę. Jedną liczącą do 132, drugą do 176, nie koniecznie w tej kolejności.

    Dodano po 1 [minuty]:

    No i w ogóle i jest 16 bitowe na 8 bitowym procesorze. Przemyśl to.

    0
  • Pomocny post
    #9 18 Kwi 2012 22:09
    tmf
    Moderator Mikrokontrolery Projektowanie

    xamrex napisał:

    Z pierwszym problemem sobie poradzę, ale czy ktoś wie jak przyspieszyć działanie 2) i 3) ??
    Czy tak długo to już się musi wykonywać i nic się nie da zrobić?


    Najwięcej zyskasz zmieniając sposób dostępu do LCD. Skoro zapisujesz piksel po pikselu nie musisz za każdym razem wysyłać całej litanii komend do LCD - wystarczy na początku pętli wysłać polecenie zapisu do pamięci i określić okno zapisu obejmujące cały LCD. Wtedy kolejne piksele zmieniasz wykonując sekwencyjnie zapisy. Zauważ też, że w tym trybie nie musisz nawet wyznaczać pozycji X i Y, LCD sam to zrobi, więc licznik pętli będzie zwykłym prostym licznikiem i niczym więcej.

    0