Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

niestabilne dzialanie, licznik impulsów

21 Mar 2012 23:19 2720 23
  • Poziom 16  
    Witam,

    Piszę program obsługujący diody umieszczone symetrycznie na obrzeżu koła. Diody mają działać tak, że przy obrocie koła świeci się tylko jego połowa. Pomiar dokonuje się jednym kontaktronem.

    Program powstał, testuje go na płytce uniwersalnej, a impuls pomiarowy wymuszam zbliżając magnes do kontaktronu. Niestety działa strasznie niestabilnie, a w sumie można powiedzieć, że nie działa.

    Jeśli ktoś mógłby spojrzeć na kod i wskazać która część jest źle, a może cały zamysł jest bez sensu :/

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Może jeszcze opiszę ideę. A mianowicie zliczam impulsy co 10ms w przerwaniu od timera. Na ich podstawie w chwili przerwania zewnętrznego (czyli co pełen obrót koła) wyliczam czasy (ilości impulsów od przerwania z timera) świecenia diod rozmieszczonych na kole.

    Wydaje mi się, że idea dobra, ale pewnie nie mam racji.
  • Poziom 38  
    Kontaktron potraktowany magnesem przy wlączaniu/wyłączaniu ma drgania styków.
    Wyzwala Ci wiele przerwań- i całość idzie w krzaki.
    Podtawowa sprawa- debouncing.
    Kontaktron ma dość krótki czas drgań styków- tak że 1-3ms do sprawdzenia stanu styków wystarczy.
  • Poziom 16  
    Faktycznie o drganiach styków nie pomyślałem czyli dać delay 3 ms po wyzwoleniu przerwania ?

    Czy w jakiś inny sposób lepiej to zrealizować? Czytałem opisy do badania stany styku ale to jest przerwanie i samo w sobie reaguje na zbocze opadające. (stan portu PULL_UP wywalam przerwanie przez podpięcie do 0)
  • Poziom 38  
    delay() to jest o kant...
    Trzeba zrobić jakiś normalny debounce- wykorzystujący timer i przerwania od timera.
  • Poziom 16  
    Dzięki, korzystam cały czas z tej strony ale wczoraj było już późno i nie zauważyłem tego punktu w spisie treści.

    A takie pytanie jeszcze do kodu, czy ogólnie zamierzenie jest dobre? czy w zły sposób podszedłem do tematu ?

    Dodano po 13 [minuty]:

    Miałem jeszcze taki dziwny przypadek, sprawdziłem wczoraj czy te if'y działają. Ustawiłem sobie czas przerwy i świecenia na stałą wartość, zrobiłem resetowanie licznika impulsów LP_timer0 tak aby diody zapalały się na okrągło. Wszytko ogólnie działało jak trzeba z wyjątkiem diody na pinie PA5, która to zapalała się jednocześnie z diodą PA0, analizowałem kod 3 razy czy nie mam gdzieś jakiejś pomyłki i jedyne miejsce gdzie robię coś z PA5 to ostatni warunek if. Zastanawiam się czy może mam coś z Atmegą nie tak. W dokumentacji też sprawdziłem kolejność wyprowadzeń i jest ok.
  • Poziom 30  
    Przy pomiarze tak małych częstotliwości jak obrót koła gdzie nawet nie jest wymagana superwysoka dokładność można spokojnie zrobić w paru linijkach częstotliwościomierz na dowolnym pinie mikrokontrolera, który będzie działał w pętli głównej i bez żadnego kombinowania można bardzo łatwo dorobić do tego debounce.
  • Moderator Mikrokontrolery Projektowanie
    Pokaż schemat.
  • Poziom 16  
    A czy nie będzie to działać jak w pierwszym kroku po wykryciu przerwania wyłączę pin INT1, a potem włączę go powiedzmy po 30 ms ? Przerwanie się wyzwoli i nie będzie możliwości wyzwolenia przez drganie styków.

    schemat, w którym testuje układ:
    niestabilne dzialanie, licznik impulsów

    przepraszam,że paincie.
  • Moderator Mikrokontrolery Projektowanie
    Będzie działać :)
    Tylko wyłączaj przerwanie INT na samym początku procedury jego obsługi.
    Tylko nie dawaj opóźnienia w funkcji obsługi przerwania.

    Czy to kompletny schemat?
    Mam nadzieję że nie :)
    Ale jeżeli kompletny, to zobacz w spisie treści z linku który podałem temat: Minimalne podłączanie pinów
  • Poziom 38  
    Przypomniał mi się mój pierwszy program na uC, którym był licznik rowerowy z obsługą LCD, zrobiony na kontaktronie. Pokazał bym program ale w sumie debouncing rozwiązałem sprzętowo filtrem LP
  • Poziom 38  
    Przerwanie do debouncingu styków to jest takie sobie.
    To nie jest sygnał o jasno określonej szybkości narastania zbocza.
    W przypadku takiego sterowania każde zakłócenie będzie odebrane jako sygnał przerwania.
    Na wejście przerwania powinien iść sygnał ukształtowany przez jakiś przerzutnik albo układ RC.
    Polling w pętli głównej albo odpytywanie co jakiś czas jest lepsze.
  • Poziom 38  
    janbernat napisał:
    Przerwanie do debouncingu styków to jest takie sobie.


    Dużo lepiej zrobić sobie taki scheduler na timerze, który cyklicznie odczytuje stan wejścia (wejść). Odpadają delaye i cudowanie z blokowaniem przerwań i poranną gimnastyką. Albo zrobić LP na chociażby RC.
  • Poziom 38  
    U mnie w pracy są tacy, co co drugie słowo mają sficzurowane ;]

    Niech będzie Panie Janie - to nie jest żaden scheduler, tylko PLANISTA :D
    I nie LP (low-pass) tylko dolno-przepustowy.
    Timer - czasomierz
    Delay - opóźnienie
  • Poziom 38  
    Bo polling to da się łatwo tłumaczyć- odpytywanie.
    Ale debouncing- eliminowanie drgań styków- to niby jasno ale długo.
    A z tym scheduler- no to nie mam pomysłu.
    Jakiś zarządca albo kierownik produkcji.
  • Poziom 16  
    "Jasno ukształtowany sygnał" , myślałem żeby zamiast kontaktronu wykorzystać hallotron.
    Ale przeanalizuje jeszcze wasze podpowiedzi i dam znać co wyszło.

    Dzięki za wskazówki.
  • Poziom 38  
    gaskoin- nie ma timerów.
    Wcale nie ma.
    Są tylko liczniki.
    Timer- to dopiero z tego sobie można zrobić.
    Ale ten scheduler- no nie wiem jak to przetłumaczyć.
    Albo coś takiego:
    Dostał ficzer i jest kontent.
    Jakaś miesznka nowomowy i staropolszczyzny.
  • Poziom 38  
    Ależ pisałem już :) w polskiej nazwie scheduler występuje jako "planista".
  • Poziom 38  
    No dobrze- planista.
    Mi to bardziej odpowiada- chociaż długie:
    "Algorytm szeregowania (ang. scheduler - planista) to algorytm rozwiązujący jedno z najważniejszych zagadnień informatyki - jak rozdzielić czas procesora i dostęp do innych zasobów pomiędzy zadania, które w praktyce zwykle o te zasoby konkurują.

    Najczęściej algorytm szeregowania jest implementowany jako część wielozadaniowego systemu operacyjnego, odpowiedzialna za ustalanie kolejności dostępu zadań do procesora. Oprócz systemów operacyjnych dotyczy w szczególności także serwerów baz danych."
  • Poziom 16  
    Witajcie

    Jednak poproszę o radę. Poprawiłem kod dodając na samym początku obsługi przerwania GICR &= ~(1<<INT1);
    Ale program dalej źle działa. Nie ma już problemu drgania styku, ale układ zachowuje się tak jakby w chwili ponownego załączenia GICR czyli po iluś tam ms :
    if(LP_timer0 > 50) GICR |= (1<<INT1); // (500 ms)
    wchodził od razu w przerwanie bo dioda która zmienia stan po wejściu w przerwanie gaśnie chwilkę po podaniu sygnału co by się zgadzało z tym 50ms. I jak wydłużyłem czas do 5000ms dioda gaśnie proporcjonalnie później.

    Może coś innego jeszcze jest nie tak. Proszę podpowiedzcie co może być nie tak

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 38  
    Przed ponownym włączeniem obsługi przerwań trzeba skasować odpowiednią flagę w rejestrze GIFR.
    Bo zapewne jest ustawiona i natychmiast wchodi w obsługę przerwania.
  • Moderator Mikrokontrolery Projektowanie
    janbernat napisał:
    No dobrze- planista.
    Mi to bardziej odpowiada- chociaż długie:
    "Algorytm szeregowania (ang. scheduler - planista) to algorytm rozwiązujący jedno z najważniejszych zagadnień informatyki - jak rozdzielić czas procesora i dostęp do innych zasobów pomiędzy zadania, które w praktyce zwykle o te zasoby konkurują.


    Ja uważam, że na siłę tłumaczenie wszystkiego na Polski jest bez sensu, z racji wieku zapewne pamiętasz tłumaczenia typu międzymordzie, joystick jako zabawowy kij może przyprawić rumieńce co wrażliwszej niewiasty :)
    Ale nawet nie o terminy chodzi - zasoby polskiego internetu są nikłe, jeśli ktoś poszukuje rozwiązań to musi poznać angielski. A wtedy zastanawianie się jak po angielsku będzie planista (dlaczego scheduler, a nie planner?) jest po prostu uciążliwością. To są terminy międzynarodowe i wszyscy ich używają. Powszechnie też występują w nazwach produktów.
  • Poziom 16  
    Trochę inaczej to już rozwiązałem zamknąłem w przerwaniu wszystko if'em, ale sprawdzę jeszcze tą flagę GIFR, bo to będzie lepsze rozwiązanie.