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.

[AVR][C] Przałączanie źródła zegara podczas pracy uC

04 Lis 2008 14:34 2351 29
  • Poziom 20  
    Witam,

    Czy da się w atmedze128 przełączyć zegar na wolniejszy podczas pracy aplikacji (kiedy jest mi nie potrzebny to włączam wolny zegar)? Jeśli tak to w jaki sposób? Wiem że robią to fusbity CKLSEL ale czy można jest z programu jakoś ustawić? Moim celem jest zmniejszenie poboru prądu przez zmniejszenie taktowania procesorka.

    Pozdrawiam,
  • Poziom 23  
    Poczytaj o rejestrze XDIV

    Pozdrawiam
  • Poziom 20  
    Tak czytałem o nim i pytanie czy jest to jedyne rozwiązanie? Oczywiście wystarcza mi bo z zegara wewn. 8Mhz jestem w stanie zrobić 8Mhz/127.
  • Poziom 24  
    Mam takie pytanie czy gdy chcesz oszczędzać na energii, to uC ma wykonywać jakieś zadania i jeśli tak, to jakie? Może rozwiązaniem będzie dla Ciebie stan uśpienia i odpowiednie przerwanie "budzące" uC z tego stanu?
  • Poziom 20  
    Tak, chcę aby procek sobie spał, co jakieś 5 sekund ma błysnąć diodą LED dając znać że urządzenie pracuje, oraz cały czas musi zliczać impulsy max 2Hz na swoim wejsciu.

    Impulsy mogą się pojawiać lub nie gdy urządzenie nadzorowane nie pracuje.
  • Poziom 24  
    Więc najlepszym rozwiązaniem jest "sleep mode" + przerwanie zewnętrzne (wyzwalane zboczem narastającym oraz opadającym) + przerwanie timera odmierzającego odpowiedni czas. Po zgłoszeniu przerwania uC sie "budzi", obsługujesz przerwanie i znów "usypiasz" układ. Jest kilka trybów sleep mode, oraz istnieje możliwość wyłączenia niektórych modułów w tym trybie w zależności od tupu uC. Szczegółowe informacje znajdziesz w nocie katalogowej.
  • Poziom 20  
    Dzięki za odpowiedź, czyli da się zrobić tak że urządzenie sobie śpi, a budzi się tylko na przerwanie pinu lub przerwanie timera? I przy okazji druga sprawa czy po wybudzeniu procek startuje od początku czy od miejsca w którym poszedł spać?
  • Poziom 24  
    uC startuje oczywiście od miejsc w którym poszedł spać, bo inaczej nie miało by to zbyt wielkiego sensu. Mam do ciebie jeszcze parę pytań:

    1. Z czego zasilasz układ?
    2. Jak bardzo energooszczędny ma być uC?
    3. Dlaczego wybrałeś ATmega128 który posiada dużą ilość układów zintegrowanych?

    Na twoje pocieszenie powiem że w ATmega128 da się je wyłączyć, aby nie marnowały energii.
  • Poziom 20  
    ad1) Układ zasilany z baterii.
    ad2) Jak najbardziej oszczędny kilka uA podczas spania, resztę peryferii jak modem czy LCD będzie odłączonych.
    ad3) Atmega128 gdyż tyle peryferii potrzeba, 2xUART, trochę Pinów IO, I2C, SPI.
  • Pomocny post
    Poziom 24  
    Wiec najlepiej tryb Power-save (wtedy zegar systemowy nie pracuje wcale) w którym działa TC0 w trybie asynchroniczny. Wiec timer trzeba będzie taktować z zewnętrznego źrudła sygnału np kwarcu zegarowego co pozwoli na dodatkowe oszczędzanie energii.
  • Poziom 20  
    Dzięki za info, jeśli napotkam problem pozwolę sobie jeszcze zadać pytania.

    Pozdrawiam,
  • Poziom 20  
    Pojawiły mi się następne pytania. Otóż podczas programowania ustawiam np. fusbity na wewnetrzny kwarc 8MHz, ale potem czasem chciałbym pracować na zewnętrznym kwarcu 32khz żeby zaoszczędzić energię. Czy można zmusić do tego atemge? Nie mówię tutaj o podziale zegara XDIV bo nie jestem pewien czy to zmniejszy pobór prądu.
  • VIP Zasłużony dla elektroda
    Wewnętrzny oscylator włącza się za pomocą fuse bitów, a te w trakcie wykonywania programu można jedynie odczytać - zapis jest możliwy tylko w trybie programowania zewnętrznego.

    Ustawiając odpowiednio XDIV możesz podzielić zegar 8MHz do 62,5kHz - chyba wystarczy? Pobór prądu się zmniejszy, bo "szybki" zegar jest doprowadzany tylko do dzielnika, a pozostałe elementy układu są taktowane sygnałem niższej częstotliwości. A jak wiadomo, w układach CMOS moc dynamiczna jest wprost proporcjonalna do częstotliwości przełączania...

    Pozdrawiam,
    Dr.Vee
  • Poziom 42  
    rmajda -> proponuję ci zapomnieć o jakichś próbach zmiany taktowania procka w celu oszczędzania energii. Po to producent wymyślił kilka różnych trybów oszczędzania, że nie musisz nic sam kombinować, wystarczy się tylko dokładnie z nimi zapoznać i wykorzystać ten tryb, który ci najbardziej odpowiada.

    Generalnie, jeśli na prawdę chcesz się nastawić na maksymalną oszczędność bo układ zasilany jest z baterii to też może daj sobie spokój z tym miganiem diody LED co jakiś czas. Bo po co taki gadżet. Czy ciągle ktoś będzie się na tę diodę LED patrzył ??? nie - ale zapewne ktoś będzie co jakiś czas np chciał (jeśli to już konieczne) dowiedzieć się czy procek po prostu nie "odszedł już do krainy wiecznych łowów" bo bateria się skończyła> Wtedy możesz sobie dorobić jeden klawisz - TEST, który po naciśnieciu spowoduje przerwanie i w jego obsłudze migniesz diodą LED - co będzie oznaczało że procek jest wśród żywych.

    Dzięki takiemu podejściu, możesz skorzystać z możliwości wprowadzenia procka w stan najwyższej śpiączki POWER-DOWN z której wybudzić go mogą głównie przerwania zewnętrzne a w środku nic więcej nie działa bo po co? I dzięki temu rzeczywiście - długo sobie pożyje w stanie uśpienia na baterii bo w tym trybie będzie pobierał rzeczywiście kilka uA !!!

    ..... oczywiście możesz się uprzeć, że ty jednak chcesz koniecznie aby co jakiś czas jednak migał tą diodą i sam bez naciskania dawał oznaki, że jeszcze żyje. Wtedy możesz skorzstać z innego trybu uśpienia o nazwie POWER-SAVE. Doczytaj sobie dokładnie co podczas tej śpiączki może działać w procku. Dowiesz się wtedy, że poza innymi rzeczami może działać sobie któryś Timer i przerwanie od jego przepełnienia może także generować przerwanie, które będzie potrafiło wybudzić procka ze śpiączki .... no i masz - w takim przerwaniu (ustalasz sobie co jaki czas ma się odbyć) robisz prostą obsługę mignięcia twojej diody LED, po czym znowu dajesz prockowi zastrzyk usypiający aby po jakimś czasie Timer znowu go wybudził i tak w kółko

    .... jednak ten tryb oszczędzania energii jak można się domyśleć (coś za coś) nie pozwala zejść już z poborem prądu tak nisko jak przy Power-Down, a do tego jeszcze cyklicznie pobierany prąd na miganie diodą LED - w sumie wyjdzie to sporo więcej niż przy PowerDown takim o jakim pisałem wyżej. Zależy więc jaką masz baterię, o jak długi czas podtrzymania ci chodzi itp itd

    ..... w związku z powyższymi metodami - sam za pomocą jakiegoś własnego pomysłu na obniżanie energii poprzez zmiejszanie taktowania - nigdy nie uzyskasz tak dobrych efektów jak nawet przy opisanym nieco gorszym Power-Save. Zawsze to już będą miliAmpery jak coś - co generalnie będzie zjadało ci baterię jak ruskie mrówki ;)


    (aha doczytałem dalej, że urządzenie ma jeszcze zliczać impulsy które nadchodzą asynchronicznie - to też mikro problem nawet dla trybu pełnego uśpienia Power-Down - bo wystarczy te impulsy kierować na któreś przerwanie, które budzi procka tylko na czas gdy impuls sobie przylecał - w przerwaniu inkrementujesz licznik tych impulsów i zapisujesz go w zależności od potrzeb do stosownej pamięci czyli RAM albo EEPROM - i też sprawa pięknie załatwiona bez kombinacji alpejskich)

    mam nadzieję że teraz coś się rozjaśniło, ale i tak musisz się zainteresować datasheetem i rozdziałem Power Management and Sleep Modes dla swojego procka

    pozdrawiam
  • Poziom 20  
    Bardzo dziękuję za pomoc i oświecenie mnie w pewnych kwestiach. Wszystko jest w miarę jasne. Jeszcze jeden problem/pytanie impulsy te mogą lecieć max do 2Hz czy takie budzenie i usypianie jakoś nie "zabija" procka? I następna sprawa jeśli zasilam EEPROM (zewn. do trzymania liczby impulsów) z pinu procka High Sink i go wyłącze czyli stan LOW, to czy w uśpieniu stan pinu jest "trzymany" czy jest coś zmienianie. Nie mogę nigdzie znaleźć odpowiedniego zdania w pdf-ie.
  • Poziom 42  
    Stan pinu jest trzymany w uśpieniu ale nie powinno do niego być podłączone jakieś obciążenie. A odnośnie budzenia procka - za pomocą 2Hz - to cóż miałoby go zabić??? - nawet gdyby miał się wybudzać przy 100Hz i więcej to i tak warto zawsze dawać w międzyczasie, gdy procek ma nic nie robić, załączanie go w tryby pobierania jak najniższej energii - począwszy od stanu IDLE a skończywszy na Power-Down
  • Poziom 20  
    mirekk36: widzę że masz jakiekolwiek doświadczenie w tym temacie w przeciwieństwie do mnie :-) Co to znaczy pin obciążony? Chcę zasilać EEPROM z pinu atmegi, przed uśpieniem wystawiam na ten pin LOW czyli wyłączam EEPROMa, czy w takim wypadku pin jest obciążony czy nie?

    Oczywiście pytanie jest do kogokolwiek nie tylko mirekk36.
  • Poziom 42  
    rmajda -> zasilanie innego układu scalonego (obojętnie jakiego) z pinu portu wyjściowego procka tak wprost to chyba troszkę nieporozumienie. Weź sobie, jeśli już tak chcesz zrobić zastosuj po drodze tranzystor, który będzie załączał zasilanie. Wtedy pomiędzy pinem portu a bazą tranzystora dasz jakiś rezystor np 2,2K (jeśli będzie to tranzystor typu PNP) i już nie masz problemu z obciążonym wyjściem portu. A możesz jeszcze dać tranzystor polowy zamiast bipolarnego.
  • Poziom 24  
    Kolega mirekk26 już chyba Ci rozjaśnił jak poradzić sobie z problemem zasilania EEPROM. Ja mam inne pytanie, czy będziesz gromadził dużą ilość informacji że potrzebujesz dodatkowej pamięci? (ATmega128 posiada 4K wewnętrznej pamięci EEPROM)
  • Poziom 20  
    mirekk36: Dzięki za info. Wydawało mi się że taki EEPROM pobiera mało prądu i spokojnie można go zasilić z pinu.

    koleszka: Niestety potrzebuję więcej niż 4kB.
  • Poziom 24  
    Więc wiedze że to coś ciekawego skoro trzeba Ci tyle pamięci;) Powodzenia w pisaniu programu.
  • Poziom 20  
    Generalnie rejestrator przemysłowy zasilany z baterii :-) I tu jest cały problem że to ma działać kilka lat z AKU.
  • Poziom 24  
    Wiec chyba warto pomyśleć o jakimś porządnym akumulatorze żelowym , jeśli to ma być niezawodne urządzenie to może również warto rozważyć opcje kontroli poziomu naładowania akumulatora? Dajmy na to raz dziennie/tygodniowo włączyć przetwornik ADC i zmierzyć napięcie zasilania. W przypadku zbyt niskiego poziomu zasygnalizować w jakiś sposób konieczność naładowania/wymiany źródła zasilania.

    Z tego co rozumiem nie ma mowy o zasilaniu z sieci aby doładować akumulator?
  • Poziom 42  
    Przy porządnym trybie Power-Down, bez migotania co jakiś czas niepotrzebnie chyba tą diodą sygnalizacyjną i przy poborze w stanie uśpienia rzędu kilku uA plus co jakiś czas - czyli co około te 2 Hz - gdy przez kiladziesiąt nanosekund pobierze kilka mA - to na akumulatorze żelowym powinno to na prawdę dłuuuugo pochulać ;) zależy jeszcze jakiej pojemności ten akumulator. Bo nawet na najmniejszym powinno podziałać tyle ile chcesz.

    A tak jak kolega wyżej mówi dopiszesz jeszcze procedurkę pomiaru napięcia z użyciem ADC - tylko także ją odpalaj przycieskiem TEST - to będzie już w ogóle extra
  • Poziom 24  
    Zależy w jakim miejscu i w jakich warunkach ma to działać. Jednak myślę że już sam dobierzesz sposób testowania i sygnalizowania potrzeby wymiany/doładowania źródła zasilania. Jeśli urządzenie ma wymagać jak najmniejsze ingerencji użytkownika to można pomyśleć o samo testowaniu i trochę większym akumulatorze. Wtedy sygnalizować można by trochę wcześniej dźwiękowo za pomocą np. buzzera, co uchroniło by przed rozładowanie akumulatora do stany gdy układ przestanie pracować. Jeśli ma nad tym czuwać jakiś serwisant to najlepiej przycisk TEST + 3 LED, zielona, pomarańczowa i czerwona sygnalizujące odpowiedni poziom naładowania. Warto też pomyśleć nad wpływem zakłóceń jakie mogą się pojawić i sytuacjami awaryjnymi jeśli to ma być konkretny projekt.
  • Poziom 20  
    Bateria już jest z góry narzucona http://www.batimex.pl/towar.asp?idtowaru=1150&menu=87

    Urządzenie będzie miało modem więc komunikacja jest po GPRSie co pewien czas. Bajerów takich jak migająca diodka nie będzie, wynegocjowane :-), kontrola baterii oczywiście będzie, modem ma nawet opcję (komende AT) która podaje wartość napięcia baterii, ale do procka też mam na wszelki wypadek. Liczę na to że nawet jak się będzie budził co 2Hz to "chwilę" na tej baterii podziała. A reszta wyjdzie jak złożymy PCB i zrobimy pomiary. Na obecną chwilę dziękuję za udział w dyskusji. Być może coś jeszcze wyjdzie to rozszerzę wątek.

    Pozdrawiam,
  • Poziom 24  
    Niezła bateria i o pojemności aż 35 Ah! Więc jeśli dobrze liczę przy średnim poborze prądu 400uA pochodzi do 10 lat. Teraz tylko trzeba oszacować ile średnio będzie pobierał cały układ łącznie z modułem GPRS, wtedy będzie wiadomo na ile musisz oszczędzać energie.
  • Poziom 15  
    zastanawia mnie czy to jest realne aby taki uklad dzialal wiecej niz .. 3/6 lat z takiej baterii - po patrzac realnie poza poborem pradu przez sam uklad w takiej bateri zachodzi samoistny proces wyladowywania/spadku pojemnosci - a to od uzytej chemii , a to od warunkow termicznych
  • Poziom 20  
    Nie ukrywam że sam jestem ciekaw :-)
  • Poziom 24  
    To już zależy od konkretnego produktu więc trzeba by poszukać noty katalogowej. Poza tym to był tylko przykładowe przeliczenie bez uwzględniania zjawisk itd. W dyskusji nie przewinęły się konkretne liczby na temat okresy przez jaki ma działać urządzenie i jak na razie nawet nie wiadomo jaki będzie pobór prądu. Ogólnie temat dotyczy oszczędności energii w uC i tego z czego trzeba zrezygnować oraz czy to jest konieczne, więc teraz tylko dorwać notę katalogową baterii. Uwzględnić warunki pracy, średni pobór prądu całego systemu i dokonać wstępnych kalkulacji.