Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][C] - Pytanie dotyczące uśpienia.

jui 09 Paź 2012 21:23 1119 4
  • #1 09 Paź 2012 21:23
    jui
    Poziom 14  

    Witam.
    Dopiero zaczynam naukę z AVR i ogólnie z programowaniem.
    Korzystam z książki P. Borkowski 'AVR & ARM7 Programowanie uC dla każdego' i zatrzymała mnie pewna sprawa dotycząca uśpienia wywoływanego przyciskiem.
    Program wygląda mniej więcej tak:
    -dwie diody migają naprzemiennie
    -po naciśnięciu przycisku na PD0 ukłąd wchodzi w stan uśpienia
    -po naciśnięciu -..- na PD2 (int0) wychodzi z uśpienia

    Zastanawia mnie, dlaczego po wejściu w uśpienie świeci się ciągle jedna dioda. (diody są podłączone pod PC2 i PC0 a świeci ta pod PC2), wiem jak wyłączyć ją ale dlaczego świeci?

    kod programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod




    dodatkowo mam jeszcze jedno pytanko, czy te linijki znaczą to samo:
    REJESTR |=(1<<BIT)
    REJESTR =_BV(BIT)
    REJESTR |=_BV(BIT)

    a jak nie to czym się różnią?
    i czy można zrobić tak (lub podobnie) żeby zrobić 0 na określonym bicie:
    REJESTR |=(0<<BIT)
    a może tak:
    REJESTR &=~(0<<BIT)

    Dziękuje, Pozdrawiam.[/code]

    0 4
  • #2 09 Paź 2012 21:36
    excray
    Poziom 39  

    A czemu nie? Skoro ją zapaliłeś przed uśpieniem to się świeci. Jak sama nazwa wskazuje uśpienie polega na tym że system zamiera w stanie w takim w jakim był na chwilę przed uśpieniem. Więc skoro ostatnio wykonaną instrukcją było zapalenie diody to ona w uśpieniu również będzie świecić.

    Dodano po 1 [minuty]:

    jui napisał:
    REJESTR |=(1<<BIT)
    REJESTR =_BV(BIT)
    REJESTR |=_BV(BIT)

    Pierwsza i trzecia to jest to samo. I powodują one ustawienie wybranego przez Ciebie bitu bez ingerencji w pozostałe bity w tym bajcie. Druga nie i powoduje ustawienie wybranego przez Ciebie bitu ale z wyzerowaniem wszystkich pozostałych.

    Dodano po 1 [minuty]:

    jui napisał:
    i czy można zrobić tak (lub podobnie) żeby zrobić 0 na określonym bicie:
    REJESTR |=(0<<BIT)

    Nie
    jui napisał:
    a może tak:
    REJESTR &=~(0<<BIT)

    też nie. Tak:
    REJESTR &=~(1<<BIT); - wyzerowanie bitu BIT

    0
  • #3 09 Paź 2012 23:57
    jui
    Poziom 14  

    No właśnie nigdzie jej nie włączyłem.
    tutaj ustawiam i wyłączam diody:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a tutaj moim zdaniem jest tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    -jeśli przycisk włączony to skocz do 'uśpienie' ( i pomija resztę czynności?)
    -jeśli nie to włącz jedną diodę potem drugą
    -( i znowu) jeśli przycisk włączony....

    Więc moim zdaniem nie ma kiedy włączyć diody?
    Poza tym w funkcji 'uspienie' włączam tryb power-down, według podręcznika to jedyne aktywne moduły to: przerwania zewnętrzne, TWI, watchdog.
    więc czy rejestr C na których mam diody nie powinien się wyłączyć?


    oj oj oj już rozumiem:)
    dokładnie tu gdzie napisałem "-jeśli nie to włącz jedną diodę potem drugą"
    po włączeniu drugiej diody jej nie wyłączyłem i następna jest funkcja sprawdzania czy uśpić. :)
    resztę też już rozumiem


    Dziękuję za pomoc:)

    0
  • Pomocny post
    #4 10 Paź 2012 00:04
    excray
    Poziom 39  

    Zapomniałeś chyba że program pracuje w pętli. Zrobiłem Ci wizualizację :-P
    [Atmega8][C] - Pytanie dotyczące uśpienia.
    Ba, nawet sam sobie napisałeś że włączasz diodę :P Tutaj:

    jui napisał:
    -jeśli przycisk włączony to skocz do 'uśpienie' ( i pomija resztę czynności?)
    -jeśli nie to włącz jedną diodę potem drugą
    -( i znowu) jeśli przycisk włączony....


    Dodano po 1 [minuty]:

    jui napisał:
    więc czy rejestr C na których mam diody nie powinien się wyłączyć?

    Nie. Nawet jest na ten temat specjalny podtemat w datasheet gdzie piszą o tym aby pamiętać że porty są dalej ustawione/wyzerowane i że przed przejściem w uśpienie warto poustawiać na nich takie stany aby pobierany był z nich jak najmniejszy prąd .

    0
  • #5 10 Paź 2012 00:12
    jui
    Poziom 14  

    Właśnie doszedłem też do tego przed chwilą po przeczytaniu tego co napisałem:)

    0