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

[Atmega8][Bascom] Pomiar czasu zadziałania przekaźnika - nie działa jak powinien

peres 27 Lis 2011 15:43 2764 11
REKLAMA
  • #1 10189058
    peres
    Poziom 11  
    Witam. Napisałem program który mierzy czas między podaniem napięcia na cewke przekaźnika, a przyciągnięciem kotwicy i zwarcia styków.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    problem polega na tym, że na wyświetlaczu cały czas pokazuje się identyczny wynik.Tak jakby procesor nie mierzył czasu przekaźnika, tylko jakiś inny czas. Jestem początkującym w dziedzinie programowania, także proszę o wyrozumiałość.
  • REKLAMA
  • REKLAMA
  • #3 10193084
    peres
    Poziom 11  
    To waitms jest tylko po to żeby zdążyć puścić przycisk który uruchamia pomiar. Bo tak to by się zapętlił (tak mi się wydaje).
    Idea programu polega na tym, że jak wcisnę przycisk, to portb.0, do którego jest podłączona cewka, ustawi się na 1, czyli załączy przekaźnik. W tym samym momencie startuje timer i liczy, po przepełnieniu generuje przerwanie które zwiększa zmienną Puls o 1. Po przyciągnięciu kotwicy i zwarciu styków (Pind.1) timer się zatrzymuje i liczbę przerwań mnoży przez obliczony współczynnik i dodaje to co zostało w timerze.
    Xury, mógłbyś opisać swój pomysł, bo trochę nie rozumiem.
  • #4 10196422
    SylwekK
    Poziom 32  
    Jak boisz się o zapętlenie to wykorzystaj dodatkowy znacznik albo badanie czy przycisk puszczony ale na litość nie WAIT'uj w programach, które mają coś dokładnie mierzyć!
  • #5 10197520
    M. S.
    Poziom 34  
    Styk przekaźnika podłącz do przerwania zewnętrznego i w obsłudze tego przerwania odczytuj wartość timera uruchomionego wraz z włączeniem cewki, a później przelicz. (Pamiętaj o drganiach styków).
    Po co korzystać z przerwania od przepełnienia timera? Użyj Timera1. Z tą samą dokładnością zmierzysz czas ponad 4ms zamiast 16us. Jak będzie za mało to włącz prescaler albo zmniejsz częstotliwość kwarcu. Ogranicz (wyeliminuj) zmienne typu Single. Wynik na wyświetlacz sformatuj instrukcją FORMAT zgodnie z helpem. uC przecież nie musi znać tego czasu w milisekundach.
  • REKLAMA
  • #6 10213981
    peres
    Poziom 11  
    Doprowadziłem program do takiej postaci:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Umieściłem załączenie cewki, i pomiar czasu w przerwaniach. A co zrobić z wyświetlaniem czasu? Czytałem w innym wątku, że w przerwaniach nie zaleca się umieszczanie rozkazów LCD. A tak jak jest teraz, to nie działa dobrze, bo każdą literkę wyświetla z opóźnieniem i czas jest 0. Wydaje mi się, że to wina tego, że jak przyjdzie przerwanie w czasie obsługi wyświetlacza to się coś kiełbasi.

    Przerwanie od przepełnienia stosuje po to, by móc mierzyć też dłuższe odcinki czasu, np w przekaźnikach czasowych.
    Dlaczego wyeliminować zmienne Single? Na co to będzie miało wpływ?
    Jeszcze jedno pytanie. Dlaczego program z pierwszego postu nie działa? Gdy "symuluje" styki przekaźnika ręcznie, tzn zwieram do masy PD1 to wszystko działa, wyświetla się czas. Czy to może być spowodowane drganiem styków?
  • #7 10214194
    SylwekK
    Poziom 32  
    Przecież tu do niczego nie potrzebne są przerwania INT0 i INT1. Po prostu uruchom timer w momencie podania napięcia na cewkę, a dowolny pin wykorzystaj i badaj nim przyciągniętą kotwicę - kiedy dostanie sygnał to zastopuj timer. Odczytaj wtedy jego zawartość, przelicz i przekaż wynik na LCD. Możesz też w obsłudze przerwania inkrementować jakąś zmienną uzależniając inkrementację od pinu odpowiedzialnego za badanie stanu przyciągniętej głowicy. Rozwiązań jest 1000...
    I jeszcze jedno, popatrz na strukturę Twojego programu. Panuje tam totalny chaos - w dobrym tonie jest włączać przerwania jak już wszystko jest skonfigurowane, bo kiedyś się możesz nieźle rozczarować...
  • #8 10219863
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 10356340
    peres
    Poziom 11  
    Witam wszystkich ponownie.
    Piny INT0 i INT1 były zewnętrznie podciągnięte przez rezystor do VCC.
    Myślę że z tymi przerwaniami to był zły pomysł. Poprawiłem trochę starą wersje programu. Zastosowałem badanie czy przycisk jest puszczony, i dopiero wtedy uruchamia się program:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Niby tak prosty program, a nie chce działać...
    Przekaźnik który badam ma czas zadziałania ok 4ms, a procesor z tym programem pokazuje mi wynik ok 10us(od 8us do 15us). Nie mam pomysłu co jest źle.
  • #10 10356562
    SylwekK
    Poziom 32  
    Nie chciał bym za Ciebie pisać tego programu, bo jest to naprawdę proste zadanie i dlatego spróbuj sam napisać go jeszcze raz od początku wg np. takiego algorytmu:

    Ustaw timer powiedzmy na 10khz aby każde przerwanie wykonywało się co 100 mikrosekund. Możesz też gęściej od tego zależy dokładność - tu 100us czyli 0,1ms
    Zdefiniuj sobie zmienną licznikową (byte - dla zakresu do 25ms, word - do 6,5s), która będzie zliczana w wymienionym przerwaniu jeśli znacznik bitowy (który też sobie zdefiniuj) przyjmie wartość np. 1, a jedynkę tą ustaw w momencie ustawienia portu sterującego przekaźnikiem na jego włączenie (czyli podczas wciśnięcia przycisku). Następnie badaj w pętli bez przerwy inne wejście portu do którego podłączasz wcześniej styk przekaźnika, który w momencie przyciągnięcia kotwicy poda na ten port powiedzmy stan 0. Jeśli w pętli, o której wspominałem wcześniej zostanie wykryte to 0 to natychmiast ustaw znacznik pozwolenia liczenia na 0 i wyjdź z pętli. Teraz już możesz odczytać zawartość inkrementowanej zmiennej i przeliczyć ją aby uzyskać wynik końcowy, np. jeśli zmienna zliczy 45 impulsów to 45*100us=4500us czyli 4,5ms
    Prościej sie chyba nie da...
    Pozdrawiam
  • #11 10358303
    Konto nie istnieje
    Poziom 1  
  • #12 10358589
    SylwekK
    Poziom 32  
    Hehe, idea dokładnie jak moja tyle, że bez dodatkowych zmiennych. W sumie jeśli nie wykorzystuje się timera do czegoś innego, a program nie jest częścią czegoś większego to wersja jest faktycznie prostsza od mojej :-)
REKLAMA