- Co to są bezpieczniki w AVR - szczegółowe wyjaśnienie
- Bity bezpieczników w Arduino
- Komponenty wymagane do testowania bezpieczników w AVR
- Schemat testowania bitów bezpiecznika w AVR
- Testowanie bezpieczników w AVR
W tym samouczku będziemy mówić o bezpiecznikach. Kiedy byłem na studiach i poznawałem wszystkie fajne rzeczy w elektronice, po raz pierwszy usłyszałem termin bezpiecznik w AVR, moja pierwsza myśl na ten temat brzmiała: och! wewnątrz AVR jest coś, co wybuchnie, jeśli zrobię coś złego. W tamtych czasach w Internecie dostępnych było niewiele zasobów do przejścia. Przeszukałem sporo, aby dowiedzieć się, że te bezpieczniki odnosiły się do specjalnych bitów wewnątrz mikrokontrolera AVR. Te bity są jak małe przełączniki wewnątrz AVR i włączając je / wyłączając, możemy włączać / wyłączać niektóre specjalne funkcje AVR. Włączanie i wyłączanie oznacza ustawianie i resetowanie.
Skorzystamy z okazji, aby omówić wszystko, co dotyczy bitów bezpiecznika w AVR. Dla uproszczenia weźmiemy przykład płytki Arduino, na której znajduje się popularny mikrokontroler ATmega328P. Tutaj dowiesz się, jak ustawić te bezpieczniki, aby włączać i wyłączać niektóre z tych funkcji, co jest bardzo przydatne w rzeczywistych zastosowaniach. Więc przejdźmy od razu do tego.
W naszych poprzednich postach zbudowaliśmy wiele projektów mikrokontrolerów AVR, takich jak moduł Łączący GSM z mikrokontrolerem AVR i Łączący HC-05 z mikrokontrolerem AVR. Możesz je sprawdzić, jeśli chcesz dowiedzieć się więcej o tych projektach.
Co to są bezpieczniki w AVR - szczegółowe wyjaśnienie
Jak omówiliśmy wcześniej, bezpieczniki w mikrokontrolerze są jak małe przełączniki, które można włączać i wyłączać, aby włączać i wyłączać różne funkcje mikrokontrolera AVR. To jest ta część, w której pojawia się nasze następne pytanie, więc jak ustawić lub zresetować te bezpieczniki? Odpowiedź na to pytanie jest prosta: robimy to za pomocą rejestrów bezpieczników.
W układzie scalonym ATmega328P znajduje się łącznie 19 bitów bezpiecznika i są one podzielone na trzy bajty bezpiecznika. Są one definiowane jako „Bajty rozszerzonego bezpiecznika”, „Bajt wysokiego bezpiecznika” i „Bajt niskiego bezpiecznika”.
Jeśli spojrzysz na Tabela 27 w karcie katalogowej ATmega328 / P Rev: 7810D – AVR – 01/15, możesz znaleźć wszystkie drobne szczegóły dotyczące końcówek bezpiecznikowych. Ale poniższy obraz daje lepsze wyobrażenie o sekcji bitów bezpiecznika w arkuszu danych.
Teraz, gdy nauczyłeś się trochę o bitach bezpieczników, przejrzyjmy arkusz danych i dowiedzmy się wszystkich niezbędnych szczegółów na temat tego układu scalonego.
Rozszerzone bity bezpiecznika:
Po kliknięciu zakładki Fuse Bits i przewinięciu trochę w dół, znajdziesz Tabela 27-5: która pokazuje tabelę „Extended Fuse Byte”, powszechnie znaną jako „ EFUSE”. Poniższy obraz dokładnie to pokazuje.
W tej tabeli są tylko trzy użyteczne bity, a pozostałe trzy są zarezerwowane. Te trzy bity dotyczą poziomu wykrywania Brownout. Jak widać w notatce, jeśli spojrzymy na tabelę 28-5, możemy znaleźć więcej szczegółów na jej temat.
Jak widać w powyższej tabeli, mamy tabelę dla wykrywania Brownout. Wykrywanie przepięcia to funkcja, która resetuje mikrokontroler, gdy napięcie zasilania spadnie poniżej określonego poziomu. W układzie scalonym ATmega328P możemy całkowicie wyłączyć wykrywanie brownout lub możemy ustawić je na poziomy, które są pokazane w powyższej tabeli.
Bajty wysokiego bezpiecznika:
Jak widać na poniższym obrazku, tabela 27-6: w arkuszu danych pokazuje bity wyższego bezpiecznika układu ATmega328P.
Bezpiecznik Wysoka czynienia z różnymi zadaniami wewnątrz mikrokontrolera ATmega328. W tej sekcji omówimy wyższe bity bezpiecznikowe i ich działanie. Zacznijmy od bitów BOOTRST, BOOTSZ0 i BOOTSZ1. Te trzy bity są odpowiedzialne za ustawienie rozmiaru rozruchu; rozmiar rozruchu odnosi się do ilości pamięci zarezerwowanej na instalację programu ładującego.
Bootloader to specjalne oprogramowanie, które działa na mikrokontrolerze i zarządza różnymi zadaniami. Ale w przypadku Arduino do załadowania szkicu Arduino wewnątrz mikrokontrolera służy bootloader. W jednym z naszych poprzednich artykułów pokazaliśmy, jak nagrać bootloader w ATmega328P za pomocą Arduino. Możesz to sprawdzić, jeśli temat Cię interesuje. Wracając do naszego tematu, cele innych bitów w starszym bajcie są dość jasne, bit EESAVE ma na celu zachowanie pamięci EEPROM podczas wykonywania cyklu wymazywania chipa. Bit WDTON służy do włączania lub wyłączania Watchdog Timer.
Zegar watchdog to specjalny zegar w układzie scalonym ATmega328P, który ma oddzielny zegar i działa niezależnie. Jeśli timer watchdoga jest włączony, należy go wyczyścić po pewnym czasie, w przeciwnym razie zegar watchdog zresetuje mikrokontroler. Jest to przydatna funkcja, która jest dostępna w wielu mikrokontrolerach, jeśli procesor utknie; Watchdog zresetuje go, aby zapobiec uszkodzeniu aplikacji końcowej.
Bit DWEN służy do włączania przewodu debugowania; jest to protokół przygotowawczy, który jest wewnętrznie wbudowany w ich sprzęt i służy do programowania i debugowania procesorów. Po włączeniu tej funkcji można flashować i debugować procesor za pomocą jednego podłączonego przewodu. Ale aby z niego skorzystać, będziesz potrzebować specjalnego sprzętu przygotowanego do Atmela.
Pozostałe dwa bity to te, których musisz unikać, chyba że dokładnie wiesz, co robisz. Są to RSTDISBL bit-7 i SPIEN bit-5. RSTDISBL (External Reset Disable), jak sama nazwa wskazuje, wyłącza zewnętrzny pin resetowania sprzętu, a bit SPIEN służy do wyłączania interfejsu programowania SPI. Wyłączenie któregokolwiek z tych dwóch bitów może całkowicie zablokować AVR; więc pozostawienie ich samych jest dobrym pomysłem.
Bajty o niskim bezpieczniku:
Jak widać na poniższym obrazku, tabela 27-7: arkusza danych przedstawia bity dolnego bezpiecznika układu ATmega328P.
Ten bajt bezpiecznika jest odpowiedzialny za ustawienie źródła zegara i niektórych innych parametrów zegara wewnątrz AVR. W tej sekcji dowiemy się o tym wszystkim.
Siódmy bit lub flaga CKDIV8 można ustawić tak, aby dzieliło źródło zegara przez 8, jest to bardzo przydatne, o czym możesz już wiedzieć, jeśli sam próbowałeś zaprogramować AVR. Następny bit to bit CKOUT i jest to szósty bit w bajcie dolnego bezpiecznika. Programując, wyprowadziłby wewnętrzny sygnał zegara na PORTB0 mikrokontrolera.
Bity-5 i bit-4 SUT1 i SUT0 kontrolują czas rozruchu mikrokontrolera. Zapobiega to wszelkim działaniom rozruchowym, które mogą mieć miejsce lub nie, zanim napięcie zasilania osiągnie akceptowalny minimalny poziom napięcia progowego. Ostatnie cztery bity CKSEL0-4 są używane do wyboru źródła zegara mikrokontrolera. Poniższa tabela daje lepsze zrozumienie tych czterech bitów, które są odpowiedzialne za ustawienie źródła zegara. Tabelę tę można znaleźć w sekcji Źródło zegara arkusza danych.
Teraz, zanim przejdziemy dalej, jest jeszcze jedna rzecz, przez którą powinienem przejść, to tabela opóźnienia rozruchu oscylatora. Opóźnienie rozruchu odnosi się do bitów 4 i 5 dolnego bajtu bezpiecznika. Opóźnienia należy ustawić w zależności od warunków, w których obwód będzie działał, i typu używanego oscylatora. Domyślne wartości są ustawione na powolny wzrost mocy z 6 cyklami zegara, gdy wykonywana jest sekwencja włączania lub wyłączania. Następnie występuje kolejne opóźnienie 14 cykli zegarowych z 65 ms opóźnienia po uruchomieniu.
Uff! To było dużo informacji do przetrawienia. Ale zanim przejdziemy dalej, zakończmy tę sekcję krótką notatką.
Uwaga:
Jeśli uważnie przyjrzałeś się arkuszowi danych, na pewno zauważyłeś, że programowanie bitu bezpiecznika oznacza ustawienie go na niski, tj. 0 (zero), co jest przeciwieństwem tego, co zwykle robimy, aby ustawić port na wysoki lub niski. Musisz o tym pamiętać podczas konfigurowania bezpieczników.
Bity bezpieczników w Arduino
Dużo rozmawialiśmy o bezpiecznikach w powyższej sekcji, ale w tej sekcji porozmawiajmy o tym, jak je skonfigurować i jak je zapisać w mikrokontrolerze. W tym celu będziemy potrzebować narzędzia o nazwie Avrdude. Jest to narzędzie służące do odczytu, zapisu i modyfikacji pamięci w mikrokontrolerach AVR. Działa z SPI i ma długą listę wsparcia dla różnych typów programistów. możesz pobrać narzędzie z linku podanego poniżej. Będziemy też używać naszego ulubionego mikrokontrolera Arduino.
- Pobierz Avrdude w wersji 6.3 Windows-ming32
Teraz, gdy masz Avrdude, musisz go wyodrębnić i otworzyć okno poleceń w tym folderze. Ponadto, jeśli planujesz użyć go później, możesz dodać ścieżkę folderu do sekcji zmiennych środowiskowych systemu Windows. Ale umieszczę go na moim pulpicie i otworzę tam okno poleceń. Kiedy już to zrobimy, podłączymy programator USBasp do naszego komputera i upewnimy się, że mamy odpowiedni sterownik dla naszego programatora USBasp. Gdy to zrobimy, możemy już iść i najpierw odczytujemy domyślną wartość bezpiecznika. Aby to zrobić, musisz uruchomić następujące polecenie.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Jeśli wszystko jest w porządku, to polecenie odczyta bajty bezpiecznika i umieści je w trzech oddzielnych plikach tekstowych. Poniższy obrazek daje lepsze wyobrażenie o procesie.
Jak widać, Avrdude przeczytał bity bezpieczników w Arduino nano i zapisał je w trzech oddzielnych plikach tekstowych. Teraz otworzyliśmy je i otrzymaliśmy trzy wartości; dla EFUSE: 0xFD, dla HFUSE: 0XDA, dla LFUSE: 0xFF. To była domyślna wartość bezpiecznika, jaką otrzymaliśmy dla Arduino nano. Teraz przekonwertujmy te bity na binarne i porównajmy je z ich domyślną wartością z arkusza danych. Poniższa tabela dokładnie to pokazuje.
Dla wygody bity bezpiecznika są zapisywane w wartościach szesnastkowych, ale jeśli przekonwertujemy je na wartości binarne i porównamy z arkuszem danych, będziemy wiedzieć, co się dzieje. Zacznijmy od dolnego bajtu bezpiecznika. Jak widać z powyższego ciągu, jest on ustawiony na 0XFF, a wartość binarna to 0B11111111.
Porównanie standardowych bajtów dolnego bezpiecznika z Arduino:
Niski bajt bezpiecznika |
Nr bitu |
Wartość domyślna w AVR |
Wartość domyślna Arduino |
CKDIV8 |
7 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
CKOUT |
6 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
SUT1 |
5 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
SUT0 |
4 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
CKSEL3 |
3 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
CKSEL2 |
2 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
CKSEL1 |
1 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
CKSEL0 |
0 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
Wyższy bajt bezpiecznika jest ustawiony na 0XDA w systemie binarnym, czyli 0B11011010.
Wyższy bajt bezpiecznika w systemie binarnym:
Bajt wysokiego bezpiecznika |
Nr bitu |
Wartość domyślna w AVR |
Wartość domyślna Arduino |
RSTDISBL |
7 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
DWEN |
6 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
SPIEN |
5 |
0 (zaprogramowane) |
0 (zaprogramowane) |
WDTON |
4 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
EESAVE |
3 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
BOOTSZ1 |
2 |
0 (zaprogramowane) |
0 (zaprogramowane) |
BOOTSZ0 |
1 |
0 (zaprogramowane) |
1 (nie zaprogramowany) |
BOOTRST |
0 |
1 (nie zaprogramowany) |
0 (zaprogramowane)) |
Ustawienie dla bajtu rozszerzonego bezpiecznika jest ustawione na 0XFD, binarnie to 0B11111101.
Rozszerzony bajt bezpiecznika w postaci binarnej:
Rozszerzony bajt bezpiecznika |
Nr bitu |
Wartość domyślna w AVR |
Wartość domyślna Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
BODLEVEL1 |
1 |
1 (nie zaprogramowany) |
0 (zaprogramowane) |
BODLEVEL0 |
0 |
1 (nie zaprogramowany) |
1 (nie zaprogramowany) |
To oznacza koniec tej sekcji. Do tej pory wiele się dowiedzieliśmy o mikrokontrolerze AVR i jego bitach bezpiecznikowych. Podsumujmy więc ten artykuł, wystawiając naszą teorię na próbę, zmieniając i eksperymentując z niektórymi bitami bezpiecznika w Arduino Nano.
Komponenty wymagane do testowania bezpieczników w AVR
Dużo rozmawialiśmy o bezpiecznikach w powyższej części. Aby jednak przejść dalej w tym artykule, potrzebujemy niektórych komponentów sprzętowych i narzędzi programowych. W tej sekcji omówimy te. Lista wymaganych komponentów wraz z obrazkami jest pokazana poniżej.
- Płytka prototypowa - 1
- Arduino Nano - 1
- Programator AVR USBasp - 1
- Kabel USB - 1
- Konwerter AVR 10-pin na 6-pin - 1
- Avrdude (narzędzie programowe do programowania AVR)
- LED - 1
- Rezystor 330R - 1
- Kable rozruchowe
Schemat testowania bitów bezpiecznika w AVR
Konfiguracja testowania sprzętu jest pokazana poniżej w tej konfiguracji. Podłączyliśmy Arduino Nano do komputera za pomocą kabla USB, a także podłączyliśmy programator USBasp do komputera. Celem tego artykułu jest zaprogramowanie bitów bezpiecznika w AVR. Z tego powodu połączyliśmy programator USBasp z Arduino. Poniższy obrazek daje lepsze wyobrażenie o konfiguracji.
Testowanie bezpieczników w AVR
Konfiguracja testowa jest pokazana poniżej. Jak widać, podłączyliśmy zarówno Arduino, jak i programator USBasp do USB mojego laptopa.
Teraz otwórzmy Arduino IDE i prześlijmy podstawowy szkic migania. Treść podstawowego szkicu mrugnięcia jest oczywista, więc nie umieściłem na ten temat żadnych szczegółów.
Na filmie zobaczysz, że dioda na pinie nr 13 mruga tak, jak powinna. Teraz dostosujmy ustawienia bezpiecznika i ustawmy je na wartości domyślne. I jak widzieliśmy wcześniej w arkuszu danych; EFUSE jest 0xFF; HFUSE to D9; LFUSE to: 62. Teraz skonfigurujmy go za pomocą Avrdude, sflashujmy i zobaczmy, co się stanie. Kod, którego będziemy używać, to-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Kiedy to zrobię, zobaczysz, że dioda LED będzie migać bardzo wolno, ponieważ obliczyliśmy i zaprogramowaliśmy wartość dla zegara 16Mhz i teraz po spaleniu bezpieczników to tylko wewnętrzny oscylator RC 1Mhz. Dlatego dioda LED miga tak wolno. Teraz spróbujmy ponownie przesłać szkic. Zobaczymy, że Arduino podaje błąd, a kod nie jest przesyłany. Ponieważ zmieniając bezpieczniki, zepsuliśmy również ustawienia bootloadera. Możesz to zobaczyć na poniższym obrazku.
Aby to naprawić i przywrócić Arduino do poprzedniego stanu, musimy po prostu ponownie wypalić bootloader dla Arduino. Aby to zrobić, przejdź do Narzędzia -> Programator- USBasp , a kiedy to zrobimy, możemy ponownie przejść do narzędzi i kliknąć opcję nagrywania bootloadera. Spowoduje to ponowne spalenie podstawowego bootloadera na twoim Arduino i wszystko wróci do poprzedniego stanu.
Po flashowaniu bootloadera z powrotem do Arduino, wrócił on do swojego pierwotnego stanu, a ostatni obraz pokazuje migającą diodę LED po ponownym spaleniu bootloadera.
I to oznacza koniec tego artykułu. Mam nadzieję, że podobał Ci się artykuł i nauczyłeś się czegoś nowego. Jeśli masz jakiekolwiek pytania dotyczące artykułu, nie wahaj się zostawić komentarza poniżej.