Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA32] [C] jak zrobić arduinowe serial.available, Przerwanie od UART.

kamdz 12 Nov 2017 18:46 660 8
  • #1
    kamdz
    Level 12  
    Witam ponownie, mam kolejny mały problem z uartem w atmedze. Może najpierw kod:
    Code: c
    Log in, to see the code

    Chciałbym, by po jednokrotnym wysłaniu 2 na uart diodki falowały, aż wyślę 1. Można by to zrobić przerwaniem, wtedy gdy tylko wyślę 2 flaga się zmienia i pętla diodek przestanie się wykonywać. Ale jakoś to przerwanie nie działa, diodki nie zaczynają falować po wysłaniu 2. No to dałem na końcu while odczyt z uarta. Tulko teraz jak wyślę 2 to wykonuje się 1 obieg pętli, a następnie program grzęźnie w oczekiwaniu na kolejną daną z uarta. I moje pytania: Czemu nie działa mi ta funkcja obsługi przerwania? I czy jest może w C możliwość sprawdzenia, czy mam coś buforze, działające tak jak arduinowe serial.availible?
    Z góry dzięki za pomoc.
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Helpful post
    #2
    sawitar
    Level 18  
    Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile.

    p.s. Samych rejestrów nie sprawdzalem.
  • Helpful post
    #3
    JarekC
    Level 32  
    Odblokowałeś globalne przerwania ale nie odblokowałeś indywidualnego od UART_RXC.
    Flaga RXCIE w rejestrze UCSRB.

    JarekC
  • #4
    kamdz
    Level 12  
    Dzięki, po zmianie na volatile i ustawieniu tego rejestru pięknie działa. Dla potomnych kod:
    Code: c
    Log in, to see the code


    A Wie ktoś może, czy jest jakiś rejestr, albo coś co pozwoliłoby mi uzyskać wynik zbliżony do Serial.available w arduino? Czy coś pozwalające sprawdzić, czy przyszło mi coś przez UART... Tak na przyszłość chciałbym wiedzieć.

    PS. Aaaa jeszcze, czy dałoby się jakoś zrobić, żeby w funkcji przerwania od UART, jeżeli dostanie 1 to jakoś zakańczało działanie funkcji faluj() natychmiastowo?
  • #5
    BlueDraco
    MCUs specialist
    kamdz wrote:
    A Wie ktoś może, czy jest jakiś rejestr, albo coś co pozwoliłoby mi uzyskać wynik zbliżony do Serial.available w arduino? Czy coś pozwalające sprawdzić, czy przyszło mi coś przez UART... Tak na przyszłość chciałbym wiedzieć.


    Przeczytaj dokumentację mikrokontrolera, rozdział o UART. Dużo tych rejestrów nie ma, więc łatwo znajdziesz to, czego szukasz.
  • #7
    sawitar
    Level 18  
    kamdz wrote:

    A Wie ktoś może, czy jest jakiś rejestr, albo coś co pozwoliłoby mi uzyskać wynik zbliżony do Serial.available w arduino?

    Przeciez juz to sprawdzasz. W funkcji USARTReadChar czekasz w petli while do momentu as jakies dane nie pojawia sie w buforze. Rownie dobrze mozesz sprawdic to tylko raz i zwrócic wynik.
    Code: c
    Log in, to see the code
  • #8
    dondu
    Moderator on vacation ...
  • #9
    JacekCz
    Level 39  
    kamdz wrote:
    Dzięki, po zmianie na volatile i ustawieniu tego rejestru pięknie działa. Dla potomnych kod:
    Code: c
    Log in, to see the code




    Zapewniam Cię, do "pięknego działania" to trochę brakuje. Owszem, z dodaniem słowa volatile zmniejszyłeś prawdopodobieństwo "brzydkiego" działania, ale go nie usunąłeś.