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

Bascom Atmega16 - Odliczanie czasu pomiędzy impulsami.

Aldoro Draxy 16 Sty 2015 09:07 3771 29
  • #1 14335457
    Aldoro Draxy
    Poziom 19  
    Witam. Jestem kompletnie słaby jeśli chodzi o timery i przerwania w atmegach. Próbowałem to zrozumieć, ale całkiem mi nie idzie.

    Mam "generator" impulsów prostokątnych o różnym odstępie i długości. Potrzebuje mierzyć czas trwania całego impulsu. Częstotliwość niewielka, maksymalnie 200Hz.

    Bascom Atmega16 - Odliczanie czasu pomiędzy impulsami.

    Czyli interesuje mnie czas w ms tego odcinka oznaczonego na obrazku wyżej (I).

    Jak to zrobić programowo, może jakiś przykład?
    A przede wszystkim gdzie podawać sygnał (pin).?


    Pozdrawiam!
  • #4 14336410
    Aldoro Draxy
    Poziom 19  
    Póki co chyba wystarczy mi rozwiązanie przedstawione przez usera kindlar. Dzięki!
  • Pomocny post
    #5 14338090
    piotr411
    Poziom 22  
    W Bascomie jest do tego specjalna instrukcja

    Zaglądnij do Helpa na polecenie Pulsein
    Kod: text
    Zaloguj się, aby zobaczyć kod



    W Pulsein mamy po kolei
    zmienna - tu znajdzie się nasz wynik w mikrosekundach
    PIND - to port do jakiego się podłączymy
    1 - pin portu do jakiego jesteśmy podłączeni
    0 - wybieramy czy chcemy obliczać do czasu pojawienia się stanu niskiego, czyli 0 czy wysokiego czyli zapiszemy wtedy 1
  • Pomocny post
    #6 14339861
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #7 14339917
    piotr411
    Poziom 22  
    Pulsein zmiennaH , PIND , 1 , 1 'detekcja od "1" 
    Pulsein zmiennaL , PIND , 1 , 0 'detekcja od "0" 
    Wynik = zmiennaH + zmiennaL
    Print Wynik 'Odczytanie ilości czasu jaki trwał miedzy H+L
  • Pomocny post
    #8 14340132
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #9 14340265
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #10 14341052
    piotr411
    Poziom 22  
    niveasoft napisał:
    Nawet jeśli nie programuje się w Bascom to warto wiedzieć że ma taką WIKI. Wszystko na jednej stronie bez przewijania Helpa. Tam opisana każda instrukcja z właściwym syntaxem i przykładami.
    Otwiera się ze skrótu szybciej niż Acrobat Rider hahahaha :D

    Raz trzeba zobaczyć http://wiki.mcselec.com/bavr/BASCOM-AVR_Help

    ..i nacisnąć PULSEIN - tam są odpowiedzi.


    To miało być złośliwe, a nie wykazać brak wiedzy.
    Chodzi o to że w poleceniu Pulsein są pewne zależności nie do końca czytelnie opisane w helpie. Występuje też przepełnienie po 655ms i też minimalny pomiar wynosi 10 uS. Przepełnienie generuje wartość Err=1 na co trzeba zwrócić uwagę

    Dokładnie zna help'a podał inne rozwiązanie też dobre, jest ich kilka, które wybierze autor posta juz nie do nas należy
  • #11 14345778
    Aldoro Draxy
    Poziom 19  
    Dzięki. Co zrobi pulsein/pulseout jeśli czas mierzony wyniesie np 10sekund?
    Pozdrawiam
  • #12 14346270
    piotr411
    Poziom 22  
    Po upływie 655.35ms następuje przepełnienie licznika, w takiej sytuacji trzeba utworzyć zmienną która będzie zliczać ilość przepełnień.
    Czyli

    
    jeżeli Err=1 wtedy 
    przepełnienie = przepełnienie +1
    ........
    na koniec liczymy 
    pełnywynik=(przepełnienie * 65535) + wynik
    .........
    
  • #13 14346868
    Aldoro Draxy
    Poziom 19  
    A po przepełnieniu co się dzieje ze zmienną err? Mam ją ręcznie zresetować?
    Po przepełnieniu licznika on się zeruje automatycznie?
  • Pomocny post
    #14 14346877
    dondu
    Moderator na urlopie...
    Aldoro Draxy napisał:
    Po przepełnieniu licznika on się zeruje automatycznie?

    W większości trybów licznik zeruje się podczas przepełnienia.
    Wyjątkiem są niektóre tryby PWM, np. Phase Correct PWM
    Mode:

    Cytat:
    The phase correct PWM mode is based on a dual-slope operation.
    The counter counts repeatedly from BOTTOM to MAX and then from MAX to BOTTOM.
  • Pomocny post
    #15 14346879
    Konto nie istnieje
    Konto nie istnieje  
  • #16 14347392
    piotr411
    Poziom 22  
    Cytat:
    Co zrobi pulsein/pulseout jeśli czas mierzony wyniesie np 10sekund?
    Pozdrawiam


    Moderowany przez dondu:

    Po czterech poprawkach warunkowo dopuszczam formę powyższego cytatu. Następnym razem proszę cytować poprawnie wraz z nickiem autora.



    PULSEOUT nic nie liczy, to polecenie generuje przebieg, przykład migawka diody połączonej do portD.1

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #17 14347416
    Konto nie istnieje
    Poziom 1  
  • #18 14355865
    Aldoro Draxy
    Poziom 19  
    Dobra panowie, poległem. Potrzebuje pomocy...
    Chyba nie umiem użyć tego pulsein. Nie mam pojęcia nic o timerach, próbuję to zrozumieć ale kompletnie nie czaję. Nie wiem czym są przerwania i przepełnienia... Nie jest to dobrze wytłumaczone.

    Na Pinb.0 (atmega32) podaję te impulsy. I chcę mierzyć albo długosc całego impulsu, albo tylko kiedy jest w stanie 0.

    Jak ogarnąć ten timer? A może ktoś ma pomysł na kod?
  • #19 14355902
    Konto nie istnieje
    Poziom 1  
  • #20 14356199
    Konto nie istnieje
    Konto nie istnieje  
  • #21 14357280
    Aldoro Draxy
    Poziom 19  
    Funkcja pulsein wstrzymuje działanie programu na te 655ms? (lub krócej)
  • #22 14357359
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #23 14357396
    Konto nie istnieje
    Konto nie istnieje  
  • #24 14362077
    Aldoro Draxy
    Poziom 19  
    Kurcze, siedzę nad tym tyle czasu i nic dobrego nie wychodzi.
    Chyba muszę wam dokładniej opisać jak to działa...

    Użyłem Atmegi32 sprzęgniętej z kwarcem 8MHZ.
    Do nóżek tosc1 i tosc2 podłączony jest kwarc zegarkowy.

    Na wejście (TO/XCK)PB0 podłączony jest tranzystor który sterowany jest transoptorem szczelinowym. Pomiędzy szczękami transoptora obraca się tarcza w której nawiercone jest 8 otworów, tak aby transoptor reagował na nie. Tarcza obraca się kiedy wieje wiatr ( zrobiłem coś w tym stylu: https://obrazki.elektroda.pl/5202354600_1357333650.jpg ).

    No i teraz interesuje mnie aby mierzyć czas trwania stanu wysokiego lub niskiego (już mi to obojętne) - a potem sobie to przeliczę doświadczalnie na prędkość wiatru. Nie musi być to nawet czas - mogą być to po prostu cykle maszynowe.


    Transoptor zasilany jest z 5v, a pomiędzy nim a płytką z tranzystorem i atmegą jest 5 metrowy przewód skrętka.


    Próbowałem zaimplementować już kilka przykładów ale nic dobrze nie działa. Nie wiem co się dzieje...
  • #25 14362090
    dondu
    Moderator na urlopie...
    Aldoro Draxy napisał:
    Próbowałem zaimplementować już kilka przykładów ale nic dobrze nie działa. Nie wiem co się dzieje...

    Bez pokazania schematu i całego programu oraz dokładnego opisania otrzymanego rezultatu możemy tylko wróżyć :)

    BTW: Minęło 7 dni. Przez ten czas spokojnie nauczyłbyś się podstaw C i skorzystał z gotowca pokazanego w poście #3. Taki moment jaki przeżywasz teraz jest najlepszym, w którym możesz dokonać skoku do przodu. Zrób go wreszcie ...
  • #26 14362106
    Aldoro Draxy
    Poziom 19  
    Jednak był to problem sprzętowy. Teraz wydaje się wszystko działać jak należy.
  • #27 14362364
    Konto nie istnieje
    Konto nie istnieje  
  • #28 14372605
    Aldoro Draxy
    Poziom 19  
    Transoptor zdaje się generować delikatnie poszarpane zbocza - przez co na jednym zboczu zlicza mi kilkadziesiąt malutkich zboczy...
  • #29 14372883
    Konto nie istnieje
    Konto nie istnieje  
  • #30 14382471
    Aldoro Draxy
    Poziom 19  
    Dodałem 100nF i wykorzystałem pomysł ze zliczaniem impulsów. Całość wypaliła i zaliczyła mi laborki na przyzwoitą ocenę.

    Aa, na wejściu z transoptora już był tranzystor.

    Pozdrawiam
REKLAMA