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

ATmega64

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.

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

ATmega64 posiada pięć źródeł resetu:

Logika resetu

Charakterystyki resetu

Symbol Parametr Warunek Min. Typ. Max. Jednostki
VPOT Napięcie progu resetu przy włączaniu (narastające)     1,4 2,3 V
Napięcie progu resetu przy włączaniu (opadające)(1)     1,3 2,3
VRST Napięcie progu końcówki RESET   0,2   0,85 VCC
tRST Minimalna długość impulsu na końcówce RESET       1,5 μs
VBOT Napięcie progu resetu przy spadku VCC(2) BODLEVEL = 1 2,5 2,7 2.9 V
BODLEVEL = 0 3,6 4,0 4,2
tBOD Minimalny okres niskiego napięcia przy wykrywaniu spadku VCC BODLEVEL = 1   2   μs
BODLEVEL = 0   2  
VHYST Histereza detektora spadku napięcia zasilania     120   mV
VBG Napięcie odniesienia   1,15 1,23 1,35 V
tBG Czas włączania napięcia odniesienia     40 70 μs
IBG Prąd pobierany przez układ napięcia odniesienia     10   μA
Uwagi: 1. Reset przy włączaniu nie będzie działać, aż napięcie zasilania nie spadnie poniżej progu VPOT.
  2. Dla niektórych mikrokontrolerów VBOT może być poniżej minimalnego napięcia pracy. W takim przypadku mikrokontroler jest testowany w dół do VCC = VBOT podczas testów fabrycznych. Gwarantuje to, iż reset przy spadku VCC wystąpi zanim napięcie to spadnie poniżej poziomu, przy którym już nie jest gwarantowane działanie mikrokontrolera.
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 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
obrazek 

Na początek:  podrozdziału   strony 

Wykrywanie spadku napięcia zasilania

ATmega64 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ą bitu bezpiecznikowego BODLEVEL na 2,7 V (BODLEVEL niezaprogramowany) lub 4,0 V (BODLEVEL zaprogramowany). 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.

Obwód BOD może być włączany/wyłączany przez bit bezpiecznikowy BODEN. Gdy BOD jest włączone (BODEN zaprogramowany) a VCC obniża się do wartości poniżej poziomu wyzwalania (VBOT- na obrazku poniżej), zostaje natychmiast uaktywniony reset od spadku napięcia. Gdy VCC wzrośnie powyżej poziomu wyzwalania (VBOT+), licznik opóźniający uruchamia mikrokontroler po upływie okresu zliczania tTOUT.

Obwód BOD tylko wtedy wykryje spadek w VCC, jeśli napięcie to pozostanie poniżej poziomu wyzwalania przez czas dłuższy od 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

ATmega64 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. Napięcie odniesienia 2,56 V dla przetwornika A/C generowane jest z wewnętrznego napięcia odniesienia,

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.

Charakterystyki wewnętrznego napięcia odniesienia

Symbol Parametr Min. Typ. Max. Jednostki
VBG Napięcie odniesienia 1,15 1,23 1,35 V
tBG Czas aktywacji VBG   40 70 μs
IBG Prąd pobierany przez układ generujący VBG   10   μA
Na początek:  podrozdziału   strony 

Timer licznika zegarowego

Timer licznika zegarowego jest taktowany z osobnego, wbudowanego w układ oscylatora, który pracuje z częstotliwością 1 MHz. Jest to typowa wartość przy  VCC = 5V. Przez sterowanie preskalerem timera licznika zegarowego interwał resetowania przez licznik zegarowy można ustawić zgodnie z tabelą w opisie rejestru WDTCR. Instrukcja WDR (ang, Watchdog Reset – reset licznika zegarowego) powoduje zresetowanie tego licznika i ponowne rozpoczęcie zliczania interwału. Timer licznika zegarowego jest również resetowany, gdy zostanie wyłączony lub gdy nastąpi reset układu. W celu określenia okresu resetowania można wybrać osiem różnych okresów cykli zegarowych. Jeśli okres resetowania minie bez zresetowania licznika zegarowego, to ATmega64 resetuje się i wykonuje program od wektora Reset.

Aby zapobiec niezamierzonemu wyłączeniu licznika zegarowego lub niezamierzonej zmianie okresu zliczania, trzy różne poziomy bezpieczeństwa są wybierane bitami bezpiecznikowymi M103C i WDTON, co pokazuje poniższa tabelka. Poziom bezpieczeństwa 0 odpowiada ustawieniu w ATmega103. Nie ma ograniczeń na włączanie licznika zegarowego w żadnym z poziomów bezpieczeństwa. Szczegóły znajdziesz w następnym podrozdziale.

M103C WDTON Poziom bezpieczeństwa Stan początkowy WDT Jak wyłączyć WDT Jak zmienić okres zliczania
1 1 1 Wyłączony Sekwencja czasowa Sekwencja czasowa
1 0 2 Włączony Zawsze włączony Sekwencja czasowa
0 1 0 Wyłączony Sekwencja czasowa Bez ograniczeń
0 0 2 Włączony Zawsze włączony Sekwencja czasowa

WDT (ang. Watchdog Timer) – Timer licznika zegarowego
"0" – bit bezpiecznikowy zaprogramowany, "1" – niezaprogramowany

Na początek:  podrozdziału   strony 

Czasowe sekwencje zmiany konfiguracji timera licznika zegarowego

Sekwencja zmian konfiguracji różni się nieco pomiędzy trzema poziomami bezpieczeństwa. Dla każdego z tych poziomów opisujemy poniżej odpowiednią procedurę.

Poziom bezpieczeństwa 0

Ten tryb jest kompatybilny z operacjami na liczniku zegarowym wykonywanymi w mikrokontrolerze ATmega103. Licznik zegarowy jest początkowo wyłączony, lecz można go uruchomić przez wpisanie bez żadnych ograniczeń jedynki do bitu WDE w rejestrze sterującym licznika zegarowego WDTCR. Okres zliczania można bez ograniczeń zmieniać w każdej chwili. Procedura wyłączenia licznika zegarowego znajduje się w opisie bitu WDE.

Poziom bezpieczeństwa 1

W tym trybie licznik zegarowy jest początkowo wyłączony, lecz można go włączyć zapisując bez żadnych ograniczeń logiczną jedynkę do bitu WDE. Sekwencja czasowa jest konieczna przy zmianie okresu zliczania licznika zegarowego lub przy wyłączaniu uruchomionego timera licznika zegarowego. W tym celu należy wykonać poniższą procedurę:

  1. W tej samej operacji wpisz logiczne jedynki do bitów WDCE i 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 w tej samej operacji wpisz pożądane wartości do bitów WDE i WDP, lecz z wyzerowanym bitem WDCE.

Poziom bezpieczeństwa 2

W tym trybie licznik zegarowy jest zawsze włączony, a bit WDE daje zawsze przy odczycie wartość jeden. Sekwencja czasowa jest wymagana przy zmianie okresu zliczania licznika zegarowego. Aby go zmienić należy wykonać następującą procedurę:

  1. W tej samej operacji wpisz logiczne jedynki do bitów WDCE i WDE. Chociaż bit WDE jest zawsze ustawiony, to jednak należy do niego wpisać jedynkę, aby uruchomić sekwencję czasową.
  2. W ciągu następnych czterech taktów zegarowych w tej samej operacji wpisz pożądane wartości do bitów WDP, lecz z wyzerowanym bitem WDCE. Wartość wpisywana do WDE jest nieistotna.
Na początek:  podrozdziału   strony 

Opis rejestrów

MCUCSR – MCU Control and 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) JTD - - JTRF WDRF BORF EXTRF PORF MCUCSR
Zapis/Odczyt Z/O O O Z/O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0   Zobacz na opis bitów  

Bit 4 – JTRF: JTAG Reset Flag – Znacznik resetu JTAG

Ten bit zostanie ustawiony, jeśli reset powodowany jest przez logiczną jedynkę w rejestrze resetu JTAG wybranego instrukcją JTAG AVR_RESET. Bit jest zerowany przez reset przy włączaniu lub przez zapis logicznego zera do tego znacznika.

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 timera licznika zegarowego

Bit 7 6 5 4 3 2 1 0  
0x21 (0x41) WDCE WDE WDP2 WDP1 WDP0 WDTCR
Zapis/Odczyt O O O Z/O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7...5 – Zarezerwowane

Te bity zostały zarezerwowane w ATmega64 i zawsze przy odczycie mają wartość zero.

Bit 4 – WDCE: Watchdog Change Enable – Uaktywnienie zmiany licznika zegarowego

Bit ten musi być ustawiony, gdy bit WDE jest ustawiany na zero. W przeciwnym razie licznik zegarowy nie zostanie wyłączony. Po wpisaniu jedynki, bit WDCE jest sprzętowo zerowany po czterech taktach zegarowych. Zobacz do opisu bitu WDE, gdzie znajduje się procedura wyłączania licznika zegarowego W poziomach zabezpieczeń 1 i 2 bit ten również musi zostać ustawiony przy zmianie bitów preskalera. Zobacz do podrozdziału "Czasowe sekwencje zmiany konfiguracji timera licznika zegarowego".

Bit 3 – WDE: Watchdog Enable – Uaktywnienie licznika zegarowego

Gdy do bitu WDE zostanie wpisana logiczna jedynka, zostaje włączony licznik zegarowy, a jeśli do WDE zostanie wpisane logiczne zero, timer licznika zegarowego zostaje wyłączony, WDE można wyzerować tylko wtedy, gdy bit WDCE ma poziom logiczny jeden. Aby włączyć lub wyłączyć timer licznika zegarowego, należy wykonać poniższą procedurę:

  1. W tej samej operacji wpisz logiczne jeden do WDCE i WDE. Jedynka musi być wpisana do WDE, nawet jeśli bit ten ma stan jeden przed rozpoczęciem operacji wyłączania.
  2. W ciągu następnych czterech taktów zegarowych wpisz logiczne 0 do WDE. To wyłączy licznik zegarowy.

Bity 2...0 – WDP2, WDP1, WDP0: Watchdog Timer Prescaler 2, 1, and 0 – Preskaler licznika zegarowego

Bity WDP2, WDP1 i WDP0 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.

WDP2 WDP1 WDP0 Liczba cykli oscylatora Typowy czas zliczania dla VCC = 3,0 V Typowy czas zliczania dla VCC = 5,0 V
0 0 0 16K (16384) 17,1 ms 16,3 ms
0 0 1 32K (32768) 34,3 ms 32,5 ms
0 1 0 64K (65536) 68,5 ms 65 ms
0 1 1 128K (131072) 0,14 s 0,13 s
1 0 0 256K (262144) 0,27 s 0,26 s
1 0 1 512K (524288) 0,55 s 0,52 s
1 1 0 1024K (1048576) 1,1 s 1,0 s
1 1 1 2048K (2097152) 2,2 s 2,1 s

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:
  ; Resetuj timer licznika zegarowego
  wdr
  ; Zapisz logiczną jedynkę do WDCE i WDE
  ; Zachowaj stare ustawienie preskalera, aby zapobiec
  ; niezamierzonemu zakończeniu okresu zliczania
  in r16, WDTCR
  ori r16, (1<<WDTOE) | (1<<WDE)
  out WDTCR, r16
  ; Wyłącz WDT
  ldi r16, (0<<WDE)
  out WDTCR, r16
  ret
Przykład w języku C
void WDT_off(void)
{
  /* Resetuj timer licznika zegarowego */
  _WDR();
  /* Zapisz logiczną jedynkę do WDCE i WDE */
  WDTCR |= (1<<WDTOE) | (1<<WDE);
  /* Wyłącz WDT */
  WDTCR = 0x00;
}
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
©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.