-
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