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

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega48A/PA/88A/PA/168A/PA/328/P

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 są ustawiane na swoje wartości początkowe, a wykonanie programu rozpoczyna się od wektora Reset. Jeśli program nigdy nie włącza żadnego źródła przerwań, to wektory przerwań nie są używane i w ich miejscu można umieścić normalny program. Tak dzieje się również, gdy wektor Resetu znajduje się w sekcji aplikacji, a wektory przerwań w sekcji programu ładującego (ang. Boot Section) lub na odwrót (tylko mikrokontrolery ATmega88A/88PA/168A/168PA/328/328P).

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.

Na początek:  podrozdziału   strony 

Źródła resetu

ATmega48A/PA/88A/PA/168A/PA/328/P posiada cztery źródła resetu:

Logika resetu

Na początek:  podrozdziału   strony 

Reset przy Włączaniu

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 

Na początek:  podrozdziału   strony 

Reset zewnętrzny

Zewnętrzne resetowanie generowane jest przez niski stan na końcówce 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. Zewnętrzny reset można zablokować bitem bezpiecznikowym RSTDISBL.

Reset zewnętrzny w trakcie pracy mikrokontrolera
obrazek 

Na początek:  podrozdziału   strony 

Wykrywanie spadku napięcia zasilania

ATmega48A/PA/88A/PA/168A/PA/328/P 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: VBOT+ = VBOT + VHYST / 2 oraz VBOT- = VBOT - VHYST / 2. Gdy moduł BOD jest uaktywniony, a napięcie zasilające VCC spadnie do wartości poniżej progu wyzwalania (VBOT- na rysunku poniżej), to zostaje natychmiast uruchomiony reset przy spadku napięcia (ang. Brown-out Reset). Gdy napięcie VCC wzrośnie powyżej progu wyzwalania (VBOT+ na rysunku poniżej), to licznik opóźniający uruchomi mikrokontroler po upływie okresu zliczania tTOUT. Obwód BOD wykryje spadek VCC tylko wtedy, gdy napięcie to pozostanie poniżej progu wyzwalania przez okres co najmniej 2μs.

Reset przy spadku napięcia zasilającego w trakcie pracy
 obrazek 

Na początek:  podrozdziału   strony 

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óźniający 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

ATmega48A/PA/88A/PA/168A/PA/328/P posiada wewnętrzne napięcie odniesienia, które używane jest do wykrywania spadków napięcia zasilania i może służyć jako dane wejściowe 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 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.

Na początek:  podrozdziału   strony 

Timer licznika zegarowego

Własności

Przegląd

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:

  1. W tej samej operacji wpisz logiczną jedynkę do bitu uaktywniającego zmiany licznika zegarowego (ang. Watchdog change enable bit, WDCE) oraz do WDE. Logiczna jedynka musi zostać wpisana do WDE bez względu na poprzednią wartość bitu WDE.
  2. W ciągu następnych czterech taktów zegarowych zapisz zgodnie ze swoim życzeniem bit WDE oraz bity preskalera licznika zegarowego (ang.Watchdog prescaler bits, WDP), lecz z wyzerowanym bitem WDCE. Musi to być wykonane w pojedynczej operacji.

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.

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 (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  

Bity 7:4 – Zarezerwowane

Te bity w mikrokontrolerze ATmega48A/PA/88A/PA/168A/PA/328/P zostały zarezerwowane i przy odczycie zawsze zwracają wartość 0.

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

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.

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.


WDTCSR – Watchdog Timer Control Register – Rejestr sterujący timera licznika zegarowego

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  

Bit 7 – WDIF: Watchdog Interrupt Flag – Znacznik przerwania licznika zegarowego

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.

Bit 6 – WDIE: Watchdog Interrupt Enable – Włączenie przerwań z licznika zegarowego

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 4 – WDCE: Watchdog Change Enable – Uaktywnienie zmiany licznika zegarowego

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.

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

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

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
©2021 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.