eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAtmega8 i USART › Atmega8 i USART
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!goblin1!goblin.s
    tu.neva.ru!news.motzarella.org!motzarella.org!news.motzarella.org!not-for-mail
    From: Piotr <p...@g...com>
    Newsgroups: pl.misc.elektronika
    Subject: Atmega8 i USART
    Date: Sun, 04 Jan 2009 17:31:11 +0100
    Organization: A noiseless patient Spider
    Lines: 112
    Message-ID: <gjqo8s$691$1@news.motzarella.org>
    Reply-To: p...@g...com
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: news.eternal-september.org
    U2FsdGVkX1+/Z4vE2IcmeauhLeleNStVXh3JqREPA/vnVBboOGi6xLoWpgmvOAnUhwZanlPBu/YQMyPRN/CfjGUMYh8cRRBZznhko7pwwYm3c8zh9Khfv9qQgNcJvmxvSl7hDnLUIVs=
    X-Complaints-To: Please send complaints to a...@m...org with full headers
    NNTP-Posting-Date: Sun, 4 Jan 2009 16:31:25 +0000 (UTC)
    X-Antivirus-Status: Clean
    X-Auth-Sender: U2FsdGVkX19UyPNRo1d8IcWu9eEpVXuWqFfDc+sML1k=
    X-Antivirus: avast! (VPS 090104-0, 2009-01-04), Outbound message
    X-Face: Mv4(E%UaE*shXz=?X`*oGW^F)Iqmp(N:~Rw}F=S}/aM&bv8LG'<M2R26wq.5Oz13A"bn=Rw
    ,xPL8/C%$>@4O#Oar@/o+'sB/Os&cBEFtUdxk[\\9"G7'Y224koPP!XsvHd|7),9+S!)_F92PR;-
    Cancel-Lock: sha1:2Mw1VIeJfx+8UoYCStgUecaVatk=
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.3)
    Gecko/20070326 Thunderbird/2.0.0.0 Mnenhy/0.7.5.666
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:553449
    [ ukryj nagłówki ]

    Witam,

    Nie wiem dlaczego, ale mam dość dziwną i niejasną dla mnie sytuację. Próbuję
    odebrać dane przez USART z wykorzystaniem przerwania. Robiłem już to setki
    razy zarówno dla AVR, PIC, Freescale i nigdy nie miałem z tym najmniejszego
    kłopotu.

    Używam kompilatora gcc 4.3.2 (WinAVR-20081205) z następującymi parametrami
    kompilacji:
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -DF_CPU=4000000 -Os
    -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    -Wp,-M,-MP,-MT,main.o,-MF,dep/main.o.d -c ../main.c -o main.o

    uC pracuje z wykorzystaniem wewnętrznego oscylatora o częstotliwości 4MHz.

    Wysyłanie oraz odbieranie znaków w aktywnej pętli działa bez najmniejszego
    problemu. Kłopoty się zaczynają, gdy próbuję to zrobić w obsłudze przerwania.
    Wygląda na to, iż ani razu przerwanie nie jest wywoływane. Dodam, iż jeżeli
    korzystam z aktywnego czekania podczas gdy włączone są przerwania, dane
    również nie są odbierane. Oto mój kod:

    //--------------------------------------------------
    ---

    #include <avr\io.h>
    #include <avr\interrupt.h>
    #include <avr\signal.h>

    volatile unsigned char data_rx = 1;

    ////////////////////////////////////////////////////
    ///
    // Inicjalizacja interfejsu
    ////////////////////////////////////////////////////
    ///
    void usart_init(int baud_rate)
    {
    // Ustawienie bauda
    UBRRH = (baud_rate >> 8);
    UBRRL = baud_rate;

    // Ustawienia USART
    UCSRB = (1 << RXEN) // Wlaczenie odczytywania
    | (1 << TXEN) // Wlaczenie wysylania
    | (1 << RXCIE); // Wlacz przerwanie odczytywania

    // Ustawienia transmisji
    UCSRC = (1<<URSEL) // Odycztywanie rejestru UCSRC
    | (1<<USBS) // 2 bity stopu
    | (3<<UCSZ0); // 8 bitowy znak
    }

    ////////////////////////////////////////////////////
    ///
    // Wysłanie danych
    ////////////////////////////////////////////////////
    ///
    void usart_send_char(unsigned char data)
    {
    // Poczekaj az zwolni sie bufor transmisji
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    // Umiesc dane w buforze
    UDR = data;
    }

    ////////////////////////////////////////////////////
    ///
    // Odebranie danych
    ////////////////////////////////////////////////////
    ///
    char usart_receive_char()
    {
    // Czekaj az dane beda gotowe
    while ( !(UCSRA & (1<<RXC)) )
    ;
    // Pobierz dane
    return UDR;
    }

    ////////////////////////////////////////////////////
    ///
    // Obsługa przerwania odbioru
    ////////////////////////////////////////////////////
    ///
    ISR(USART_RXC_vect)
    {
    PORTB &= ~(1 << PB0); // Zgas diode
    data_rx = UDR; // Pobierz dane
    }

    ////////////////////////////////////////////////////
    ///
    // main()
    ////////////////////////////////////////////////////
    ///
    int main()
    {
    unsigned char tmp;

    // Led uC
    DDRB |= (1 << PB0);
    PORTB |= (1 << PB0);

    // Inicjalizacja interfejsu USART
    usart_init(25); // Baud rate dla 4Mhz i 9600 bps

    // Wlacz wszystkie przerwania
    sei();

    while(1)
    ;

    return 0;
    }

    //--------------------------------------------------
    ---

    Będę bardzo wdzięczny za wszelkie sugestie.

    --
    Piotr Piwko
    http://www.embedded-engineering.pl/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: