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.

[Rozwiązano] Zobrazowanie zjawiska drgania stykow - przerwania zewnetrzne

Jakub17 20 Mar 2018 11:01 540 17
  • #1 20 Mar 2018 11:01
    Jakub17
    Poziom 6  

    Witam

    Procesor ATmega328
    Napisałem krotki programik ukazujący na wyświetlaczu liczbę zmian stanów po naciśnięciu przycisku, w którym nie został zaimplementowany debouncing.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Program właściwe działa, ale jest jedno "ale"...
    Nie rozumiem dlaczego gdy trzymam przycisk wciśnięty, to zmienna nadal się inkrementuje w przerwaniu. Ustawiam w procedurze obsługi przerwania naprzemiennie wyzwalanie zboczem opadajacym i narastajacym. Jak trzymam przycisk wciśnięty to jest on cały czas zwierany do masy, więc nie powinno pojawiać się żadne zbocze, a tym samym przerwanie. Tymczasem tak się dzieje, przez co pomiar jest niewiarygodny, bo wystarczy, że dłużej przytrzymam przycisk a zmienna sie inkrementuje, mimo że zmian stanów nie było (przecież jak będę trzymał przycisk wciśnięty w nieskończoność to w końcu drgające styki się uspokoją).
    Gdzie leży problem?

    0 17
  • #2 20 Mar 2018 11:27
    czareqpl
    Poziom 28  

    Jakub17 napisał:
    Gdzie leży problem?


    Może problem leży w sile docisku? Może wtedy też doświadczasz drgania styku? Spróbuj zlutować przewody i sprawdź czy zjawisko się powtarza.

    0
  • #3 20 Mar 2018 12:03
    Jakub17
    Poziom 6  

    Staram się przykładać stałą siłę docisku. Przycisk trzymałem nawet przez kilkanaście sekund i nadal to samo (styki powinny już dawno przestać drgać) - zmienna nieustannie się inkrementuje, przepłenia się i inkrementuje ponownie... czyli przerwania wywołują się nieustannie. Układ mam polutowany na płytce.

    Dodano po 4 [minuty]:

    Gdzieś musi być błąd w programie, bo nawet jeśli pominę switch i od razu zewrę pin INT0 do masy, to występuje ten sam problem... Sprawdziłem dokładnie dokumentacje. Naprawdę na temat przerwań zewnętrznych w procesorze ATmega328 mało piszą. Dużo więcej konfiguracji jest w ATmega32

    1
  • #4 20 Mar 2018 12:21
    ghost2000
    Poziom 17  

    Jakub17 napisał:
    Ustawiam w procedurze obsługi przerwania naprzemiennie wyzwalanie zboczem opadajacym i narastajacym

    Po co skoro można ustawić przerwanie od obu zboczy?

    Jakub17 napisał:
    na temat przerwań zewnętrznych w procesorze ATmega328 mało piszą. Dużo więcej konfiguracji jest w ATmega32

    Akurat przerwanie INT0, 1, są w obu uC obsługiwane tak samo.

    Poniższe
    Kod: c
    Zaloguj się, aby zobaczyć kod

    jeśli już robisz to bezpośrednio przed wyjściem z przerwania a nie na jego początku.

    0
  • Pomocny post
    #5 20 Mar 2018 12:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    W pętli głównej robisz operację R-M-W na rejestrze EICRA, który modyfikujesz też z przerwania.

    Do tego Twoja funkcje ustaw_wyzwalanie_poziomem() i ustaw_wyzwalanie_zboczem() na 100% nie robią tego co chcesz, bo aby to robiły to musiałbyś zerować też kilka innych bitów, a nie tylko używać "|=".

    0
  • #7 20 Mar 2018 12:24
    ghost2000
    Poziom 17  

    Jakub17 napisał:
    Nie. Rejestry są inne. Zajrzyj do dokumentacji.

    Nie napisałem, ze są takie same tylko
    Cytat:

    Akurat przerwanie INT0, 1, są w obu uC obsługiwane tak samo.

    To, ze nazywają się inaczej (mają różne adresy) i mają inne nr bitów, nie zmienia faktu, że obsługa i możliwości są takie same.

    0
  • #8 20 Mar 2018 12:43
    Jakub17
    Poziom 6  

    Freddie Chopin napisał:
    W pętli głównej robisz operację R-M-W na rejestrze EICRA, który modyfikujesz też z przerwania.

    Do tego Twoja funkcje ustaw_wyzwalanie_poziomem() i ustaw_wyzwalanie_zboczem() na 100% nie robią tego co chcesz, bo aby to robiły to musiałbyś zerować też kilka innych bitów, a nie tylko używać "|=".




    Spojrzałem jeszcze raz w dokumentacje. Okazało się że pomyliłem troche nazwy bitów np. zamiast ISC01 uzywalem ISC10. Teraz działa. Dzięki za sugestie:)

    I ku mojemu zaskoczeniu jest niewiele tych zmian stanu. Jak mocno przywale w przycisk to mam tak z 8-9 a typowo przy normalnym wciśnięciu 3-4, czyli o 1 lub 2 za dużo. Dodałem jeszcze jeden warunek w main(). Ponieważ ostatnie zbocze na pewno będzie narastające, więc ostatnie przerwanie ustawi konfigurację bitów na zbocze opadające. Uwzględniłem to w warunku if(). Oto poprawiony program:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 20 Mar 2018 13:11
    mpier
    Poziom 16  

    Hej. ICS00, ICS11 i reszta wiesz co znaczą?

    0
  • #11 20 Mar 2018 14:26
    mpier
    Poziom 16  

    Ani ICS ani ISC (racja) nie oznaczają sposobu wyzwalania przerwania. Nic dłuższego teraz nie napiszę. Poszukaj.

    0
  • #12 20 Mar 2018 15:01
    ghost2000
    Poziom 17  

    mpier napisał:
    Ani ICS ani ISC (racja) nie oznaczają sposobu wyzwalania przerwania

    Oznaczają. Można ustawić zbocze opadające, narastające, oba lub poziom niski. Autor uparł się, nie wiedzieć czemu, aby w przerwaniu zmieniać zbocza aby ustawić obydwa. To jest pierwszy błąd. "Kugluje" tymi zboczami, a flagę przerwania kasuje przez nie nie po "kuglowaniu". Gdzie sens, gdzie logika?
    Jeśli ma te rady w głębokim poważaniu, wystarczy wykomentować wszystko w pętli głównej i w debugerze zobaczyć czy występują niekontrolowane przerwania. W ten sposób można łatwiej namierzyć problem.

    0
  • #13 20 Mar 2018 15:22
    mpier
    Poziom 16  

    Autor poprawił program. Za długo pisałem pierwszą wiadomość. Nie oznaczają. ISC00 znaczy 0, ISC11 znaczy 3 itd. W pierwszym poście autor potraktował ich nazwy raczej "dosłownie".

    0
  • #14 20 Mar 2018 16:04
    Jakub17
    Poziom 6  

    mpier napisał:
    "Kugluje" tymi zboczami, a flagę przerwania kasuje przez nie nie po "kuglowaniu". Gdzie sens, gdzie logika?


    A co za różnica w którym miejscu procedury obsługi przerwania skasuje tą flagę? Tak w ogole jest ona kasowana przy wejściu do procedury obsługi przerwania. Napisałem ją tak z przyzwyczajenia... Bodajże w ATmega32 w dokumentacji było to zalecane ręczne wyzerowanie flagi przy zmianie sposobu wyzwalania przerwania. W dokumentacji ATmega328P takich zaleceń nie mam, mimo to ją wyzerowałem ręcznie.

    Dodano po 5 [minuty]:

    ghost2000 napisał:
    mpier napisał:
    Ani ICS ani ISC (racja) nie oznaczają sposobu wyzwalania przerwania

    Autor uparł się, nie wiedzieć czemu, aby w przerwaniu zmieniać zbocza aby ustawić obydwa. To jest pierwszy błąd.


    To nie jest błąd. Można tak zrobić i program będzie idetycznie. Poza tym jest to zabieg celowy. W warunku if wykrywam czy ustawione jest przerwanie wywoływane zboczem opadającym. Ponieważ sposób wyzwalania przerwania jest naprzemienny w ostatnim przerwaniu na pewno będzie ustawienie na zbocze opadające. W połączeniu z resztą elementów warunku oznacza to, że ostatnim przerwaniem było przerwanie wywołane zboczem narastającym i drgania styków się skończyły.

    0
  • #15 20 Mar 2018 16:35
    ghost2000
    Poziom 17  

    Piszesz

    Jakub17 napisał:
    A co za różnica w którym miejscu procedury obsługi przerwania skasuje tą flagę?


    Później
    Jakub17 napisał:
    Bodajże w ATmega32 w dokumentacji było to zalecane ręczne wyzerowanie flagi przy zmianie sposobu wyzwalania przerwania.


    Gdzie logika?

    0
  • #17 20 Mar 2018 16:48
    ghost2000
    Poziom 17  

    Jakub17 napisał:
    Napisałem, że to pracuje na ATmega328P a tam nie ma takich zaleceń

    Słyszał kolega o erratach, niewykrytych błędach? Czy kolega sprawdził to, że kasowanie tej flagi nie ma znaczenia?
    Skoro jednak czytam
    Jakub17 napisał:
    Odczep się już od tej flagi.

    to pewnie tak.

    0