|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s
permission is not required when using copyrighted material in:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Tryby uśpienia umożliwiają aplikacji zamknięcie nieużywanych modułów
w mikrokontrolerze, przez co oszczędzana jest energia. AVR
udostępnia różne tryby uśpienia pozwalające użytkownikowi dopasować
zużycie energii do wymagań aplikacji.
Aby wejść w dowolny z pięciu trybów uśpienia, należy wpisać logiczną
jedynkę do bitu SE w rejestrze MCUCR, a
następnie wykonać instrukcję SLEEP.
Bity SM2...0 w rejestrze MCUCR określają, który tryb uśpienia
(bezczynny, zmniejszania zakłóceń dla przetwornika A/C, wyłączenia
zasilania, oszczędzania energii lub gotowości) zostanie uaktywniony
przez instrukcję SLEEP. Gdy w trakcie uśpienia pojawi się dozwolone
przerwanie, mikrokontroler wybudzi się. Następnie mikrokontroler
jest wstrzymywany przez cztery cykle zegara dodatkowo do czasu
uruchamiania, po czym wykonuje procedurę obsługi przerwania i
kontynuuje realizację programu głównego od następnej instrukcji za
SLEEP. Gdy mikrokontroler wybudza się z uśpienia, zawartość zestawu
rejestrów i pamięci SRAM jest niezmieniona. Gdy w trakcie uśpienia
wystąpi reset, mikrokontroler wybudza się i wykonuje program od
wektora Reset.
Zwróć uwagę, iż rozszerzony tryb gotowości obecny w wielu innych
mikrokontrolerach AVR został usunięty w ATmega8, ponieważ wejścia
TOSC i XTAL dzielą się tą samą fizyczną końcówką.
Rejestr ten zawiera bity sterujące zarządzaniem poborem energii.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x35 (0x55) | SE | SM2 | SM1 | SM0 | ISC11 | ISC10 | ISC01 | ISC00 | MCUCR |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit SE musi być zapisany logiczną jedynką, aby mikrokontroler wszedł w tryb uśpienia, gdy wykona instrukcję SLEEP. Aby uniknąć wejścia w uśpienie, jeśli nie jest to intencją programisty, zaleca się ustawienie bitu SE tuż przed wykonaniem instrukcji SLEEP.
Bity te wybierają jeden z pięciu dostępnych trybów uśpienia według tabelki poniżej.
| SM2 | SM1 | SM1 | Tryb uśpienia |
| 0 | 0 | 0 | Bezczynność |
| 0 | 0 | 1 | Redukcja zakłóceń dla przetwornika A/C |
| 0 | 1 | 0 | Wyłączenie zasilania |
| 0 | 1 | 1 | Oszczędzanie energii |
| 1 | 0 | 0 | Zarezerwowane |
| 1 | 0 | 1 | Zarezerwowane |
| 1 | 1 | 0 | Gotowość(1) |
| Uwaga: | 1. | Tryb gotowości dostępny jest tylko przy taktowaniu mikrokontrolera zewnętrznymi kwarcami lub rezonatorami. |
Gdy bity SM2...0 zostaną ustawione w stan 000, to instrukcja SLEEP wprowadza mikrokontroler w tryb bezczynności, zatrzymując mikroprocesor lecz pozwalając dalej pracować modułowi SPI, USART, komparatorowi analogowemu, przetwornikowi A/C, 2-przewodowemu interfejsowi szeregowemu, timerom/licznikom, licznikowi zegarowemu oraz systemowi przerwań. Ten tryb uśpienia głównie zatrzymuje zegary clkCPU i clkFLASH, natomiast pozwala pracować pozostałym zegarom.
Tryb bezczynności pozwala mikrokontrolerowi wybudzić się przy przerwaniach wyzwalanych zarówno zewnętrznie jak i wewnętrznie, jak przerwania od nadmiarów timerów i przy zakończeniu transmisji USART. Jeśli wybudzenie z przerwania komparatora analogowego nie jest wymagane, komparator może zostać wyłączony przez ustawienie bitu ACD (ang. Analog Comparator Down) w rejestrze ACSR (ang. Analog Comparator Control and Status Register – Rejestr Stanu i Sterowania Komparatorem Analogowym). Zmniejszy to pobór energii w trybie bezczynności. Jeśli przetwornik A/C (ang. Analog to Digital Converter, ADC) jest uaktywniony, to konwersja rozpoczyna się natychmiast, gdy mikrokontroler wejdzie w ten tryb uśpienia.
Gdy w bitach SM2...0 zostanie umieszczona wartość dwójkowa 001, to instrukcja SLEEP wprowadzi mikrokontroler w tryb zmniejszania zakłóceń dla przetwornika A/C, zatrzymując mikroprocesor, lecz zezwalając na pracę przetwornika A/C, zewnętrznym przerwaniom, modułowi śledzenia adresu 2-przewodowego interfejsu szeregowego, timerowi/licznikowi 2 i licznikowi zegarowemu (jeśli jest uaktywniony). Ten tryb uśpienia zatrzymuje zegary clkI/O, clkCPU i clkFLASH, natomiast pozostałe zegary pracują normalnie.
Obniża to poziom zakłóceń od sieci logicznej, co poprawia precyzję przetwarzania w przetworniku A/C, umożliwiając bardziej dokładne pomiary. Jeśli przetwornik A/C jest uaktywniony, to konwersja rozpocznie się automatycznie przy wejściu w ten tryb uśpienia. Oprócz przerwania przy zakończeniu przetwarzania w przetworniku A/C mikrokontroler może być wybudzony z trybu zmniejszania zakłóceń tylko przez zewnętrzny reset, reset od licznika zegarowego, reset przy spadku napięcia zasilania, przerwanie od zgodności adresu 2-przewodowego interfejsu szeregowego, przerwanie od gotowości SPM/EEPROM lub przerwanie od poziomu na wejściu INT0/INT1.
Zapamiętaj, iż jeśli do wybudzania z trybu wyłączenia używane jest przerwanie wyzwalane poziomem, to zmieniony poziom musi się utrzymywać przez pewien czas, aby wybudzić mikrokontroler. Zobacz do rozdziału "Przerwania zewnętrzne".
Przy wybudzaniu z trybu wyłączenia istnieje pewne opóźnienie od czasu wystąpienia warunku wybudzenia do jego aktywacji. Pozwala to zegarowi uruchomić się ponownie i ustabilizować po wcześniejszym zatrzymaniu. Okres wybudzania definiują te same bity bezpiecznikowe CKSEL, które definiują okres upływu czasu resetu, co opisano w podrozdziale "Źródła zegarowe".
Jeśli asynchroniczny timer NIE jest taktowany asynchronicznie, zaleca się tryb wyłączenia zasilania zamiast trybu oszczędzania energii, ponieważ zawartość rejestrów w asynchronicznym timerze powinna być traktowana jako niezdefiniowana po wybudzeniu z trybu oszczędzania energii, jeśli AS2 ma stan 0.
Ten tryb uśpienia zasadniczo zatrzymuje wszystkie zegary z wyjątkiem clkASY, pozwalając na pracę jedynie modułom asynchronicznym, łącznie z timerem/licznikiem 2, jeśli jest on taktowany asynchronicznie.
Aktywne domeny zegarowe i źródła wybudzeń w różnych trybach uśpienia
| Aktywne domeny zegarowe | Oscylatory | Źródła wybudzeń | |||||||||||
| Tryb uśpienia | clkCPU | clkFLASH | clkIO | clkADC | clkASY | Włączone główne źródło zegarowe | Włączony oscylator timera | INT1/INT0 | Zgodność adresu TWI | Timer 2 | Gotowość SPM/EEPROM | ADC | Inne we/wy |
| Bezczynność | X | X | X | X | X(2) | X | X | X | X | X | X | ||
| Redukcja zakłóceń | X | X | X | X(2) | X(3) | X | X | X | X | ||||
| Wyłączenie zasilania | X(3) | X | |||||||||||
| Oszczędność energii | X(2) | X(2) | X(3) | X | X(2) | ||||||||
| Gotowość(1) | X | X(3) | X | ||||||||||
| Uwagi: | 1. | Jako źródło zegarowe wybrany został zewnętrzny kwarc lub rezonator. |
| 2. | Jeśli bit AS2 w ASSR jest ustawiony. | |
| 3. | Tylko przerwanie od poziomu INT1 i INT0. |
Istnieje kilka zagadnień do rozważenia przy próbach minimalizowania poboru prądu w systemie zarządzanym przez mikrokontroler AVR. Ogólnie należy stosować tryby uśpienia tak często, jak jest to możliwe, co powoduje wyłączanie niepotrzebnych modułów we/wy. Wszystkie zbędne funkcje powinny być wyłączane. W szczególności dotyczy to poniższych modułów:
Jeśli jest uaktywniony, przetwornik A/C będzie pracował w trybach uśpienia. Aby zaoszczędzić energię, należy go wyłączyć przed wejściem w dowolny tryb uśpienia. Gdy przetwornik A/C został wyłączony i włączony ponownie, to następna konwersja będzie konwersją rozszerzoną. Działanie przetwornika jest opisane w rozdziale "Przetwornik Analogowo/Cyfrowy".
Przy wejściu w tryb bezczynności (ang. Idle mode), komparator analogowy powinien zostać wyłączony, jeśli się z niego nie korzysta. Przy wejściu w tryb zmniejszania zakłóceń dla przetwornika A/C (ang. ADC Noise Reduction mode), komparator powinien zawsze być wyłączany. W pozostałych trybach uśpienia komparator analogowy jest wyłączany automatycznie. Jednakże, jeśli komparator analogowy został ustawiony na wykorzystywanie jako wejścia wewnętrznego napięcia odniesienia, to należy go wyłączać we wszystkich trybach uśpienia. W przeciwnym razie układ wewnętrznego napięcia odniesienia będzie uaktywniony bez względu na tryb uśpienia. Opis ustawień znajdziesz w rozdziale "Komparator analogowy".
Jeśli w aplikacji nie jest potrzebny moduł wykrywania spadku napięcia zasilającego (ang. Brown-out Detector), to można go wyłączyć. Jeśli moduł BOD jest uaktywniony przez bit bezpiecznikowy BODEN, to będzie on aktywny we wszystkich trybach uśpienia, a stąd zawsze będzie pobierał prąd. W głębszych trybach uśpienia będzie się to znacząco przyczyniać do całkowitego poboru energii przez mikrokontroler. Szczegóły konfiguracji modułu BOD znajdziesz w podrozdziale "Wykrywanie spadku napięcia".
Moduł wewnętrznego napięcia odniesienia zostanie uaktywniony w razie wykorzystywania przez detektor spadku napięcia zasilającego, komparator analogowy lub przetwornik A/C. Jeśli moduły te zostały wyłączone, jak opisano powyżej, to układ wewnętrznego napięcia odniesienia będzie wyłączony i nie będzie zużywał energii. Gdy zostanie ponownie włączony, program użytkownika musi odczekać pewien czas, zanim będzie mógł z niego skorzystać. Jeśli układ ten pracuje w trybie uśpienia, to z jego wyjścia można skorzystać natychmiast po wybudzeniu. Czasy uruchamiania są opisane w rozdziale "Wewnętrzne napięcie odniesienia".
Jeśli timer licznika zegarowego (ang. Watchdog Timer) nie jest potrzebny w aplikacji, to moduł ten powinien zostać wyłączony. Jeśli licznik zegarowy jest włączony, to będzie pracował we wszystkich trybach uśpienia i zawsze będzie zużywał energię. W głębszych trybach uśpienia będzie się to znacząco przyczyniać do całkowitego poboru energii przez mikrokontroler. Szczegóły konfiguracji licznika zegarowego znajdziesz w rozdziale "Timer licznika zegarowego".
Przy wejściu w tryb uśpienia wszystkie końcówki portu powinny być tak skonfigurowane, aby zużywać minimalną energię. Najważniejszą rzeczą będzie zapewnienie, iż żadna z końcówek nie zasila obciążenia oporowego. W trybach uśpienia z wyłączonymi oboma zegarami we/wy (clkI/O) oraz przetwornika A/C (clkADC) bufory wejściowe mikrokontrolera są wyłączone. Zapewnia to, iż nie jest zużywana energia przez układy logiczne wejść, gdy nie są one potrzebne. W niektórych przypadkach układy te są potrzebne do wykrywania warunków wybudzenia, a wtedy będą włączone. Jeśli bufor wejścia jest włączony, a sygnał wejściowy zmienia się lub sygnał analogowy posiada poziom bliski Vcc/2, to bufor wejścia będzie zużywał nadmierną energię. Przy końcówkach analogowych cyfrowe bufory wejścia powinny zawsze być wyłączane. Zobacz do rozdziału "Porty we/wy".
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.