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

Atmega 16 i licznik impulsów na Timer1 [Bascom]

15 Kwi 2010 13:03 4007 2
  • Poziom 15  
    Jestem początkujący w dziedzinie programowania Atmelków.
    Mam zamiar zrobić licznik impulsów , który w pierwszej linii wyświetlacza LCD 2*16 , będzie wyświetlał ilość impulsów , zaś w drugiej ma pokazywać ilość obrotów na minutę. Generalnie ma to rejestrować przebiegi wolnozmienne ok 1Hz nawet ciut mniej. Zaczerpnąłem kawałek kodu oczywiście z netu , standardowa obsługa Timer1 :
    Code:

    Do

       Timer1 = 0
                                                 
                                                   
       Start Timer1                                         
       Wait  10
                                                     
        Stop Timer1                                           

       Wynik = Timer1 * 6                                       'wynik zliczania w czasie 10s mnożymy przez 6 dla otrzymania wyniku w: obr/min

       Cls                                                      'czyścimy LCD
       Lcd "Takty:  " ; Wynik 
    End

    Oczywiście dochodzą do tego procedury obsługi wyświetlacza i konfiguracji Timer1 jako counter.
    I tu mam problem, gdyż albo potrafię wyświetlić wyniki jako częstotliwość w obr/min albo umiem delikatnie to zmodyfikować i zrobić z tego zwykły licznik impulsów . Czy trzeba do tego zaprzęgnąć następny Timer ? Czy da sie z jednego czujnika tak pokombinować aby w czasie rzeczywistym pokazywało non stop ilość cykli(ilość impulsów) a także co 10 sekund pokazywało mniej więcej częstotliwość pracy? Cały ten układzik ma posłużyć do kontroli maszyny zmęczeniowej , w której ważna jest właśnie ilość wykonanych cykli i częstotliwość z jaką maszyna jest ustawiona. Oczywiście dojdzie do tego kilka innych następnych procedur , może jakaś klawiatura do ustawiania nastaw ale to dalszy temat. Najpierw chcę uporać sie z tym problemem. Nie wiem czy jest to możliwe ale podczas tego Wait 10, najprawdopodobniej nie da sie w tym samym momencie pokazywać na 2 linii LCD faktycznego dynamicznego przyrost impulsów , gdyż program sie zatrzyma aby licznik złapał przedział do obliczenia obrotów. Może całkiem inaczej należy podejść do samego zliczania impulsów wykonanych cykli a zostawić ta procedurę co powyżej , dla wyliczania częstotliwości? Może to co piszę jest masło maślane , więc przepraszam z góry.
    Dodam tylko , że na Port A2 podawany jest sygnał z czujnika optycznego , w skrócie następuje tam zmiana stanu z niskiego na wysoki. W wersji testowej użyłem Atmega16, pewnie przerost formy nad treścią ale traktuje ta płytkę jako ćwiczebną i w końcowej fazie nie powinienem mieć problemów przeniesienia tego na innego mniejszego procka . Tyle już potrafię.

    Proszę kod umieszczać w znacznikach code!
    Robak
  • Poziom 36  
    aro333 napisał:
    Cały ten układzik ma posłużyć do kontroli maszyny zmęczeniowej , w której ważna jest właśnie ilość wykonanych cykli i częstotliwość z jaką maszyna jest ustawiona.


    Jezeli to ma sluzyc jako wyniki konkretnych badan "na endurance", to musisz dolozyc staran aby wyniki byly dokladniejsze a moc processor byla bardziej prawidlowo wykorzystana.
    Wiec tak na poczatek zapomnij o stosowaniu procedur jak:
    Wait 10
    W tym czasie processor nie robi nic poza wyczekiwaniem czasu postoju (10 sec.- to bardzo wielka strata czasu), a pozniej nie robi wiele wiecej.
    Oczywiscie mozesz stosowac timery do zliczania ilosci impulsow a takze do ustalenia przedzialow czasowych dla wykonania pewnych cyklicznych czynnosci.
    Nie podales wiele z twojego listingu, ale zauwazylem ze popelniasz ten sam blad, co wielu tu na tej grupie pytajac o wskazowki; nie ma potrzeby zatrzymywania timera/licznika aby go odczytac/wyzerowac/preload. Zatrzymywanie, odczyt i pozniej start timera powoduje niepotrzebne gubienie czasu/cykli processora oraz w twoim przypadku cykli pracy urzadzenia, ktore musisz zliczac (akumulowac) od poczatku do konca proby zmeczeniowej - inaczej to nie bedzie mialo sensu.
    Zauwazylem rowniez, ze niemal nikt nie stosuje tak pomocnego narzedzia przy programowaniu jakim jest: "flowchart" - obrazowy, logiczny przebieg calego procesu.

    Dalej; skoro konfigurujesz timer1 jako licznik impulsow z czujnika cykli pracy to ten sygnal powinien byc raczej podany na PB1 (T1), zamiast do PA2 (Mega16).
    Proponuje rozwazyc ewentualne zastosowanie interruptow.

    Prawdopodobnie process proby zmeczeniowej bedzie dosc dlugi w czasie i ilosci cykli, zatem nalezy pamietac o przepelnieniach licznikow i odpowiednio je zliczac do jakichs zdefiniowanych zmiennych i wykorzystac je w obliczeniach zarowno koncowych wartosci, badz tymczasowych do display.

    e marcus
  • Poziom 15  
    Dziekuję za odpowiedz. Z tymi portami to była mała literówka z mojej strony pisząc tego posta. Generalnie jak widzę należy całkiem inaczej podejść do tych TIMERÓW, tego się spodziewałem.Jestem naprawdę mocno początkujący w programowaniu tych procków, ale Twój post pozwolił mi inaczej spojrzeć na ten problem i już pewne info znalazłem tutaj na elektrodzie, plus oczywiście książka w rękę . Co do samej próby zmęczeniowej - ta maszyna działa już parę lat , licznik cykli ma typowo mechaniczny a ustawianie częstotliwości odbywa się na "zegarek". Wiem wiem śmieszne to jest no ale cóż , dlatego próbuję to w miarę ulepszyć. Na pewno moje umiejętności w tym momencie nie są wystarczające ale być może ten problem pozwoli mi na doświadczalne zrozumienie Bascoma (moje styczność z programowaniem sięga zamierzchłych czasów i pracy z Basicem na ZX Spectrum). Same urządzenie pracuje z nie dużą częstotliwością a ilość cykli jaką dane części mają "wytrzymać " przeważnie nie przekracza 50 tyś cykli.