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

Czasomierz/Okresomierz ATMEGA8

MrFlexible 06 Dec 2013 22:12 5073 28
Computer Controls
  • #1
    MrFlexible
    Level 9  
    Witam wszystkich, jestem w trakcie robienia Czasomierza/Okresomierza. W załączniku umieściłem schemat. Jeśli chodzi o Sharpy, to dla nich będą osobne malutkie płytki. Nauczyłem się już obsługi wyświetlacza, ale utkwiłem w samym pomiarze czasu. Używam zewnętrznego kwarcu 16Mhz. Moje pytanie(nigdy nie używałem timerów), jak badać moment kiedy stan niski przechodzi w wysoki(aby mi sharp milion razy nie włączył timera), oraz jak mam ustawić, włączyć, wyłączyć, zapamiętać jakikolwiek timer z megi8, aby liczyć czas rzeczywisty. Programuję w C/C++ w Atmel Studio 6.1 Jeśli chodzi o dokładność to interesują mnie sekundy, setne sekundy. ;)
  • Computer Controls
  • #2
    dondu
    Moderator on vacation ...
    Witaj.

    Na początek pochwała za ładny schemat - takie schematy aż chce się sprawdzać :)

    Ale zaczniemy od uwag i pytań do niego:
    1. W jaki sposób osiągniesz niski stan na liniach TS1, TS2 i TS3? Zastanów się nad tym.
    2. Jaki to buzzer? Podaj link do datasheet.
    3. Jakie SHARPy?
    4. Jakie źródło zasilania?

    Co do pomiaru czasu za pomocą timerów z wykorzystaniem ICP - przykład: http://mikrokontrolery.blogspot.com/2011/04/obrotomierz-diy.html

    EDIT:
    Poprosiłem moderatora, by przeniósł Twój post do właściwego działu: https://www.elektroda.pl/rtvforum/forum199.html
  • #3
    MrFlexible
    Level 9  
    1. Faktycznie, trzeba je do masy podciągnąć.
    2. http://www.tme.eu/pl/details/ld-bzeg-0905/sygnalizatory-elektromag-z-generatorem/loudity/ , wielokrotnie już go w innych projektach używałem.
    3. Cyfrowe 10cm, znalazłem sobie wygodne mocowanie wraz z elementami pasywnymi : http://botland.com.pl/cyfrowe-czujniki-odlegl...rowy-czujnik-odlegl-10cm-z-podstawka-pcb.html
    Jutro przeanalizuję przykład ;)
  • Computer Controls
  • #4
    kicajbas
    Level 32  
    Witam
    Jeśli przycisk "RESET" jest zbocznikowany kondensatorem, to powinien być włączony w szereg z rezystorem 330R a nie bezpośrednio do masy.
    Pozdr.
  • #5
    MrFlexible
    Level 9  
    A możesz powiedzieć co konkretnie zmieni ten rezystor? Bo w każdym poprzednim projekcie reset przy takim podłączeniu działa prawidłowo. A co do przykładu, to kompletnie nie wiem co się w nim dzieje ;D
  • #6
    Mateusz_Łukasik
    Level 10  
    TUTAJ

    rozdział "Eliminacja sprzętowa za pomocą kondensatora" :)
  • #7
    excray
    Level 40  
    Mateusz_Łukasik wrote:
    TUTAJ

    rozdział "Eliminacja sprzętowa za pomocą kondensatora" :)

    Musi albo i nie musi. To tylko RESET. A na dodatek kondensator na linii RESET podpiętej pod złącze KANDA może spowodować problemy przy programowaniu a nawet uszkodzić port w programatorze.
  • #9
    excray
    Level 40  
    dondu wrote:
    ... który jako jedyny nie ma diody zabezpieczającej zwierającej do Vcc ...

    Właśnie. I dlatego nie należy pchać się z kondensatorem w to miejsce. Szczególnie że uC ma już zaimplementowany własny system utrzymywania odpowiednio długiego sygnału RESET a kondensator na resecie to taki zabytek z czasów 8051 i starszych.
  • #10
    dondu
    Moderator on vacation ...
    Projekt powyższy nie wygląda na obciążony zakłóceniami z silników, przekaźników, itp. więc dodanie kondensatora jest faktycznie nadmierną ostrożnością. Ja bym pewnie nie dodał, ale może autor wie coś czego my nie wiemy.


    @MrFlexible
    Nie odpowiedziałeś na moje pytanie nr 4.
  • #11
    MrFlexible
    Level 9  
    Wybacz, źródło zasilania pewnie zasilacz impulsowy 12V. Analizą tego schematu nie musicie się zajmować, zapewniam, że wszystko działa wg moich oczekiwań:). Problemem jest tylko program. Obsługiwanie timerów to moja pięta achillesowa. Jak zrobić, aby Sharp1 włączył liczenie czasu, jak zapamiętać czas przelotu obiektu pomiędzy sharp1-2, 2-3, 1-1(pełny cykl wahadła) oraz aby po 10 cyklach(sharp1-2-3-2-1) sharp1 zatrzymał timer. Czasy chciałbym sobie przerzucić do tablic, aby je na wyświetlaczu na bieżąco pokazywać.
  • #13
    MrFlexible
    Level 9  
    Mam potężny radiator ;D, ale racja, warto wymienić. Więc postaram się to opisać jak najprościej. Umieszczam 3 sharp-y w ustalonej odległości od siebie na stojakach z możliwością regulacji wysokości. Wiązki podczerwieni z czujników są względem siebie równoległe.1 Tryb pracy: pomiar czasu przelotu obiektu przez te 3 sharpy(np. tocząca się kulka po stole). Atmega ma zmierzyć czasy, podczas których obiekt przelatuje między sharpem1 a sharpem 2, 2-3 i 1-3,na bieżąco wyświetlać na lcd te 3 czasy a na koniec(kiedy sharp3 ją zobaczy) zatrzymać czas i wyświetlić 3 pomiary. 2 Tryb pracy: okresomierz, tak samo jak w przypadku czasomierza, ale np. kulka będzie umieszczona na nitce(wahadło) więc sharp 3 nie kończy pomiaru, bo kulka za moment wróci do sharp 1. I tutaj chciałbym mierzyć 10 takich okresów, gdzie 1 okres to przelot kuli przez sharp 1,2,3,2,1. Po 10 okresie chciałbym mieć zapamiętane 10 czasów sharp 1-1(pełen okres) oraz 10 czasów sharp 1-2 i sharp 2-3. Z tych 10 pomiarów wezmę sobie średnią i wywalę na lcd.Wiem, że opis nie wygląda czytelnie, ale nie wiem jak prościej to ująć ;).
  • #15
    User removed account
    Level 1  
  • #16
    MrFlexible
    Level 9  
    Tak, wahadło porusza się w 1 płaszczyźnie. @Marek_Skalski a co proponujesz wstawić zamiast tej staruszki ;)? Interesuje mnie tylko seria Atmega, ale z tego co widzę, to wszystkie mają po 1 wejściu ICP. Mogę dać ATmega328P-PU, ale raczej to nic nie zmieni?
  • #18
    User removed account
    Level 1  
  • #19
    MrFlexible
    Level 9  
    dondu wrote:
    MrFlexible wrote:
    Tak, wahadło porusza się w 1 płaszczyźnie.

    W takim układzie dlaczego decydujesz się na SHARPy, a nie na zwykłe bariery za pomocą LED i fototranzystora?

    Ponieważ jest z tym więcej roboty, bramka robiona ręcznie wyszła mi mniej dokładna, a fakt że sharp to czujnik odbiciowy nic mi nie zmienia, użyłem go dla czystej wygody.

    Oczywiście zdaje sobie sprawę z tego, że programowo jest zawsze gorzej, uC dopierałem tak, aby składanie było jak najwygodniejsze(ma tylko 28 nóżek i jest tht, idealnie ;D), w załączniku podaję schemat PCB, jeszcze przed poprawieniem przycisków i kilku rzeczy.Wykonanie tego będzie prościutkie.UC w smd raczej odpada, bo zniszczę takie 2, zanim przylutuję dobrze. Oczywiście jest to projekt amatorski, więc nie będzie tu żadnych przelatujących pocisków z broni palnej ;). Raczej myślę o kulce lekko poturlanej po stole o średnicy nie mniejszej od 1,5cm. Jak już wspomniałem, dokładność pomiaru może być do 10ms, zależy mi na setnych częściach sekundy, a sam 1 okres może trwać nie więcej niż kilka sekund.
  • #21
    MrFlexible
    Level 9  
    dondu wrote:
    Bariera (bramka) zawsze będzie dokładniejsza od SHARPa.
    OK, wybrałeś i koniec tematu.



    Sharpy reagują po około 3-5ms, więc są idealne. TSOPY i modulowane IR nie działały mi idealnie. W każdym razie, z czasu reakcji Sharpów jestem zadowolony ;).
  • #22
    MrFlexible
    Level 9  
    Poprawiłem schemat. Czy mógłby mi ktoś wytłumaczyć jak tu mierzyć czas programowo?(nie rozumiem zasady działania i posługiwania się timerami). Okresami zajmę się później, najpierw zwykły przelot kulki. Zdecydowałem się ostatecznie na użycie ATmega 328P-PU.
  • #23
    User removed account
    Level 1  
  • #25
    MrFlexible
    Level 9  
    Witam ponownie, nie miałem czasu zająć się projektem, dzisiaj dopiero usiadłem na chwilkę i od razu doszedłem do wniosku, że chyba wprowadziliście mnie w błąd z przyciskami. Przy takim założeniu że są podpięte do GND nigdy nie ustawimy na nich stanu wysokiego, a efekt będzie taki, że stan wysoki będziemy ustawiać poprzez zbliżenie palca do przycisku lub bezpośrednio do nóżki. Moim zdaniem miałem dobrze - należy je podłączać pod Vcc. Co do programu to na razie umieram i nie potrafię zrozumieć na czym polega timer ;D.
  • #26
    dondu
    Moderator on vacation ...
    MrFlexible wrote:
    ... doszedłem do wniosku, że chyba wprowadziliście mnie w błąd z przyciskami. Przy takim założeniu że są podpięte do GND nigdy nie ustawimy na nich stanu wysokiego, a efekt będzie taki, że stan wysoki będziemy ustawiać poprzez zbliżenie palca do przycisku lub bezpośrednio do nóżki. Moim zdaniem miałem dobrze - należy je podłączać pod Vcc.

    ??? :lol:

    Na schemacie masz switche, a nie czujniku dotykowe. Jeżeli nadal to są switche, to masz je źle podłączone o czym pisaliśmy. Jeżeli jednak uważasz, że wprowadzamy Ciebie w błąd, to zrób płytkę, a później najwyżej będziesz nożykiem ją ciął, by zmienić zgodnie z naszymi wskazaniami :)

    A teraz odwróćmy kota ogonem:

    MrFlexible wrote:
    Moim zdaniem miałem dobrze - należy je podłączać pod Vcc.

    ... czyli jak wtedy wymusiłbyś stan niski na pinie wejściowym?

    Czy wiesz, co to są "antenki zbierające zakłócenia"?: http://mikrokontrolery.blogspot.com/2011/04/zakocenia-w-pracy-mikrokontrolerow.html

    A teraz przeczytaj o rezystorach pull-up w dokumentacji mikrokontrolera. :)
  • #27
    MrFlexible
    Level 9  
    Okej racja,w zasadzie to nie ma znaczenia gdzie są przyciski podpięte, działanie zależy od stanu początkowego w programie. Układ już gotowy, teraz męczę się z tymi timerami:
    Code: cpp
    Log in, to see the code



    EDIT.
    Wprowadziłem podział w programie na 3 funkcje:
    1- czasomierz, wykorzystuje 3 sharpy, mierzy czas, przyspieszenie, prędkość
    2- okresomierz, wykorzystuje 1 sharpa, mierzy odstęp czasu pomiędzy sygnałami pochodzącymi z sharpa
    3- stoper- wykorzystuje 2 sharpy, działa jak stoper ;D.

    Stoper działa już jak należy, tylko jeszcze muszę dodać reakcje na zbocza z wejść INT1 ! INT0
    Teraz utknąłem w okresomierzu. Liczy mi czas między kolejnymi sygnałami od sharpa. Po następnym sygnale resetuje się i liczy od nowa, tak jak chcę. Tylko pytanie w jaki sposób teraz jeszcze na lcd poniżej wyświetlić napis: Okres wynosi: xx:xx:xx i ten okres ma być odświeżany tylko po resecie licznika. Czyli w momencie 2 sygnału od sharpa zapamiętuje ten czas i wyświetla go do momentu kiedy pojawi się 3 sygnał, po 3 sygnale aktualizuje ten napis itd...

    Tak samo w przypadku czasomierza, nie mam pojęcia jak zapamiętać czas w momencie gdy obiekt włącza 2 sharpa i 3 sharpa, bo tutaj potrzebuję odświeżanie na lcd na bieżąco czasu, a gdy obiekt włączy 3 bramkę to na lcd chcę wyświetlić czas końcowy, prędkość końcową, prędkość początkową i przyspieszenie. A to tego potrzebuję czas końcowy i czas w 2 bramce w postaci zmiennych w sekundach.
  • #28
    MrFlexible
    Level 9  
    EDIT.
    http://www.youtube.com/watch?v=OcLVG1uZb6Y
    Po wielu godz. rozwiązałem wszystkie problemy. Poniżej umieszczam program napisany pod ATmege 328P(inaczej niż w temacie), gdyby ktoś budował coś podobnego i temat zamykam.


    Code: cpp
    Log in, to see the code
  • #29
    polarczn
    Level 16  
    Dlaczego przed zmiennymi nie ma operatora volatile, chociaż są w przerwaniu i występują również w funkcji main?