eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikablokowanie obsługi przycisku a funkcja while › blokowanie obsługi przycisku a funkcja while
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: badworm <n...@p...pl>
    Newsgroups: pl.misc.elektronika
    Subject: blokowanie obsługi przycisku a funkcja while
    Date: Tue, 22 Mar 2016 12:34:59 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 45
    Message-ID: <85o7yor6fejs$.dlg@badworm.pl>
    NNTP-Posting-Host: ip-5-172-247-194.free.aero2.net.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset="iso-8859-2"
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1458646512 3062 5.172.247.194 (22 Mar 2016 11:35:12 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Tue, 22 Mar 2016 11:35:12 +0000 (UTC)
    User-Agent: 40tude_Dialog/2.0.15.1pl Hamster/2.0.0.1
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:696652
    [ ukryj nagłówki ]

    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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: