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.

Ogólny zarys programu, co w przerwaniach? Obsługa przycisków

22 Wrz 2007 23:47 1658 9
  • Poziom 20  
    Witam wszystkich

    Programuję od niedawna AVR'y w języku C (AVR GCC). Mam takie proste pytanie do wszystkich doświadczonych w programowaniu uC. Jak najkorzystniej i poprawnie zbudować program, co obsługiwać w przerwaniach, co ma znaleźć się w pętli głównej?
    np Jeśli robię zegar/stoper z 4 przyciskami to lepiej odświeżać wyświetlacz LCD w pętli głównej czy w przerwaniach Timera, gdzie umieścić obsługę przycisków?
    Dziękuje
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Pomocny post
    Poziom 23  
    Jak już Ci pisałem Stoper zrobił bym tak:
    2 guziki podłączone do przerwań:

    1 guzik przerwanie:

    Code:

    if(FlagCount)
    {
    FlagCount = 0;
    Wyłącz Timer
    } else {
    FlagCount = 1;
    Załącz Timer
    }


    Pochodzące od 2 guzika:
    Code:

    FlagCount=0;
    Wylacz Timer;
    ss=0; s=0; m=0; h=0;


    Pochodzące od Timera:
    Code:

    ss++;
    if(!(ss%20))FlagDisplay=1;
    i tu dodawanie czasów do zmiennych s, m, h itd.


    pętla main()
    Code:

    Konfiguracja Timera i przerwań
    while(1){
    if(FlagDisplay){
    Display();
    FlagDisplay=0;
    }}



    PS. Popraw tytuł tematu. Ten mało mówi dla szukających
  • Pomocny post
    Poziom 17  
    Mikrokontrolery to także jak najmniejsze zużycie prądu. Gdzie tylko to możliwe należy je usypiać. W Twoim przypadku możesz wykorzystać co najwyżej uśpienie 'cpu', ponieważ potrzebujesz działających 'timer'ów( przydatna tabela znajduje się w notach przy 'Power Management and Sleep Modes', np. 'atmega8' str.33)
    Zalecana przez twórców 'avr-libc' sekwencja usypiania:
    Code:

        #include <avr/interrupt.h>
        #include <avr/sleep.h>

        ...
          cli();
          if (some_condition) {
            sleep_enable();
            sei();
            sleep_cpu();
            sleep_disable();
          }
          sei();

    Jeżeli masz do dyspozycji dwa 'timer'y, to niech jeden zlicza czas a drugi odświeża ekran( kolejny zysk(zmniejszenie strat) bo i tak nikt nie zauważyłby zmian co milisekundę).
    No i będzie wszystko jak w zegarku :)
    Powodzenia
    ++++++++++++++++++++++++
    kolegę 'Mad Bekon' przepraszam za nieuważne czytanie kodu
    Code:
     ...nikt nie zauważyłby zmian co milisekundę.. --> if(!(ss%20))FlagDisplay=1; 
  • Pomocny post
    Poziom 26  
    Moim zdadniem najlepiej jest w przerwaniach ustawiać flagi zezwalające na wykonanie danej czynności, np. odświerzenie ekranu, a samą czynność wykonywać w programie głównym. Jest z tego taki zysk, że przerwania, które jednak blokują wykonywanie się kodu, wykonują się szybko. Program główny, który może być przerywany wykonuje się w chwilach wolnych.
    Oczywiście, usypianie możesz dodać w pętli głównej, po wykonaniu wszystkich czynności, które mają ustawione flagi. W większości procków przerwanie powoduje obudzenie procesora.
  • Poziom 20  
    arturt134 napisał:
    Moim zdadniem najlepiej jest w przerwaniach ustawiać flagi zezwalające na wykonanie danej czynności, np. odświerzenie ekranu, a samą czynność wykonywać w programie głównym. Jest z tego taki zysk, że przerwania, które jednak blokują wykonywanie się kodu, wykonują się szybko. Program główny, który może być przerywany wykonuje się w chwilach wolnych.
    Oczywiście, usypianie możesz dodać w pętli głównej, po wykonaniu wszystkich czynności, które mają ustawione flagi. W większości procków przerwanie powoduje obudzenie procesora.


    tak będzie chyba najlepiej, ponieważ przerwanie nie może trwać za długo bo np jeśli zrobię obsłóge przycisków oraz odświeranie wyświetlacza za pomocą przerwań podczas wciśnięćia przycisku wyświetlacz nie będzie odświeżany, pnieważ przerwanie sie nawzajem przerywają :P
  • Poziom 17  
    Nu tak... taki niuanzik :)
    +++++++++++++++++
    przy obieraniu ziemniaków wpadłem: przerwanie przycisków sterowane zboczem nie zablokuje układu. no chyba, że ktoś ma paluszki jak Chopin. poza tym ciągłe przerwanie ustawiające flagę ciągle, także blokuje układ. ziemniaki...
  • Poziom 13  
    Petros napisał:
    [...]Jak najkorzystniej i poprawnie zbudować program, co obsługiwać w przerwaniach, co ma znaleźć się w pętli głównej?[...]


    ogólnie zasada jest taka:
    dobrze zaprojektowany i wykonany program działa jedynie na przerwaniach.

    w praktyce bywa jednak, że trzeba coś wykonać w pętli głównej...
    bo np jest to jakaś doróbka, albo z lenistwa albo z braku innych umiejętności.

    co do Twojego projektu to bez problemu wykonuje się tylko na przerwaniach...
  • Poziom 26  
    Do piotrkopec:
    Po prostu jeżeli przychodzi przerwanie, to ustawiasz flagę i blokujesz to przerwanie. Odblokowujesz je ponownie po wykonaniu odpowiadającej mu czynności w pętli głównej.
    Poza tym, jeżeli chodzi o klawiaturę, to powinieneś eliminować drgania styków. Na przykład po otrzymaniu przerwania odczytywać stan tego pinu kilkakrotnie w odstępie kilku milisekund i stwierdzać, czy przycisk został rzeczywiście naciśnięty, czy też jest to tylko zakłócenie.

    Do GreG$:
    Życzę powodzenia w bardziej skomplikowanych programach, gdzie przerwania przychodzą jednocześnie (albo prawie jednocześnie). Zaproponowane przeze mnie rozwiązanie stosuję we wszystkich moich projektach (czasami wykonuję coś w przerwaniu, np. obsługę transmisji szeregowej, skanowanie klawiatury, ale są to bardzo krótkie kawałki kodu).
  • Poziom 17  
    Do arturt134
    Wyłączenie przerwania na czas odpowiadający pracy powiązanej z przerwaniem( oczywiście nie globalne wyłączenie przerwań, co byłoby po prostu odsuniętym przerwaniem bez zagnieżdżeń) jest dobrym rozwiązaniem. I skanowanie klawiatury zamiast przerwań też jest dobre. Ale nie mogę się zgodzić co do uniwersalności Twojego rozwiązania. Jest przejrzyste i bezkolizyjne( oraz bogatsze gdy zamiast flag liczniki) ale sam piszesz o krótkich kawałkach kodu w przerwaniach. Krótkich względnie, zależnie od reszty programu. A alternatyw jest przecież kilka i trudno mówić o ich wyższości czy totalnym kalectwie.
    Co sądzisz o 'zarządcy przerwań'?(moja nazwa, nie wiem kak na Świecie ). Kierowane są do niego wszystkie przerwania, ma dopuszczalną liczbę własnych zagnieżdżonych wywołań opartą na liczniku lub kontroli stosu, dane statystyczne do 'debug'owania i optymalizacji całego projektu. Daje nam możliwość konfigurowania priorytetów dla każdego zdarzenia( kolejka) i na upartego jeszcze parę cech. Czy jest nadmiarowy... zależy.... :). Ale dobrze napisany staje się bardzo miłym 'obiektem' do wykorzystania w PRAWIE wszystkich projektach dając solidną podstawę. Całkiem jak Twoja pętla...
  • Poziom 26  
    Jeżeli masz ochotę komplikować sobie życie....
    Fakt, że raz napisany, bedzie mógł być użyty w różnych aplikacjach, ale samo napisanie czegoś tak uniwersalnego będzie raczej skomplikowane, że nie wspomnę o tym, że jeżeli popełnisz błąd, to możesz go odkryć dopiero po kilku projektach.
    Ja osobiście zostanę przy swojej wersji, wymaga mniej pracy.