logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Stoper elektroniczny - prośba o pomoc w budowie (np na AVR )

Dariusz Goliński 27 Paź 2010 11:16 5978 14
  • #1 8669250
    Dariusz Goliński
    Poziom 22  
    Witam
    Potrzebuję zbudować zegar z dużymi wyświetlaczami do odmierzania czasu jak w stoperze. Problem polega na dokładności pomiaru.

    00.00.00 ( minuty, sekundy, milisekundy )

    Potrzebuję aby można go było uruchomić za pomocą przycisku i zatrzymać za pomocą tego samego przycisku. Drugim przyciskiem kasowanie wyświetlanego wyniku. ( Start stopera - Stop stopera - Reset Wyniku - Start ......... itp )
    Dodatkowo potrzebuję blokadę która będzie miała za zadanie zablokowanie funkcji startu przez około 5 - 8 sekund. ( Po to aby nie można było przypadkowo zatrzymać stopera od razu )

    Wymyśliłem sobie coś takiego. Jako procek Atmega 8, wyświetlacze to led-y sterowane z dekodera BCD.

    Dopiero zaczynam się bawić w programowanie BASCOM więc nie bardzo jeszcze umiem. Potrafię zdefiniować kody BCD ale nie wiem jak zrealizować taki stoper.

    Elektronikę sobie zrobię. Czy pomoże mi ktoś napisać program ?

    Z góry dzięki za pomoc.
  • #2 8669315
    tmf
    VIP Zasłużony dla elektroda
    Bascom? To ci nie pomogę. A co do części elektronicznej - zamiast ładować się w dekodery zrób wyświetlanie multiplekserowe. Mniej połączeń i prościej, i nie potrzeba żadnych zewnętrznych scalaków.
  • #3 8669346
    Dariusz Goliński
    Poziom 22  
    Dziękuje moderatorowi za przeniesienie do właściwego forum.
    Co do części elektronicznej to może być multipleksowe, rzuciłem temat BCD ponieważ obawiam się, że przy multipleksowym mogę mieć problemy z wyświetlaniem ( np czas gaśnięcia diod LED o podwyższonej jasności ( miałem już coś takiego )).
    Co do BASCOM to nie twierdze że musi być w tym języku, po prostu takowy troszkę znam i się go uczę więc trochę roboty mógł bym sam odwalić zwłaszcza monotonne definiowanie cyfr, ale jak by mógł by ktoś mi pomóc w innym języku to też bym był wdzięczny.
  • #4 8669427
    hotdog
    Poziom 26  
    Masz w sumie do obsłużenia 3 rzeczy - GPIO, timer i najlepiej przerwania. Możesz dołożyć jeszcze drugi timer do obsługi wyś. LED.

    Trochę zabiersza się od tyłka strony. Najpierw przedstaw schemat (chyba że już masz i jesteś go pewien), zrób urządzenie i później będziemy omawiać program.

    Ogólnie:
    Init:
    - Konfigurujesz timer tak aby dawał przerwanie co 10ms (milsekund);
    - Konfigurujesz przerwanie od wejścia ustawiającego i zerującego (INT0 i INT1)
    - Konfigurujesz timer od wyświetlacza LED tak aby uruchamiał przerwanie z freq co najmniej 50Hz * ilość wyświetlaczy multipleksowanych;

    Program:
    pętla nieskończona bez w sumie niczego konkretnego
    Przerwania:
    INT0:
    - włączenie lub zatrzymanie timera od licznika
    INT1:
    - reset licznika od wyświetlacza
    TIMER OD LICZNIKA:
    - inkretowanie zmiennych od milisekund, później sekundy, później minuty
    TIMER OD LED:
    - zgaszenie poprzedniego wyświetlacza
    - przetłumaczenie aktualnie wyświetlanej liczby na GPIO
    - ustawienie na GPIO wyjść multipleskowany
    - zapalenie wyświetlacza

    W sumie wszystko. Blokadę sobie gdzieś tam dorzucisz.
  • #5 8669532
    tmf
    VIP Zasłużony dla elektroda
    Dokłądnie tak jak hotdog pisze, z tym, że przyciski (dlaczego nie jeden?) lepiej podłączyć pod wejścia RxD mikrokontrolera. Wykorzystując sprzętowy UART można łatwo uzyskać debouncing. Jak podłączysz pod INT to trzeba będzie chwilkę pokombinować. I dla LEDów dałbym więcej niż 50*ilość wyświetlaczy - lepiej, żeby odświeżanie miało co najmniej 1000Hz. Oczywiście sterowanie zrobić na jakimś buforze, żeby na segment przypadał nieco wyższy prąd dla zapewnienia odpowiedniej jasności.
  • #6 8669626
    Dariusz Goliński
    Poziom 22  
    O to i schemat
    Zrobiony w programie typu e-cad o nazwie HandsPCB
    Nieważne jak wygląda ważne że zawiera istotne informacje potrzebne do pisania softu. Jak coś z tego wyjdzie naszkicuje w Eagle.
    Stoper elektroniczny - prośba o pomoc w budowie (np na AVR )
    Sorki za nie opisanie przycisków. Umówmy się że Start/Stop - PC0 a reset prezentowanego wyniku PC1.
  • #8 8703716
    hotdog
    Poziom 26  
    Schemat jest OK. Jak nie zależy Tobie na zabójczej jasności to z ULN'a mógłbyś w sumie zrezygnować. Wiadomo że jeszcze duży kondensator dla zasilania (impulsowe sterowanie wyświetlaczami) no i ceramiki przy avr'ku.

    Dobrze zrobiłeś podłączając wszystkie wspólne katody wyświetlacza do jedno portu (łatwiej wtedy ustawić na nich wartość). Ale pamiętaj żeby podłączyć przyciski pod wejścia INT (zobacz w nocie które to są i czy ich nie zająłeś, a wydaje mi się że tak).

    Podłącz między przycisk kondensatory 100nF do debouncigu. W sumie w ten sposób trochę stracisz na dokładności (jakieś setne części sekundy). Taki proceder ułatwi znacznie program na uC. Jak później będziesz chciał sobie zrobić go super dokładnego to je wylutujesz i sobie zrobisz w sofcie wszystko tak jak powinno być. Też bym nie żałował 2 rezystorów na pull-up na przyciskach ~5-10k. Bez tego (na wbudowanych) jak załączysz coś powodującego duże zakłucenia indukcyjne blisko urządzenia stoper może się zatrzymać, lub zresetować (już widziałem takie rzeczy :P).

    Chyba tyle...
  • #9 8704503
    Dariusz Goliński
    Poziom 22  
    Dzięki za wszystkie sugestie
    Te przyciski to tak symbolicznie wstawione są bo będą transoptory ( w prototypie będą przyciski ).
    Potem podciągnę do H rezystorkami.

    INT1 = PD3, INT0 = PD2, PC0 = ADC0, PC1 = ADC1
  • #11 8755132
    hotdog
    Poziom 26  
    bascom afe...

    To zależy jak dokładnie chcesz to mieć, najdokładniej to robisz:
    - Konfigurujesz timer na precaler 8;
    - ustawiasz compare match na 100
    - ustawiasz tryb Interroput on compare match
    - włączasz przerwanie od compare match

    W ten sposób przerwanie od comare match generowane jest co 800 cykli zegara. Czyli dokładnie z freq 10kHZ. W tym przerwaniu wprowadzasz licznik który liczy ilość przerwań do 100 i w ten sposób masz 10ms.

    Pozdrawiam
  • #12 8759355
    Konto nie istnieje
    Poziom 1  
  • #13 8760228
    hotdog
    Poziom 26  
    emarcus napisał:

    Skorzystaj z ogólnego szblonu na CTC dla timera1 jaki podał ci hodog, lecz użyj inne parametry.
    Do odmierzenia przyjętego podstawowego przedziału czasowego 10 ms, masz w zasadzie tylko dwie optymalne możliowosci konfiguracji timera1.
    Dajesz prescaler 8 i potrzebujesz naliczyc 10 000 cykli, albo prescaler 64 i naliczyć 1250 cykli timerem1.


    Ja założyłem że będzie chciał skorzystać z timera 8-bitowego, a tam te wartości są chyba najpoprawniejsze. Dla timera 16-bitowego rzeczywiście lepiej jest ustawić presc na 8 i naliczyć 10000 cykli.

    Pozdro
  • #14 8763404
    Konto nie istnieje
    Poziom 1  
  • #15 8765425
    hotdog
    Poziom 26  
    ale timer2 też jest 8 bitowy i ma CTC :)

    Nie ma co dyskutować można zrobić tak jak ja napisałem albo tak jak TY. Zalety Twojego rozwiązania są takie, że jest mniejsza ilość przerwań, bo tylko jedno raz na 10ms (u mnie 100) i w moim rozwiązaniu jedna dodatkowa zmienna w ramie jest potrzebna. Ale za to mamy wolny timer o największych możliwościach.

    Pozdro
REKLAMA