Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 timer i przerwanie INT1 - jak wstawić do programu?

as_szeroka 12 Maj 2012 16:26 4687 40
  • #31 12 Maj 2012 16:26
    as_szeroka
    Poziom 13  

    Układ ma odmierzać czas pracy przekaźnika, sygnalizować... i działa
    No więc... wykonałem to jak do tej pory z Waszą pomocą tak;

    Kod: c
    Zaloguj się, aby zobaczyć kod

    A teraz proszę o uwagi...
    Dalsze prace nad wyborem czasu trwania pracy przekaźnika za pomocą switch'y DP1

  • #32 12 Maj 2012 23:20
    as_szeroka
    Poziom 13  

    Po wielu "przebojach", trudach i masie czasu spędzonego nad zaprogramowaniem uC do tego projektu, podaję końcowy (na obecną chwilę) kod;

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Po przestawieniu całości projektu na zewnętrzny kwarc 12MHz niedokładności ustąpiły. Pasuje czas do wyliczeń matematycznych. Zdaję sobie sprawę że jeszcze pewnie jest wiele błędów, bądź niewłaściwych interpretacji, ale skutek jest osiągnięty.
    Jeśli są uwagi (a napewno są), będę poprawiał projekt na bieżąco.
    Układ pracuje w sposób;
    Jeśli zasilimy układ i DP2_1 jest off - to układ steruje przekaźnikiem bez odmierzania czasu, sygnalizując po włączeniu miganiem LED żółtą przez chwilę po włączeniu.
    Jeśli DP2_1 jest ON to układ oczekuje na sygnał z wyzwalacza (świeci LED czerwona), którym uruchamiamy zegar (którego czas jest ustawiany za pomocą kombinacji DP1_x w zakresie 1-10 minut).
    W czasie odmierzania czasu miga LED żółta i za pomocą przycisku, uruchamiamy przekaźnik,
    jak skończy się odliczanie czasu, układ wraca do stanu oczekiwania na wyzwalacz, itd...
    Szczerze, oczekuję na jakieś sugestie, porady itd... (co można inaczej, lepiej, prościej, szybciej) :P
    Dziękuję wszystkim za czas i poświęcenie, oraz uwagi dotąd otrzymane.
    Pozdrawiam.

  • #33 12 Maj 2012 23:45
    janbernat
    Poziom 38  

    Masz tak- zegar odmierzający 1s.
    A co by szkodziło gdyby odmierzał co 100ms.
    Albo co 10ms czy 1ms.
    Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
    Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
    Bo _delay() to jest wytrych który się później mści.
    Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.

  • #34 13 Maj 2012 00:35
    as_szeroka
    Poziom 13  

    janbernat napisał:
    Masz tak- zegar odmierzający 1s.
    A co by szkodziło gdyby odmierzał co 100ms.
    Albo co 10ms czy 1ms.
    Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
    Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
    Bo _delay() to jest wytrych który się później mści.
    Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.


    Słusznie.
    Powiem tylko, że myślałem nad tym "delay", ale nie wpadłem na żaden logiczny sposób, ponieważ niedawno zacząłem "zabawę" z uC. A dokładnośc w zakresie 50-100ms na to wystarczy.
    Ale czy nie za dużo będzie się wykonywać w przerwaniu? ("kombinowałem" żeby w przerwaniu jak najmniej było), ale postaram się zastosować do sugestii..
    Po zmianie kodu postaram się go zaprezentować.
    A co do czasu pracy układu to wychodzi, że może pracować od 1-15minut, więc wynikła pomyłka 2 posty wyżej :P

    Pozdrawiam.

  • #35 13 Maj 2012 00:58
    janbernat
    Poziom 38  

    W przerwaniu to nalezy tylko liczyć i sprawdzać czy się zmienna już zliczyła.
    A całą resztę wykonać w pętli głównej jak już warunki są spełnione..
    Chyba że w przerwaniu jest dość czasu aby to wszystko obliczyć/wykonać.

  • #37 13 Maj 2012 18:34
    as_szeroka
    Poziom 13  

    janbernat napisał:
    Masz tak- zegar odmierzający 1s.
    A co by szkodziło gdyby odmierzał co 100ms.
    Albo co 10ms czy 1ms.
    Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
    Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
    Bo _delay() to jest wytrych który się później mści.
    Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.


    Proszę o poprawienie mnie jeśli nie tak rozumuję, więc;
    żeby odmierzać 10ms z przerwania Timer1 od porównania to;
    12MHz (12 000 000) dzielę przez prescaler (w tym wypadku 64), żeby mi wyszły liczby całkowite i w tym momencie mam 187,5kHz (czyli 187500) i jeśli chcę otrzymać przerwanie co 10ms to do rejedtru OCR1A wstawiam wartość (nie większą niż 65536 chyba, bo to max) 1875 ?? bo 1 ms to tysięczna część sekundy, a ja muszę (chcę) mieć 10ms, więc dzielę jeszcze przez 100 (te 187,5kHz). I generuje mi się przerwanie co 10ms ??
    bo reszta to zmienne zliczane, ale z tym chyba sobie poradzę :P
    jak nie to będę pytał...

    Dodano po 18 [minuty]:

    Czy tak by to miało być np;
    Kod: c
    Zaloguj się, aby zobaczyć kod

    z tą zmienną w opóźnieniach (odczekaj)...
    Jestem w pracy, więc nie mam jak wypróbować na działającym układzie.

  • #38 13 Maj 2012 18:45
    janbernat
    Poziom 38  

    Co pewien wybrany przez Ciebie czas Timer generuje przerwanie.
    Co jaki czas- mniej ważne, ważne żeby to był najmniejszy czas jakiego potrzebujesz.
    W programie osługi przerwania umieszczasz jakieś zmienne- powinny one być zdeklarowane jako volatile przed main()- będą wtedy globalne i volatile.
    Ja to robię tak- volatile uint8_t (albo uint_32_t) flaga1, volatile uint8_t flaga2 itd.- ile tych flag potrzeba.
    Co przerwanie flaga się zwiększa- flaga1++, flaga2++ itd.
    Teraz tak- w programie w głównej pętli sprawdamy czy flaga osiągnęła wymaganą wartość- czy czas się przepełnił.
    Wtedy kasujemy flagę- od poczatku zacznie zliczać- i wykonujemy jakiś program.
    if flaga1==ileśtam
    {
    skasuj flagę;
    wykonaj program()
    }
    I tak dla każdej flagi.
    Tak procedura się nazywa Round Robin- znajdź w sieci.(dzięki mirekk36 za podanie nazwy)
    Najprostsza metoda zrobienia systemu wielowątkowego albo prawie czasu rzeczywistego dla wielu funkcji.

  • #39 13 Maj 2012 22:22
    as_szeroka
    Poziom 13  

    No to teraz mi "klina" zadaliście...
    Po wyszukaniu informacji na temat round-robin wogóle nie wiem do czego to w tym projekcie zastosować,
    nie ma tu wielu wątków.
    Jedno przerwanie zewnętrzne, odmierzanie czasu i praca przekaźnika. Może nie rozumiem (a właściwie napewno nie rozumiem do czego mogę to zastosować), ale mniejsza z tym.
    Co do tych zmiennych to rozumiem, tylko że nie potrzebuję uruchamiać wielu (instrukcji, podprogramów... czy jak to nazwać), w konkretnych odstępach czasu.
    A zamianę _delay na formę zmiennej inkrementowanej można wykonać a to chyba nie jest nic w stylu round-robin.
    A tak na koniec to poproszę o jakieś jasne wyjaśnienie gdzie i do czego mogłbym to zastosować.
    A teraz zmusiliście mnie do przeskoczenia do strony 395 książki którą posiadam :)
    Napewno coś wyczytam (pomimo iż tak daleko jeszcze nie doszedłem)

  • #40 14 Maj 2012 00:29
    mirekk36
    Poziom 42  

    as_szeroka napisał:

    A tak na koniec to poproszę o jakieś jasne wyjaśnienie gdzie i do czego mogłbym to zastosować.


    Gdzie?

    Wszędzie, jak załapiesz ten mechanizm to sam zobaczysz że będziesz swój każdy program, nawet najdrobniejszy i na najmniejszego ATtiny pisał zaczynając przygotowywać RoundRobina ;) .... To jest na prawdę aż tak bardzo przydatne, a wydaje się trudne początkującym i dlatego nie zdziwię się, że jeśli przeskoczysz wiele rozdziałów i nagle zaczniesz czytać o tym - to wyda ci się to jeszcze większym i strasznym kudłatym jeżem do niczego nie potrzebnym.....

    A tymczasem przygotowanie "syst_tick" na potrzeby RoundRobina to zawsze podstawa ;) .... i w większych mikrokontrolerach masz nawet sys_tick sprzętowo już realizowany - nie bierze się więc ten pomysł ot tak sobie z powietrza.

  • #41 14 Maj 2012 08:12
    as_szeroka
    Poziom 13  

    Hmm...
    Ciekawe. Czyli w moim przypadku chodzi o stworzenie programowo czegoś w stylu;
    Link
    Ogólnie, proste (coś jak Timer), zobaczymy dalej... :P

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME