eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › blokowanie obsługi przycisku a funkcja while
Ilość wypowiedzi w tym wątku: 5

  • 1. Data: 2016-03-22 12:34:59
    Temat: blokowanie obsługi przycisku a funkcja while
    Od: badworm <n...@p...pl>

    W ramach tworzonego programu na AVR MEGA8 wymyśliłem sobie, by
    opóźnienie niezbędne przy wyłączaniu urządzenia przyciskiem (tak, by z
    powrotem się zaraz nie włączało) zrealizować poprzez funkcję while i
    Timer 1, którego przerwanie jest generowane co 1 sekundę.

    Fragment kodu w funkcji obsługującej długie naciśnięcie przycisku, która
    ma wyłączać urządzenie, wygląda tak:

    OLED_putString(" Power off! ");
    g_off_timer=5;
    while(g_off_timer>1);

    i dalej zestaw funkcji powodujących wyłączenie zasilania (zdjęcie stanu
    wysokiego z odpowiednich pinów)

    zmienna g_off_timer jest dekrementowana w ramach obsługi przerwania od
    Timera 1 w następujący sposób:

    if (g_off_timer>0)
    {
    g_off_timer--;
    PORT(TESTOUT_PORT) ^= (1<<TESTOUT);
    }

    i to wiem, że działa prawidłowo bo LED podłączony do wyjścia TESTOUT
    mruga z częstotliwością 0,5Hz.

    Zakładam, że gdy program dojdzie do "while(g_off_timer>1)" to powinien w
    tym miejscu utknąć w pętli i czekać, aż z kolejnymi wygenerowanymi
    wywołaniami przerwania od Timera 1 wartość tej zmiennej dojdzie do 1,
    wówczas warunek w while będzie niespełniony i program poleci dalej.
    Program jednak utyka na dobre w tym miejscu, mimo iż zmienna g_off_timer
    osiąga wartość 0 - sprawdziłem to dodając prosty warunek w obsłudze
    przerwania od Timera 1:

    if (g_off_timer==0)
    {
    PORT(TESTOUT_PORT) |= (1<<TESTOUT);
    }

    Zgodnie z przewidywaniem, po kilku mrugnięciach LED zapalił się na
    stałe. Gdzie mam błąd?
    --
    Pozdrawiam Bad Worm badworm[maupa]post{kropek}pl
    GG#2400455 ICQ#320399066


  • 2. Data: 2016-03-22 13:11:23
    Temat: Re: blokowanie obsługi przycisku a funkcja while
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "badworm" napisał w wiadomości grup
    dyskusyjnych:85o7yor6fejs$....@b...pl...
    >W ramach tworzonego programu na AVR MEGA8 wymyśliłem sobie, by
    >opóźnienie niezbędne przy wyłączaniu urządzenia przyciskiem (tak, by
    >z
    >powrotem się zaraz nie włączało) zrealizować poprzez funkcję while i
    >Timer 1, którego przerwanie jest generowane co 1 sekundę.

    >Fragment kodu w funkcji obsługującej długie naciśnięcie przycisku,
    >która
    >ma wyłączać urządzenie, wygląda tak:

    >OLED_putString(" Power off! ");
    >g_off_timer=5;
    >while(g_off_timer>1);

    A w deklaracji napisales volatile ?
    To napisz :)

    Optymalizator piekna rzecz :-)

    Nad jakims HALT mozna by jeszcze pomyslec - po co ma sie krecic w
    kolko bez potrzeby.


    J.


  • 3. Data: 2016-03-22 13:24:59
    Temat: Re: blokowanie obsługi przycisku a funkcja while
    Od: JDX <j...@o...pl>

    On 2016-03-22 12:34, badworm wrote:
    [...]
    > Zgodnie z przewidywaniem, po kilku mrugnięciach LED zapalił się na
    > stałe. Gdzie mam błąd?
    1. Obstawiam, że g_off_timer nie jest zadeklarowana jako ,,volatile". A
    tego, jak jest zadeklarowana nie pokazałeś.
    2. To prawdopodobnie nie jest źródłem tego konkretnego problemu, ale
    jest źródłem potencjalnych problemów - miejsca ,,programu głównego" w
    których modyfikujesz g_off_timer musisz ,,owinąć" sekcją krytyczną (czyli
    w tym przypadku zapewne zwykłym wyłączeniem, a przy wyjściu z sekcji
    włączeniem przerwania od Timera 1) - chodzi o to, aby przerwanie timera
    nie weszło w trakcie modyfikacji g_off_timer w ,,programie głównym" i tym
    samym nie narobiło kaszanki.


  • 4. Data: 2016-03-22 19:26:00
    Temat: Re: blokowanie obsługi przycisku a funkcja while
    Od: badworm <n...@p...pl>

    Dnia Tue, 22 Mar 2016 13:11:23 +0100, J.F. napisał(a):

    > A w deklaracji napisales volatile ?
    > To napisz :)
    > Optymalizator piekna rzecz :-)

    Pomogło, dzięki! :)
    --
    Pozdrawiam Bad Worm badworm[maupa]post{kropek}pl
    GG#2400455 ICQ#320399066


  • 5. Data: 2016-03-23 18:44:58
    Temat: Re: blokowanie obsługi przycisku a funkcja while
    Od: Sebastian Biały <h...@p...onet.pl>

    On 2016-03-22 19:26, badworm wrote:
    >> A w deklaracji napisales volatile ?
    >> To napisz :)
    >> Optymalizator piekna rzecz :-)
    > Pomogło, dzięki! :)

    Wiedz jednak że to bardzio złym pomysł i uchodzi Ci to tylko na sucho bo
    jesteś na grupie elektronika :P

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: