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

ATtiny 2313 + USART = brak transmisji danych

Kubbaz 20 Wrz 2011 11:58 2533 15
REKLAMA
  • #1 9945118
    Kubbaz
    Poziom 26  
    Witam wszystkich Elektrodowiczów!

    Mam mikrokontroler ATtin2313, który pracuje na wewnętrznym oscylatorze 8 MHz (bez dzielnika CLK=8). Chcę na nim zrobić transmisję szeregową po USARTcie w trybie normalnym asynchronicznym (U2X = 0), z 1 bitem stopu i 8 bitami danych.
    Wcześniej robiłem transmisję na USARTcie, ale na ATmega8 i działało - tu nie chce.
    Ustawiam bitrate na 9600 bps (na początek bez szaleństw) i wartość rejestru UBRR wychodzi mi 51 (dokładnie to 51,083) z błędem o wartości 0,16 % (obliczenia wg wzoru w tabeli 48 na 113 stronie dokumentacji). Potwierdza się to z danymi w tabeli 56 na stronie 134 (przykłady ustawień wartości rejestru UBRR). Zatem wartość dla rejestru UBRRH = 0, a dla rejestru UBRRL = 51 ( (51)DEC = (0000 0000 0011 0011)BIN ). Pomimo ustawienia poprawnych wartości w rejestrze ustawień zegara USARTa, mikrokontroler nic nie wysyła po magistrali. Poniżej załączam pełny kod źródłowy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod jest w zasadzie cały zasięgnięty z dokumentacji miokrokontrolera (str. 116 i str. 118), dlatego też nie wiem co zrobiłem źle.
    Układ zasilam z programatora USBasp i jak dotychczas ta forma zasilania przy nie dużym wysiłku mikrokontrolera się sprawdzała. Czy trzeba zrobić pull-up (przez resyztor np. 10 kΩ) linii TxD USARTa do napięcia zasilania +5 V?
  • REKLAMA
  • Pomocny post
    #2 9945199
    snnaap
    Poziom 25  
    U Ciebie jest:

    UCSRC |= (1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); // ustawienie1 bitu stopu, 8 bitów danych w bajcie

    W nocie jest:


    Bit 3 – USBS: Stop Bit Select
    This bit selects the number of stop bits to be inserted by the Transmitter. The Receiver ignores
    this setting.

    Table 53. USBS Bit Settings
    USBS Stop Bit(s)
    0 1-bit
    1 2-bit

    Czyli powinno być:

    UCSRC |= (1<<UCSZ1)|(1<<UCSZ0); // ustawienie 1 bitu stopu, 8 bitów danych w bajcie
  • #3 9945487
    saper_2
    Poziom 18  
    Może być ci ciężko uzyskać jakąkolwiek poprawną transmisję gdyż wewnętrzny osc jest bardzo niedokładny :( . Może ci się udać ale nie będzie to powtarzalne, wystarczy, że zmienisz napięcie zasilania albo zmieni się temperatura i rozjedzie ci się cała transmisja. Najlepiej jak byś podłączył normalny kwarc i przestawił fusy na zewnętrzny oscylator.
  • REKLAMA
  • #4 9945590
    snnaap
    Poziom 25  
    saper_2 napisał:
    Może być ci ciężko uzyskać jakąkolwiek poprawną transmisję gdyż wewnętrzny osc jest bardzo niedokładny :( . Może ci się udać ale nie będzie to powtarzalne, wystarczy, że zmienisz napięcie zasilania albo zmieni się temperatura i rozjedzie ci się cała transmisja. Najlepiej jak byś podłączył normalny kwarc i przestawił fusy na zewnętrzny oscylator.


    No nie przesadzajmy.
    Z tymi wewnętrznymi osc nie jest tak źle. Atmel dając wewnętrzny osc raczej ręczy, że będzie on działał prawidłowo tak więc w przedziale temperaturowym określonym w nocie wszystko powinno być ok.
  • #5 9945617
    mirekk36
    Poziom 42  
    saper_2 napisał:
    Może być ci ciężko uzyskać jakąkolwiek poprawną transmisję gdyż wewnętrzny osc jest bardzo niedokładny


    A co to znaczy wg kolegi, że jest niedokładny ???

    saper_2 napisał:
    . Może ci się udać ale nie będzie to powtarzalne,


    W typowych warunkach testowych - temperatura pokojowa, taktowanie wewn. oscylatorem 9600bps przy +5V - masz na bank w 100% zawsze powtarzalne i to bez żadnego ale....


    saper_2 napisał:
    wystarczy, że zmienisz napięcie zasilania


    A o jakich zmianach zasilania kolega pisze ??? czyżby co chwilę ktoś zmieniał zasilanie w procku. Robi się układ na jedno zasilanie i już. Chyba że koledze chodzi o jakieś wahania napięcia - ale to też nie będzie miało żadnego zanaczenia no chyba że coś jest nieteges z zasilaczem czy stabilizatorem.


    saper_2 napisał:
    albo zmieni się temperatura i rozjedzie ci się cała transmisja.


    Takie rzeczy to się dopiero dzieją gdy wystawisz układ na mróz albo temperatury bliskie zera lub np powyżej 50stC. To wtedy fakt może się rozjeżdżać transmisja. Czyli np gdy procek pracuje w jakiejś puszce na zewnątrz - narażony na drastycznie zmiany temperatur w zimie i w lecie.

    saper_2 napisał:
    Najlepiej jak byś podłączył normalny kwarc i przestawił fusy na zewnętrzny oscylator.


    Nawet jeśli w warunkach pokojowych , któryś procek nie ruszy tzn nie ruszy transmisja UART na wewn. oscylatorze (co może choć bardzo rzadko się zdarzyć) - to mamy coś takiego jak bajt OSCCAL - dzięki któremu można podregulować każdy wewn. oscylator tak, żeby w danej temperaturze RS232 działał jak brzytwa.

    Co nie oznacza, że stosowanie kwarcu jest bez sensu - ale na pewno nie stosuje się go dlatego , że jak to mawiają ludzie na forach:

    Cytat:
    "bo wewn. oscylator jest niedokładny"
  • #6 9948188
    arturt134
    Poziom 27  
    Zmień definicję FCPU na: 8000000UL.
    Sprawdź na symulatorze, czy na pewno dobra liczba jest wpisywana do rejestru.

    mirekk36: zmiany częstotliwości oscylatora wewnętrznego mogą być za duże do prawidłowego działania transmisji, jeżeli:
    - zakres temperatur to -20 + 50°C (wcale nie tak rzadko spotykany) - żeby kalibrować oscylator, można oczywiście dorobić pomiar temperatury, ale taniej (i bardziej energoszczędnie) będzie dać po prostu kwarc....
    - układ jest zasilany bezpośrednio z baterii Li-ION, bez stabilizatora (napięcie: 3...4V) lub ma dwa źródła napięcia: zewnętrzne +5V i wewnętrzna bateria Li-ION - (napięcie: 3..5V)
  • #7 9948345
    Kubbaz
    Poziom 26  
    Przypatrując się bacznie Waszym wypowiedziom i dyskusji, mogę powiedzieć, że:
    1. mikrokontroler (bo nie będzie w moim układzie innych aktywnych elementów i to on będzie jedynym odbiornikiem energii w układzie) będzie zasilany z zasilacza Freebox DA-1212A (12 V DC, 1,2 A, 14,4 VA) przez stabilizator napięcia 78M05 (5 V, 0,5 A, 1,25 W, obudowa DPAK/TO-252 SMD),
    mikrokontroler nie będzie zasilany z żadnej baterii ani akumulatora

    2. mikrokontroler będzie pracował docelowo w temperaturze pokojowej (w domu), więc wahania temperatury mogą wynosić od 19°C do 25°C (no chyba że ktoś lubi zimniej lub cieplej ;))
  • REKLAMA
  • REKLAMA
  • #10 9948423
    mirekk36
    Poziom 42  
    arturt134 napisał:

    mirekk36: zmiany częstotliwości oscylatora wewnętrznego mogą być za duże do prawidłowego działania transmisji, jeżeli:
    - zakres temperatur to -20 + 50°C (wcale nie tak rzadko spotykany) - żeby kalibrować oscylator, można oczywiście dorobić pomiar temperatury, ale taniej (i bardziej energoszczędnie) będzie dać po prostu kwarc....


    Przecież sam BARDZO wyraźnie o tym napisałem - tylko też napisałem dokładnie kiedy to się może zdarzać - i na pewno nie zdarza się to w 90% przypadków gdy ktoś testuje sobie to w domu albo robi urządzenie pracujące w takich warunkach czyli pomieszczenie zamknięte ze stałą temperaturą od powiedzmy 10 do 30st C bo wtedy będzie wszystko OK




    arturt134 napisał:
    - układ jest zasilany bezpośrednio z baterii Li-ION, bez stabilizatora (napięcie: 3...4V) lub ma dwa źródła napięcia: zewnętrzne +5V i wewnętrzna bateria Li-ION - (napięcie: 3..5V)


    No i to jest przesada właśnie - ty piszesz o skrajnych i bardzo rzadkich przypadkach - z którymi większość osób początkujących i testujących pierwszy raz nie ma styczności.

    Dlatego owszem warto o tym wspominać żeby na przyszłość wiedzieli z czym to się wiąże - ale nie opowiadać takich historii, że MUSI użyć kwarca bo wewn. oscylator jest niedokładny. Uczepiłem się tego - bo to jest najczęściej powtarzany slogan na forach, a potem aż żal bierze jak się widzi, początkującego wlepiającego na siłę kwarc do procka do migania diodą LED - a jak się zapytasz jaki jest powód ???? to zawsze usłyszysz jedno:

    "bo na forum pisali że wewn. oscylator jest niedokładny i może mi dioda nie mrugać dokładnie co 1 sekundę"

    Dodano po 45 [sekundy]:

    A nie wspomnę, że autor tematu potwierdził moje przypuszczenia co do tego jak będzie zasilał procka i w jakich temperaturach testował - i to jest normalne.
  • #11 9948433
    arturt134
    Poziom 27  
    Przepraszam, że zabrałem głos.
    Pozdrowienia.
  • #12 9948453
    mirekk36
    Poziom 42  
    arturt134 napisał:
    Przepraszam, że zabrałem głos.
    Pozdrowienia.


    Dlaczego - bardzo dobre wyjaśnienia od czego zależy rojeżdżanie się wewn oscylatora - to bardzo pożyteczne informacje, tylko troszkę zbyt skrajne z tym wewn. oscylatorem nie warto. Bo wewn. oscylator bardzo ale to bardzo się przydaje i to ogromnej ilości przypadków.
  • #13 9969971
    asembler
    Poziom 32  
    Można napisać program i zastosować protokół, który pozwala na transmisje z dowolną (2400-115200) szybkością nie dbając o to czy to kwarz czy też oscylator wewnętrzny. Jest jedno ale takiego rozwiązania: Znikną w końcu mnogie posty tego typu.
    Innymi słowy nie intersujemy się jaka jest czestotliwość oscylatora.
  • #14 9970178
    mirekk36
    Poziom 42  
    asembler napisał:
    Można napisać program i zastosować protokół, który pozwala na transmisje z dowolną (2400-115200) szybkością nie dbając o to czy to kwarz czy też oscylator wewnętrzny. Jest jedno ale takiego rozwiązania: Znikną w końcu mnogie posty tego typu.
    Innymi słowy nie intersujemy się jaka jest czestotliwość oscylatora.


    To, że taki program można napisać to na pewno każdy początkujący wie panie kolego. Gorzej z realizacją tego. Dlatego jak już to podpowiedz tym początkującym chociaż jak się za to zabrać ;) .... bo taka porada pokazuje tylko, że ty wiesz ... ale nikomu nie powiesz. Co nie spowoduje, że znikną takie posty ;)

    A nawiasem mówiąc, ja nie widzę aż takiej szerokiej potrzeby stosowania tej metody. Wszystko zależy jakie urządzenie robimy. I jeśli to ma być jakaś prosta komunikacja to realizacja tego bardzo często mija się z celem. Lepiej już dobrać odpowiednio taktowanie procka i zdecydować się na stałą prędkość.
  • #15 9970255
    asembler
    Poziom 32  
    Napisałem, że jest taka możliwość i każdy może kombinować jak to zrealizować.
    Szeroko to ja bym nie stosował, ale właśnie odwrotnie do realizacji prostych projektów idelne rozwiazanie, a szczególnie gdy procesor nie ma mozliwosci podpiecia kwarzu.
    Dodatkowo "odwrotka" pozwala znając baurate łatwo obliczyć czestotliwość oscylatora.
    A jakie to daje ogromne mozliwości w przypadku systemów multiprocesorowych.
REKLAMA