Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMEGA32 - Prędkość transmisji USART

bojar10 20 Lis 2013 22:25 978 7
  • #1 20 Lis 2013 22:25
    bojar10
    Poziom 6  

    Witam,
    moim zadaniem jest wysłanie ramki danych za pomocą mikrokontrolera ATMEGA32.
    Jeden bit musi trwac 4 us (mikrosekundy), co daje nam predkosc 250kbps. Niestety w dziedzinie mikrokontrolerów jestem początkujący i nie bardzo rozumiem podpowiedzi z internetu, a tym bardziej te w datasheet ATMEGA32, ktore sa po ang.
    Interesują mnie linijki kodu, które ustawiają tą prędkość. Znalazłem, że za to odpowiada rejestr USART. Nalezy odpowiednio ustawic bity UBRRH i UBRRL. Niestety nie wiem jak to zrobic.
    W każdym z plików pomocy znalazłem taki kod:

    UBRRH = (unsigned char) (ubrr >> 8); // ustawienie prędkości
    UBRRL = (unsigned char) ubrr;

    Wyglada na to ze odpowiada on za ustawianie predkości, jednak w jaki sposob do tego dochodzi ,to nie mam pojecia. Co oznacza ubrr >> 8 ? Jak powinienem ustawic te bajty, aby otrzymac moją prędkość 250kbps? I jakie taktowanie procesora? Proszę o pomoc

    0 7
  • #4 20 Lis 2013 23:02
    bojar10
    Poziom 6  

    Wg tego artykulu UBRR=[fosc/(16*BAUD)]-1

    jeżeli taktowanie procesora wynosi fosc= 8 000 000Hz
    BAUD = 250 000Hz
    wynika, że UBRR = 1

    Czy to oznacza, że musze ustawić UBRRH =0000 0000
    UBRRL = 0000 0001

    więc, w programie bedzie to wygladac tak:

    UBRRH = (unsigned char) ubrr; // ustawienie prędkości
    UBRRL = (unsigned char) (ubrr>>0); //czyli ustaw 1 na bicie zerowym bajtu UBRRL

    ATMEGA32 - Prędkość transmisji USART

    mam racje?

    0
  • #5 20 Lis 2013 23:06
    dondu
    Moderator Mikrokontrolery Projektowanie

    Po co zajmujesz się liczeniem?
    Algorytm i nagłówek setbaud.h zrobią to za Ciebie.
    Wykorzystaj po prostu funkcję, którą Ci wskazałem ponieważ istnieje jeszcze mnożnik: U2X
    Masz wtedy pewność poprawnego ustawienia, a przy przekroczeniu dopuszczalnych parametrów błędu otrzymasz warning.

    0
  • #6 20 Lis 2013 23:13
    bojar10
    Poziom 6  

    dondu napisał:
    Po co zajmujesz się liczeniem?
    Algorytm i nagłówek setbaud.h zrobią to za Ciebie.
    Wykorzystaj po prostu funkcję, którą Ci wskazałem ponieważ istnieje jeszcze mnożnik: U2X
    Masz wtedy pewność poprawnego ustawienia, a przy przekroczeniu parametru błędu otrzymasz warning.


    Podsumowując, jeżeli zdefiniuje w ten sposob parametry transmisji, to prędkość zostanie ustawiona automatycznie?


    void usart_inicjuj(void)
    {
    #define BAUD 250000 //tutaj podaj żądaną prędkość transmisji
    #include <util/setbaud.h> //linkowanie tego pliku musi być

    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
    #if USE_2X
    UCSRA |= (1<<U2X);
    #else
    UCSRA &= ~(1<<U2X);
    #endif
    (...)

    Natomiast co z ustawieniem czestotliwosci taktowania procesora? Rozumiem, że nie może być dowolna. W jaki sposób ją dobrac?

    0
  • Pomocny post
    #7 20 Lis 2013 23:18
    dondu
    Moderator Mikrokontrolery Projektowanie

    Tak. Po to właśnie jest nagłówek setbaud.h a funkcję go wykorzystującą już znasz i opisałem ją dokładnie w komentarzach.
    F_CPU ustawia się w opcjach: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
    W ten sposób setbaud.h będzie wiedział jaka jest częstotliwoć taktowania mirokontrolera, i funkcja usart_inicjuj() dobierze odpowiednie ustawienia USART do wybranej przez Ciebie prędkości transmisji i co najważniejsze, zawsze zrobi to poprawnie lub zgłosi warning o przekroczeniu poziomu błędu.

    I po problemie :)

    0
  • #8 20 Lis 2013 23:19
    bojar10
    Poziom 6  

    Dziekuje bardzo za pomoc

    0