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.

Przerwania "gryzą" się ze sobą.

miccaldo 10 Sty 2013 18:27 1470 7
  • #1 10 Sty 2013 18:27
    miccaldo
    Poziom 12  

    Witam, mam pewien problem z przerwaniami, otóż zastosowałem przerwanie zewnętrzne do zliczania obrotów i przerwanie timera do zliczania czasu w sekundach, ale po włączeniu przerwań timera, zobaczyłem w debuggowaniu że przerwania zewnętrzne zliczają do około 4. Czy jest to możliwe że przerwania się gryzą ze sobą?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam.

    Proszę uzupełnić tytuł postu- zgodnie z regulaminem pkt.3.1.15 [dzimi]

    0 7
  • #2 10 Sty 2013 19:27
    BlueDraco
    Specjalista - Mikrokontrolery

    Pytania nie rozumiem, ale na początek zaprogramuj timer tak, żeby odmierzał właściwy czas - z automatycznym przeładowaniem i stałym okresem. W tej chwili chodzi jak chce.

    0
  • #3 11 Sty 2013 21:39
    KKK14
    Poziom 9  

    Co masz na myśli pisząc, że przerwania się gryzą?, Podejrzyj sobie kod w asemblerze zobacz ile instrukcji trwa obsługa przerwania zewnętrznego a ile przerwania od timera a ile pętla główna. Jeśli przerwanie zewnętrzne zgłaszało by się bardzo często to teoretycznie istniała by możliwość, że podczas obsługi przerwania od timera zgłoszonych zostanie więcej niż jedno przerwanie zewnętrzne i wtedy część impulsów byłaby gubiona.

    0
  • #4 13 Sty 2013 22:51
    miccaldo
    Poziom 12  

    Nie no tak myślałem że może przerwanie zewnętrzne i od timera na raz mogło by coś mieszać, ale raczej nie. Mam inny problem, bo układ to enkoder MHK40 i wyświetlacz siedmiosegmentowy, i program wygląda następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Enkoder robi jeden obrót, zapala się jedynka i koniec a jest wyraźnie że ma liczyć dalej i jeśli drugi obrót to ma pojawić się dwójka itd. Także tego nie rozumiem.
    Z kolei w AVR Studio kiedy zmienna cnt zliczy do 100 to pojawia się dwójka... i dalej nic.
    Przerwania "gryzą" się ze sobą.
    Czy da się coś zrobić aby to poprawnie działało?

    0
  • #5 13 Sty 2013 23:05
    KKK14
    Poziom 9  

    enkoder ma 100 impulsów na obrót ? Z tego programu co teraz wstawiłeś wynika, że to co się wyświetla na LED zależy od cnt i czas to jak to niby ma działać ?

    0
  • #6 13 Sty 2013 23:17
    miccaldo
    Poziom 12  

    Kanał A enkodera jest podłączony do pinu INT0, ustawiłem na tym pinie przerwanie zewnętrzne od zbocza narastającego. Jeśli chodzi o ten cnt i czas, fakt dopiero spojrzałem, tej zmiennej czas w ogóle tam nie powinno być, ale zmieniłem w if'ach zmienne czas na cnt i niestety po obrocie enkodera jest nadal to samo, czyli tylko jedynka się pojawia.
    W AVR Studio zmieniło się że jak zliczy do 100, to obrot = 2, zliczy do 200, obrot = 4, zliczy do 300, obrot = 6. Nie wiem skąd 2, 4, 6 skoro ma dodawać +1...

    0
  • #7 13 Sty 2013 23:30
    KKK14
    Poziom 9  

    A skąd wiesz, że impulsy z enkodera są dobrze zliczane ?

    Dodano po 4 [minuty]:

    miccaldo napisał:

    W AVR Studio zmieniło się że jak zliczy do 100, to obrot = 2, zliczy do 200, obrot = 4, zliczy do 300, obrot = 6. Nie wiem skąd 2, 4, 6 skoro ma dodawać +1...


    Z tego wynikało by, ze enkoder ma 200 impulsów na obrót. Czyli po jednym obrocie cnt=200, pod dwóch cnt=400 itd.

    0
  • #8 14 Sty 2013 17:09
    miccaldo
    Poziom 12  

    Wydaje mi się że zlicza poprawnie, gdyż po jednym obrocie zapala się jedynka. Ale żeby było jasne, program ma działać na enkoderze ale robię też symulację w AVR Studio bo tam mogę obserwować zmienne, ale w tym wypadku wiadomo nie kręcę enkoderem więc zastępuje mi ten fragment:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Teraz zmieniłem jedną rzecz: przerwania zewnętrzne uaktywniają się przy zmianie stanu, a nie przy zboczu narastającym, efekt taki że przy cnt==200 dodaje do zmiennej obrot +1, przy 400 obrot=2 więc prawidłowo. Muszę teraz sprawdzić czy będzie poprawnie również przy obrotach enkoderem, choć obawiam się że niewiele zmieni.[/quote]

    Dodano po 25 [minuty]:

    Uwaga, ta zmiana nic nie dała, ale: jakoś spróbowałem pokombinować, i mam takie coś:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak widać zmieniłem wyłącznie operatory przypisania, zupełnie przypadkowo, i wygląda to tak że na samym początku mam zero, następnie kręcę enkoderem jeden obrót i zapala się "8", czyli ok. A przy następnym obrocie zapaliła mi się już "2". Tak więc jest pewność że enkoder zlicza prawidłowo, ale teraz mam pytanie dlaczego tak się dzieje? Przecież operator '=' ustawia bity niezależnie od stanu poprzedniego, więc chyba powinno działać?

    Dodano po 6 [minuty]:

    Ok, muszę teraz zmienić wyświetlacz jakby był ze wspólną katodą, bo dodanie operatora '~' załatwia sprawę, zlicza do końca. Tylko proszę o wytłumaczenie dlaczego taki banał a miał tak znaczący wpływ?

    0
  Szukaj w 5mln produktów