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 |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Podczas resetu wszystkie rejestry we/wy są ustawiane na ich wartości początkowe, a wykonanie programu rozpoczyna się od wektora Reset. Instrukcją umieszczoną w tym wektorze musi być instrukcja skoku względnego RJMP (ang. Relative Jump) do procedury obsługi resetu. Jeśli program nigdy nie uaktywnia źródła przerwań, wektory przerwań nie są używane i w ich miejscu może zostać umieszczony zwykły kod. Schemat na poniższym rysunku pokazuje logikę resetu.
Porty we/wy zostają natychmiast zresetowane do swojego stanu początkowego, gdy źródło resetu staje się aktywne. Nie wymaga to pracy żadnego źródła sygnałów zegarowych.
Gdy wszystkie źródła resetu staną się nieaktywne, uaktywniony zostaje licznik opóźnień, który rozciągnie w czasie wewnętrzny reset. Pozwoli to napięciu zasilającemu osiągnąć stabilny poziom przed rozpoczęciem normalnej pracy mikrokontrolera. Okres zliczania w tym liczniku opóźniającym jest definiowany przez użytkownika poprzez bity bezpiecznikowe SUT i CKSEL.
Charakterystyka resetu
Symbol | Parametr | Warunki | Min(1) | Typ.(1) | Max(1) | Jednostki |
VPOT | Próg napięcia rosnącego dla resetu przy włączaniu | TA = -40 ... +85°C | 1,2 | V | ||
Próg napięcia opadającego dla resetu przy włączaniu(2) | TA = -40 ... +85°C | 1,1 | V | |||
VRST | Próg napięcia końcówki RESET | VCC = 1,8 ... 5,5V | 0,2VCC | 0,9VCC | V | |
tRST | Minimalna długość impulsu na końcówce RESET | VCC = 1,8 ... 5,5V | 2,5 | μs |
Uwagi: | 1. | Podane wartości są jedynie orientacyjne. |
2. | Reset przy włączaniu nie zadziała, aż do momentu, gdy napięcie zasilające nie spadnie poniżej progu VPOT. |
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ż 2,5 μs 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
ATtiny2313A/4313 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 dla modułu BOD można wybrać za pomocą bitów
bezpiecznikowych BODLEVEL. Poziom wyzwalania ma histerezę, aby
zapewnić bezzakłóceniowe wykrywanie spadku napięcia
zasilającego. Histereza na poziomie wykrywania powinna być
interpretowana jako:
Kodowanie bitów bezpiecznikowych BODLEVEL(1)
Bity BODLEVEL 2...0 | Min. VBOT | Typ. VBOT | Max. VBOT | Jednostki |
111 | Moduł BOD wyłączony | |||
110 | 1,8 | V | ||
101 | 2,7 | V | ||
100 | 4,3 | V | ||
011 | Zarezerwowane | |||
010 | ||||
001 | ||||
000 |
Charakterystyka wykrywania spadku VCC
Symbol | Parametr | Min. | Typ. | Max. | Jednostki |
VHYST | Histereza detektora BOD | 50 | mV | ||
tBOD | Minimalna długość impulsu do wywołania resetu BOD |
2 | μs |
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 VCC tylko wtedy, gdy pozostanie ono poniżej poziomu dłużej niż czas tBOD.
Reset przy spadku napięcia zasilającego w
trakcie pracy
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
Mikrokontroler ATtiny24/44/84 posiada wewnętrzne napięcie odniesienia. Używane jest ono przez moduł wykrywania spadku napięcia zasilającego, a może również pełnić rolę napięcia wejściowego dla komparatora analogowego. Napięcie odniesienia zmienia się z temperaturą oraz napięciem zasilającym.
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.
Parametry wewnętrznego napięcia odniesienia(1)
Timer licznika zegarowego (ang. Watchdog Timer) jest taktowany z wewnętrznego oscylatora pracującego z częstotliwością 128 kHz. Sterując preskalerem timera licznika zegarowego można ustawiać odpowiedni interwał czasowy resetu z licznika zegarowego. Instrukcja WDR (ang. Watchdog Reset, reset licznika zegarowego) – resetuje timer licznika zegarowego. Timer ten jest również resetowany, gdy zostanie wyłączony lub gdy wystąpi reset układu (ang. Chip Reset). Można wybierać różne okresy cyklów zegarowych, aby określać okres resetu. Jeśli okres ten upłynie bez kolejnego zresetowania licznika zegarowego, to mikrokontroler ATtiny2313A/4313 zresetuje się i rozpocznie wykonywanie programu od wektora resetu.
Timer licznika zegarowego może również zostać skonfigurowany do generowania przerwania zamiast resetu. Może to być bardzo pomocne przy stosowaniu licznika zegarowego do wybudzania z trybu wyłączenia. Aby zapobiec niezamierzonemu wyłączeniu licznika zegarowego lub niezamierzonej zmianie okresu zliczania, bit bezpiecznikowy WDTON wybiera dwa różne poziomy bezpieczeństwa, jak pokazuje poniższa tabelka:
WDTON | Poziom bezpieczeństwa |
Stan początkowy licznika zegarowego |
Jak wyłączyć licznik zegarowy |
Jak zmienić okres zliczania |
Niezaprogramowany | 1 | Wyłączony | Sekwencja czasowa | Bez ograniczeń |
Zaprogramowany | 2 | Włączony | Zawsze włączony | Sekwencja czasowa |
Timer licznika zegarowego
Sekwencja do zmiany konfiguracji różni się nieznacznie pomiędzy dwoma poziomami bezpieczeństwa. Dla każdego poziomu opisane są oddzielne procedury.
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 można 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
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 są zarezerwowane w ATtiny2313A/4313 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 (0x41) | 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 | 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 WDIF jest zerowany sprzętowo przy wywołaniu odpowiedniego wektora obsługi przerwania. Alternatywnie bit WDIF można wyzerować przez zapis logicznej jedynki do znacznika. Gdy bity I w SREG oraz WDIE 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 WDIF. Wykonanie odpowiadającego mu wektora przerwań wyzeruje automatycznie bity WDIE i WDIF (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 WDIE 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
WDE | WDTIE | Stan timera licznika zegarowego | Działanie przy zakończeniu okresu zliczania |
0 | 0 | Zatrzymany | Żadne |
0 | 1 | Pracuje | Przerwanie |
1 | 0 | Pracuje | Reset |
1 | 1 | Pracuje | Przerwanie |
Ten bit musi być ustawiony, gdy do bitu WDE jest wpisywane logiczne zero. W przeciwnym razie licznik zegarowy nie zostanie wyłączony. Po zapisaniu jedynką bit zostanie sprzętowo wyzerowany po czterech cyklach zegara. Zobacz na opis bitu WDE poniżej, gdzie jest procedura wyłączania licznika zegarowego. Bit ten również musi być ustawiony prze zmienianiu bitów preskalera.
Gdy do bitu WDE zostanie wpisana logiczna jedynka, licznik czasu zostaje uaktywniony, a gdy do WDE będzie wpisane logiczne zero, funkcja licznika zegarowego zostanie wyłączona. Bit WDE może zostać wyzerowany tylko wtedy, gdy bit WDCE ma poziom logiczny jeden. Aby wyłączyć działający timer licznika zegarowego, należy postępować wg następującej procedury:
Przy poziomie 2 zabezpieczeń nie można wyłączyć licznika czasu, nawet za pomocą przedstawionego powyżej algorytmu.
Przy poziomie 1 zabezpieczeń bit WDE jest przechwytywany przez bit WDRF w rejestrze MCUSR. Oznacza to, iż WDE jest zawsze ustawiony, gdy WDRF jest ustawiony. Aby wyzerować WDE bit WDRF musi być wyzerowany przed wyłączeniem licznika zegarowego za pomocą opisanej wyżej procedury. Ta cecha zapewnia wielokrotne resety podczas sytuacji wywołujących błędy oraz bezpieczny start po takim błędzie.
Uwaga:
Jeśli licznik zegarowy nie będzie używany w aplikacji, to należy wykonać procedurę jego wyłączenia w czasie inicjalizacji mikrokontrolera. Jeśli licznik zegarowy przypadkowo włączy się, np. przez źle działający wskaźnik lub spadek napięcia zasilającego, to mikrokontroler zostanie zresetowany, co następnie doprowadzi do nowego resetu od licznika zegarowego. Aby uniknąć tej sytuacji, oprogramowanie aplikacji powinno zawsze zerować znacznik WDRF oraz bit sterujący WDE w procedurze inicjalizacyjnej.
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 ©2024 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.