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

[Atmega 32] [C] wywoływanie przerwania USART_RXC_vec przy wysyłaniu

kmkm2 26 Mar 2014 16:13 1320 4
  • #1 13445611
    kmkm2
    Poziom 21  
    Inicjalizacja
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Obsługa przerwania:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wysyłanie danych:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czemu przy wysyłaniu znaku wywołuje się przerwanie USART_RXC_vect?
  • #2 13447338
    BlueDraco
    Specjalista - Mikrokontrolery
    1. Nie wywołuje się samo. być może masz śmieci na linii RXD.

    2. Coś to za dziwna maniera, żeby najpierw włączyć nadawanie i odbiór, a potem dopiero konfigurować parametry transmisji?
  • #3 13447553
    kmkm2
    Poziom 21  
    Cytat:
    1. Nie wywołuje się samo. być może masz śmieci na linii RXD.

    Jeśli nic nie nadaję, to przerwanie nie wywołuje się. Atmega do komputera jest podłączona, przez ft232. Wykluczyłem zwarcie między rx,tx. Jeśli odłączę usb od komputera, to przerwanie przestaje się wywoływać.
    Cytat:

    2. Coś to za dziwna maniera, żeby najpierw włączyć nadawanie i odbiór, a potem dopiero konfigurować parametry transmisji?

    Poprawione
    Cytat:

    3. Masz błędny sposób wyliczenia UBRR.

    Czemu? Przecież wyliczoną wartość UBRR dostaję jako argument metody.

    Dodano po 40 [minuty]:

    Przyczyną było uszkodzenie ft232. Po wymianie na nowy problem ustąpił.
  • #4 13447885
    BlueDraco
    Specjalista - Mikrokontrolery
    Pomyłka, rozpędziłem się z tym UBRR.
  • Pomocny post
    #5 13450209
    Akane
    Poziom 27  
    W przerwaniu USART_RXC musisz odczytać UDR niezależnie od warunków umieszczonych w kodzie, najlepiej, kopiując wartość tego rejestru do lokalnej zmiennej, tuż na początku funkcji. Jeżeli tego nie zrobisz, procesor zakolejkuje kolejne przerwanie. Piszę to na podstawie dokumentacji AVR8.

    W Twoim przypadku, gdy bufor odbiorczy się zapełni i nadejdzie kolejny znak, funkcja USART_RXC_vect zostanie dwukrotnie uruchomiana - raz, by wyczyścić bufor odbiorczy, następnie by odczytać odebrany znak.

    Podobnie jest z USART_UDRE_vect przy wysyłaniu - przerwanie będzie ponawiane, dopóty nie zapiszesz czegoś do UDR, lub nie wyłączysz tego przerwania.

    UBRR możesz zapisać wartością 16-bitową, kompilator sam rozłoży to na ośmiobitowe zapisy. Szkoda trudu, moim zdaniem, na zabawę w UBRRH i UBRRL.
REKLAMA