Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny13

Sterowanie systemem i reset

obrazek

Educational and Non-Profit Use of Copyrighted Material:

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: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Resetowanie mikrokontrolera AVR

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:

obrazek

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".

Na początek:  podrozdziału   strony 

Źródła Resetu

Mikrokontroler ATtiny13 posiada cztery źródła resetu:

Reset przy Włączaniu Zasilania

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
obrazek

Start mikrokontrolera, RESET przedłużony zewnętrznie
obrazek

Zewnętrzny reset

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
obrazek

Reset przy spadku napięcia zasilającego

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
oraz
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
 obrazek

Uwaga: Histereza dla VBOT: VBOT+ = VBOT + 25 mV, VBOT– = VBOT – 25 mV.

Reset od licznika zegarowego

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
obrazek

Na początek:  podrozdziału   strony 

Wewnętrzne napięcie odniesienia

Mikrokontroler ATtiny13 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 lub przetwornika A/C.

Sygnały uaktywniające wewnętrzne napięcie odniesienia i czas włączania

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.

Na początek:  podrozdziału   strony 

Timer licznika zegarowego

Mikrokontroler ATtiny13 posiada rozszerzony timer licznika zegarowego (ang. Enhanced Watchdog Timer, WDT). WDT jest timerem zliczającym cykle oddzielnego, wbudowanego oscylatora o częstotliwości 128 kHz. WDT generuje przerwanie lub reset systemu, gdy licznik osiąga zadaną wartość czasu. W normalnym trybie pracy wymagane jest, aby system używał instrukcji resetowania licznika zegarowego WDR, co zapobiega przekroczeniu limitu czasu. Jeśli system nie użyje tej instrukcji w zadanym przedziale czasu (np. z powodu awarii), to zostanie wygenerowane przerwanie lub reset systemu.

Timer licznika zegarowego
obrazek

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:

  1. W tej samej operacji zapisz logiczne jedynki w bicie uaktywnienia zmian w liczniku zegarowym (ang. Watchdog change enable bit, WDCE) oraz w bicie WDE. Logiczna jedynka musi być wpisana do WDE bez względu na poprzedni stan tego bitu.
  2. W ciągu następnych czterech cykli zegarowych zapisz wg potrzeb bit WDE i bity preskalera licznika zegarowego WDP, lecz z wyzerowanym bitem WDCE. Musi to być wykonane w jednej operacji.

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.

Na początek:  podrozdziału   strony 

Opis rejestrów

MCUSR – MCU Status Register – Rejestr stanu mikrokontrolera

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  

Bity 7:4 – Zarezerwowane

Te bity są zarezerwowane w ATtiny13 i dają zawsze odczyt zero.

Bit 3 – WDRF: Watchdog Reset Flag – Znacznik resetu od licznika zegarowego

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.

Bit 2 – BORF: Brown-out Reset Flag – Znacznik resetu przy spadku napięcia zasilającego

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.

Bit 1 – EXTRF: External Reset Flag – Znacznik resetu zewnętrznego

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.

Bit 0 – PORF: Power-on Reset Flag – Znacznik resetu przy włączeniu zasilania

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.


WDTCR – Watchdog Timer Control Register – Rejestr sterujący licznika zegarowego

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  

Bit 7 – WDTIF: Watchdog Timer Interrupt Flag – Znacznik przerwania od licznika zegarowego

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).

Bit 6 – WDTIE: Watchdog Timer Interrupt Enable – Uaktywnienie przerwań od licznika zegarowego

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.

Bit 4 – WDCE: Watchdog Change Enable – Uaktywnienie zmian w liczniku zegarowym

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.

Bit 3 – WDE: Watchdog System Reset Enable – Uaktywnienie resetu systemu od licznika zegarowego

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 5, 2:0 – WDP[3:0]: Watchdog Timer Prescaler 3, 2, 1 and 0 – Bity preskalera licznika zegarowego

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
Na początek:  podrozdziału   strony 

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.