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

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

kamdz 12 Lis 2017 18:46 843 8
REKLAMA
  • #1 16818733
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    Witam ponownie, mam kolejny mały problem z uartem w atmedze. Może najpierw kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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.
  • REKLAMA
  • Pomocny post
    #2 16820209
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile.

    p.s. Samych rejestrów nie sprawdzalem.
  • REKLAMA
  • #4 16820765
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    Dzięki, po zmianie na volatile i ustawieniu tego rejestru pięknie działa. Dla potomnych kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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?
  • REKLAMA
  • #5 16820910
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    kamdz napisał:
    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.
  • REKLAMA
  • #7 16824656
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    kamdz napisał:

    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.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 16824934
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
  • #9 16922182
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    kamdz napisał:
    Dzięki, po zmianie na volatile i ustawieniu tego rejestru pięknie działa. Dla potomnych kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod




    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ś.

Podsumowanie tematu

✨ W dyskusji poruszono problem z implementacją komunikacji UART w mikrokontrolerze ATmega32, szczególnie w kontekście użycia przerwań. Użytkownik miał trudności z poprawnym działaniem zmiennej 'flaga' w przerwaniu, co zostało rozwiązane przez oznaczenie jej jako 'volatile' oraz odblokowanie przerwania RXC w rejestrze UCSRB. Uczestnicy dyskusji sugerowali również sprawdzenie dokumentacji mikrokontrolera oraz optymalizację funkcji odczytu danych z UART. Wskazano na możliwość uproszczenia kodu poprzez dodanie funkcji sprawdzającej dostępność danych w buforze.
Wygenerowane przez model językowy.
REKLAMA