ATNEL tech-forum https://forum.atnel.pl/ |
|
Jak prawidłowo obliczać UBRR dla transmisji RS232 https://forum.atnel.pl/topic2025.html |
Strona 1 z 2 |
Autor: | rezasurmar [ 1 sty 2013, o 03:49 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Ooo widzę, że nie tylko, ja nie mogę spać . Dziękuje za aktualizacje . |
Autor: | mirekk36 [ 1 sty 2013, o 03:50 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
noo niestety ciśnienie mi podniósł śpec elektrodowy ... ale przy tej okazji ciach i nowy mini poradnik. |
Autor: | SunRiver [ 1 sty 2013, o 12:13 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
żałosne to jest jednak... szkoda, że tylko potrafi się zasłaniać nickiem ... brak cywilnej odwagi żeby się przyznać do siebie samego .... to sie nazywa super gościu .... echhh nie martw sie Mirku widać że to dziecko neostrady wychowane przez zrywającego neta i półbogów z elektrody ... |
Autor: | mirekk36 [ 1 sty 2013, o 12:15 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
SunRiver napisał(a): .... widać że to dziecko neostrady wychowane przez zrywającego neta i półbogów z elektrody ... Sun jak ja uwielbiam twoje teksty hahahah normalnie jesteś świetny - i wcale ci teraz nie słodzę zresztą wspominałem już o tym po twoim opowiadaniu na temat naszych Lochów |
Autor: | lukas12 [ 1 sty 2013, o 13:33 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Ja nie wiem co wy robicie, że tak spędzacie sylwestra powiniście go spędzić w gronie programistów |
Autor: | osa1313 [ 1 sty 2013, o 13:41 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
lukas12 napisał(a): Ja nie wiem co wy robicie, że tak spędzacie sylwestra powiniście go spędzić w gronie programistów W następny sylwester zbierzemy się i będzie impra tylko dla programistów Tylko żeby nam atmeg nie zabrakło Mirek jak ty potrafisz tak szybko nakręcić tyle poradników które są nie do zastąpienia |
Autor: | SunRiver [ 1 sty 2013, o 13:59 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
mirek przyniesie przekąski .... M644 w zalewie octowej |
Autor: | mirekk36 [ 1 sty 2013, o 14:15 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
SunRiver napisał(a): mirek przyniesie przekąski .... M644 w zalewie octowej hahahahaha A Sun przyniesie jakieś PIC'ki na zagrychę mniam |
Autor: | lukas12 [ 1 sty 2013, o 14:16 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Za rok jeszcze nie będę mieć prawka żeby do Szczecina skoczyć, za 2 lata może dam radę |
Autor: | SunRiver [ 1 sty 2013, o 14:50 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
mirekk36 napisał(a): hahahahaha A Sun przyniesie jakieś PIC'ki na zagrychę mniam hehehe no ba ... pieczone z kremikiem i parę MSPków z chrzanikiem |
Autor: | Domanoid [ 9 sty 2013, o 18:45 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Ale po co się tak męczyć? Można skorzystać z fajnego narzędzia liczącego BAUD i error. Do tego dużo ciekawych funkcji związanych z Timerami i inne. http://www.b9.com/elect/avr/kavrcalc/ Polecam przetestować |
Autor: | luki [ 9 sty 2013, o 19:40 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Ale dzięki temu wzorowi bez różnicy jakie ustawisz taktowanie procesora w Eclipse czy prędkość BaudRate to automatycznie wyliczy ci nowe wartości tych rejestrów,a tak musisz zawsze pamiętać o zmianie tych parametrów. |
Autor: | mirekk36 [ 9 sty 2013, o 19:46 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Domanoid napisał(a): Ale po co się tak męczyć? Można skorzystać z fajnego narzędzia liczącego BAUD i error. Do tego dużo ciekawych funkcji związanych z Timerami i inne. http://www.b9.com/elect/avr/kavrcalc/ Polecam przetestować Tak tylko kolega chyba albo nie zrozumiał IDEI takiego podejścia do obliczania UBRR, albo .... po prostu jeszcze nie rozumiesz przydatności preprocesora lub w ogóle nie wiesz o co w tym chodzi ... też tak może być i broń boże nie chcę ci tu przygadać a coś ew wyjaśnić. Owszem takie programiki jak pokazujesz są fajne, jest ich dziesiątki i robią to na różne sposoby ale .... ale nie powiesz mi chyba, że ty pisząc swój program z transmisją RS232 obliczasz sobie UBRR tym sposobem a potem skrzętnie w kodzie wpisujesz tą stałą wyliczoną wartość np: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. bo takie coś, jak już, to zwykle widać w setkach programów całkowicie początkujących osób, które nie rozumieją jeszcze że UART to jedno z PODSTAWOWYCH narzędzi, że często w trakcie pracy zmienia się np prędkość, że WARTO do tego wykorzystać to co daje ci PREPROCESOR, dzięki czemu w każdym programie piszesz sobie język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. czy tam jaką prędkość chcesz - a reszta najczęściej wyliczana jest na poziomie preprocesora. Tu polecam doczytać to w niebieskiej książce - mam nadzieję, że już dotarła .... tzn o preprocesorze. Ale mnóstwo jest także sytuacji gdy potrzeba w kodzie np przekalkulować tą wartość - przy czym wtedy zdecydowanie lepszy jest ten pierwszy wzór. Reasumując - taki sposób - jak niżej - jeszcze raz go przypomnę: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. nie tylko, że nie należy do dobrych technik programowania to powiedziałbym, że wygląda wręcz tragicznie dla oka i mam nadzieję, że również ciebie wkrótce będzie raził w oczy - zobaczysz - jak tylko dłużej liźniesz języka C ostatecznie - to powiedz mi czy z tego kodu: uart_init( 54 ); wiesz jaką mam ustawioną prędkość BAUD RATE w moim programie ??? czy nie ?? ..... chyba nie .... więc widzisz takim prostym pytaniem mam nadzieję, że dobrze ci to pokazuję. A gdy w moim kodzie zobaczysz: #define BAUD 19200 .... to co ??? NAGLE wszystko jasne - prawda ? |
Autor: | Domanoid [ 10 sty 2013, o 10:40 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Dziękuję bardzo za jakże wyczerpującą odpowiedź. Książka dotarła, właśnie skończyłem przerabiać całą teorię. Czyli zabieram się za przykłady praktyczne. I już widzę jak dużym błędem było uczenie się bez takiej podpory jak ta książka. Programy pisałem sam lub z niewielką pomocą internetu. Teraz widzę jak dużo złych nawyków muszę się oduczyć, gdzie są braki i jak to powinno wyglądać. Największym osiągnięciem było uruchomienie wyświetlacza z radia samochodowego sterowanego przez SPI: http://www.elektroda.pl/rtvforum/viewtopic.php?t=2318243 I teraz jak tak patrze na ten kod... Zrobiłbym to o wiele inaczej. #define jest niesamowitym ułatwieniem, od wczoraj stosowanym przeze mnie ciągle Pozdrawiam |
Autor: | mirekk36 [ 10 sty 2013, o 12:00 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Domanoid --> cieszę się w takim razie, że mogłem chociaż troszeczkę pomóc w tym zakresie. Dlatego też mam prośbę maleńką - aby gdzieś tam czasem znajomym tym w realu i w virtualu wspomnieć o tym co robię. Jeśli mogę prosić oczywiście. |
Autor: | Domanoid [ 10 sty 2013, o 12:26 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Oczywiście, że naprowadzam na firmę Atnel oraz forum. Na razie najciekawszą osobą tutaj sprowadzoną jest pu5zek (puszek - czy jakoś tak). Także w tym zakresie nie trzeba prosić |
Autor: | Maureli [ 18 sty 2013, o 07:17 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
U mnie nowy wzór nie działa i najgorsze jest to że nie wiem dlaczego tak się dzieje. Dla tych samych wartości F_CPU=8000000 i UART_BAUD=19200 otrzymuje następujące wyniki w zależności od zastosowanego wzoru: stary wzór F_CPU/16/UART_BAUD-1 -> wynik 25 czyli OK wzór kolegi michalko12 ( F_CPU / 16.0 / UART_BAUD - 0.5 ) -> wynik 25 tu też OK nowy wzór ((F_CPU+UART_BAUD*8)/(16*UART_BAUD)-1) -> wynik -1 ?!?! Wyniki działania preprocesora wyświetliłem na LCD podłączonym po atmege Atmega 328p, eclpise juno + Atmel Toolchain 3.4 podpowiedzcie proszę gdzie robię błąd? |
Autor: | mirekk36 [ 18 sty 2013, o 11:16 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Maureli napisał(a): podpowiedzcie proszę gdzie robię błąd? Spróbuj tak: ( ( FOSC + BAUD * 8UL ) / (16UL * BAUD) -1 ) ------------------------ [ Dodano po: dzisiaj, o 00:33 ] W razie czego na blogu też już poprawiłem i dodałem to UL (czyli rzutowanie jawne na Unsigned Long) |
Autor: | Maureli [ 18 sty 2013, o 20:42 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
działa wielkie dzięki Mirek |
Autor: | nixie [ 20 mar 2013, o 12:56 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Nie wiem czy już było ale odkryłem, że w avrlibc znajduje się plik nagłówkowy <util/setbaud.h> pozwalający obliczyć UBRR. Dodatkowo definiując BAUD_TOL możemy określić maksymalny błąd transmisji który standardowo wynosi 2%. Jeśli dla zadanej prędkości nie uda się zmieścić w zakresie oczekiwanego błędu otrzymamy warninga. Plik setbaud.h includujemy po zdefiniowaniu BAUD. To tak 'nawiasem', jak było to proszę wywalić. |
Autor: | mirekk36 [ 20 mar 2013, o 12:59 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
nixie - nie nie było o tym, ja o tym nie wspominałem więc bardzo cenna wskazówka. To właśnie również dzięki takim ludziom jak Ty - to forum fajnie się rozwija |
Autor: | kiclaw [ 24 mar 2013, o 20:24 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Hmm mam takie pytanko. W moim przypadku to chyba stary wzór się bardziej sprawdzi No bo spójrz, mam zewn.rezonator 16MHz i szybkość 38,4k. Idealną wartością jest więc 25. Licząc ze starego wzoru ((tj. F_CPU/16/UART_BAUD-1)), wychodzi mi 25,04 czyli zaokrągli do 25. Licząc ze wzoru od michalko12 ( FOSC / 16.0 / BAUD - 0.5 ), też wychodzi mi 25,54. Więc zaokrągli do 26. A licząc wg Twojego wzoru (( ( FOSC + (16 * BAUD) / 2 ) / (16 * BAUD) -1 )), wychodzi mi 26,54 więc zaokrągli nawet do 27. |
Autor: | nixie [ 25 mar 2013, o 16:26 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Nie kiclaw napisał(a): A licząc wg Twojego wzoru (( ( FOSC + (16 * BAUD) / 2 ) / (16 * BAUD) -1 )), wychodzi mi 26,54 więc zaokrągli nawet do 27. tylko: Cytuj: ( FOSC + BAUD * 8UL ) / (16UL * BAUD) -1 http://mirekk36.blogspot.com/2013/01/rs ... trick.html |
Autor: | mirekk36 [ 27 mar 2013, o 13:47 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
kiclaw napisał(a): Hmm mam takie pytanko. W moim przypadku to chyba stary wzór się bardziej sprawdzi No bo spójrz, mam zewn.rezonator 16MHz i szybkość 38,4k. Idealną wartością jest więc 25. Licząc ze starego wzoru ((tj. F_CPU/16/UART_BAUD-1)), wychodzi mi 25,04 czyli zaokrągli do 25. Licząc ze wzoru od michalko12 ( FOSC / 16.0 / BAUD - 0.5 ), też wychodzi mi 25,54. Więc zaokrągli do 26. A licząc wg Twojego wzoru (( ( FOSC + (16 * BAUD) / 2 ) / (16 * BAUD) -1 )), wychodzi mi 26,54 więc zaokrągli nawet do 27. Bardzo proszę zajrzyj koniecznie do artykułu na moim blogu: http://mirekk36.blogspot.com/2013/01/rs ... trick.html jeszcze raz - na sam dół artykułu ponieważ dodałem ważny UPDATE w związku z takimi pytaniami jak twoje. A że dostaję je ostatnio często to uznałem że warto żebym jeszcze uzupełnił info i solidnie udokumentował dlaczego podane wzory są OK i jak się o tym przekonać - sprawdź proszę ok ? |
Autor: | Arcadio [ 2 kwi 2013, o 23:37 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
mirekk36 napisał(a): Maureli napisał(a): podpowiedzcie proszę gdzie robię błąd? Spróbuj tak: ( ( FOSC + BAUD * 8UL ) / (16UL * BAUD) -1 ) ------------------------ [ Dodano po: dzisiaj, o 00:33 ] W razie czego na blogu też już poprawiłem i dodałem to UL (czyli rzutowanie jawne na Unsigned Long) Cześć wszystkim, jest to mój pierwszy raz ale na tym forum więc przedstawię się. Mam na imię Arkadiusz i mieszkam w rejonie polski gdzie mam piękny widok na panoramę Tatr (jak nie ma mgły, zawieruchy, deszczu, itp. Poza tym mam 8 m-cy zimy ale za to potem samo piękne lato ). Na co dzień coś tam sobie składam w SQL wykorzystując VB.NET a moimi wypocinami racze uszczęśliwiać inny współpracowników. Obecnie zabieram się do nauki AVR posługując się "początkowymi podstawami" C ale mam to do siebie, że jak czytam książkę "C" i jest tam coś wspomniane co będzie później rozwinięte to nie omieszkam zaglądać tam i o tym poczytać. Próbuję zgłębić otrzymaną informację aby stała się moją wiedzą i tak mam pytanie odnośnie zmiany bitu U2X0 (ok wiem że 1 << U2X0) ale może ktoś tą myśl rozwinie. Podaję parę linijek przykładu jak to wygląda, czy tak jest OK (przepisałem z noty + dodałem U2X0): void USART_Init( unsigned int ubrr) { /*Set baud rate */ UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; UCSR0A = (1<<U2X0) /* dodany wiersz, logicznie myśląc przed UCSR0C i B ale chyba można w dowolnym miejscu poniżej */ /*Enable receiver and transmitter */ UCSR0B = (1<<RXEN0)|(1<<TXEN0); /* Set frame format: 8data, 2stop bit */ UCSR0C = (1<<USBS0)|(3<<UCSZ00); } i napisać dokładnie coś o tym, kiedy to się zmienia (dokładnie chodzi mi o U2X0). O ile się nie mylę to aby zwiększyć prędkość transmisji, więc dlaczego większość nie zmienia tego bitu tylko używa standardowego 0. Ponieważ zgodnie z notą dla ATmega328 można wykorzystując kwarc 16MHz przesyłać z prędkością 1Mbps przy 0% błędów. A jeżeli można dowolnie tym bitem sobie zmieniać to może i w powyższym zacytowanym wzorze uzupełnić tak aby zamiast 8UL i 16UL przy U2X0=0 wyliczać odpowiednio 4UL i 8UL przy U2X0=1 ??? Ponieważ jak mamy zmienne Fosc, BAUD to i U2X0 dodać ale tak to zmajstrować aby podając 1 lub 0 uwzględniał to wzór, ponieważ nie ładnie to by wyglądało tak: U2X0 = 1 lub U2X0 = 2 => ( ( FOSC + BAUD * ( 4 * U2X0 ) UL ) / ( ( 8 * U2X0 ) UL * BAUD) -1 ) więc może tak przy założeniach U2X0 = 0 lub U2X0 = 1, ale czy staje się on czytelniejszym ? ale mamy już "chyba wszytko ujęte": ( ( FOSC + BAUD * ( 4 + ( 4 * U2X0) ) UL ) / ( ( 8 + (8 * U2X0 ) ) UL * BAUD) -1 ) Wybaczcie o ile coś namieszałem w tym moim rozumowaniu ale człek całe życie się uczy ------------------------ [ Dodano po: 46 minutach ] Ajj pomyliłem się z tego wszystkiego (chyba późna pora) bo ustawiając U2X0 = 1 powinien chodzić szybciej a tu jest na opak. Trzeba to jeszcze poprawić !!! |
Autor: | mirekk36 [ 3 kwi 2013, o 07:19 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Witamy Arcadio, a jeśli chodzi o bit U2X to nie jest on do zwiększania czy zmniejszania prędkości - chociaż tak by się wydawać mogło a bardziej do zwiększenia elastyczności doboru prędkości baudrate dla danego taktowania ale ta możliwość czyli wybór U2X=1 jest niestety kosztem czegoś .... przez co jak zauważyłeś większość jednak tego nie stosuje i słusznie zauważyłeś. Jak doczytasz dokładnie w nocie PDF to działanie U2X=1 związane jest PRZEDE wszystkim ze zmianą rozdzielczości próbkowania sygnału, dokładniej mówiąc z jej zmniejszeniem - przez co są te nieco większe możliwości ale jednocześnie narażamy się na większą możliwość błędów podczas transmisji a dokładniej mówiąc możliwości iż błędnie zostaną zinterpretowane stany poszczególnych bitów. Czasem gdy transmisja RS232 nie ma najwyższej wagi, i przy porządnym taktowaniu np z rezonatora kwarcowego - można sobie na taki zabieg pozwalać. W innych wypadkach albo najlepiej zawsze korzystać z U2X=0. Tak to wygląda mniej więcej. ------------------------ [ Dodano po: wczoraj, o 23:20 ] Przy okazji bardzo fajny cytat w twoim podpisie |
Autor: | Arcadio [ 3 kwi 2013, o 17:11 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
Dzięki Mirek za info. Nie mniej jednak mam jakiś niedosyt ale zaczekam aż coś sobie wymyślę i aby to naocznie sprawdzić co daje zmiana U2X0 i jakie to generuje błędy ale wcześniej jeszcze dużo nauki przede mną i pewnie wybiegłem troszkę do przodu |
Autor: | mirekk36 [ 3 kwi 2013, o 19:01 ] |
Tytuł: | Re: Jak prawidłowo obliczać UBRR dla transmisji RS232 |
No i właśnie o to chodzi Arcadio - nie ma to jak sprawdzić na własnym organiźmie aczkolwiek pewnie się zdziwisz w pierwszych testach - że niby przy U2X=1 także wszystko działa .... niestety jeśli zaczniesz wszystkie projekty na tym robić - mające działać na długo i na poważnie, na RS485 itp .... to sam powoli zaczniesz dostrzegać - że tu nie chodzi o to że w testach zaraz po kilku próbach miałoby wyjść że jest BEEE .... no ale ... to właśnie jest kwestia prób i własnych doświadczeń |
Strona 1 z 2 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |