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.

Atmega328P - Timer2 nie wybudza mikrokontrolera

makro71 15 Gru 2013 12:33 1434 14
  • #1 15 Gru 2013 12:33
    makro71
    Poziom 9  

    Chciałbym aby timer2 (tryb asynchroniczny) wybudzał mikrokontroler co 1s i zmieniał stan na pinie.
    Niestety z jakiegoś powodu mikrokontroler nie zostaje wybudzony, a wchodzi w stan uśpienia na pewno ponieważ pobór prądu spada do ok. 1uA


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 14
  • #3 15 Gru 2013 12:43
    makro71
    Poziom 9  

    Kwarc zewnętrzny 32 kHz (32.768KCFPX-56R) + dwa kondensatory 18 pF smd, wszysko na płytce blisko procka.
    Wewnętrzne taktowanie 1Mhz.

    0
  • Pomocny post
    #4 15 Gru 2013 12:51
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zastanów się nad negacją warunku w:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Cytat:
     Bit 1 – TCR2AUB: Timer/Counter Control Register2 Update Busy
    When Timer/Counter2 operates asynchronously and TCCR2A is written, this bit becomes set. When TCCR2A has
    been updated from the temporary storage register, this bit is cleared by hardware. A logical zero in this bit indicates
    that TCCR2A is ready to be updated with a new value.

    0
  • #5 15 Gru 2013 12:52
    excray
    Poziom 39  

    To zapewne nie zmieni problemu ale dlaczego modyfikujesz rejestry licznika bez sprawdzania bitu TCR2UB w ASSR? W teorii Twoje modyfikacje TCNT i TCCR wcale nie powinny zostać przyjęte. A co do braku wybudzania to moim zdaniem sam sobie utrudniasz życie używając tych dziwacznych komend z pliku sleep.h. Tak naprawdę to sam nie wiesz co ustawiasz. Nie lepiej samemu zmodyfikować MCUCR?

    0
  • #6 15 Gru 2013 12:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    excray napisał:
    To zapewne nie zmieni problemu ale dlaczego modyfikujesz rejestry licznika bez sprawdzania bitu TCR2UB w ASSR?

    Nie ma takiego bitu.

    excray napisał:
    A co do braku wybudzania to moim zdaniem sam sobie utrudniasz życie używając tych dziwacznych komend z pliku sleep.h. Tak naprawdę to sam nie wiesz co ustawiasz.

    Po to są nagłówki, by je używać. Czy zna dokładnie co wykonują, to już inna sprawa :)

    0
  • #7 15 Gru 2013 13:02
    excray
    Poziom 39  

    I Te nagłówki są bez sensu jak widać. Dawno temu napisałem kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Działał od razu. Tym czasem dzięki nagłówkom co chwilę na forum wypływa temat pod tytułem "dlaczego uC mi się nie wybudza".

    0
  • #8 15 Gru 2013 13:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie twierdzę, że nie warto pisać własnych. Ala nie można twierdzić, że nagłówki ze sleep.h są złe. Są równie dobre, jak te pisane "ręcznie", należy tylko wiedzieć co wykonują, gdy się je stosuje. Można więc zaglądnąć do sleep.h lub tutaj: http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html

    0
  • #9 15 Gru 2013 13:06
    excray
    Poziom 39  

    A ja właśnie uważam że są złe. Bo ludzie "dzięki" nim nie czytają DSa i nie wiedzą co wybudza, jak wybudza i kiedy.

    0
  • #10 15 Gru 2013 13:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    Masz prawo tak uważać, a ja mam prawo uważacć że są dobre.
    Twój kod zawiera zbędne opóźnienie - w jakim celu?
    Od tego są flagi które sprawdzasz.
    Widzisz, Twój kod wcale nie jest taki dobry jak sądzisz :)


    Przykład: http://mikrokontrolery.blogspot.com/2011/04/SmartPIP-Licznik-czasu-testowanie.html

    0
  • #11 15 Gru 2013 13:13
    excray
    Poziom 39  

    dondu napisał:
    Twój kod zawiera zbędne opóźnienie - w jakim celu?

    Bo miałem paskudny kwarc który średnio na jeża chciał startować. Nie twierdzę że kod jest idealny ale chodzi mi o to że przynajmniej od razu widać co się w nim dzieje. A jak widzę set_sleep_mode(SLEEP_MODE_PWR_SAVE); to tak na prawdę nigdy nie mam gwarancji co do tego co dokładnie zostało zrobione i jak z MCUCR czy SMCR. Już nie mówiąc o tym że mi wystarczy DS żeby ustawić tryb np: External Standby a z biblioteką to muszę szukać po pliku jak to powinienem zapisać.

    0
  • #12 15 Gru 2013 13:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    To Ty miałeś problem, a ja nie :)

    I jeszcze raz podkreślam, że nie jestem przeciwnikiem ustawiania bezpośrednio rejestrów i zachęcam do tego, ale jednoznaczne twierdzenie, że używanie nagłówka sleep.h jest złe, można tak samo odnieść do io.h, delay.h i interrupt.h, itd. a jednak ich używasz.

    Wręcz przeciwnie sleep.h prawidłowo ustawi, a kod jest łatwo przenieść na inny mikrokontroler ...

    0
  • #13 15 Gru 2013 13:24
    excray
    Poziom 39  

    dondu napisał:
    Wręcz przeciwnie sleep.h prawidłowo ustawi, a kod jest łatwo przenieść na inny mikrokontroler ...

    Rzeczywiście. Jeden rejestr z głowy a pozostałe 50 i tak trzeba przerabiać ręcznie. Tak jak piszesz - każdy ma prawo pisać tak jak mu pasuje.

    0
  • #14 15 Gru 2013 13:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    No właśnie, więc proszę nie gań autora tematu, gdy nie ma takiej potrzeby :)

    Dodano po 16 [minuty]:

    excray napisał:
    Potrzeba jak widać jest bo temat jednak został założony.

    Owszem, ale nie dotyczy tego co kwestionujesz czyli użycia nagłówka sleep.h w taki sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #15 16 Gru 2013 23:19
    makro71
    Poziom 9  

    Wreszcie zadziałało. Kolega Dondu słusznie zwrócił uwagę na warunek w pętli, ale ponieważ ten fragment kodu skopiowałem artykułu
    http://www.embedds.com/avr-timer2-asynchronous-mode/
    założyłem że jest poprawny i nie wdawałem się w analizę. Problem polegał na tym że program od razu wyskakiwał z pętli i zanim zaktualizowały się rejestry wchodził w stan uśpienia.
    Poniżej poprawiony kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    lub bez nagłówka sleep.h jeżeli ktoś woli

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0