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.

[ATMEGA8][C] - przerwania rs232

witekjj 23 Sie 2012 15:58 1254 2
  • #1 23 Sie 2012 15:58
    witekjj
    Poziom 6  

    Witam
    Próbuję zrealizować obsługę rs232 za pomocą przerwań. Najprostsze fragmenty kodu z noty katalogowej służące do sprawdzenia poprawności transmisji działają, zatem wykluczam tutaj jakiekolwiek przyczyny ze sprzętem i przedstawię tylko kod.

    plik main.c:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/code]

    rs232.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    rs232.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po naciśnięciu przycisku widzę znak na terminalu tylko wtedy, kiedy wysyłam znak za pomocą aktualnie odkomentowanej funkcji w pliku main.c. Kiedy próbuję odkomentować którąś z linii poniżej, znak nie pojawia się a program się wiesza. Próbowałem dochodzić gdzie jest błąd za pomocą zapalania diody LED w różnych miejscach programu. Doszedłem do wniosku, że program nie wykonuje fragmentu kodu odpowiadającego za przerwanie, mimo ustawienia odpowiedniego bitu UDRIE w UCSRB. W nocie katalogowej napisane jest
    Cytat:
    • Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
    Writing this bit to one enables interrupt on the UDRE Flag. A Data Register Empty interrupt will
    be generated only if the UDRIE bit is written to one, the Global Interrupt Flag in SREG is written
    to one and the UDRE bit in UCSRA is set.


    No ale ja UCSRB ustawiam, globalne zezwolenia na przerwania włączam za pomocą sei(), nie jestem tylko pewien co do pustego rejestru UDR, ale jak ustawię ręcznie bit UDRE w UCSRA który oznacza że bufor jest pusty, także nic się nie wysyła.

    Jakieś sugestie? Z góry dziękuję.

    0 2
  • Pomocny post
    #2 23 Sie 2012 20:53
    Andrzej__S
    Poziom 28  

    Najpierw spróbuj może dodać:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    na początku pliku rs232.c

    witekjj napisał:
    ...ale jak ustawię ręcznie bit UDRE w UCSRA który oznacza że bufor jest pusty, także nic się nie wysyła.


    To nie jest argument. Flag przerwań w AVR generalnie nie da się ustawiać programowo, niektóre można tylko wyzerować. Akurat UDRE można wyzerować tylko poprzez wpisanie bajtu danych do rejestru UDR, flaga ustawiana jest sprzętowo po opróżnieniu UDR.

    0
  • #3 23 Sie 2012 22:45
    witekjj
    Poziom 6  

    Dzięki, dodanie pliku nagłówkowego w rs232.h rozwiązało problem:)

    0