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:
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.
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.
'Odbiornik
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.
Do celów diagnostycznych system zredukowałem do minimum czyli 1 nadajnik i pozostawiłem tylko 1 odbiornik. Tak jak na rysunku poniżej:
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.
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
'Odbiornik
Kod: text
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.