Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Podczas resetu wszystkie rejestry we/wy przyjmują swoje początkowe wartości, a wykonywanie programu rozpoczyna się od wektora RESET. Instrukcją umieszczoną pod adresem tego wektora musi być instrukcja skoku względnego RJMP do procedury obsługi resetu. Jeśli w programie nigdy nie są uaktywniane źródła przerwań, to wektory przerwań nie są używane i w ich miejscu może zostać umieszczony normalny program. Poniższy rysunek przedstawia logikę resetu:
Porty we/wy mikrokontrolera AVR są natychmiast resetowane do swojego stanu początkowego, gdy uaktywnia się źródło resetu. Nie wymaga to pracy żadnego źródła zegara.
Gdy wszystkie źródła resetu staną się nieaktywne, wywoływany jest licznik opóźniający, rozciągający w czasie wewnętrzny reset. Pozwala to osiągnąć napięciu zasilającemu stabilny poziom przed rozpoczęciem normalnej pracy. Okres zliczania licznika opóźniającego jest definiowany przez użytkownika za pomocą bitów bezpiecznikowych SUT i CKSEL. Poniższe tabele przedstawiają możliwe ustawienia tych bitów:
Opcja zegarowa | CKSEL1:0(1) |
Zegar zewnętrzny | 00 |
Wewnętrzny oscylator kalibrowany 4,8/9.6 MHz | 01, 10 |
Wewnętrzny oscylator 128 kHz | 11 |
Uwaga: 1. Dla wszystkich bitów bezpiecznikowych "1" oznacza stan niezaprogramowany, "0" oznacza stan zaprogramowany.
SUT1:0 | Czas uruchamiania po
wybudzeniu z trybu wyłączenia/oszczędzania |
Dodatkowe opóźnienie z resetu |
Zalecane zastosowanie |
00 | 6 CK | 14 CK | Włączone BOD |
01 | 6 CK | 14 CK + 4 ms | Szybko narastające zasilanie |
10 | 6 CK | 14 CK + 64 ms | Wolno narastające zasilanie |
11 | Zarezerwowane |
Więcej na ten temat znajdziesz w rozdziale "Źródła zegarowe".
Impuls POR (ang. Power-on Reset – reset przy włączeniu zasilania) jest generowany przez wewnętrzny obwód wykrywający. POR jest aktywowany zawsze, gdy napięcie zasilające VCC spadnie poniżej poziomu wykrywania. Obwód POR może zostać użyty zarówno do wyzwalania resetu przy włączaniu zasilania, jak również do wykrywania awarii napięcia zasilającego.
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
Zewnętrzne resetowanie generowane jest przez niski stan na wyprowadzeniu RESET. Impuls resetu dłuższy niż 50 ns wygeneruje reset, nawet jeśli zegar mikrokontrolera nie pracuje. Krótsze impulsy nie dają gwarancji wygenerowania resetu. Gdy zastosowany sygnał osiągnie napięcie progu resetowania VRST (ang. Reset Threshold Voltage) na zboczu narastającym (0 → 1), licznik opóźnienia uruchomi mikrokontroler po upływie okresu opóźnienia tTOUT.
Reset zewnętrzny w trakcie pracy mikrokontrolera
ATtiny13 posiada wewnętrzny obwód wykrywania spadku napięcia zasilającego (ang. Brown-out Detection, BOD) przeznaczony do monitorowania poziomu VCC podczas pracy przez porównywanie go z ustalonym poziomem wyzwalającym. Poziom wyzwalania ma histerezę, aby zapewnić bezzakłóceniowe wykrywanie spadku napięcia zasilającego. Histereza na poziomie wykrywania powinna być interpretowana jako:
VBOT- = VBOT - VHYST / 2. |
Gdy obwód BOD został aktywowany, a napięcie VCC zmniejsza się do wartości poniżej poziomu wyzwalania (na obrazku poniżej oznaczonym jako VBOT-), zostaje natychmiast aktywowany reset przy spadku napięcia zasilającego. Gdy VCC zwiększa się ponad poziom wyzwalania (oznaczony na obrazku jako VBOT+), licznik opóźniający uruchamia mikrokontroler po upływie okresu opóźnienia tTOUT.
Obwód BOD wykryje spadek napięcia circuit VCC tylko wtedy, gdy pozostanie ono poniżej poziomu dłużej niż czas tBOD podany w rozdziale "Parametry Systemu i Resetu".
Reset przy spadku napięcia zasilającego w
trakcie pracy
Uwaga: | Histereza dla VBOT: VBOT+ = VBOT + 25 mV, VBOT– = VBOT – 25 mV. |
Gdy licznik zegarowy dojdzie do końca okresu swojego zliczania, wygeneruje krótki impuls reset o czasie trwania równym jednemu cyklowi zegara CK. Przy opadającym zboczu tego impulsu licznik opóźnienia zaczyna zliczać okres opóźnienia tTOUT.
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 jest w rozdziale "Parametry Systemu i Resetu". 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.
Timer licznika zegarowego
W trybie przerwania WDT generuje przerwanie, gdy timer zakończy swój cykl zliczania. Przerwanie to można wykorzystywać do wybudzania mikrokontrolera z trybów uśpienia lub również jako ogólny timer systemu. Przykładem może być ograniczanie maksymalnego czasu pewnych operacji, gdzie przerwanie pojawia się w sytuacji, gdy dana operacja wykonuje się dłużej niż oczekiwano. W trybie resetowania systemu WDT resetuje system, gdy timer zakończy cykl zliczania. Zwykle stosuje się to do zapobiegania zawieszeniom w przypadku awarii oprogramowania. Trzeci tryb, przerwanie i reset systemu, łączy ze sobą dwa poprzednie tryby najpierw generując przerwanie, a następnie przełączając się na reset systemu. Ten tryb, przykładowo, pozwoli na bezpieczne wyłączenie przez zapis krytycznych parametrów przed resetem systemu.
Bit bezpiecznikowy stałego włączenia licznika zegarowego (ang. Watchdog always on fuse, WDTON), jeśli jest zaprogramowany, wymusi tryb resetu systemu w liczniku zegarowym. Przy zaprogramowanym tym bicie bity trybu resetu systemu (WDE) i trybu przerwania (WDTIE) są zablokowana odpowiednio na 1 i na 0. Aby zapewnić dalsze bezpieczeństwo programu, zmiany w ustawieniach licznika zegarowego muszą być wykonywane z przestrzeganiem ograniczonych czasowo procedur. Procedura zerowania WDE i zmiany konfiguracji okresu zliczania jest następująca:
Poniższy przykład kodu pokazuje jedną funkcję w asemblerze i w języku C wyłączania timera licznika zegarowego. Przykład zakłada, iż przerwania są kontrolowane globalnie, aby mozna je było chwilowo wyłączyć i nie wystąpiły podczas wykonywania tych funkcji.
Przykład w kodzie maszynowym |
WDT_off: ; Wyłącz przerwania globalnie cli ; resetuj timer licznika zegarowego wdr ; Zeruj bit WDRF w MCUSR in r16, MCUSR andi r16, (0xff - (1<<WDRF)) out MCUSR, r16 ; Zapisz logiczną jedynkę do WDCE i WDE ; Zachowaj stare ustawienie preskalera, aby zapobiec ; niezamierzonemu zakończeniu okresu zliczania in r16, WDTCR ori r16, (1<<WDCE) | (1<<WDE) out WDTCR, r16 ; Wyłącz WDT ldi r16, (0<<WDE) out WDTCR, r16 ; Włącz przerwania globalnie sei ret |
Przykład w języku C(1) |
void WDT_off(void) { __disable_interrupt(); __watchdog_reset(); /* Zeruj WDRF w MCUSR */ MCUSR &= ~(1<<WDRF); /* Zapisz logiczną jedynkę do WDCE i WDE */ /* Zachowaj stare ustawienie preskalera, aby zapobiec niezamierzonemu zakończeniu okresu zliczania */ WDTCR |= (1<<WDCE) | (1<<WDE); /* Wyłącz WDT */ WDTCR = 0x00; __enable_interrupt(); } |
Uwaga: 1. Przykładowy kod zakłada dołączenie odpowiednich plików nagłówkowych
Jeśli licznik zegarowy zostanie przypadkowo uruchomiony, np. przez uszkodzony wskaźnik lub przez spadek napięcia zasilającego, mikrokontroler zostanie zresetowany a licznik zegarowy będzie wciąż aktywny. Jeśli kod nie jest przystosowany do obsługi licznika zegarowego, może to doprowadzić do nieskończonej pętli resetowań po okresie zliczania. Aby uniknąć tej sytuacji, aplikacja powinna zawsze zerować znacznik resetowania systemu przez licznik zegarowy (ang. Watchdog System Reset Flag, WDRF) oraz bit sterujący WDE w procedurze inicjalizacyjnej, nawet jeśli licznik zegarowy nie jest używany.
Poniższy przykład kodu pokazuje jedną funkcję w asemblerze i w języku C do zmiany okresu zliczania timera licznika zegarowego.
Przykład w kodzie maszynowym |
WDT_Prescaler_Change: ; Wyłącz globalnie przerwania cli ; resetuj timer licznika zegarowego wdr ; Rozpocznij sekwencję ograniczoną czasowo in r16, WDTCR ori r16, (1<<WDCE) | (1<<WDE) out WDTCR, r16 ; -- Mamy cztery cykle na ustawienie nowych wartości od tego miejsca - ; Ustaw nową wartość okresu zliczania w preskalerze = 64K cykli (~0,5 s) ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0) out WDTCR, r16 ; -- Koniec ustawiania nowych wartości, zużyte 2 cykle - ; Włącz globalnie przerwania sei ret |
Przykład w języku C(1) |
void WDT_Prescaler_Change(void) { __disable_interrupt(); __watchdog_reset(); /* Rozpocznij sekwencję ograniczoną czasowo */ WDTCR |= (1<<WDCE) | (1<<WDE); /* Ustaw nową wartość okresu zliczania w preskalerze = 64K cykli (~0,5 s) */ WDTCR = (1<<WDE) | (1<<WDP2) | (1<<WDP0); __enable_interrupt(); } |
Licznik zegarowy powinien zostać zresetowany przed jakąkolwiek zmianą bitów WDP, ponieważ ich zmiana może spowodować nieoczekiwane zakończenie okresu zliczania przy ustawieniu krótszego okresu.
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 | - | - | - | - | 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 są zarezerwowane w ATtiny13 i dają zawsze odczyt zero.
Ten bit jest ustawiany, jeśli wystąpi reset 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 | |
0x21 | WDTIF | WDTIE | WDP3 | WDCE | WDE | WDP2 | WDP1 | WDP0 | WDTCR |
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 | X | 0 | 0 | 0 |
Ten bit jest ustawiany, gdy timer licznika zegarowego zakończy swój okres zliczania i jest skonfigurowany na wygenerowanie przerwania. Bit WDTIF jest zerowany sprzętowo przy wywołaniu odpowiedniego wektora obsługi przerwania. Alternatywnie bit WDTIF można wyzerować przez zapis logicznej jedynki do znacznika. Gdy bity I w SREG oraz WDTIE są ustawione, zakończenie okresu zliczania w timerze licznika zegarowego powoduje wykonanie przerwania od licznika zegarowego (ang. Watchdog Time-out Interrupt).
Gdy ten bit zostanie zapisany jako 1 i bit I w rejestrze SREG jest ustawiony, to włączane są przerwania od licznika zegarowego. Jeśli w kombinacji z tym ustawieniem bit WDE jest wyzerowany, to timer licznika zegarowego pracuje w trybie przerwań, a odpowiednie przerwanie zostanie wykonane, jeśli timer zakończy swój okres zliczania. Jeśli bit WDE jest ustawiony, to timer licznika zegarowego pracuje w trybie przerwania i resetu systemu. Za pierwszym razem gdy nastąpi zakończenie okresu zliczania w liczniku zegarowym, zostanie ustawiony znacznik WDTIF. Wykonanie odpowiadającego mu wektora przerwań wyzeruje automatycznie bity WDTIE i WDTIF (licznik zegarowy przejdzie w tryb resetu systemu). Jest to przydatne przy utrzymywaniu bezpieczeństwa za pomocą licznika zegarowego przy korzystaniu z tego przerwania. Aby pozostać w trybie przerwania i resetu systemu, bit WDTIE musi być ustawiany po każdym przerwaniu. Tego jednak nie powinno się wykonywać w samej procedurze obsługi przerwania, ponieważ moze to naruszyć funkcję bezpieczeństwa trybu resetu systemu przez licznik zegarowy. Jeśli przerwanie nie wystąpi do zakończenia następnego okresu zliczania licznika zegarowego, zostanie zastosowany reset systemu.
Konfiguracja timera licznika zegarowego
WDTON(1) | WDE | WDTIE | Tryb |
Działanie przy zakończeniu okresu zliczania |
1 | 0 | 0 | Zatrzymany | Żadne |
1 | 0 | 1 | Tryb przerwania | Przerwanie |
1 | 1 | 0 | Tryb resetu systemu | Reset |
1 | 1 | 1 | Tryb przerwania i resetu systemu | Przerwanie, następnie przejście w tryb resetu systemu |
0 | X | X | Tryb resetu systemu | Reset |
Uwaga: 1. Bit bezpiecznikowy WDTON ustawiony na "0 oznacza zaprogramowany, ustawiony na "1" oznacza niezaprogramowany.
Ten bit jest używany w ograniczonych czasowo ciągach instrukcji zmieniających bit WDE i bity preskalera. Aby wyzerować bit WDE i/lub zmienić bity preskalera, bit WDCE musi być ustawiony. Po zapisaniu go logiczną jedynką zostanie wyzerowany po upływie czterech cykli zegara.
WDE jest nadpisywany przez bit WDRF w rejestrze MCUSR. Oznacza to, iż WDE jest zawsze ustawiany, gdy ustawiany jest bit WDRF. Aby wyzerować WDE, należy najpierw wyzerować WDRF. Ta własność zapewnia wielokrotne resetowania podczas warunków powodujących awarię oraz bezpieczne uruchamianie po takiej awarii.
Bity WDP[3:0] określają ustawienie preskalera dla timera licznika zegarowego, gdy timer ten jest uruchomiony. Wartości ustawień preskalera oraz odpowiadające im okresy zliczania są pokazane w poniższej tabeli:
WDP3 | WDP2 | WDP1 | WDP0 | Liczba cykli oscylatora licznika zegarowego |
Typowy okres zliczania przy VCC = 5V |
0 | 0 | 0 | 0 | 2K (2048) cykli | 16 ms |
0 | 0 | 0 | 1 | 4K (4096) cykli | 32 ms |
0 | 0 | 1 | 0 | 8K (8192) cykli | 64 ms |
0 | 0 | 1 | 1 | 16K (16384) cykli | 0,125 s |
0 | 1 | 0 | 0 | 32K (32768) cykli | 0,25 s |
0 | 1 | 0 | 1 | 64K (65536) cykli | 0,5 s |
0 | 1 | 1 | 0 | 128K (131072) cykli | 1,0 s |
0 | 1 | 1 | 1 | 256K (262144) cykli | 2,0 s |
1 | 0 | 0 | 0 | 512K (524288) cykli | 4,0 s |
1 | 0 | 0 | 1 | 1024K (1048576) cykli | 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 ©2023 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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.