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

[Atmega8][gcc] Prosty minutnik

adrian1711 25 Sie 2012 21:30 2379 9
  • #1 25 Sie 2012 21:30
    adrian1711
    Poziom 6  

    Nie wiedziałem, czy lepiej stworzyć nowy temat, czy odpowiedzieć tutaj - w razie czego proszę o wydzielenie postu.
    Właśnie skończyłem pierwszy mini-projekt na ATmegę8 - prosty minutnik 3-minutowy z brzęczykiem. Zasada działania: lewy przycisk włącza odliczanie, prawy je zatrzymuje lub - jeśli odliczanie się skończyło - wyłącza brzęczyk. Trzy zielone diody symbolizują pozostały czas - co minutę gaśnie jedna z nich. Duża czerwona dioda zapala się i gaśnie co sekundę.

    [Atmega8][gcc] Prosty minutnik

    Czy w kodzie programu widać jakieś złe nawyki bądź miejsca, które dałoby się zoptymalizować?
    Aby nie niepokoić się drganiami styków, w momencie wciśnięcia przycisku po prostu wyłączałem obsługę przerwania związanego z tym przyciskiem. Czy jest jakiś lepszy sposób zapobiegania temu przy korzystaniu z przerwań?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze jedno pytanie - przy składaniu całości zauważyłem, że brzęczyk i końcówki jego kabli są bardzo wrażliwe na dotyk. Metodą prób i błędów dołączyłem kondensator, tak jak na obrazku. Czy jest to dobry sposób i miejsce na filtrowanie?
    [Atmega8][gcc] Prosty minutnik



    ----
    Wydzielono z tematu: Pierwsze starcie z mikrokontrolerami
    przez LordBlick dnia 25.08.2012 21:35

    0 9
  • Arrow Multisolution Day
  • #2 26 Sie 2012 11:08
    hotdog
    Poziom 26  

    Witam.

    Temat klawiatury (przycisków) obslugiwanej przez przerwania to nie jest taki rewelacyjny sposób. Generalnie w pierwszych projektach wszyscy tak robią. Z czasem jednak dochodzi się do wniosku ze to nie jest dobre rozwiazanie. Problem zaczyna się jak chcemy obsłużyć wiecej przycisków niż mamy przerwań. Wtedy jedyna prawidłowa metoda to pooling gpio w przerwaniu timera. Dużą zaletą jest możliwość zrobienia debuncingu programowego. Chyba ze w uC mamy przerwanie na każdym GPIO.

    U ciebie widzę ze na przyciskach masz pull-up z uC. To bardzo złe rozwiazanie. Zakłócenia (np. styczniki) bez problemu zaidukuja w twoim przewodzie do przycisku impuls, który wywoła przerwanie.

    Jeżeli chcesz zostać przy swoim kodzie z przerwaniami dodaj pullup na przyciskach ok 4,7k, a żeby wyeliminować drgania styków daj ceramiki 100nf równoległe z przyciskiem.

    Pozdrawiam

    0
  • Arrow Multisolution Day
  • #3 26 Sie 2012 15:34
    adrian1711
    Poziom 6  

    hotdog napisał:

    U ciebie widzę ze na przyciskach masz pull-up z uC. To bardzo złe rozwiazanie. Zakłócenia (np. styczniki) bez problemu zaidukuja w twoim przewodzie do przycisku impuls, który wywoła przerwanie.

    Innymi słowy, pull-up powinien być jak najbliżej przycisku zamiast w uC?
    Możliwe, że dziś zrobię osobny program zliczający wciśnięcia przycisku, czysto w celu poeksperymentowania z obsługą switcha. Dzięki za rady :)

    0
  • #4 26 Sie 2012 17:15
    hotdog
    Poziom 26  

    Nie, w uC są wbudowane pull-up'y rzędu 50k ohm, czyli dosyc spore. Jeżeli nie masz urządzenia w metalowej, zmasowanej obudowie lub nie masz zrobionego porządnego filtrowania programowego to zdecydowanie za dużo. Długość przewodów (scieżek) tez działa wtedy na niekorzyść, bo im dłuższy przewód tym lepsza antena na zakłócenia :)

    0
  • #5 26 Sie 2012 17:27
    adrian1711
    Poziom 6  

    Miałem na myśli: czy po dołączeniu rezystorów 4,7k pod switch powinienem wyłączyć pull-up w uC czy go zostawić?

    0
  • #6 26 Sie 2012 22:07
    LordBlick
    VIP Zasłużony dla elektroda

    Zostaw, na pewno nie zaszkodzi...

    0
  • #7 27 Sie 2012 03:51
    dondu
    Moderator Mikrokontrolery Projektowanie

    adrian1711 napisał:
    Aby nie niepokoić się drganiami styków, w momencie wciśnięcia przycisku po prostu wyłączałem obsługę przerwania związanego z tym przyciskiem. Czy jest jakiś lepszy sposób zapobiegania temu przy korzystaniu z przerwań?

    Jeżeli przez "lepszy" rozumiesz skuteczny dla tak prostego projektu jak Twój, to nie ma. Wybrałeś najprostszy i widać, że "główkować" potrafisz :)

    adrian1711 napisał:
    Czy jest to dobry sposób i miejsce na filtrowanie?

    Nie pokazałeś całego schematu, a jedynie fragment, o który pytasz. Pokaż cały schemat.

    W przyszłości definiuj zegar w opcjach projektu, a dlaczego to jest istotne dowiesz się stąd:
    http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html


    ---------------

    Kolego hotdog - nie strasz, gdy nie ma potrzeby.

    hotdog napisał:
    U ciebie widzę ze na przyciskach masz pull-up z uC.
    To bardzo złe rozwiazanie.
    Zakłócenia (np. styczniki) bez problemu zaidukuja w twoim przewodzie do przycisku impuls, który wywoła przerwanie.
    ...
    Nie, w uC są wbudowane pull-up'y rzędu 50k ohm, czyli dosyc spore. Jeżeli nie masz urządzenia w metalowej, zmasowanej obudowie ...

    W tym projekcie nie ma styczników i włączenie wewnętrznych pull-up dla przycisków jest wystarczające, bezpieczne i skuteczne.
    Podobnie straszenie brakiem obudowy metalowej ... to nie tego typu projekt.

    Warto natomiast autora pytać o schemat całości, by zobaczyć, czy prawidłowo filtruje zasilanie, o czym przekonamy się, gdy go wstawi.

    hotdog napisał:
    Jeżeli ... nie masz zrobionego porządnego filtrowania programowego...

    Autor zrobił najskuteczniejszy sposób filtrowania programowego jaki w ogóle jest możliwy i jest on wystarczający dla tego projektu. Ale czekamy na schemat całości.

    0
  • #8 27 Sie 2012 11:41
    hotdog
    Poziom 26  

    dondu masz rację, trochę straszę.

    Po prostu trzeba zrobić albo mocny pull-up, albo filtrowanie :)

    Moje sugestie są tak daleko idące bo widzę że autor chce się czegoś nauczyć :)

    0
  • #9 27 Sie 2012 13:43
    adrian1711
    Poziom 6  

    Oto schemat, wersja "początkowa" (przed utworzeniem tematu i odpowiedziami Hotdoga):
    [Atmega8][gcc] Prosty minutnik
    Rezystor R5 przed brzęczykiem jest tylko po to, by trochę zmniejszyć głośność ;)

    0
  • #10 28 Sie 2012 15:00
    hotdog
    Poziom 26  

    złota zasada, an każdy układ scalony elektrolit 10uF możliwie blisko układu oraz na każdą nóżkę zasilania jeden kondensator ceramiczny 100nF.

    U Ciebie dokładasz 2 ceramiki (VCC - GND, AVCC - GND) i jeden elektrolit (VCC - GND). Atmel też zaleca dławik, no ale idzie żyć bez niego. Poza tym ten dodatkowy pull-up o którym pisałem i nie ma się czego czepić.

    0