Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

Dariusz Goliński 27 Oct 2010 11:16 5819 14
Altium Designer Computer Controls
  • #1
    Dariusz Goliński
    Level 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.
  • Altium Designer Computer Controls
  • #2
    tmf
    Moderator of Microcontroller designs
    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
    Dariusz Goliński
    Level 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.
  • Altium Designer Computer Controls
  • #4
    hotdog
    Level 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
    tmf
    Moderator of Microcontroller designs
    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
    Dariusz Goliński
    Level 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.
  • #7
    Dariusz Goliński
    Level 22  
    Wkrótce postaram się załączyć jakiś zarys softwaru.
  • #8
    hotdog
    Level 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
    Dariusz Goliński
    Level 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
  • #10
    Dariusz Goliński
    Level 22  
    Zrobiłem na razie niewiele
    Nie umiem policzyć Timera żeby generował dokładnie co 10 ms.
    Może ktoś coś dorzuci ?.
    Pozdrawiam.
  • #11
    hotdog
    Level 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
    emarcus
    Level 38  
    Dariusz Goliński wrote:
    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



    Bez urazy:,
    Trochę ci sie to wszystko miesza bo robisz ten projekt w zasadzie bez konkretnego planu.
    Rozumiem że te interrupty (0 i 1) albo przynajmniej jeden chcesz wykorzystać do podłączenia przycisków Start/Stop i Reset (reset licznika nie potrzebuje interruptu) ; a tymczasem te dwa piny sa skonfigurowane w twoim listingu jako wyjścia. Co więc ma być podłączone do PC0 i PC1?
    Dalej, zastępując przyciski transoptorami na nie wiele się to przyda bo transoptor nie eliminuje drgan styków, pozwala natomiast na interface sygnałów o różnych poziomach napięć. U ciebie ten problem jak dotychczas nie widać aby występował. "Brudny" sygnał jest powielany przez transootor. Wymagany będzie 'debounce' w formie programowej lub HW.
    Odnośnie timerów:
    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.
    Czy zastosujesz tryb CTC albo Normal (podstawowy) to nie ma tu większego znaczenia.

    e marcus
  • #13
    hotdog
    Level 26  
    emarcus wrote:

    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
    emarcus
    Level 38  
    hotdog wrote:

    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


    To nie zupenie jest tak jak piszesz.
    W Mega8 timer0 nie ma możliwości ustawienia trybu CTC. Ponadto prescaler 8 jest "bezpieczny " w sensie dokladności odmierzania czasu pod warunkiem użycia trybu CTC czyli pozostaje Timer1 (Timer2 jest również 8 bitowy więc wymagałby zliczania przepełnień). Stosując nawet Timer1 i tryb Normal oraz prescaler 8 należy liczyć się z pewną nadwyżką czasu zużytą na obsługe stosu w przerwaniu koniecznym do obsługi rozdzielczości timera. Prescaler 64 pozwala na taką obsługe.
    Oczywiście, ta 'niedokładnośc' nie jest zbyt duża i niekiedy jest zwyczajnie pomijana; szczególnie gdy pomiar czasu nie jest krytyczny.

    Timer0 może być wykorzystany do obsługi multiplexera wyswietlacza w bardzo dowolnej konfiguracji (bez zmiany rozdzielczości).

    e marcus
  • #15
    hotdog
    Level 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