Omówienie podstaw mikrokontrolera

Wypróbuj Nasz Instrument Do Eliminowania Problemów





Jedna rzecz jest świetna w układach scalonych mikrokontrolerów, są one dostępne prawie we wszystkich częściach świata i w sklepach elektronicznych.

Wprowadzenie

Zasadniczo urządzenia mikrokontrolerów są powszechnie stosowane w aplikacjach związanych z oceną otaczającego środowiska i podobnej elektronice.



Można znaleźć te urządzenia do wyświetlania określonego parametru, w aplikacjach sterowania silnikami, oświetleniu LED, czujnikach różnych typów, takich jak czujnik przechyłu, akcelerometr, miernik prędkości, rejestratory danych, regulatory temperatury, klawiatury itp.

Podstawowe zrozumienie dotyczące mikrokontrolerów można uzyskać odwołując się do mikrokontrolera AVR Amega32, który jest tak zaawansowany, że czasami nazywany jest komputerem w układzie scalonym.



To urządzenie jest przeznaczone do wykonywania serii poleceń w celu utworzenia programu.

Język programu, który tu zobaczysz, to C ++. W ramach tego kursu możesz dogłębniej nauczyć się tego języka.

Jeśli chodzi o MCU, masz możliwość kontrolowania i konfigurowania wszystkich jego pinoutów.

Jeśli jesteś tym trochę zmęczony, po prostu wyluzuj, bo to wcale nie jest skomplikowane, będziesz łagodzony przez wszystkie aspekty równomiernie, ale zdecydowanie, gdy będziemy iść do przodu.

W układzie MCU wszystkim pinom z wyjątkiem Vdd i Vss, które są pinami zasilania układu, można przypisać ekskluzywne oznaczenia.

Szczegóły pinów

Jeśli spojrzysz na chip od góry, zobaczysz małe trójkątne wycięcie, które wskazuje początek punktu, w którym zaczynają się pinouty, to znaczy, że pin nr 1 chipa zaczyna się tuż pod tym wycięciem.

Zaczynając od tego kołka, można znaleźć 20 kołków do dołu po tej stronie (po lewej) i kolejne 20 kołków po drugiej stronie (po prawej), kontynuując od dołu do góry po prawej stronie.

Pierwsze 8 pinów zaczynających się od wycięcia to PBO-7, które tworzą szpilki indeksujące układu scalonego, ponieważ cały program tutaj zaczyna się od indeksu zero.

Powyższa seria wyprowadzeń jest określana jako PORT B, podczas gdy istnieją inne identyczne zestawy portów przypisanych od A do D.

Porty te mogą być przypisane do akceptowania i rozpoznawania podawanych danych o nazwie INPUT, a także do przesyłania danych w określonej formie zwanej OUTPUT.

Dwa z pinów należących do kategorii ogólnej to piny (+) / (-), które są również nazywane Vdd i GND.

Jeden pin z PORTU D (PDO-6) można zobaczyć po lewej stronie chipa w dolnej części.

PD7, który jest pinem nr 7 PORTU D, można prześledzić stojąc samodzielnie i rozpoczynając serię pinów po prawej stronie.

Przechodząc od prawej strony żetonu, gdzie kończy się PORT D, PORT C rozpoczyna liczenie w górę w kolejności.

Przyczyniają się one do wielu interesujących pinów MCU, od analogowych po cyfrowe.

Piny te pełnią rolę wejść czujnikowych do wykrywania wielu parametrów za pośrednictwem zewnętrznie skonfigurowanych stopni obwodu analogowego.

Powyższe piny tworzą PORT A.

Konwersję analogowo-cyfrową na powyższych pinach można zrozumieć za pomocą przykładu, w którym analogowy poziom temperatury wykryty za pomocą zwykłego czujnika, takiego jak termister, jest stosowany do jednego z pinów PORT A, który jest łatwo akceptowany i konwertuje go przez MCU w celu uzyskania odczytu cyfrowego od zera do 255 stopni F (8-bitowa liczba, którą można ulepszyć w celu uzyskania 10-bitowego wyjścia).

Inną cechą, która może być dodatkowo obserwowana w MCU, jest dostępna przestrzeń programowania lub pamięć, która określa miejsce na zmienne i program określony dla mikrokontrolera.

Ponadto MCU mają wbudowany zegar przypisany do zliczania odpowiednich parametrów.

Funkcje zegara umożliwiają MCU zastosowanie się do wielu różnych procesów liczenia, które mogą być szybkie w zakresie mikrosekund w zależności od specyfikacji konkretnego urządzenia, a także mogą być wolniejsze w dowolnym pożądanym zakresie.

Do tej pory być może do pewnego stopnia zrozumiałeś koncepcję mikrokontrolera i dotyczącą jego portów i pinów.

Jak utworzyć złącze SPI z programatora do mikrokontrolera

Nadszedł czas, aby zagłębić się w temat i zbadać świat programowania.

To powiedziawszy, przed przystąpieniem do procedury ładowania programu do chipa musimy znaleźć właściwy sposób integracji złącza SPI (Serial Peripheral Interface) z MCU.

Jednak nawet po tym nie możemy po prostu wepchnąć SPI do pinoutów MCU, prawda? Nie możemy też pozwolić, aby przedłużone przewody z SPI były bezpośrednio wkładane do płytki chlebowej. Może to również spowodować nieprawidłowe ustawienie przewodów połączonych z nieprawidłowymi pinami powodującymi złe połączenia.

Dlatego, aby wszystko było absolutnie nienaganne, wykonujemy procedury na malutkiej płytce veroboard, w której otrzymujemy wymagane metalowe kołki łączące zwane także „główką” wlutowane. Te szpilki nagłówka mogą być teraz używane do połączenia ze złączem SPI. Połączenia z tego nagłówka mogą być zakończone do innych równoległych pinów nagłówka, które mogą być użyte do połączeń płytki prototypowej.

Tak więc powyższy zespół tworzy teraz wygodną i niezawodną pośrednią platformę łączącą SPI z MCU.

Do tej pory wszystko wygląda ładnie i idealnie, więc przejdźmy do zarabiania na programatorze, który jest wymagany między komputerem a MCU.

Może istnieć wiele firm, które produkują i sprzedają te jednostki programistyczne, więc ich zakup nie powinien stanowić dla Ciebie problemu, na przykład Adafruit Industries, USBtinyISP lub Sparkfun itp.

Niektóre z nich mogą wyglądać zupełnie inaczej niż konwencjonalne typy, ale w zasadzie mają wszystko identyczne i są zgodne ze standardowymi zasadami programowania i mogą być używane jako interfejs między komputerem a mikrokontrolerem AVR.

Jednak pamiętaj, że jeśli używasz innego MCU, a nie AVR Atmega32, być może będziesz musiał sprawdzić, czy jest odpowiedni programator dla tego konkretnego układu MCU.

Można zauważyć, że sporo z tych programistów ma identyczne sterowniki, o co trzeba zadbać, o czym więcej dowiemy się w kolejnych rozdziałach.

Podłączenie komputera PC do układu mikrokontrolera jest naprawdę proste i byłbyś zachwycony, gdybyś wiedział, jak proste jest to do wykonania. Więc od razu wciśnijmy przyciskJ

Przygotowanie opisanej powyżej płyty interfejsu SPI nie jest trudne, chodzi o to, aby lutownica działała przez wszystkie połączenia na pokazanych dwóch rzędach pinów nagłówka na małej płytce ogólnego przeznaczenia.

Powyższy rysunek przedstawia szczegóły połączeń, których należy przestrzegać podczas łączenia przewodów między nagłówkami.

Aby jeszcze bardziej uprościć sprawę, przejdźmy przez poniższe szczegóły połączenia, odwołując się do powyższego obrazu:

Pin SPI zaczynający się od góry po lewej stronie przechodzi do „Master IN, Slave OUT” (MISO)

Pin SPI od środka po lewej stronie łączy się z pinem zegara (SCK)

Pin SPI w lewym dolnym rogu łączy się z resetem. (Dowiemy się szczegółowo o tym pinie w następujących samouczkach)

SPI odnoszące się do prawego dolnego rogu łączy się ze stykiem GND MCU, GND odnosi się do styku, który tworzy zerową linię zasilania lub ujemną (względną) szynę zasilania.

Zakończenie SPI ze środkowego prawego nagłówka łączy się z pinem „Master Out, Slave IN” (MOSI) MCU.

SPI wychodzący z prawego górnego złącza jest połączony z (+) MCU, który jest oczywiście Vdd lub dodatnim pinem zasilania MCU.

Otóż ​​to.

Podłącz dwa złącza zgodnie z objaśnieniami, a płyta interfejsu SPI jest gotowa do wykonania wymaganych czynności.

Aby uzyskać dalszą pomoc, możesz zapoznać się z rysunkiem pokazanym powyżej, twoja końcowa płyta interfejsu powinna wyglądać tak po wykonaniu wszystkich połączeń przewodowych za pomocą powyższej dyskusji.

Mam nadzieję, że mogłeś już skonstruować interfejs SPI, jak wyjaśniono w poprzednim samouczku, a teraz nadszedł czas, aby upewnić się, że nasz komputer akceptuje programistę, którego musimy zintegrować między komputerem a MCU.

Tworzenie prostego kodu programowania dla MCU

Do połączenia komputera z mikrokontrolerem bierzemy jednostkę USBTinyISP firmy Sparkfun.

Wiemy, że każdy system operacyjny komputera, taki jak Windows, będzie wymagał sterowników, bez których ładowanie czegokolwiek do komputera byłoby bezużyteczne, dlatego nasz programista będzie potrzebował sterowników, aby załadować go do komputera.

Przyjrzyjmy się procedurom wymaganym do zainstalowania sterowników w systemie operacyjnym komputera, tutaj bierzemy przykład systemu operacyjnego Windows 7 ze specyfikacją 32-bitową lub 64-bitową.

Otwórz stronę sparkfun.com i kliknij „Pocket AVR programmer page”. Link można łatwo zwizualizować na stronie.

Następnie znajdź „Sterownik Windows” pod dokumentami i po prostu go kliknij.

Zapewni to plik pocketprog-driver.zip na komputerze.

Przejdź do komputera, znajdź lokalizację pobierania i po prostu rozpakuj pobrany plik do folderu.

Jeśli Twój komputer jest 64-bitowym systemem operacyjnym, musisz wykonać kilka dodatkowych kroków podanych w punkcie, w przypadku 32-bitowego systemu operacyjnego możesz bezpośrednio rozpocząć instalację z rozpakowanego pliku.

W przypadku wersji 64-bitowej wykonaj następujące czynności, w przypadku wersji 32-bitowej po prostu zignoruj:

Google „libusb sourceforge” i kliknij ten link do najnowszej wersji.

Możesz natrafić na kilka dodatkowych plików, ale byłbyś zainteresowany znalezieniem pliku bib, to jest: libusb-win32-bin - #. #. #. #. Zip

Teraz idź i znajdź tę lokalizację pobierania na swoim komputerze, rozpakuj ją i zapisz w jednym z folderów.

Do tego folderu przejdź do folderu bin, przechodząc do folderu amd64.

Zobaczysz tutaj kilka folderów, takich jak: ghcalled libusb0.dll i libusb0.sys.

Chciałbyś zmienić ich nazwy na: libusb0_x64.dll i libusb0_x64.sys.

Teraz będziesz musiał skopiować powyższe pliki do folderu pocketprog-driver, po prostu nadpisz pliki w istniejącej wersji.

Aby zainstalować powyższe sterowniki, zainteresuje Cię następująca metoda, raczej niekonwencjonalna w swoim typie:

Jest to tryb „dodawania starszego sprzętu”.

Kliknij „Menu Start”

Następnie kliknij prawym przyciskiem myszy „komputer”

Kliknij „Zarządzaj”, a na koniec kliknij „Menedżer urządzeń”

Następnie w menu wybierz „Dodaj starszy sprzęt”

Kontynuuj, aby nacisnąć „Dalej”, aż kreator zostanie wstawiony

Postępując zgodnie z instrukcjami, kliknij „Zainstaluj sprzęt, który chcesz wybrać z listy zaawansowanej”, co spowoduje wyświetlenie ikony przycisku radiowego w tym konkretnym wyborze. W rzeczywistości jest to przycisk sterowania systemem Windows, który teraz wyglądałby jak małe kółko z okrągłym niebieskim wypełnieniem w środku.

Teraz po prostu kliknij „Dalej”

Spowoduje to wyświetlenie menu „Pokaż wszystkie urządzenia”, które należy kliknąć.

Następnie kliknij ikonę „Z dysku”.

Za pomocą ikony „Przeglądaj” przejdź do lokalizacji folderu pocketprog-driver. Jeśli wybór został dokonany poprawnie, zwizualizowałbyś plik pocketprog.inf umieszczony w tym konkretnym folderze.

Kliknij dwukrotnie ten plik, a na pewno zobaczysz, jak sterownik instaluje się na twoim komputerze.

W kółko !! Przejdźmy do następnego samouczka na następnej stronie.

Możliwe, że do tej pory zainstalowałeś wymagane oprogramowanie i zbudowałeś interfejs SPI.

Jak przenieść program do chipa mikrokontrolera

Następny krok będzie wymagał kilku komponentów, takich jak płytka prototypowa, dioda LED i rezystor obliczeniowy dla zamierzonego zastosowania.

W tej sekcji poznamy metodę testowania programisty oraz potwierdzimy instalację odpowiednich sterowników i oprogramowania.

Aby sprawdzić, czy sterowniki i oprogramowanie zostały poprawnie zainstalowane, zaimplementujemy prosty program o nazwie avrdude.

AVRdude to program powiązany z najnowszą instalacją WinAVR, bez której rzeczywisty transfer pliku do MCU nie jest możliwy.

Ten program ma format pliku .hex, który zasadniczo staje się zrozumiały dla MCU dla wymaganych wykonań.

W przypadku niepowodzenia weryfikacji programista nie będzie w stanie wykonać transferu pliku.

Zobaczmy szybko, jak możemy zaimplementować procedurę testowania, korzystając z następujących instrukcji:

Otwórz wiersz DOS (system operacyjny dysku), klikając „menu Start” i wpisując cmd.exe w odpowiednim polu wyszukiwania.

Teraz wykonanie AVRdude można wykonać po prostu wpisując avrdude –c usbtiny –p m32 przez znak zachęty DOS. Jak tylko zostanie to zaimplementowane, DOS natychmiast potwierdzi, czy połączenie się powiodło.

W powyższym poleceniu „-c” jest flagą powiadamiającą, która zawiera specyfikację parametru programatora „usbtiny”, podczas gdy znacznik „-p” identyfikuje urządzenie mikrokontrolera („m32 oznacza Atmega32).

Jeśli użyłeś innego MCU, musisz dołączyć odpowiednie przedrostki do implementacji.

Po zakończeniu powyższej procedury możesz wpisać „exit” w wierszu poleceń DOS, co spowoduje wyjście z okna.

Jeśli poważnie zastanawiasz się nad faktycznymi szczegółami programowania, cóż, najpierw musielibyśmy przylutować i zbudować zewnętrzny analogowy obwód LED, nad którym program mógłby zostać zaimplementowany, ponieważ jeśli nie ma systemu potwierdzającego odpowiedź z MCU, programowanie a działanie mikrokontrolera byłoby zupełnie bez znaczenia.

Wykonanie płytki LED jest bardzo proste, polega na przylutowaniu dwóch przewodów diody LED na kawałku płytki Veroboard i połączeniu rezystora z jednym z wyprowadzeń diody LED. Rolą tej diody LED jest tylko ograniczenie prądu do diody LED, aby nie spaliła się z powodu nadmiernego napięcia i prądu z wyjścia MCU.

Wartość rezystora można obliczyć z następującego prostego wzoru:

R = (Ub – LEDfwd)/I

Gdzie Ub to napięcie zasilania, LEDfwd to optymalne napięcie robocze zastosowanej diody LED, a I to jej optymalne natężenie prądu.

Załóżmy, że używamy CZERWONEJ diody LED, która ma napięcie przewodzenia diody LED = 2,5 V i prąd I = 20 mA, powyższe równanie można rozwiązać w następujący sposób:

Ponieważ napięcie z MCU wynosi 5 V, można je wyrazić jako:

R = (5 - 2,5) /. 02 = 125 omów, ¼ wata, najbliższa wartość 120 omów wystarczy.

Teraz mamy diodę LED, rezystor 120 omów i veroboard, po prostu połącz powyższe elementy, jak podano na schemacie, z mikrokontrolerem.

Po wykonaniu tej czynności MCU można zaprogramować pod kątem zamierzonej odpowiedzi na powyższej konfiguracji diody LED.

Następnie programowanie MCU.

Aby umożliwić mikrokontrolerowi wykonanie pewnych znaczących implementacji, konieczne jest napisanie odpowiednich instrukcji do MCU.

Jak zainstalować środowisko programistyczne i zbadać WinAVR

W tym celu prawdopodobnie moglibyśmy użyć naszego własnego „edytora tekstu” na naszym komputerze, chociaż niektórzy z nas byliby wdzięczni za użycie bardziej profesjonalnego „środowiska programistycznego” zamiast zwykłego edytora tekstu, prostego, ponieważ takie podejście pozwoliłoby ci cieszyć się wbudowane interesujące funkcje tego pakietu „środowiska programowania”.

Wspierałby tworzenie i edycję programów w różnych językach, a także kompilował je do postaci łatwo zrozumiałej i akceptowanej przez układ mikrokontrolera.

Ostatecznie byłoby to obsługiwane przez WinAVR i przenoszone do odpowiedniego układu MCU.

WinAVR może być również przygotowany do wykonywania wielu innych operacji, takich jak rozwiązywanie problemów z programami i ostrzeganie nas o możliwej składni oraz błędach i błędach kompilacji. Omówimy je w naszych późniejszych samouczkach.

Chciałbyś, aby przebieg instalacji WinAVR był niezwykle szybki i zgryźliwy. Zagłębmy się w szczegóły, korzystając z następujących punktów:

Musisz pobrać najnowsze wersje ze źródłowego folderu plików WinAVR. Na jego oficjalnej stronie można znaleźć przydatne informacje związane z tym plikiem do pobrania.

Zostaniesz poproszony o zapytanie bezpieczeństwa, abyś mógł odpowiedzieć, jeśli chcesz, aby miało miejsce pobieranie, jest to pytanie, czy plik do pobrania jest plikiem wykonywalnym.

Pobierz plik i rozpocznij proces wykonywania, klikając go. Rozpocznij instalację.

Proces poprowadzi Cię kilkoma pytaniami, na które można odpowiedzieć, tak, abyś mógł usprawnić instalację zgodnie z własnym komfortem. Chciałbyś zignorować wiele z nich do ich domyślnych form, tylko do Ciebie należy wybranie tych, które Twoim zdaniem najlepiej nadają się do działań.

Do tej pory wszystko wydawało się całkiem normalne i łatwe i znajdziesz kilka opcji, w których menu startowe jest rzucane na ciebie. Nie martw się, tylko niektóre z nich faktycznie używałyby tylko jednego z tem o nazwie „notatnik programisty”.

Po kliknięciu tej ikony uruchamia interfejs użytkownika, dzięki czemu można zastosować pisanie programów (takie jak tworzenie i edycja). Będziesz także świadkiem programu składającego się z poleceń menu, które pomogą Ci skompilować kody i osadzić je w mikrokontrolerze.

Podstawowym zadaniem powyższego notatnika programisty jest przekształcenie kodu czytelnego dla człowieka, który będziesz pisać, w serię instrukcji zrozumiałych tylko dla MCU.

W kolejnym tutorialu omówione zostaną testy powyższego programatora, abyśmy mieli pewność co do jego kompatybilności z Windows i czy doskonale „ściska rękę” z układem scalonym mikrokontrolera.

Jak zaprogramować MCU do włączania diody LED

Gdy to zostanie potwierdzone, przystąpiliśmy do tworzenia małego kodu „nic nie rób”, aby upewnić się, że procedura przesyłania kodu nie napotka błędów.

Oczywiście jesteśmy teraz gotowi do zaimplementowania naszego pierwszego programu wewnątrz MCU, ale wcześniej warto byłoby szybko podsumować to, co zrobiliśmy w trakcie naszych poprzednich samouczków:

Zamówiliśmy mikrokontroler AVR Atmel zgodnie z wymaganą przez nas specyfikacją, do ilustracji użyliśmy ATMega32, a następnie poznaliśmy podstawy mikrokontrolera i jednostkę programującą, która jest odpowiedzialna za przesyłanie programu do układu MCU.

Następnie zbudowaliśmy złącze interfejsu SP, które jest niezbędne, aby komputer mógł być połączony z mikrokontrolerem w celu programowania.

Po tym potwierdziliśmy, czy sterowniki zostały poprawnie zainstalowane na komputerze zarówno dla 32-bitowego, jak i 64-bitowego systemu operacyjnego.

Następnie zainstalowaliśmy środowisko programistyczne o nazwie Win AVR, aby ułatwić łatwe pisanie i przenoszenie kodów do mikrokontrolera, a następnie zaimplementowaliśmy avrdude do weryfikacji programatora z komputerem PC i połączonym mikrokontrolerem.

Wreszcie w poprzednim rozdziale zakończyliśmy budowę obwodu LED / rezystora i połączyliśmy go z odpowiednimi wyjściami MCU.

To naprawdę dużo pracy, niemniej jednak czas od razu zająć się prawdziwymi programami!

Na początek chcielibyśmy podzielić mikrokontroler na trzy kategorie, co bardzo ułatwiłoby nam zrozumienie:

Kontrola, wykrywanie i komunikacja

Byłoby interesujące wiedzieć, że powyższe funkcje można zaprogramować na wiele różnych sposobów.

W naszym pierwszym programie chcielibyśmy, aby mikrokontroler „sterował” zewnętrznym parametrem, tak, masz rację, byłaby to dioda LED, którą niedawno zbudowaliśmy.

Aby być precyzyjnym, powiemy MCU, aby włączył podłączoną diodę LED, tak, wiem, że wygląda to dość prymitywnie, ale faza początkowa zawsze musi być łatwa.

Kontynuując obecną pracę, sprawienie, że sterowanie MCU diodą LED jest w rzeczywistości dość proste:

W tym celu nakazujemy pinowi # 0 na PORCIE B wytworzyć wymagane 5 V dla diody LED.

Przypomnijmy sobie z poprzedniego samouczka, podłączyliśmy anodę diody LED do wspomnianego pinu MCU.

Są dwie podstawowe rzeczy, które należy zaadresować do tego pinu MCU: 1) wyjście i 2) 5 woltów

Dowiemy się, w jaki sposób możemy poinstruować określony pin, aby stał się wyjściem MCU.

Po ustawieniu wyjścia chipa możemy ustawić, aby był „wysoki” (5 V) lub „niski” (0 V), zgodnie z wymaganiami aplikacji.

Ponieważ dowolny obwód logiczny, taki jak MCU, styki mogą być połączone z wyjściem lub wejściem i mogą być skonfigurowane do generowania wysokiego lub niskiego poziomu logicznego, wystarczy przypisać pinom tylko wartość logiczną wyższą lub niską logiczną. , nie ma żadnych stanów pośrednich ani nieokreślonych innych niż te kilka stanów dla mikrokontrolerów lub dowolnego cyfrowego układu scalonego. To samo dotyczy każdego pinu MCU.

Jeśli chodzi o przypisanie pinów wejściowych i wyjściowych, wejścia byłyby ustawione tak, aby przyjmowały sygnały z zewnętrznych stopni analogowych, podczas gdy wyjścia byłyby odpowiedzialne za interpretację ich do określonych stanów logicznych lub częstotliwości.

Chociaż powyższe zadania można wykonać na wiele różnych sposobów, omówilibyśmy jeden z nich ze względu na prostotę. Należy jednak zauważyć, że chociaż ten, który zostałby teraz przedstawiony, wygląda na łatwy i interesujący, nie jest tak realny i nie jest zalecany dla wszystkich aplikacji MCU, z tego samego powodu, z tego samego powodu zostałbyś wprowadzony w bardziej popularne metody programowania w dalszej części kursu . Programy te pozwolą na przypisanie tylko żądanych pinów zgodnie ze specyfikacją bez wpływu na inne sąsiednie, które mogą być już przypisane do wykonywania innych funkcji.

Jednak w tej chwili nie będziemy się tak przejmować innymi szpilkami i użyjemy tylko odpowiednich szpilek, które nas interesują, unikając w pewnym stopniu komplikacji.

Aby przypisać pin jako wyjście, musimy użyć rejestru kierunku danych (DDR). Jeśli zastanawiasz się, co oznacza tutaj rejestr, jest to po prostu spacja w MCU, która umożliwia mikrokontrolerowi reagowanie w określony sposób.

Korzystając z DDR możemy ustawić pin tak, aby wysyłał dane przypominające „wyjście” lub akceptował dane w postaci „wejścia”.

Jakkolwiek możesz być zdezorientowany co do tego słowa, co to oznacza? Dane dodają trzeci wymiar do pinów, które mogą być przypisane do ciągłego zera logicznego (0 V) lub wysokiego logicznego (5 V), ale co z sygnałami, które mogą się szybko zmieniać, takimi jak częstotliwość impulsów. Częstotliwości towarzyszyłyby wysokie i niskie logiki (5 V i 0 V) ​​oscylujące w określonych odstępach czasu lub okresach, dlatego staje się ona zorientowana na czas i może być dostosowywana w odniesieniu do czasu, dlatego identyfikujemy jako „dane”, czyli parametr, który funkcja względem innej funkcji (stany logiczne i czas).

Jedną z metod przypisania pin0 jako wyjścia jest napisanie następującego kodu:

DDRB = 0b00000001

W powyższym programie DDRB oznacza Data Direction Register dla PORT B ​​0b instruuje kompilator odnośnie następującego wyrażenia binarnego liczby, podczas gdy „1” na końcu wyrażenia wskazuje położenie pin0, czyli jego położenie w postaci pierwszego pinu PORT B.

Jeśli pamiętasz, dowiedzieliśmy się, że PORT B ​​kojarzy z nim 8 pinów (od 0 do pin7), a jeśli zauważysz, że powyższy kod również zawiera 8 cyfr, co oznacza, że ​​każda cyfra oznacza te 8 pinów PORTU B.

Teraz następną procedurą byłoby przypisanie 5V do tego pinu (pin0). Ponownie zasada działania jest identyczna z DDR jak powyżej wyrażona za pomocą następującego kodu binarnego:

PORTB = 0b00000001

Jak widać, jedyną różnicą między powyższym kodem a wcześniejszym jest to, że w tym kodzie wykorzystaliśmy rejestr PORT. Ten rejestr w szczególności obsługuje przypisania pinów tego konkretnego portu, dla którego został umieszczony w MCU. W ten sposób umożliwia nam przypisanie rzeczywistej logiki danych (0 lub 1) do tych pinoutów.

Teraz możemy być zainteresowani omówieniem niektórych przybliżonych szczegółów naszego programu. Ponieważ wiemy, że wszystkie programy wymagają określonej przestrzeni, aby zainicjować wykonanie, można to porównać do szefa kuchni, który zna wszystkie składniki danego przepisu, ale nie jest poinstruowany, od czego zacząć.

„Główna” funkcja to tutaj lokalizacja, w której każdy z programów C / C ++ inicjuje wykonanie. Dlatego główne można stworzyć jako:

int main (nieważne)
{
}

Jednak aby umożliwić programowi interpretację szczegółów rejestrów DDR i PORT oraz ich funkcjonowania wewnątrz układu MCU, należy dołączyć dodatkowe oświadczenie, które może zawierać wszystkie dane dotyczące MCU AVR. Być może chcielibyśmy dodać to włączenie do wszystkich naszych programów.

#zawierać
int main (nieważne)
{
}

Zaraz po rozpoczęciu kompilacji sekcja preprocesora kompilatora skupia się na katalogu AVR w celu zidentyfikowania pliku „io.h”. Rozszerzenie „.h” w tym miejscu wskazuje, że jest to plik nagłówkowy i że ten kod wewnątrz pliku zostanie wprowadzony na początku (nagłówku) tworzonego pliku źródłowego, stąd nazwa „nagłówek”.

Tutaj możemy wprowadzić instrukcje DDR i PORT do naszego kodu, ponieważ dodanie pliku nagłówkowego io.h skierowałoby kompilator do ich uwzględnienia.

#zawierać

int main (nieważne)

{

DDRB = 0b00000001 // Rejestr kierunku danych ustawiający pin0 na wyjście, a pozostałe piny jako wejście

PORTB = 0b00000001 // Ustaw pin0 na 5 woltów

}

Powyższe ustala orientację pin0 jako wyjścia o wartości 5V. Jednak nadal istnieje jeden problem, który nie został określony dla tego pinu, to znaczy, że ten pin nie ma jeszcze instrukcji, aby był włączony na czas nieokreślony, o ile MCU jest zasilany. Ta nieskończona pętla sprzężenia zwrotnego zapewni, że ten pin z MCU nie wyłączy się, a raczej będzie kontynuował wyjście 5V przez czas nieokreślony.

Chociaż istnieje wiele różnych metod stosowania instrukcji pętli dla pinów, spróbujemy zastosować tutaj pętlę „while”. Jak sama nazwa wskazuje, pętla „while” mówi mikrokontrolerowi, że „póki” moc jest dostępna, należy pozostać aktywnym z przypisanym 5V dla przypisanego pinouta.

#zawierać

int main (nieważne)

{

DDRB = 0b00000001 // Rejestr kierunku danych ustawiający pin0 na wyjście, a pozostałe piny jako wejście

PORTB = 0b00000001 // Ustaw pin0 na 5 woltów

podczas gdy (1)

{

// Kod byłby tutaj, gdyby musiał być wykonywany w kółko ... bez końca

}

}

Warto zauważyć, że tutaj użyliśmy „1” w postaci argumentu dla pętli „while”, ponieważ wszystko oprócz „0” można uznać za logiczne „prawdziwe”.

Oznacza to, że uwzględnienie pętli „while” nigdy nie odpowiadałoby za nic poza logicznym „prawdą”, co oznacza, że ​​określony pin zablokowałby się w określonym stanie w nieskończoność.

Można zaobserwować, że dioda LED świeci stale na przypisanym pinie, o ile MCU otrzymuje zasilanie przez swoje Vdd i Vss.

To wszystko, teraz mamy rezultat, który chcieliśmy osiągnąć i wreszcie możemy zobaczyć, jak się to dzieje po tak ciężkiej pracy, ale mimo to oglądanie słodkiego wyniku naszej ciężkiej pracy jest tak satysfakcjonujące.

W następnych samouczkach nauczymy się, jak dodać wymiar „czasu” do powyższej diody LED, czyli jak sprawić, by migała z określoną, określoną szybkością.

W rzeczywistości, w powyższej implementacji, dioda LED faktycznie miga, ale częstotliwość pętli jest tak duża, że ​​jest prawie jak trwałe włączenie oświetlenia LED.

Zobaczymy, jak można dodać tę pętlę z odpowiednim opóźnieniem, aby dioda LED migała z taką opóźnioną częstotliwością.

Jak sprawić, by dioda LED mrugała za pomocą mikrokontrolera AVR

W ostatniej dyskusji dowiedzieliśmy się, jak włączać diodę LED za pomocą mikrokontrolera, to było znakomite, prawda? Może nie tak dużo!

Tutaj nauczymy się, jak urozmaicić powyższe oświetlenie LED, przypisując funkcję dwukierunkową, to znaczy postaramy się, aby migała lub migała z określoną częstotliwością lub częstotliwością. Zobaczymy również, jak można zwiększyć lub zmniejszyć tę stawkę zgodnie z życzeniem użytkownika.

Przyjrzyjmy się temu:

#zawierać

#zawierać

int main (nieważne)

{

DDRB | = 1<< PINB0

podczas gdy (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Jeśli czujesz się zaskoczony tymi dziwnymi symbolami (&, ^, | itp.) Używanymi w powyższym wyrażeniu (& nie ma, ale może być użyty w innych podobnych kodach), oto powiązane informacje, które chciałbyś wiedzieć na ich temat :

Zawiera wiele standardowych algorytmów logicznych, takich jak AND, OR, NOT i XOR, które są zwykle używane z powyższym kodem.

Te funkcje logiczne w szczególności porównują dwa bity „1” i „0” zgodnie z przypisanymi do nich tabelami prawdy.

Wpadniemy na pomysł, analizując następujący układ bitów:

01001011 &
10001101
równa się
00001001

W powyższym kodzie & odnosi się do AND, używanego w programowaniu w C.

Czytanie wierszy w pionie sugeruje, że 0 i 1 równa się 0, 1 i 0 równa się również 0, 0 i 0 równa się 0, 1 i 1 równa się 1. Czytanie tego jest takie proste. Są one zgodne z tabelą prawdy operatora AND.

Jeśli ocenimy poniższą tabelę, wskazuje ona symbol „|” oznaczający użycie funkcji „LUB”, znak „|” można znaleźć po lewej stronie „backspace” na klawiaturze komputera:

01001011 |
10001101
równa się
11001111

Identycznie ta tablica prawdy funkcji logicznej OR wskazuje, że bity 0 lub 1 równa się 1, 1 lub 0 również równa się 1, 0 lub 0 równa się 0, podczas gdy 1 lub 1 równa się 1.

Następująca kombinacja bitów dotyczy operatora logicznego XOR oznaczonego przez ^ i może być badana tak samo jak w przypadku tabel prawdy AND, OR:

01001011 ^
10001101
równa się
11000110

Przejdźmy teraz do pierwszego programu i dowiedzmy się, co oznacza następujący w nim wiersz:

#zawierać

Dzięki naszym poprzednim samouczkom wiemy, jak działa to wyrażenie, więc nie będziemy go powtarzać, ale wydaje się, że jest to nowe „uwzględnienie” wyrażone przez #include, które należy zbadać.

W tym „uwzględnieniu” delay.h pozwala nam na kilka prostych metod implementacji.

Jak sama nazwa wskazuje, delay.h umożliwia wywołanie opóźnienia w danym programie.

Następne wyrażenie int main (void) można pominąć w toczącej się dyskusji, ponieważ omówiliśmy to już w naszych wcześniejszych postach.

Następnie pojawia się zmieniona DDRB.

Poniższy rysunek przedstawia wcześniejszą formę, która nie jest lepszym sposobem przypisywania pinów, ponieważ wszystkie piny od 0 do 7 zostały zamienione na wejścia. Ale wyobraź sobie tylko, jaka byłaby sytuacja, gdybyśmy chcieli stworzyć dłuższy program wymagający tych pinów do innych funkcji? Na przykład pin2 może być potrzebny do zastosowania zdalnego przełączania urządzenia. W takim przypadku nie docenilibyśmy przypisywania tego samego jako wejścia tylko metodą prób i błędów. Może to oznaczać nieprawidłową odpowiedź ze zdalnego nadajnika na odbiornik urządzenia.

DDRB = 0b00000001

Raczej chcemy mieć wpływ tylko na jeden bit, kapelusz pin0, patrząc na funkcję „LUB”, którą można by wykonać poprzez maskowanie binarne.

DDRB = DDRB | 0b00000001

Tutaj jest on osłonięty maską „LUB”: 0b00000001, chociaż wydaje się, że jest to autentyczna liczba binarna, na przykład w przypadku wcześniejszej pamięci DDRB: 0b01001010, a następnie zastosowanie do tego OR poprzez maskowanie mogłoby dać: 0b01001010 | 0b00000001 = 0b01001011.

Wynikowa różnica, jaką można było zaobserwować, dotyczy tylko pin0, którego bity się zmieniły!

Skompresowanie powyższej instrukcji jeszcze bardziej za pomocą C ++ daje:

DDRB | = 0b00000001

Jednak okazuje się, że w danym programie jest jeszcze więcej. Chociaż może wydawać się to całkiem uzasadnione i oczywiste, powinniśmy skorzystać z niektórych instrukcji z pliku nagłówkowego io.h, zwłaszcza gdy jest on zasadniczo stworzony dla naszej wygody?

Więc jeśli „DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Zaczynamy więc od 0b00000000 i wstawiamy „1”, aby otrzymać 0b0000001, a następnie przenosimy je do lewej pozycji 0, co daje dokładnie identyczne 0b00000001 jak powyżej.

Teraz, zakładając, że był to PINB4, oświadczenie można by wyrazić jako 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Uważaj, używamy indeksu zerowego, co oznacza, że ​​po „1” są cztery zera.

Przechodząc teraz do pętli „while”, którą wcześniej zauważyliśmy w „nieskończonej pętli”. Ale być może teraz chcemy, aby mikrokontroler zaimplementował niektóre z pożądanych wykonań. Może to być możliwe tylko wewnątrz danej pętli. Jest to pętla, w której dana sekwencja jest powtarzana wielokrotnie.

W przypadku gdyby wykonanie zostało umieszczone przed pętlą, byłoby to zaimplementowane tylko raz.

Jednak aby dioda LED mrugała w nieskończoność, należałoby przełączać PINB0 naprzemiennie na ON / OFF w pętli. Znajdziemy tu również wprowadzane opóźnienia, bez których miganie diody nie byłoby możliwe. Ale to zmusiłoby diodę LED do migania w bardzo szybkim tempie, trudnym do rozpoznania gołym okiem, musiałaby nieco zwolnić, aby można ją było rozpoznać naszymi oczami.

Znamy procedurę ustawiania konkretnego bitu w liczbie binarnej, ale nie jesteśmy pewni, jak zastosować konkretny bit „0” w przypadku, gdy jest to jeszcze „1”.

Można było zobaczyć, jak robi to poniższy program, ale okaże się też, że może nie być widoczny w programie.

Pierwsze dwa stwierdzenia zmieniają bit na „1” (5 V, świeci się dioda LED), a następnie wprowadzana jest pauza na 100 ms.

Następne kilka wierszy zamienia bit PINB0 na „0” (zerowe napięcie, wyłączenie diody LED), ale przepraszam, że funkcja AND porównania nie będzie w stanie wykonać „0” z tego bitu, ale jeśli NIE użyjemy „~” dla maski binarnej może zamienić wszystkie zera na jedynki i odwrotnie.

To pozwoli nam wpłynąć tylko na bit PINB0 i zamienić go na „0”. Nawias został dodany, aby zawrzeć wykonanie maskowania tak, aby operacja NOT mogła być zastosowana dla całych masek, a nie tylko dla „1” przed przesunięciem w lewo.<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

Aby stworzyć opóźnienia ON OFF lub okresy o jednakowym czasie trwania, możemy skrócić poprzednie cztery wiersze do dwóch i zastosować funkcję XOR na naszą korzyść. Należy zauważyć, że przy wykonywaniu XOR przypisano pin do 1 w przypadku, gdy jest to 0 i odwrotnie. To wykonanie wpłynęłoby tylko na PINB0. Jak to bywa w przypadku zastosowania polecenia, po prostu zmieniłoby to bit w przeciwieństwo istniejącej logiki.

PORTB ^ = 1<< PINB0
_delay_ms (100)

GOTOWY! Twoja dioda LED będzie teraz migać zgodnie z ustawioną szybkością… Proste, prawda?




Poprzedni: Obwód zdalnego sterowania wielu urządzeń Dalej: Faza prądu przemiennego, przewód neutralny, obwód wskaźnika zwarcia doziemnego