Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom AVR Uart wolne wysyłanie

konstruktor_123456 09 May 2014 16:06 1818 5
  • #1
    konstruktor_123456
    Level 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 wolne wysyłanie

    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 wolne wysyłanie

    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.




    Code: basic4gl
    Log in, to see the code

    'Odbiornik

    Code: basic4gl
    Log in, to see the code




    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.
  • #2
    jousto
    Level 17  
    Quote:
    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.

    Quote:
    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]
  • #3
    konstruktor_123456
    Level 14  
    Dorzucam wspomnianą konfiguracje timera1.

    Code: basic4gl
    Log in, to see the code


    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]
  • #4
    MArSTER_1
    Level 19  
    Przerwanie od portu szeregowego przy odbiorze jest generowane po napłynięciu JEDNEGO bajtu. Wykonywanie więc całego ciagu instrukcji za każdym razem mija się z celem.Każdy podprogram obsługujący przerwanie musi być maksymalnie krótki. Czy sprawdzałeś ile razy komunikuje ci, że napłyneło > niż 50 bajtów i nie nastapiła poprawna transmisja? Policz ile czasu ma przy prędkości 57 kB procesor na wykonanie twojego podprogramu. Ma czas jaki zajmuje wysłanie 10 bitów. Może to za mało dla tak rozbudowanego podprogramu?
    No i po co ci pętla Do Loop wykonywana until b = 1? Przecież do tej pętli program przejdzie właśnie po wykonaniu rozkazu Print.
  • #5
    konstruktor_123456
    Level 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.