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.

Modyfikacja zmiennych globalnych w przerwaniu.

26 Lis 2011 10:35 1017 5
  • Poziom 14  
    Witam

    Poszukiwałem rozwiązania mojego problemu już po forum ale nie znalazłem rozwiązania, a problem wydaje mi się dosyć prozaiczny aczkolwiek nie umiem go samodzielnie rozwikłać. Mianowicie posiadam w programie prostą strukturę zadeklarowaną jako:


    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Struktura ta, jak i zmienne TimeOn i TimeOff są zadeklarowane globalnie.

    W funkcji main na początku wpisuje sobie sztywno wartości do struktury:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    W funkcji main oczywiście mam też prawidłowo skonfigurowane przerwania, i w przerwaniu od INT0 umiesciłem taki kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Jest to fragment wycięty tylko dla pokazania problemu, w przerwaniu wykonuje się odrobine wiecej rzeczy i z tamtymi nie ma problemu co znaczy że przerwanie działa prawidłowo.

    Jednakże po powrocie do funkcji main, czyli powrocie do nieskonczonej pętli while dane zawarte w strukturach TimeOn i TimeOff wyswietlane są jako wartosci wpisane początkowo w funkcji main, a nie zmieniane na te z przerwania.

    Ogólnie przerwanie od INT0 jest przerwaniem wchodzącym w menu ustawien gdzie przez klawiaturę i wyświetlacz ustawiam sobie godziny TimeOn i TimeOff.
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 14  
    Przecież przy deklaracji w pierwszym kodzie jak byk stoi volatile :)

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 32  
    Raczej doczytał, bo wstawił przed deklaracjami zmiennych, a jeśli rozwiązaniem jest wstawienie volatile też wewnątrz struktury, to raczej nie jest to oczywiste bez doświadczenia z C.
  • Pomocny post
    Poziom 42  
    No dobrze - o matko (sorki) moja kurza ślepota ale zwrócę uwagę na coś innego mocno niepokojącego w twoim kodzie.

    On się cały czas resetuje po przerwaniu.

    Po pierwsz po co ci cli() i sei() w przerwaniu (przecież wyłączenie innych przerwań po wejściu w każde przerwanie dzieje się z automatu)

    ale już wplecenie rozkazu:

    reti();

    to wyciągnięcie dywanika spod nóg i murowany reset niestety :(

    wywal więc z przerwania te trzy rzeczy i okaże się że zacznie wszystko działać jak należy.

    A przy okazji jednak spójrz na ten link który ci podałem i zobacz jak wygląda prolog i epilog makra przerwania ISR w asemblerze oraz dlaczego nie możesz tam dać - reti()
  • Poziom 14  
    Właśnie czytam o tym voilatile z Twojego linka, a to cli i sli raczej spowodowane przyzwyczajeniami z pisania pod '51 w Assemblerze. Usunę i sprawdzę jak to wtedy działa :)

    Dodano po 8 [minuty]:

    Super, działa :) Dziękuje niezmiernie za pomoc.

    A w woli wyjaśnienia potrzebowałem tego do projektu inżynierskiego. Będzie to sterownik pompy ciepłej wody i akurat te zmienne mówią mi w jakich godzinach sterownik ma działać. I troszkę mnie to przystopowało że zmiana w menu godzin pracy nad którymi właśnie siedziałem nie wywoływała oczekiwanych rezultatów.