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

UART na ATmega8 - dlaczego transmisja nie działa?

01 Wrz 2006 19:57 2572 6
REKLAMA
  • #1 2977670
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #2 2977781
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    Co najmniej 3 błędy popełniłeś. Pierwwszy to włączasz przerwanie Uart Data Register Empty, a nie wstawisz chociaz reti pod wektor obslugi tego przerwania. Tu na pewno program się wykracza i nie wiadomo co procesor zrobi, najprawdopodobniej RESET. Drugi to włączenie sterowania sprzętowego. Co prawda w przypadku odbierania to nie ma znaczenia, ale w przypadku wysyłania owszem, poniewaz jeśli linia CTS znajdzie się w stanie niekatywnym to PC nic nie wyśle.

    3 bład to to, że powinieneś wpisac do UBRRL = 51. Patrz nota AVR'a. Są tam odpowiednie tabelki przy rozdziale USART. Do UBRRH nic nie musisz wpisywać.

    Poza tym ściągnij sobie Realterm. Ma pare upierdliwych bug'ów, ale za to mnóstwo przydatnych funkcji.

    Jeśli uruchamiasz uC na wewnętrznym oscylatorze to może byc problem z dzialaniem uarta, poniewaz wew osc ma tolerancje +-3% a uart dopuszcza 1%. Wtedy moga dochodzić śmieci. Spróbuj w takim wypadku wysyłac bajt 0xC0. Jeśli w takim przypadku przychodzi on dobrze, ale Relaterm zapala kontrolke ERROR, to znaczy, że są problemy z dokłądnościa oscylatora.

    Nie sprawdzałem dokłądnie podłączeń do max'a ale w pdfie któregoś producenta powinieneś znaleźć schemat. Ale przy zasilaniu max'a dawaj raczej 100uF i 100n. On stosunkowo mocno "sieje", szczególnie na wąskich i długich ścieżkach zasilających.


    Pozdrawiam
    Boogie
  • REKLAMA
  • #3 2978575
    Konto nie istnieje
    Konto nie istnieje  
  • #4 2978628
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    skrzyp_ napisał:
    Dziękuje bardzo - działa. Zastanawia mnie jedno - w swoim programie używam funkcji

    sbis UCSRA, UDRE

    czyli skip if bit in register is set

    w przypadku UDRE przez ustawienie rozumie sie przypisanie 0. Z tego wynika że sbis nie sprawdza czy jest tam jedynka, ale sprawdza czy jest na swój sposób ustawiony (w niektórych rejestrach może to być 0, w niektórych 1). Czy dobrze rozumuje?


    bit UDRE jest równy jeden, jeśli uart moża przyjąć następny bajt do wysłania. Czyli także po resecie jest równy 1. Jak wsadzisz bajt to się zamienia na 0. (dokładniej - to na samym początku dopiero po wlozeniu dwoch bajtow bedzie rowny 0 ze względu na buforowanie)

    Pozdrawiam.
    Boogie
  • REKLAMA
  • #5 2988590
    Marianekk
    Poziom 13  
    Posty: 129
    Pomógł: 2
    Ocena: 2
    Witam mam takie pytanko odnośnie tego tematu. Poziomy napięć na liniach RS232 z tego co wyczytałem powinny mieć -15 ... 15V (najlepiej chyba -12 i 12V) jak to ma być spełnione skoro układ zasilamy ze żródła +5V? Byłbym wdzieczny gdyby mi to ktoś wyjaśnił :).
  • REKLAMA
  • #6 2988761
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    Max232 to jest przetwornica pojemnościowa podnosząca napięcie. Odpowiednio ładując kondensatory można uzyskac wyższe napięcie. Dlatego aż tyle trzeba ich do max'a podłączyć.

    Pozdrawiam
    Boogie
  • #7 2988949
    Marianekk
    Poziom 13  
    Posty: 129
    Pomógł: 2
    Ocena: 2
    Wielkie dzięki za wyjaśnienie :)

    Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczył nieprawidłowej konfiguracji UART w mikrokontrolerze ATmega8 pracującym z wewnętrznym oscylatorem 8 MHz. Główne błędy to: włączenie przerwania UART Data Register Empty bez obsługi wektora przerwania, co powodowało reset mikrokontrolera; włączenie sprzętowego sterowania przepływem (CTS), które blokowało transmisję; oraz błędne ustawienie rejestru UBRRL na wartość 52 zamiast 51, zgodnie z tabelą prędkości transmisji dla 9600 bps. Zalecane jest użycie programu Realterm do testów UART. Wewnętrzny oscylator o tolerancji ±3% może powodować problemy z transmisją, gdyż UART wymaga dokładności ±1%. Dyskusja wyjaśniła także działanie bitu UDRE w rejestrze UCSRA, który jest ustawiany na 1, gdy UART jest gotowy do przyjęcia kolejnego bajtu do wysłania. Dodatkowo omówiono napięcia linii RS232 i rolę układu Max232 jako przetwornicy pojemnościowej podnoszącej napięcie z 5 V do wymaganych ±12 V.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA