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

ATmega16

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

ATmega16 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,1   0,9 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 3,2 V
BODLEVEL = 0 3,6 4,0 4,5
tBOD Minimalny okres niskiego napięcia przy wykrywaniu spadku VCC BODLEVEL = 1   2   μs
BODLEVEL = 0   2  
VHYST Histereza detektora spadku napięcia zasilania     50   mV
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. Test ten jest wykonywany z BODLEVEL = 1 dla ATmega16L i BODLEVEL = 0 dla ATmega16. Wartości BODLEVEL = 1 nie stosuje się dla ATmega16.
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

ATmega16 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 

MCUCSR – Rejestr sterowania i stanu mikrokontrolera

MCUCSR – MCU Control and Status Register – Rejestr sterowania i 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 ISC2 - JTRF WDRF BORF EXTRF PORF MCUCSR
Zapis/Odczyt Z/O Z/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.

Na początek:  podrozdziału   strony 

Wewnętrzne napięcie odniesienia

ATmega16 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,40 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 ATmega16 resetuje się i wykonuje program od wektora Reset.

Aby uniknąć niezamierzonego wyłączenia licznika zegarowego, należy wykonać specjalną sekwencję wyłączającą, gdy licznik zegarowy ma faktycznie zostać wyłączony. Zobacz do opisu rejestru WDTCR.


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

Bit 7 6 5 4 3 2 1 0  
0x21 (0x41) WDTOE 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 ATmega16 i zawsze przy odczycie mają wartość zero.

Bit 4 – WDTOE: Watchdog Turn-off Enable – Zezwolenie na wyłączenie licznika zegarowego

Ten bit musi być ustawiony, gdy bit WDE jest zapisywany logiczną jedynką. W przeciwnym razie licznik zegarowy nie zostanie wyłączony. Po wpisaniu jedynki bit ten zostanie sprzętowo wyzerowany po czterech taktach zegara. Zobacz do opisu następnego bitu, gdzie znajdziesz procedurę wyłączania 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.