|
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
Porty we/wy mikrokontrolera AVR zostają natychmiast zresetowane do swojego stanu początkowego, gdy źródło resetu staje się aktywne. Nie wymaga to pracy żadnego źródła zegarowego.
Po ustąpieniu wszystkich źródeł resetu włączany jest licznik opóźniający, który rozciąga wewnętrzny reset. Pozwala to napięciu zasilającemu osiągnąć stabilny poziom przed rozpoczęciem normalnej pracy. Okres zliczania licznika opóźniającego jest definiowany przez użytkownika poprzez bity bezpiecznikowe CKSEL.
Logika resetu

Obwód POR zapewnia resetowanie mikrokontrolera przy włączeniu zasilania. Gdy napięcie osiąga próg POR, włącza się licznik opóźniający, który określa czas utrzymywania mikrokontrolera w stanie resetu po podniesieniu się napięcia VCC. Sygnał resetu jest ponownie aktywowany bez żadnej zwłoki, gdy napięcie zasilające VCC spadnie poniżej poziomu wykrywania.
Start mikrokontrolera,
RESET połączony z Vcc

Start mikrokontrolera,
RESET przedłużony zewnętrznie
Reset zewnętrzny w trakcie pracy mikrokontrolera
Reset przy spadku napięcia zasilającego w
trakcie pracy
Reset od licznika zegarowego podczas pracy
mikrokontrolera
Napięcie odniesienia posiada pewien czas uruchamiania, który może wpływać na sposób jego wykorzystywania. Czas uruchamiania podany poniżej w tabeli. W celu oszczędności energii napięcie odniesienia nie zawsze jest włączane. Jest ono aktywne w następujących sytuacjach:
Stąd, jeśli układ BOD nie jest włączony, po ustawieniu bitu ACBG lub po włączeniu przetwornika A/C program użytkownika musi zawsze odczekać, aż napięcie to uruchomi się, zanim będzie można skorzystać z wyjścia komparatora analogowego lub przetwornika A/C. Aby zmniejszyć pobór energii w trybie wyłączenia zasilania (ang. Power-down mode), przed wejściem w ten tryb uśpienia użytkownik może unikać trzech opisanych powyżej sytuacji, co zapewni wyłączenie modułu napięcia odniesienia.
ATmega48A/PA/88A/PA/168A/PA/328/P posiada ulepszony timer licznika czasu (ang. Watchdog Timer, WDT). WDT jest timerem zliczającym takty oddzielnego oscylatora 128kHz wbudowanego w mikrokontroler. WDT generuje przerwanie lub reset systemu, gdy licznik osiągnie dany czas zliczania. W normalnym trybie pracy wymaga się, aby system korzystał z instrukcji , w celu (ang. Watchdog Timer Reset – reset ltimera licznika zegarowego) w celu wyzerowania licznika przed osiągnięciem jego wartości okresu zliczania. Jeśli system nie wyzeruje tego licznika na czas, to zostanie wygenerowane przerwanie lub reset systemu.

W trybie przerwania timer licznika czasu generuje przerwanie, gdy minął okres zliczania. Przerwanie to można wykorzystać do wybudzenia mikrokontrolera z trybów uśpienia lub również jako ogólny timer systemowy. Jednym z przykładów jest ograniczanie maksymalnego czasu na wykonywanie niektórych operacji, dając przerwanie, gdy dana operacja wykonywała się dłużej niż oczekiwano. W trybie resetu systemu timer licznika czasu generuje reset, gdy przekroczy okres zliczania. Typowo wykorzystuje się to do zapobiegania zawieszaniu się systemu w przypadku błędu w kodzie. Trzeci tryb, przerwanie i reset systemu, łączy ze sobą dwa poprzednie tryby przez wygenerowanie najpierw przerwania, a później przejścia w tryb resetu systemu. Ten tryb przykładowo pozwala na bezpieczne wyłączenie przez zachowanie krytycznych parametrów przed resetem systemu.
Jeśli zostanie zaprogramowany bit bezpiecznikowy stałego włączenia licznika czasu (WDTON), wymusi przełączenie timera licznika czasu w tryb resetu systemu. Przy zaprogramowanym tym bicie bezpiecznikowym bit trybu resetu systemu (WDE) i bit trybu przerwania (WDIE) zostają zablokowane odpowiednio w stanach 1 i 0. Aby jeszcze bardziej zwiększyć bezpieczeństwo programu, zmiany ustawień licznika czasu muszą być wykonywane za pomocą sekwencji czasowych. Sekwencja zerowania WDE i zmiany konfiguracji czasu zliczania jest następująca:
Poniższy przykładowy kod pokazuje funkcję w asemblerze i jej odpowiednik w języku C do wyłączania timera licznika zegarowego. Przykład zakłada, iż przerwania są pod kontrolą (np. przez ich globalne wyłączenie), więc żadne się nie zdarzy podczas wykonywania tych funkcji.
| Przykład w kodzie maszynowym |
WDT_off: ; Wyłącz globalnie przerwania cli ; Zresetuj timer licznika zegarowego wdr ; Wyzeruj bit WDRF w rejestrze MCUSR in r16, MCUSR andi r16, ~(1<<WDRF) out MCUSR, r16 ; Zapisz logiczną jedynkę do WDCE i WDE ; Utrzymaj stare ustawienie preskalera, ; aby zapobiec niezamierzonemu końcowi zliczania lds r16, WDTCSR ori r16, (1<<WDCE) | (1<<WDE) sts WDTCSR, r16 ; Wyłącz WDT ldi r16, (0<<WDE) sts WDTCSR, r16 ; Włącz globalnie przerwania sei ret |
| Przykład w języku C |
void WDT_off(void) { __disable_interrupt( ); __watchdog_reset( ); /* Wyzeruj bit WDRF w rejestrze MCUSR */ MCUSR &= ~(1<<WDRF); /* Zapisz logiczną jedynkę do WDCE i WDE Utrzymaj stare ustawienie preskalera, aby zapobiec niezamierzonemu końcowi zliczania */ WDTCSR |= (1<<WDCE) | (1<<WDE); /* Wyłącz WDT */ WDTCSR = 0x00; __enable_interrupt( ); } |
Uwaga: Jeśli licznik czasu zostanie przypadkowo aktywowany, np. przez błędny wskaźnik i ucieczkę kodu lub przypadek spadku napięcia, to mikrokontroler zresetuje się, a licznik zegarowy pozostanie włączony. Jeśli program użytkownika nie został przygotowany do obsługi licznika czasu, to może to doprowadzić do nieskończonej pętli resetów przy zakończeniu okresów zliczania. Aby zapobiec takie sytuacji, oprogramowanie aplikacji zawsze powinno zerować system znacznik resetu systemu od licznika zegarowego (ang. Watchdog System Reset Flag, WDRF) oraz bit sterujący WDE w procedurze inicjalizacyjnej, nawet jeśli licznik czasu nie jest używany.
Poniższy przykładowy kod pokazuje funkcję w asemblerze i jej odpowiednik w języku C do ustawiania okresu zliczania licznika zegarowego.
| Przykład w kodzie maszynowym |
WDT_Prescaler_Change: ; Wyłącz globalnie przerwania cli ; Zresetuj timer licznika zegarowego wdr ; Rozpocznij sekwencję czasową lds r16, WDTCSR ori r16, (1<<WDCE) | (1<<WDE) sts WDTCSR, r16 ; Masz cztery takty do ustawienia stąd nowych wartości - ; Ustaw nową wartość preskalera (czas zliczania) = 64K taktów (~0,5 s) ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0) sts WDTCSR, r16 ; -- Koniec ustawiania nowych wartości, zużyto 2 takty - ; Włącz globalnie przerwania sei ret |
| Przykład w języku C |
void WDT_Prescaler_Change(void) { __disable_interrupt( ); __watchdog_reset( ); /* Rozpocznij sekwencję czasową */ WDTCSR |= (1<<WDCE) | (1<<WDE); /* Ustaw nową wartość preskalera (czas zliczania) = 64K taktów (~0,5 s) */ WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP0); __enable_interrupt( ); } |
Uwaga: Licznik zegarowy powinien być resetowany przed dowolną zmianą bitów WDP, ponieważ zmiana ta może spowodować zakończenie okresu zliczania, gdy nastąpi przełączenie na krótszy okres.
Rejestr MCUSR dostarcza informacji na temat źródła, które spowodowało reset mikrokontrolera.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x34 (0x54) | – | – | – | – | WDRF | BORF | EXTRF | PORF | MCUSR |
| Zapis/Odczyt | O | O | O | O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | Zobacz na opis bitów | ||||
Te bity w mikrokontrolerze ATmega48A/PA/88A/PA/168A/PA/328/P zostały zarezerwowane i przy odczycie zawsze zwracają wartość 0.
Ten bit jest ustawiany, jeśli wystąpi reset systemu od licznika zegarowego. Bit jest zerowany przez reset przy włączeniu zasilania lub poprzez zapis logicznego zera do tego znacznika.
Ten bit jest ustawiany, jeśli wystąpi reset od spadku napięcia zasilania. Bit jest zerowany przez reset przy włączeniu zasilania lub poprzez zapis logicznego zera do tego znacznika.
Ten bit jest ustawiany, jeśli wystąpi reset zewnętrzny. Bit jest zerowany przez reset przy włączeniu zasilania lub poprzez zapis logicznego zera do tego znacznika.
Ten bit jest ustawiany, jeśli wystąpi reset przy włączeniu zasilania. Bit jest zerowany tylko przez zapis logicznego zera do znacznika.
Aby skorzystać ze znaczników resetu, użytkownik powinien odczytać, a następnie wyzerować rejestr MCUSR tak szybko, jak to jest możliwe w programie. Jeśli rejestr zostanie wyzerowany przed wystąpieniem następnego resetu, to źródło resetu można znaleźć przez testowanie poszczególnych znaczników resetu.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| (0x60) | WDIF | WDIE | WDP3 | WDCE | WDE | WDP2 | WDP1 | WDP0 | WDTCSR |
| 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 |
Ten bit zostaje ustawiony, gdy timer licznika zegarowego zakończy swój okres zliczania i został on skonfigurowany na generację przerwania. Bit WDIF jest zerowany sprzętowo przy wykonaniu odpowiadającego mu wektora obsługi przerwania. Alternatywnie WDIF można wyzerować przez zapisanie w nim logicznej jedynki. Gdy jest ustawiony bit I w rejestrze SREG oraz bit WDIE, zostaje wykonane przerwanie od upływu okresu zliczania przez licznik zegarowy.
Gdy jest ustawiony na jeden ten bit oraz bit I w rejestrze SREG, uaktywnia się generowanie przerwań przez licznik zegarowy. Jeśli bit WDE jest wyzerowany w powiązaniu z tym ustawieniem, timer licznika zegarowego pracuje w trybie przerwań, a odpowiednie przerwanie jest wykonywane, jeśli zdarzy się zakończenie okresu zliczania w timerze licznika zegarowego. Jeśli bit WDE jest ustawiony, to timer licznika zegarowego jest w trybie przerwań i resetu systemu. Pierwsze zakończenie okresu zliczania w timerze licznika zegarowego ustawi bit WDIF. Wykonanie odpowiedniego wektora przerwań automatycznie wyzeruje sprzętowo bity WDIE i WDIF (licznik zegarowy przejdzie w tryb resetu systemu). Jest to użyteczne przy utrzymywaniu bezpieczeństwa timera licznika zegarowego podczas używania przerwania. Aby pozostać w trybie przerwań i resetu systemu, bit WDIE musi być ustawiany po każdym przerwaniu. Tego jednak nie powinno się robić wewnątrz samej procedury obsługi przerwania, ponieważ mogłoby to zagrozić funkcji bezpieczeństwa trybu resetu systemu od licznika zegarowego. Jeśli przerwanie to nie zostanie wykonane przed następnym końcem zliczania, będzie zastosowany reset systemu.
Konfiguracja timera licznika zegarowego
| WDTON(1) | WDE | WDIE | Tryb | Działanie przy końcu zliczania |
| 1 | 0 | 0 | Zatrzymany | Nic |
| 1 | 0 | 1 | Tryb przerwań | Przerwanie |
| 1 | 1 | 0 | Tryb resetu systemu | Reset |
| 1 | 1 | 1 | Tryb przerwania i resetu systemu | Przerwanie, po czym przejście w tryb resetu systemu |
| 0 | X | X | Tryb resetu systemu | Reset |
| Uwaga: | 1. | Bit bezpiecznikowy WDTON ustawiony na “0” oznacza stan zaprogramowany, a "1" oznacza stan niuezaprogramowany. |
Bit ten używany jest w sekwencjach czasowych przy zmianie WDE oraz bitów preskalera. Aby wyzerować bit WDE i/lub zmienić bity preskalera, należy ustawić WDCE. Po wpisaniu do niego jedynki bit WDCE zostanie wyzerowany sprzętowo po upływie czterech taktów zegara.
WDE jest przejmowany przez bit WDRF w rejestrze MCUSR. Oznacza to, iż WDE jest zawsze ustawiany, gdy jest ustawiany bit WDRF. Aby wyzerować bit WDE, należy najpierw wyzerować WDRF. Ta cecha zapewnia wielokrotne resety w warunkach powodujących awarie mikrokontrolera oraz bezpieczne uruchomienie po takich awariach.
Bity WDP[3:0] określają preskalowanie timera licznika zegarowego, gdy timer ten jest włączony. Poniższa tabela pokazuje różne wartości preskalowania oraz odpowiadające im okresy zliczania.
| WDP3 | WDP2 | WDP1 | WDP0 | Liczba cykli oscylatora | Typowy czas zliczania dla VCC = 5,0 V |
| 0 | 0 | 0 | 0 | 2K (2048) taktów | 16ms |
| 0 | 0 | 0 | 1 | 4K (4096) taktów | 32ms |
| 0 | 0 | 1 | 0 | 8K (8192) taktów | 64ms |
| 0 | 0 | 1 | 1 | 16K (16384) taktów | 0,125 s |
| 0 | 1 | 0 | 0 | 32K (32768) taktów | 0,25 s |
| 0 | 1 | 0 | 1 | 64K (65536) taktów | 0,5 s |
| 0 | 1 | 1 | 0 | 128K (131072) taktów | 1,0 s |
| 0 | 1 | 1 | 1 | 256K (262144) taktów | 2,0 s |
| 1 | 0 | 0 | 0 | 512K (524288) taktów | 4,0 s |
| 1 | 0 | 0 | 1 | 1024K (1048576) taktów | 8,0 s |
| 1 | 0 | 1 | 0 | Zarezerwowane | |
| 1 | 0 | 1 | 1 | ||
| 1 | 1 | 0 | 0 | ||
| 1 | 1 | 0 | 1 | ||
| 1 | 1 | 1 | 0 | ||
| 1 | 1 | 1 | 1 | ||
![]() |
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.