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.

AVR - Pytanie o obsługę przerwań

Marek_Gorecki 05 Maj 2015 12:46 513 13
  • #1 05 Maj 2015 12:46
    Marek_Gorecki
    Poziom 16  

    Witam;

    mam taką sytuację.
    Do procesora taktowanego 14,475MHz przychodzi prawie ciągle transmisja RS232 o prędkości 115 200Hz.
    Odbiór odbywa się w przerwaniu.
    Wszystko działa.
    Ale teraz chciałem podłączyć do tego procesora encoder.
    Ale powstał problem, mianowicie przy dużej prędkości obrotowej procesor "gubi" impulsy.
    Sprawdziłem, że to nie jest wina enkodera (optyczny) , bo po podłączeniu innego licznika tenże wskazuje dobrze.
    Moje pytanie brzmi : Czy transmisja RS232 na przerwaniach (duża ilość danych) może skutecznie uniemożliwić odbiór impulsów z encodera o tak dużej ilośc impulsów?
    Częstotliwość impulsów przy dużej prędkości wynosi około 2700Hz.

    Czy da się obiczyć max częstotliwość przy której będzie wszystko jeszcze działać dobrze?

    0 13
  • Pomocny post
    #2 05 Maj 2015 13:04
    namok
    Poziom 25  

    0,000000069s - 1/14,475MHz - czas jednej instrukcji procesora
    0,000086806s - (1/115200) *10 - najkrótsza ramka(8 bitów danych + start + stop) - co taki okres może przyjść przerwanie od portu szeregowego.
    Jak widać czasu jest dość(ponad 1000 instrukcji na przerwanie) pytanie co jeszcze robi procesor.
    Jak odbierasz impulsy z enkodera?

    0
  • #3 05 Maj 2015 13:22
    Marek_Gorecki
    Poziom 16  

    Dzieki za odpowiedź - czyli procesor jest "nieczynny" przez czas odbioru 1 znaku , czyli (1/115200) *10 ?
    Dane z encodera też odbieram w przerwaniu.
    A mam pytanie, czy jeżeli wysyłam dane np tak:

    printf"ala ma kota");

    to czy przez ten czas wysyłki procesor jest zablokowany?

    0
  • #4 05 Maj 2015 13:27
    tadzik85
    Poziom 38  

    Oczywiście.
    Chyba, że to jakaś twoja implementacja print.Wbudowane funkcje typu print są zasobożerne.

    0
  • #5 05 Maj 2015 13:33
    namok
    Poziom 25  

    Marek_Gorecki napisał:
    Dzieki za odpowiedź - czyli procesor jest "nieczynny" przez czas odbioru 1 znaku , czyli (1/115200) *10 ?

    Nie. Czas który podałem to czas pomiędzy poszczególnymi bajtami z portu szeregowego.

    Może najpierw poczytaj: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html, poćwicz a potem pytaj. Mam wrażenie że kompletnie nie rozumiesz jak co działa.

    0
  • #6 05 Maj 2015 13:49
    Marek_Gorecki
    Poziom 16  

    namok napisał:
    0,000000069s - 1/14,475MHz - czas jednej instrukcji procesora
    0,000086806s - (1/115200) *10 - najkrótsza ramka(8 bitów danych + start + stop) - co taki okres może przyjść przerwanie od portu szeregowego.



    a co to jest 0,000086806s ?

    Dodano po 3 [minuty]:

    tadzik85 napisał:
    Oczywiście.
    Chyba, że to jakaś twoja implementacja print.Wbudowane funkcje typu print są zasobożerne.


    Czyli z tego co piszesz, nawet jeśli wysyłam printfem dwa znaki, to teoretycznie w tym czasie jak przyjdzie jeden znak na UART to moge go zgubić?

    Przykładowo wysyłam tekst :
    Printf("ala ma kota");

    a dokładnie w chwili wykonywania się tej instrukcji przyjdą dane na UART to stracę je bezpowrotnie? Nie wychwyci je przerwanie?

    0
  • #7 05 Maj 2015 13:53
    tadzik85
    Poziom 38  

    Przerwanie tak, raczej tak.
    Ale możliwe, że masz nieoptymalnie napisane przerwania.

    0
  • #9 05 Maj 2015 15:47
    Marek_Gorecki
    Poziom 16  

    Obsługa przerwań jest banalna.
    W przerwaniu od Rsa jest tylko dopisywany znak do zmiennej tablicowej, a w obsłudze przerwania od encodera tylko warunek i albo zwiększenie, albo zmniejszenie wartości licznika.

    Ale ponawiam pytanie, czy wysyłając rozkaz:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    na czas wysyłki (dość długi czas) program czeka na koniec wysyłki?
    I drugie pytanie, czy w czasie wykonywania tej instrukcji przerwania są zablokowane?

    0
  • #10 05 Maj 2015 15:51
    atom1477
    Poziom 43  

    Bez zobaczenia kodu nic nie można powiedzieć. Samo printf nie blokuje przerwań.
    Blokować by je mogło jak by było umieszczone w innym przerwaniu.

    0
  • #11 05 Maj 2015 15:53
    dondu
    Moderator Mikrokontrolery Projektowanie

    Marek_Gorecki napisał:
    Ale ponawiam pytanie, czy wysyłając rozkaz:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    na czas wysyłki (dość długi czas) program czeka na koniec wysyłki?
    I drugie pytanie, czy w czasie wykonywania tej instrukcji przerwania są zablokowane?

    http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html

    0
  • #12 05 Maj 2015 16:00
    Marek_Gorecki
    Poziom 16  

    Dzięki Atom.
    O to mi chodziło - czyli printf nie blokuje przerwań na czas wysyłki.

    0
  • Pomocny post
    #13 05 Maj 2015 16:03
    dondu
    Moderator Mikrokontrolery Projektowanie

    Marek_Gorecki napisał:
    O to mi chodziło - czyli printf nie blokuje przerwań na czas wysyłki.

    To standardowa funkcja języka C, więc nie może mieć nic wspólnego z przerwaniami, bo te są różne w różnych mikrokontrolerach.

    Istotne jest jednak miejsce jej użycia, więc nadal prosimy o materiały, bo nie ma jak Ci pomóc.

    0
  • #14 05 Maj 2015 21:03
    namok
    Poziom 25  

    Marek_Gorecki napisał:
    a co to jest 0,000086806s ?

    =(1/115200) *10
    Czy Ty aby na pewno rozumiesz podstawowe operacje matematyczne?

    Kolego nie da się pisać programów bez podstawowej znajomości rzeczy. Jeśli masz transmisję szeregową to musisz wiedzieć jak działa. Wzięcie gotowca, wklejenie do programu działa do momentu w którym nie zaczniesz czegoś zmieniać lub nie próbujesz nieudolnie połączyć z innym gotowcem. Przejrzyj przykłady z linku który podałem a przestaniesz mieś podstawowe problemy.

    0