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

Bascom AVR Uart - jak przyspieszyć wysyłanie danych przez RS485?

konstruktor_123456 09 Maj 2014 16:06 1896 5
REKLAMA
  • #1 13585641
    konstruktor_123456
    Poziom 14  
    Witam. Od pewnego czasu zajmuje się wykonaniem sterowania na mikro-kontrolerach AVR. Nadajnik pracuje na atmega 8 a odbiorniki na atmega 16. Mój system to zestaw 15 odbiorników i 1 nadajnika. Połączone jest to wszystko za pomocą magistrali RS485 za pośrednictwem Sn75176 z przełączaniem odbiór nadawanie. To tyle odnośnie układu docelowego.
    Do celów diagnostycznych system zredukowałem do minimum czyli 1 nadajnik i pozostawiłem tylko 1 odbiornik. Tak jak na rysunku poniżej:

    Bascom AVR Uart - jak przyspieszyć wysyłanie danych przez RS485?

    Jak wygląda przebieg pojedynczej transmisji.
    Nadajnik w pętli głównej wysyła ciąg znaków dokładnie taki (Print "X011aWSY" ). Odpowiednie przerwanie informuje o zakończeniu wysyłania.Od tego momentu następuje przełączenie nadajnika na odbiór i w pętli głównej czekamy no odpowiedz przez 300ms. Dane odbiera przerwanie URX jak złoży cały komplet danych dokładnie taki ("X024MWS+238k050Y" ) uznajemy ze transmisja zakończona i wysyłamy kolejny raz. I tak w kółko.
    Dodatkowo procesor generuje przerwanie co 100ms. I obsługuje LCD.

    Odbiornik
    Czeka na przychodzące dane i od razu odpowiada wspomnianą paczka danych ("X024MWS+238k050Y" ).Też ma generowane przerwanie co 100ms. Poza tym nie robi nic bo skróciłem program do minimum dla testów.

    Bascom AVR Uart - jak przyspieszyć wysyłanie danych przez RS485?

    Jaki jest problem?
    Otóż nadajnik w ciągu 1 sekundy wysyła i otrzymuje odpowiedź maksymalnie 7 razy. Jak na moje potrzeby to za mało ponieważ przy 15 odbiornikach każdy będzie odpytywany co 2 sekundy.

    Spostrzeżenia:
    Nadajnik wysyła 8 znaków przyjmując po 10 bitów na bajt mamy 80 bitów
    Odbiornik wysyła 16 znaków przyjmując po 10 bitów na bajt mamy 160 bitów
    Czyli cała transmisja ma na celu przesłanie 160 bitów dajmy 200 bitów.

    Dla zadeklarowanej prędkości transmisji $baud = 57600 powinno być 57600 bitów na sekundę. W moim przypadku 200 bitów x 7 razy na sekundę mam 1400 bitów/sekundę. Wiadomo że procesory maja trochę innej pracy niż tylko przesył danych wiec te 57600 bitów na sekundę to teoria i powiedzmy ze wynik ten podzielimy na pół to otrzymamy i tak super wynik 57600/2=28000bitów/sekundę . A ja mam w swoim modelu jedynie 1400 bitów/sekundę czyli 20 razy mniej.
    Zauważyłem też ze zmiana długości wysyłanego ciągu przez nadajnik z 8 na 25 bajtów nie spowalnia jak by się wydawało transmisji.




    Kod: text
    Zaloguj się, aby zobaczyć kod

    'Odbiornik

    Kod: text
    Zaloguj się, aby zobaczyć kod




    Problem prędkości Uartów był poruszany wielokrotnie dla różnych języków programowania wiec to nie tylko problem środowiska Bascomoewgo ja to niektórzy twierdzą. Będę wdzięczny za dyskusje i pomoc przy rozwikłaniu zagadki.
    Pozdrawiam.
  • REKLAMA
  • #2 13586110
    jousto
    Poziom 17  
    Cytat:
    Timer1 = 48256 'przerwanie wywolywane co 100 ms 10razy na sekunde


    Skąd można wywnioskować , że przerwanie wywoływane jest 10x/sek skoro nie widać jak Timer1 został skonfigurowany.

    Cytat:
    Zauważyłem też ze zmiana długości wysyłanego ciągu przez nadajnik z 8 na 25 bajtów nie spowalnia jak by się wydawało transmisji.

    Pewnie że nie spowalnia bo układ ziewa z nudów oczekując na przełączenie kierunku transmisji a sama transmisja odbywa się z zadaną prędkością 57600.

    Poza tym czas obsługi wyświetlacza chyba ma istotny wpływ na całokształt pracy. U mnie zmierzony czas obsługi prostego polecenia wyświetlenia zmiennej na LCD wynosi około 70ms[/quote]
  • REKLAMA
  • #3 13586327
    konstruktor_123456
    Poziom 14  
    Dorzucam wspomnianą konfiguracje timera1.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Co do Lcd to chyba nie masz racji bo to by oznaczało że jeśli w pętli głównej będę coś wyświetlał na lcd to bedzie się ona wykonywać ze spowolnieniem 70ms.A przecież tak nie jest.Wystarczy w owej pętli wstawić inkrementacje zmiennej i potem ją wyświetlić. Efekt będzie taki że nie będziemy gołym okiem nadążyć za jej zmianami i to na pewno nie będzie co 70ms.
    Po drugie aby wyeliminować opóźnienia od Lcd dałem wyświetlanie z warunkiem na wciśniecie przycisku. Program wyrzuca dane na Lcd bardzo rzadko tak dla kontroli tylko.

    [/center]
  • REKLAMA
  • #4 13586506
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 13588748
    konstruktor_123456
    Poziom 14  
    Pętla do loop.
    W tej pętli czekam na koniec wysyłania czyli instrukcji print jak wszystko wysłane dopiero potem przełączam się na odbiór. Bez tej pętli czekającej transmisja nie chodziła wcale.
    Po czynie jeszcze parę testów ze skróceniem przerwania URX. Wiem że macie utrudnione zadanie bo nie macie sprzętu na biurku więc jak macie propozycje testów jaki by trzeba było wykonać to mogę to zrobić na bieżąco.
REKLAMA