logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C/Eclipse] - dekrementacja zmiennej w przerwaniu

Krzysiu6699 27 Wrz 2012 17:21 2169 7
REKLAMA
  • #1 11353917
    Krzysiu6699
    Poziom 11  
    W programie poniżej dekrementuję zmienną globalną(volatile) "time" w przerwaniu.
    Problem tkwi w tym, że dekrementacja działa prawidłowo tylko gdy zainicjuję zmienną globalną "time" początkową wartością, natomiast ja chcę podawać wartość zmiennej do dekrementacji w głównej pętli while(1) tak jak to jest w kodzie poniżej (który oczywiście nie działa). Atmega8 jest taktowana zewnętrznym kwarcem 12MHz, a przerwanie pochodzi od Timera1 w trybie CTC.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11353946
    dondu
    Moderator na urlopie...
    Zmienna time definiowana bez podania wartości faktycznie ustawiana jest na zero.
    Sprawdź sobie ten kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    tutaj: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-zmienne.html
    i przeczytaj artykuł - tam o tym pisze.


    Nie działa?
    A jak ma działać po Twojej myśli, skoro non stop ustawiasz time=5 w pętli głównej?

    Innymi słowy przerwanie zmniejsza o 1, ale natychmiast w pętli głównej znowu jest time=5.
    Załapałeś swój błąd?
  • REKLAMA
  • REKLAMA
  • #4 11354625
    zumek
    Poziom 39  
    Krzysiu6699 napisał:
    ...Problem tkwi w tym, że ...

    ... Twoje założenia to jedno, a program, to zdecydowanie co innego.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a) Z trybem CTC związane są rejestry OCR1A lub ICR1.
    b) Bit WGM12 znajduje się w rejestrze TCCR1B.
    c) Preskaler 1024 to ...
    ... i.t.p
  • #5 11356682
    Krzysiu6699
    Poziom 11  
    Chodzi o to że chcę sobie napisać układ czasowy w oparciu o instrukcję sterująca switch w, której warunkami przejścia do kolejnego stanu będzie odliczony czas tylko nie wiem jak to zrobić może ktoś robił podobny program proszę o pomoc. Poniżej przedstawiam przykładowy kod jakby to miało wyglądać.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pytanie brzmi co zrobić by tim = 5 oznaczało 5 sekund oraz jak dekremantować ten czas do zera i spełnienia warunku !tim.
    Próbowałem dekrementować tą zmienną w przerwaniu co sekundę ale nie działa.
  • REKLAMA
  • #7 11356812
    szulat
    Poziom 23  
    napisałeś:
    Krzysiu6699 napisał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a pewnie chodziło ci o...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 11356819
    Krzysiu6699
    Poziom 11  
    Problem rozwiązany brakowało volatile przy zmiennej tim.
REKLAMA