Najnowsze układy na mikrokontrolerach atmega8. Tylko działające diagramy!: Projekty na ATMega8. System alarmowy GSM z powiadomieniem na telefon komórkowy

Najnowsze układy na mikrokontrolerach atmega8.  Tylko działające diagramy!: Projekty na ATMega8.  System alarmowy GSM z powiadomieniem na telefon komórkowy
Najnowsze układy na mikrokontrolerach atmega8. Tylko działające diagramy!: Projekty na ATMega8. System alarmowy GSM z powiadomieniem na telefon komórkowy

Miernik częstotliwości w AT90S2313

Wirtualny miernik częstotliwości to „zestaw” składający się z programu na komputer PC i prostego przyrząd pomiarowy, z którym się łączy Port COM komputer.Wirtualny instrument umożliwia pomiar częstotliwości, okresu, odstępów czasu i zliczanie impulsów.

Detale:http://home.skif.net/~yukol/FMrus.htm

Polecam zbierać prosty projekt nie wymaga konfiguracji i co najważniejsze działa! Zaprogramowany mikrokontrolerprogramator PonyProg - doskonały programator, prosty, duży wybór programowalnych mikrokontrolerów,działa pod Windows, rosyjski interfejs.


Magazyn „Radio” N1 2002 Dla Baterie Ni-Cd. Umożliwia ładowanie 4 akumulatorów.



Licznik częstotliwości na zdjęciu 16F84A

Charakterystyka techniczna miernika częstotliwości:

Maksymalna zmierzona częstotliwość...........30 MHz;

Maksymalna rozdzielczość mierzonej częstotliwości wynosi... 10 Hz.

Czułość wejściowa...........250 mV;

Napięcie zasilania...........................8...12 V:

Pobór prądu...........................35 mA


Szczegóły, oprogramowanie:http://cadcamlab.ru


Stacja lutownicza na Atmega 8


Lutownica i suszarka do włosów są przełączane za pomocą przełączników PC. Suszarka do włosów jest sterowana przez tyrystor, ponieważ Suszarka do włosów na 110V zamiast diody R1 z katodą na V.6.


Szczegóły, oprogramowanie: http://radiokot.ru/forum


Cyfrowy miernik pojemności bez wylutowywania z obwodu

Opis znajduje się w czasopiśmie „Radio” nr 6, 2009. Konstrukcja zmontowana na AT90S2313, Tiny2313 użyto bez zmian w oprogramowaniu. W Ponce ustawiłem checkboxy dla SUT1, CKSEL1, CKSEL0, reszta jest pusta. MAX631 nie montowałem, dla nas to coś drogiego, zdecydowałem się zasilić go z zasilacza przez stabilizator 7805, na zasilacz plus włożyłem R29, R32, R33. Oprócz miernika pojemności w obudowie zamontowana jest sonda do testowania tranzystorów bez wylutowywania oraz generator sygnału wysokiej częstotliwości o niskiej częstotliwości.



Miernik parametrów urządzenia półprzewodnikowe na ATmega8

Urządzenie może:

Identyfikować końcówki półprzewodnikowe;
- określić rodzaj i konstrukcję;
- zmierzyć parametry statyczne.
Mierzy diody, bipolarne tranzystory, tranzystory polowe JFET i MOS, rezystory, kondensatory.


Licznik wykonany jest w tej samej obudowie co licznik FCL, przełączanie wskaźnika pomiędzy urządzeniami odbywa się za pomocą przełącznika PC.

Miernik częstotliwości, miernik pojemności i indukcyjności - miernik FCL

Opisane poniżej urządzenie umożliwia pomiar częstotliwości drgań elektrycznych oraz pojemności i indukcyjności w szerokim zakresie części elektroniczne Z wysoka celność. Projekt ma minimalne rozmiary, wagę i zużycie energii.

Dane techniczne:

Napięcie zasilania, V: 6…15

Pobór prądu, mA: 14…17

Granice pomiaru:

F1, MHz 0,01…65**

F2, MHz 10…950

Od 0,01 pF...0,5 µF

L 0,001 µH…5 H


Schemat zdalnej głowicy


Więcej szczegółów: http://ru3ga.qrz.ru/PRIB/fcl.shtml


Woltomierz miniaturowy oparty na mikrokontrolerze ATmega8L


Tutaj rozważamy konstrukcję woltomierza wykorzystującego tylko jeden mikrokontroler ATmega8L i wskaźnik z układu elektronicznego termometr medyczny. Zmierzony zakres napięcia prąd stały±50 V. Jako dodatkową funkcję zaimplementowano tryb sondy dźwiękowej w celu sprawdzenia integralności przewodów i lamp żarowych. Urządzenie automatycznie przechodzi w tryb czuwania w przypadku braku pomiarów. Mikrokontroler zasilany jest z dwóch miniaturowych ogniw alkalicznych (baterie do zegarek na rękę), umieściłem 1 element na 3b. Nie będzie konieczności częstej wymiany baterii: pobór prądu w trybie aktywnym wynosi zaledwie 330 μA, w trybie czuwania – niecałe 300 nA. Dzięki swojej miniaturowej konstrukcji i możliwościom urządzenie jest użyteczne i praktyczne. Moja tablica nie zmieściła się w etui termometru, więc zrobiłam ją w etui z pisakiem. Zrobiłem własną płytkę, zamontowałem rezystory R5-R7 pionowo na szynach zbiorczych. Dzięki niemu VADZZ pomógł w stworzeniu oprogramowania ze źródła. Wskaźnik prowadzi od lewej do prawej, przewody znajdują się na dole i są skierowane w Twoją stronę.

Diagram (aby uzyskać pełnowymiarowy diagram, zapisz obraz na komputerze).

Więcej szczegółów można znaleźć na stronie: http://www.rlocman.ru/shem/schematics.html?di=63917

Ładowarka z funkcją pomiaru pojemności

Chciałem zmierzyć pojemność akumulatora, okazało się, że importowane mierniki są dość drogie ciekawy schemat i zebrał. Działa dobrze, ładuje, mierzy, ale trudno mi powiedzieć z jaką dokładnością - nie ma normy. Zmierzyłem akumulatory całkiem przyzwoitych firm 2700 mA/h - celowałem w 2000. Baterie z zabawek 700 mA/h -350, zamówiłem chińskie akumulatory BTY na EBAY-u 2500 mA/h - 450 mA/h, ale jednocześnie są całkiem przyzwoite, dobrze sprawdzają się w zabawkach, dużo tańsze od baterii.


Urządzenie przeznaczone jest do ładowania akumulatorów NiMH i monitorowania ich pojemności. Przełączanie pomiędzy trybami ładowania/rozładowania odbywa się za pomocą przycisku SA1. Stan pracy sygnalizowany jest za pomocą diod LED oraz miejsc dziesiętnych dwóch pierwszych cyfr wskaźnika siedmiosegmentowego.
Zaraz po włączeniu zasilania urządzenie przechodzi w tryb ładowania. Wskaźnik pokazuje czas ładowania. Po upływie zaprogramowanego czasu ładowanie zostaje zatrzymane. Zakończenie ładowania (i rozładowania) sygnalizowane jest świecącą kropką czwartego rozładowania. Prąd ładowania definiuje się jako C/10, gdzie C to pojemność akumulatora, ustawiana trymerem R14.
Zasada działania miernika opiera się na obliczeniu czasu, w którym napięcie akumulatora spadnie do 1,1 V. Prąd rozładowania powinien wynosić 450 mA, ustawić na R16. Aby zmierzyć pojemność należy włożyć akumulator do komory rozładowczej i rozpocząć proces poprzez naciśnięcie przycisku! Urządzenie może rozładować tylko jeden akumulator.

Więcej szczegółów:http://cxem.net

Uniwersalny piekarnik do radioamatorstwa

Piec do lutowania części SMD posiada 4 programowalne tryby.

Schemat jednostki sterującej (w celu uzyskania pełnowymiarowego schematu należy zapisać obraz na komputerze).


Zasilanie i sterowanie grzejnikiem


Zmontowałem ten projekt, aby sterować stacją lutowniczą IR. Może kiedyś będę sterować piecem. Był problem z uruchomieniem generatora, zamontowałem kondensatory 22 pF z pinów 7 i 8 do masy i odpalił normalnie. Wszystkie tryby działają normalnie, obciążone grzałką ceramiczną o mocy 250 W.

Więcej szczegółów: http://radiokot.ru/lab/hardwork/11/

Ponieważ nie ma pieca, zrobiłem takie dolne ogrzewanie na małe deski:

Grzejnik 250 W średnica 12 cm, wysłany z Anglii, kupiony na EBAY-u.


Cyfrowa stacja lutownicza do PIC16F88x/PIC16F87x(a)

Stacja lutownicza z dwiema lutownicami jednocześnie i suszarką do włosów. Można używać różnych MCU (PIC16F886/PIC16F887, PIC16F876/PIC16F877, PIC16F876a/PIC16F877a). Zastosowano wyświetlacz z Nokii 1100 (1110). Prędkość turbiny suszarki jest sterowana elektronicznie, wykorzystuje się także kontaktron wbudowany w suszarkę. Wersja autorska wykorzystuje zasilacz impulsowy, ja zastosowałem zasilacz transformatorowy. Wszystkim podoba się ta stacja, jednak przy mojej lutownicy: 60W, 24V, z grzałką ceramiczną, występują duże rozbiegi i wahania temperatury. Jednocześnie lutownice o mniejszej mocy, z grzejnik nichromowy mają mniejsze wahania. Jednocześnie moja lutownica, z opisaną powyżej stacją lutowniczą firmy Mikha-Pskov, z oprogramowaniem firmy Volu, utrzymuje temperaturę z dokładnością do jednego stopnia. Więc potrzebujesz dobry algorytm ogrzewanie i utrzymywanie temperatury. W ramach eksperymentu wykonałem regulator PWM na timerze, przyłożyłem napięcie sterujące z wyjścia wzmacniacza termopary, wyłączyłem, włączyłem z mikrokontrolera, wahania temperatury natychmiast spadły do ​​kilku stopni, co potwierdza, że ​​tak jest potrzebne poprawny algorytm kierownictwo. Zewnętrzne PWM to oczywiście pornografia w obecności mikrokontrolera, ale dobre oprogramowanie nie zostało jeszcze napisane. Zamówiłem inną lutownicę, jeśli nie zapewni dobrej stabilizacji, będę kontynuował eksperymenty z zewnętrznym sterowaniem PWM, może pojawi się dobry firmware. Stacja została zmontowana na 4 płytach, połączonych ze sobą za pomocą łączników.

Schemat cyfrowej części urządzenia pokazano na rysunku; dla przejrzystości pokazano dwa MK: IC1 - PIC16F887, IC1(*) - PIC16F876. Pozostałe MK podłącza się w ten sam sposób do odpowiednich portów.

Aby zmienić kontrast, musisz znaleźć 67 bajtów, jego wartość to „0x80”, na początek możesz wpisać „0x90”. Wartości muszą mieścić się w przedziale od „0x80” do „0x9F”.

Jeśli chodzi o wyświetlacz 1110i (tekst jest lustrzany), jeśli nie jest to chiński, ale oryginalny, otwórz EEPROM, poszukaj 75 bajtów, zmień go z A0 na A1.

Rzemiosło z mikrokontrolerami to pytanie bardziej aktualne i interesujące niż kiedykolwiek. W końcu żyjemy w XXI wieku, epoce nowych technologii, robotów i maszyn. Dziś co druga osoba już od najmłodszych lat potrafi korzystać z Internetu i różnego rodzaju gadżetów, bez których czasem trudno obejść się w życiu codziennym.

Dlatego w tym artykule poruszymy w szczególności kwestie wykorzystania mikrokontrolerów, a także ich bezpośredniego wykorzystania w celu ułatwienia misji, przed którymi stoimy każdego dnia. Przekonajmy się, jaka jest wartość tego urządzenia i jak łatwo jest z niego skorzystać w praktyce.

Mikrokontroler to układ scalony, którego zadaniem jest sterowanie urządzenia elektryczne. Klasyczny kontroler łączy w jednym chipie zarówno działanie procesora, jak i urządzeń zdalnych oraz zawiera urządzenie pamięci o dostępie swobodnym. Ogólnie rzecz biorąc, jest to monokryształ Komputer osobisty, które mogą wykonywać stosunkowo zwyczajne zadania.

Różnica między mikroprocesorem a mikrokontrolerem polega na obecności urządzeń start-stop, timerów i innych zdalnych struktur wbudowanych w chip procesora. Zastosowanie w obecnym sterowniku dość wydajnego aparatu obliczeniowego o szerokich możliwościach, zbudowanego na monoukładzie, a nie na pojedynczym zestawie, znacznie zmniejsza skalę, zużycie i cenę tworzonych na jego bazie urządzeń.

Wynika z tego, że takie urządzenie może znaleźć zastosowanie w technice komputerowej, np. kalkulatorze, płycie głównej, kontrolerach CD. Są również stosowane w elektrycznych urządzeniach gospodarstwa domowego, takich jak kuchenki mikrofalowe i pralki, i wiele innych. Mikrokontrolery są również szeroko stosowane w mechanice przemysłowej, począwszy od mikroprzekaźników po techniki sterowania obrabiarkami.

Mikrokontrolery AVR

Zapoznajmy się z bardziej powszechnymi i dokładnie ustalonymi nowoczesny świat kontroler, taki jak AVR. Składa się z szybkiego mikroprocesora RISC, 2 typów energochłonnej pamięci (pamięci podręcznej projektu Flash i pamięci podręcznej informacji EEPROM), operacyjnej pamięci podręcznej typu RAM, portów we/wy i różnorodnych struktur zdalnych interfejsów.

  • temperatura pracy waha się od -55 do +125 stopni Celsjusza;
  • temperatura przechowywania wynosi od -60 do +150 stopni;
  • najwyższe napięcie na pinie RESET, zgodnie z GND: maksymalnie 13 V;
  • maksymalne napięcie zasilania: 6,0 V;
  • maksymalny prąd elektryczny linii wejściowej/wyjściowej: 40 mA;
  • Maksymalny prąd na linii zasilającej VCC i GND: 200 mA.

Możliwości mikrokontrolera AVR

Absolutnie wszystkie mikrokontrolery typu Mega, bez wyjątku, mają właściwość niezależnego kodowania, możliwość zmiany elementów pamięci sterownika bez pomoc z zewnątrz. Ten cecha wyróżniająca umożliwia tworzenie za ich pomocą bardzo elastycznych koncepcji, a sposób ich działania jest zmieniany osobiście przez mikrokontroler w powiązaniu z takim czy innym obrazem, zdeterminowanym zdarzeniami zewnętrznymi lub wewnętrznymi.

Obiecana liczba obrotów spisu pamięci podręcznej dla mikrokontrolerów AVR drugiej generacji wynosi 11 tysięcy obrotów, podczas gdy standardowa liczba obrotów wynosi 100 tysięcy.

Konfiguracja struktury portów wejściowych i wyjściowych AVR jest następująca: celem wyjścia fizjologicznego są trzy bity regulacji, a nie dwa, jak w dobrze znanych kontrolerach bitowych (Intel, Microchip, Motorola itp.). ). Ta właściwość eliminuje potrzebę posiadania w pamięci zduplikowanego elementu portu w celach ochronnych, a także przyspiesza efektywność energetyczną mikrokontrolera w połączeniu z urządzeniami zewnętrznymi, a mianowicie w przypadku powiązanych problemów elektrycznych na zewnątrz.

Wszystkie mikrokontrolery AVR są wyposażone w wielopoziomową technologię tłumienia. Wydaje się, że przerywa standardowy tok rusyfikacji, aby osiągnąć cel priorytetowy i zdeterminowany pewnymi wydarzeniami. Istnieje procedura konwersji wniosku o zawieszenie dla konkretnego przypadku, która znajduje się w pamięci projektu.

Kiedy pojawia się problem powodujący wyłączenie, mikrokontroler zapisuje liczniki regulacji komponentów, wstrzymuje wykonanie tego programu przez procesor główny i rozpoczyna wykonywanie procedury przetwarzania zamknięcia. Po zakończeniu wykonywania, pod patronatem programu zawieszenia, wcześniej zapisany licznik programu zostaje wznowiony, a procesor kontynuuje realizację niedokończonego projektu.

Rzemiosło oparte na mikrokontrolerze AVR

Rękodzieło DIY wykorzystujące mikrokontrolery AVR staje się coraz bardziej popularne ze względu na ich prostotę i niskie koszty energii. Czym są i jak je wykonać własnymi rękami i umysłem, zobacz poniżej.

"Dyrektor"

Takie urządzenie zostało zaprojektowane jako mały pomocnik dla osób preferujących spacery po lesie, a także przyrodników. Pomimo tego, że większość telefonów posiada nawigator, do pracy wymagają one połączenia z Internetem, a w miejscach odizolowanych od miasta jest to problem, nie rozwiązano także problemu z doładowaniem w lesie. W takim przypadku wskazane byłoby mieć przy sobie takie urządzenie. Istotą urządzenia jest to, że określa kierunek, w którym należy się poruszać oraz odległość do pożądanej lokalizacji.

Układ zbudowany jest w oparciu o mikrokontroler AVR taktowany z zewnętrznego rezonatora kwarcowego częstotliwością 11,0598 MHz. Za współpracę z GPS odpowiada NEO-6M firmy U-blox. To, choć przestarzały, jest powszechnie znanym i budżetowym modułem z dość przejrzystą możliwością określenia lokalizacji. Informacje skupiają się na ekranie Nokii 5670. Model zawiera także miernik fali magnetycznej HMC5883L i akcelerometr ADXL335.


Bezprzewodowy system alarmowy z czujnikiem ruchu

Przydatne urządzenie, które zawiera urządzenie do poruszania się i możliwość nadania, w zależności od kanału radiowego, znaku, że zostało uruchomione. Konstrukcja jest ruchoma i ładowana za pomocą baterii lub baterii. Aby to zrobić, trzeba mieć kilka modułów radiowych HC-12, a także czujnik ruchu HC-SR501.

Urządzenie ruchowe HC-SR501 działa przy napięciu zasilania od 4,5 do 20 woltów. I dla optymalna wydajność z Bateria litowo-jonowa powinieneś ominąć diodę LED bezpieczeństwa na wejściu zasilania i zamknąć dostęp i wyjście stabilizatora liniowego 7133 (2. i 3. nóżka). Po zakończeniu tych procedur urządzenie rozpoczyna stałą pracę przy napięciu od 3 do 6 woltów.


Uwaga: przy współpracy z modułem radiowym HC-12 czasami zdarzało się, że czujnik działał fałszywie. Aby tego uniknąć należy 2-krotnie zmniejszyć moc nadajnika (polecenie AT+P4). Czujnik zasilany jest olejem, a jedna naładowana bateria o pojemności 700 mAh wystarczy na ponad rok.

Miniterminal

Urządzenie okazało się wspaniałym asystentem. Jako podstawa do produkcji urządzenia potrzebna jest płytka z mikrokontrolerem AVR. Ze względu na to, że ekran jest podłączony bezpośrednio do kontrolera, napięcie zasilania nie powinno przekraczać 3,3 V, ponieważ wyższe wartości mogą powodować problemy z urządzeniem.


Należy wziąć moduł konwertera oparty na LM2577, a podstawą może być akumulator Li-Ion o pojemności 2500 mAh. Dostępny będzie przydatny pakiet, który zapewnia stałe napięcie 3,3 V w całym zakresie napięcia roboczego. Do ładowania użyj modułu opartego na chipie TP4056, który jest uważany za niedrogi i dość wysokiej jakości. Aby móc podłączyć miniterminal do mechanizmów 5 V bez ryzyka spalenia ekranu, należy skorzystać z portów UART.

Podstawowe aspekty programowania mikrokontrolera AVR

Kodowanie mikrokontrolerów jest często wykonywane w stylu asemblera lub SI, jednak można również używać innych języków Forth lub BASIC. Zatem, aby faktycznie przystąpić do prac nad programowaniem sterownika, należy zaopatrzyć się w następujący zestaw materiałów, w którego skład wchodzą: mikrokontroler w ilości trzech sztuk - cieszące się dużą popularnością ATmega8A-PU, ATtiny2313A-PU i ATtiny13A-PU i skuteczne.

Aby zaimplementować program w mikrokontrolerze, potrzebujesz programisty: za najlepszy uważa się programator USBASP, który zapewnia napięcie 5 woltów, które będzie wykorzystywane w przyszłości. Na potrzeby wizualnej oceny i wniosków z wyników projektu potrzebne są zasoby odbicia danych - są to diody LED, cewka LED i ekran.


Do poznania procedur komunikacji mikrokontrolera z innymi urządzeniami potrzebne jest numeryczne urządzenie do pomiaru temperatury DS18B20 i pokazywanie odpowiedni czas, obejrzyj DS1307. Ważne jest również posiadanie tranzystorów, rezystorów, rezonatorów kwarcowych, kondensatorów i przycisków.

Do montażu systemów potrzebna będzie przykładowa płyta montażowa. Aby zbudować strukturę na mikrokontrolerze, należy użyć tablica rozwojowa do montażu bez lutowania oraz komplet zworek do niej: płytka wzorcowa MB102 oraz zworki łączące z płytką stykową kilku typów - elastyczne i sztywne, a także w kształcie litery U. Kodowanie mikrokontrolerów odbywa się za pomocą programatora USBASP.

Najprostsze urządzenie oparte na mikrokontrolerze AVR. Przykład

Po zapoznaniu się z tym, czym są mikrokontrolery AVR i ich systemem programowania, rozważmy najprostsze urządzenie, dla którego ten kontroler służy jako podstawa. Podajmy przykład sterownika silników elektrycznych niskiego napięcia. Urządzenie to pozwala kontrolować dwa słabe punkty jednocześnie. silniki elektryczne prąd ciągły.

Maksymalny możliwy prąd elektryczny, którym można załadować program, wynosi 2 A na kanał i najwyższa moc silniki mają moc 20 W. Na płytce znajduje się para dwuzaciskowych listew zaciskowych do podłączenia silników elektrycznych oraz trójzaciskowa listwa zaciskowa do zasilania wzmocnionego napięcia.

Urządzenie wygląda płytka drukowana ma wymiary 43 x 43 mm i zbudowano na nim miniukład chłodnicy, którego wysokość wynosi 24 milimetry, a waga 25 gramów. W celu manipulacji obciążeniem płyta sterownicza zawiera około sześciu wejść.

Wniosek

Podsumowując, mikrokontroler AVR jest użytecznym i cennym narzędziem, zwłaszcza dla majsterkowiczów. A używając ich prawidłowo, przestrzegając zasad i zaleceń dotyczących programowania, możesz łatwo zdobyć przydatna rzecz nie tylko w życiu codziennym, ale także w działalność zawodowa i po prostu w życiu codziennym.

Mikrokontrolery Atmega8 są najpopularniejszymi przedstawicielami swojej rodziny. Pod wieloma względami zawdzięczają to z jednej strony prostocie obsługi i zrozumiałej strukturze, z drugiej zaś dość szerokiej funkcjonalność. W tym artykule omówimy programowanie Atmega8 dla początkujących.

informacje ogólne

Mikrokontrolery są wszędzie. Można je znaleźć w lodówkach, pralki, telefony, maszyny fabryczne i mnóstwo innych urządzenia techniczne. Mikrokontrolery obejmują zarówno proste, jak i niezwykle złożone. Te ostatnie oferują znacznie więcej możliwości i funkcjonalność. Ale zrozum natychmiast złożona technologia nie będzie działać. Na początku musisz opanować coś prostego. A Atmega8 zostanie wzięta jako próbka. Programowanie na nim nie jest trudne dzięki kompetentnej architekturze i przyjaznemu interfejsowi. Ponadto ma wystarczającą wydajność, aby można go było zastosować w większości. Co więcej, są one stosowane nawet w przemyśle. W przypadku Atmega8 programowanie wymaga znajomości języków takich jak AVR (C/Assembler). Gdzie zacząć? Opanowanie tej technologii jest możliwe na trzy sposoby. I każdy sam wybiera, od czego zacząć pracę z Atmega8:

  1. Programowanie poprzez Arduino.
  2. Zakup gotowego urządzenia.
  3. Samodzielny montaż mikrokontrolera.

Rozważymy pierwszy i trzeci punkt.

Arduino

Jest to wygodna platforma zaprojektowana w formie odpowiedniej dla szybkie tworzenie różne urządzenia. Na płytce jest już wszystko co potrzeba w postaci samego mikrokontrolera, jego wiązki i programatora. Podążając tą ścieżką, osoba otrzyma następujące korzyści:

  1. Niskie wymagania progowe. Aby opracować urządzenia techniczne, nie trzeba posiadać specjalnych umiejętności.
  2. Dostępna będzie szeroka gama elementów do podłączenia bez dodatkowego przygotowania.
  3. Szybki start rozwoju. Dzięki Arduino możesz od razu przejść do tworzenia urządzeń.
  4. Dostępność dużej ilości materiały edukacyjne oraz przykłady realizacji różnych projektów.

Ale są też pewne wady. Zatem programowanie Arduino Atmega8 nie pozwala zanurzyć się głębiej w świat mikrokontrolera i zrozumieć wiele przydatnych aspektów. Dodatkowo będziesz musiał nauczyć się języka programowania, który różni się od tych używanych przez AVR (C/Assembler). I jeszcze jedno: Arduino ma dość wąską gamę modeli. Dlatego prędzej czy później zaistnieje potrzeba zastosowania mikrokontrolera, którego nie stosuje się w płytkach. Ale ogólnie jest to dobra opcja do pracy z Atmega8. Programowanie poprzez Arduino zapewni Ci pewny start w świecie elektroniki. A dana osoba raczej nie podda się z powodu niepowodzeń i problemów.

Samodzielny montaż

Dzięki przyjaznemu projektowi możesz je wykonać samodzielnie. W końcu wymaga to tanich, niedrogich i prostych komponentów. Pozwoli to dokładnie przestudiować konstrukcję mikrokontrolera Atmega8, którego zaprogramowanie po złożeniu będzie wydawać się łatwiejsze. Ponadto, jeśli to konieczne, możesz niezależnie wybrać inne komponenty Szczególnym zadaniem. To prawda, że ​​​​jest tu pewna wada - złożoność. Samodzielne złożenie mikrokontrolera nie jest łatwe, jeśli nie posiada się niezbędnej wiedzy i umiejętności. Rozważymy tę opcję.

Co jest potrzebne do montażu?

Najpierw musisz zdobyć samą Atmegę 8. Wiadomo, że zaprogramowanie mikrokontrolera bez niego jest niemożliwe. Będzie kosztować kilkaset rubli - zapewniając przy tym przyzwoitą funkcjonalność. Pozostaje też pytanie, jak zostanie zaprogramowana Atmega8. USBAsp jest ładne dobre urządzenie, co się sprawdziło najlepsza strona. Ale możesz użyć innego programatora. Lub zmontuj go samodzielnie. Ale w tym przypadku istnieje ryzyko, że źle stworzony, zamieni mikrokontroler w niefunkcjonalny kawałek plastiku i żelaza. Nie zaszkodzi też mieć płytkę stykową i zworki. Nie są one wymagane, ale pozwolą Ci zaoszczędzić nerwy i czas. I wreszcie potrzebujesz źródła zasilania 5 V.

Programowanie Atmega8 dla początkujących na przykładzie

Przyjrzyjmy się, jak to zrobić Ogólny zarys urządzenie jest tworzone. Załóżmy, że mamy mikrokontroler, diodę LED, rezystor, programator, przewody łączące i zasilacz. Pierwszym krokiem jest napisanie oprogramowania sprzętowego. Rozumie się przez to zestaw poleceń dla mikrokontrolera, który prezentowany jest jako plik końcowy w specjalnym formacie. Konieczne jest określenie połączenia wszystkich elementów, a także interakcji z nimi. Następnie możesz rozpocząć montaż obwodu. Pin VCC powinien być zasilany. Do każdego innego, przeznaczonego do współpracy z urządzeniami i elementami, najpierw podłącza się rezystor, a następnie diodę LED. W tym przypadku moc pierwszego zależy od zapotrzebowania na moc drugiego. Możesz użyć następującego wzoru: R=(Up-Ups)/Is. Tutaj p to moc, a s to dioda LED. Wyobraźmy sobie, że mamy diodę LED, która pobiera 2 V i wymaga prądu zasilania 10 mA, przekonwertuj ją na postać wygodniejszą dla operacji matematycznych i uzyskaj 0,01 A. Wtedy wzór będzie wyglądał następująco: R=(5V-2V)/0,01A=3V/0,01A=300 Ohm. Jednak w praktyce wybór często okazuje się niemożliwy element doskonały. Dlatego wybierany jest najbardziej odpowiedni. Ale musisz użyć rezystora o rezystancji wyższej niż wartość uzyskana matematycznie. Dzięki takiemu podejściu przedłużymy jego żywotność.

Co dalej?

Mamy więc mały diagram. Teraz pozostaje już tylko podłączyć programator do mikrokontrolera i zapisać do jego pamięci stworzony firmware. Jest tu jeden punkt! Budując obwód należy go tak stworzyć, aby mikrokontroler można było flashować bez konieczności wylutowywania. Zaoszczędzi to czas, nerwy i wydłuży żywotność elementów. W tym Atmega8. Należy zauważyć, że programowanie w obwodzie wymaga wiedzy i umiejętności. Ale pozwala także na tworzenie bardziej zaawansowanych projektów. Przecież często zdarza się, że podczas rozlutowywania elementy ulegają uszkodzeniu. Następnie schemat jest gotowy. Można zastosować napięcie.

Ważne punkty

Chciałbym dać to początkującym przydatne porady o programowaniu Atmega8. Nie zmieniaj wbudowanych zmiennych i funkcji! Wskazane jest flashowanie urządzenia utworzonym programem po sprawdzeniu go pod kątem braku „wiecznych pętli”, które będą blokować wszelkie inne zakłócenia i użyciu dobrego nadajnika. Jeśli używasz do tych celów domowego produktu, powinieneś być psychicznie przygotowany na awarię mikrokontrolera. W przypadku flashowania urządzenia za pomocą programatora należy podłączyć odpowiednie wyjścia VCC, GND, SCK, MOSI, RESET, MISO. I nie naruszaj zasad bezpieczeństwa! Jeśli właściwości techniczne Przewiduje się, że powinno być napięcie zasilania 5 V, wówczas należy przestrzegać dokładnie tego napięcia. Nawet użycie elementów 6V może negatywnie wpłynąć na wydajność mikrokontrolera i skrócić jego żywotność. Oczywiście akumulatory 5 V mają pewne różnice, ale z reguły wszystko mieści się w rozsądnych granicach. Na przykład maksymalne napięcie będzie utrzymywane na poziomie 5,3 V.

Szkolenia i doskonalenie umiejętności

Na szczęście Atmega8 jest bardzo popularnym mikrokontrolerem. Dlatego znalezienie ludzi o podobnych poglądach lub po prostu ludzi posiadających wiedzę i umiejętności nie będzie trudne. Jeśli nie chcesz wymyślać koła na nowo, ale po prostu chcesz rozwiązać określony problem, możesz wyszukać wymagany schemat w rozległej sieci WWW. Przy okazji mała podpowiedź: choć robotyka jest dość popularna w segmencie rosyjskojęzycznym, jeśli nie ma odpowiedzi, to należy jej szukać w segmencie anglojęzycznym - zawiera ona rząd wielkości duża ilość Informacja. Jeśli istnieją pewne wątpliwości co do jakości istniejących zaleceń, możesz poszukać książek omawiających Atmegę8. Na szczęście firma produkcyjna bierze pod uwagę popularność swoich rozwiązań i dostarcza im specjalistyczną literaturę, w której doświadczeni ludzie opowiadają, co i jak, a także podają przykłady działania urządzenia.

Czy trudno jest zacząć tworzyć coś własnego?

Wystarczy mieć 500-2000 rubli i kilka wolnych wieczorów. Ten czas w zupełności wystarczy na zapoznanie się z architekturą Atmega8. Po odrobinie praktyki możesz łatwo tworzyć własne projekty realizujące określone zadania. Np, ramię robota. Jedna Atmega8 powinna w zupełności wystarczyć do przekazania głównego sygnału funkcje motoryczne palce i dłoń. Oczywiście, że jest ładny trudne zadanie, ale całkiem wykonalne. W przyszłości możliwe będzie tworzenie skomplikowanych rzeczy, które będą wymagały dziesiątek mikrokontrolerów. Ale to wszystko przed nami, wcześniej musisz zdobyć dobra szkoła poćwicz na czymś prostym.

Projekty na ATMega8.

Proste projekty do badania jednego z najprostszych i najpopularniejszych mikrokontrolerów.

Do pracy będziesz potrzebować co najmniej CodeVision AVR2.04.4a i Proteus 7.2 SP6. Jeśli chcesz pracować ze sprzętem, będziesz potrzebować także programisty. Polecam ten - jest łatwy w montażu i dobrze się sprawdza. Jedyny problem dotyczy początkowego oprogramowania układowego ATMega8, można to zrobić albo przez port LPT - 5-provodov-avr, albo można kupić „przewodowy” mikrokontroler, wziąłem to.


Sygnalizacja świetlna nr 1.

Stworzenie najprostszej sygnalizacji świetlnej w jednym kierunku nie wymaga dużego wysiłku i umiejętności. Obwód jest montowany w ciągu kilku minut. Rezystory dobiera się na podstawie zastosowanych diod LED (dla „radzieckiego” AL307 wskazana jest rezystancja 470 omów), należy zauważyć, że na schemacie pin AVCC jest podłączony do zasilacza, jeśli nie jest podłączony do prawdziwego mikrokontrolera, niezależnie od zastosowania wbudowanego przetwornika ADC (przetwornika analogowo-cyfrowego) wówczas możesz uszkodzić mikroukład (dotyczy każdego sterownika serii Mega)!!!

Kod źródłowy jest na tyle prosty, że przedstawię go tutaj. Znalazłem taki kod dla C w internecie i trochę go poprawiłem, jednak każdy programista powie, że ten kod jest głupi (później opiszę dokładnie jak pisać takie programy), ale jest prosty, wizualny i działający.

Typ chipa: ATmega8
Typ programu: Aplikacja

Model pamięci: Mały
Rozmiar stosu danych: 256


#włączać

#włączać

puste główne (puste)
{
// Inicjalizacja portu B
PORTB=0x00;
DDRB=0x00;

// Inicjalizacja portu C
PORTC=0x00;
DDRC=0x00;

// Inicjalizacja portu D
PORTD=0x00;
DDRD=0x07;

// Inicjalizacja przerwań zewnętrznych
// INT0: wyłączone
// INT1: wyłączone
MCUCR=0x00;


// Komparator analogowy: wyłączony

ACSR=0x80;
SFIOR=0x00;

podczas gdy (1) (

PORTD.2=1; //zapala się zielone światło
opóźnienie_ms(8000); //świeci przez 8 sekund


opóźnienie_ms(500); //Poczekaj pół sekundy


PORTD.2=0; //Wyłącz kolor zielony

PORTD.2=1; //Włącz zielony

/*delay_ms(500);//Poczekaj pół sekundy
PORTD.2=0; //Wyłącz kolor zielony
opóźnienie_ms(500); //Poczekaj pół sekundy
PORTD.2=1; //Włącz zielony
opóźnienie_ms(500); //Poczekaj pół sekundy*/

PORTD.1=1; //Włącz kolor żółty
PORTD.2=0; //Wyłącz kolor zielony
opóźnienie_ms(3000); //Poczekaj 3 sekundy

PORTD.0=1; //Włącz kolor czerwony
PORTD.1=0; //wyłącz żółty
opóźnienie_ms(9000); //przez 9 sekund

PORTD.1=1; //zmienia żółty na czerwony
opóźnienie_ms(3000); //poczekaj 3 sekundy
PORTD.0=0; //Wyłącz kolor czerwony
PORTD.1=0; //i żółty
};
}

Kod można jeszcze trochę skrócić jeśli weźmiemy pod uwagę, że domyślnie prawie wszystkie porty i rejestry ATMega8 są inicjowane na 0. Teraz dla początkujących kilka wyjaśnień:

#włączać

#włączać

Są to tak zwane pliki nagłówkowe, w których zapisane są procedury, które zastosujemy z innych plików. Przykładowo procedura opóźnienia_ms(X), która wyznacza opóźnienie w milisekundach, została napisana przez inną osobę i znajduje się w pliku opóźnienie.c (w rzeczywistości wszystko może nie do końca tak być, albo wcale - procedura może zawierać plik obiektowy typu *.obj, *.asm), a zasady jego wykorzystania opisano w dołączonym przez nas pliku opóźnienia.h.

PORTB=0x00;
DDRB=0x00;

Zastrzeżone nazwy oznaczające rejestry portów kontrolera (jego piny są pogrupowane bajtami - po 8, każdy bit rejestru portu odpowiada własnemu pinowi) i rejestry kierunku wymiany portów (0-wejście, 1-wyjście)

Przykładowo wpisanie DDRB.5=1 oznacza, że ​​pin PB5 kontrolera jest skonfigurowany jako wyjście, natomiast wpisując PORTB.5=0 lub =1, na tym pinie otrzymamy 0 (0...0,8 V) lub 1 (4...5 V). Można oczywiście od razu przypisać całą wartość do portu: PORTB=0xFF, czyli: wszystkie piny portu PB to 1.

while(1) (wyrażenie);

reprezentuje nieskończoną pętlę, ponieważ 1 = PRAWDA.

Sygnalizacja świetlna nr 2.


Aby uzyskać sygnalizację świetlną w dwóch kierunkach, należy zmodyfikować schemat sygnalizacji świetlnej nr 1:


i kod sygnalizacji świetlnej nr 1:

/*****************************************************
Typ chipa: ATmega8
Typ programu: Aplikacja
Częstotliwość zegara rdzenia AVR: 1,000000 MHz
Model pamięci: Mały
Rozmiar zewnętrznej pamięci RAM: 0
Rozmiar stosu danych: 256
*****************************************************/

#włączać
#włączać

puste główne (puste)
{
// Inicjalizacja portu B
PORTB=0x00;
DDRB=0x00;

// Inicjalizacja portu C
PORTC=0x00;
DDRC=0x00;

// Inicjalizacja portu D
PORTD=0x00;
DDRD=0b00111111;

ACSR=0x80;
SFIOR=0x00;

podczas gdy (1)
{
PORTD.2=1; //zielony1 zapala Z1
PORTD.3=1; //czerwony2 oświetla K2
opóźnienie_ms(8000); //zielony1 świeci się przez 8 sekund

PORTD.2=0; //wyłącz green1 ZM1
opóźnienie_ms(500); //poczekaj pół sekundy

opóźnienie_ms(500); //poczekaj pół sekundy

opóźnienie_ms(500); //poczekaj pół sekundy
PORTD.2=1; //włącz zielony1
opóźnienie_ms(500); //poczekaj pół sekundy

PORTD.1=1; //włącz pomarańczowy1 J1 K2+J2
PORTD.4=1; //włącz orange2
PORTD.2=0; //wyłącz zielony1


PORTD.0=1; //włącz czerwony1 K1
PORTD.5=1; //włącz zielony2 Z2
PORTD.1=0; //wyłącz orange1
PORTD.4=0; //wyłącz orange2
PORTD.3=0; //wyłącz kolor czerwony2
opóźnienie_ms(8000); //poczekaj 8 sekund

PORTD.5=0; //wyłącz green2 ZM2
opóźnienie_ms(500); //poczekaj pół sekundy

opóźnienie_ms(500); //poczekaj pół sekundy

opóźnienie_ms(500); //poczekaj pół sekundy
PORTD.5=1; //włącz zielony2
opóźnienie_ms(500); //poczekaj pół sekundy

PORTD.1=1; //włącz pomarańczowy1 do czerwonego1 K1+J1
PORTD.4=1; //włącz orange2 J2
PORTD.5=0; //wyłącz zielony2
opóźnienie_ms(2000); //poczekaj 2 sekundy
PORTD.0=0; //Wyłącz kolor czerwony1
PORTD.1=0; //i pomarańczowy1
PORTD.4=0; //i pomarańczowy2
};
}

komentarze do kodu:

DDRD=0b00111111; //0b(b7)(b6)(b5)(b4)(b3)(b2)(b1)(b0)

Po prawej stronie znajduje się bitowa (binarna) reprezentacja liczby, w której najbardziej znacząca cyfra znajduje się po lewej stronie; można ją również zapisać w postaci dziesiętnej (DDRD=63;) lub szesnastkowej (DDRD=0x3F;).

puste główne (puste)

Main to główna procedura, od niej rozpoczyna się wykonanie programu, void oznacza dosłownie nic ( typ zerowy), zamiast void możesz zastąpić (ze znakiem lub bez znaku) int, long; float, double i tak dalej (a nawet wskaźnik do innej zmiennej, co zostanie omówione później). Co więcej, zastąpienie void jakimś typem na pierwszej pozycji oznacza to ten projekt- funkcja, a nie procedura i może zwracać wartość, tj. należy go wewnętrznie uzupełnić słowem powrót.

int zabawa(pustka) (
int a=10;
powrót(a);
}

Wszystkie zmiany zostały wykonane zgodnie ze schematem pracy:


Schemat działania sygnalizacji świetlnej w dwóch kierunkach z migającym sygnałem zielonym. Ten schemat też został wzięty z internetu i moim zdaniem: powinno być więcej mrugających zielonych sygnałów.



Sygnalizacja świetlna nr 3.


Przykłady nr 1 i nr 2 wskazały na nieco „proste” wykorzystanie kodu, które jest dopuszczalne w przypadku małych programów, ale nie może być stosowane ze względu na marnowanie zasobów w dużych aplikacjach.
Aby uprościć i skrócić kod w zastosowania technologiczne programiści zwykle używają automatów. Automat jest uproszczonym i wystarczającym modelem procesu. Na przykład całe działanie sygnalizacji świetlnej można podzielić na pewną skończoną liczbę stanów, które będą się powtarzać co określony okres. Aby reprezentować automat, będziesz potrzebować programowego licznika stanu i dekodera stanu. Sygnalizacja świetlna nr 3, na którą składają się sygnalizacja świetlna komunikacyjna w 4 kierunkach, 4 sygnalizacja świetlna dla pieszych, 1 sygnalizacja świetlna na przejazdach kolejowych i 1 migająca dla pieszych, byłaby problematyczna w realizacji bez automatu.


Poniżej przedstawiono kod bez przetwarzania sygnalizacji świetlnej dla pieszych i kolei. Łatwo zrozumieć, że procedury takie jak
void SetRedT1(void) //Światła transportowe 1 włączają czerwone D3
{
ptc|=0x01;
}
ustawić lub wyczyścić poszczególne bity.

W pętli głównej wartość licznika i stale rośnie, aż osiągnie 48.
ja++;
W takim przypadku licznik jest resetowany do zera.
jeśli (i==48) (i=0;); // 24c=0,5*48

W pętli wartość licznika jest stale porównywana ze stałymi, a praca wykonywana jest za pomocą portów. Chociaż ten kod jest bardziej zaawansowany niż dwa poprzednie, jest również bardziej odpowiedni ze względu na przejrzystość niż do pracy. Profesjonaliści najczęściej nie korzystają ze zbiorów pojedynczych operacji porównań, lecz korzystają z operatorów przełączania, a nawet zapisują wstępnie obliczone dane do tablic – korzystają z gotowej tabeli:

flashuj znak bez znaku sw[N]=(
//G1Y1R1G2Y2R2 XX
0b10000100, //1 X okresy Świecą zielone1 i czerwone2
0b10000100, //2
...
0b00000100, // X okresów Zielony1 miga,

0b10000100, //
...
0b01001100, //K-1 Zielony1 gaśnie, zapalają się Żółty1 i Żółty2
0b00110000, //K Czerwony1 świeci, Zielony1 świeci, Żółty2 i Czerwony2 gaśnie

...
0b01101000 //N
};

podczas gdy (1)
{
ja++;


PORTC=(sw[i]>>x) | maska;
PORTD=(sw[i]>>x) | maska;
opóźnienie_ms(500);
};
}

Oczywiście wyrażenia (sw[i]>>x) | maski są opisywane warunkowo, wszystko zależy od położenia informacji o sygnałach w stałej sw.

/*****************************************************
Typ chipa: ATmega8
Typ programu: Aplikacja
Częstotliwość zegara rdzenia AVR: 1,000000 MHz
Model pamięci: Mały
Rozmiar zewnętrznej pamięci RAM: 0
Rozmiar stosu danych: 256
*****************************************************/

#włączać
#włączać

znak bez znaku ptb=0;
znak bez znaku ptc=0;
znak bez znaku ptd=0;

void SetRedT1() //Światła transportowe 1 włączają kolor czerwony D3
{
ptc|=0x01;
}

void ResetRedT1() //Światła transportowe 1 wyłączają czerwony D3
{
ptc&=~0x01;
}

void SetYelT1() //Światła transportowe 1 włączają żółte D2
{
ptc|=0x02;
}

void ResetYelT1() //Światła transportowe 1 wyłączają żółte D2
{
ptc&=~0x02;
}

void SetGrnT1() //Światła transportowe 1 zmieniają kolor na zielony D1
{
ptc|=0x04;
}

void ResetGrnT1() //Światła transportowe 1 wyłączają zielone D1
{
ptc&=~0x04;
}

void SetRedT2() //Światła transportowe 2 włączają kolor czerwony D6
{
ptc|=0x08;
}

void ResetRedT2() //Światła transportowe 2 wyłączają czerwone D6
{
ptc&=~0x08;
}

void SetYelT2() //Światła transportowe 2 włączają żółte D5
{
ptc|=0x10;
}

void ResetYelT2() //Światła transportowe 2 wyłączają żółte D5
{
ptc&=~0x10;
}

void SetGrnT2() //Światła transportowe 2 zmieniają kolor na zielony D4
{
ptc|=0x20;
}

void ResetGrnT2() //Światła transportowe 2 wyłączają zielone D4
{
ptc&=~0x20;
}


void SetRedT3() //Światła transportowe 3 włączają kolor czerwony D9
{
ptd|=0x01;
}

void ResetRedT3() //Światła transportowe 3 wyłączają czerwony D9
{
ptd&=~0x01;
}

void SetYelT3() //Światła transportowe 3 włączają żółte D8
{
ptd|=0x02;
}

void ResetYelT3() //Światła transportowe 3 wyłączają żółte D8
{
ptd&=~0x02;
}

void SetGrnT3() //Światła transportowe 3 zmieniają kolor na zielony D7
{
ptd|=0x04;
}

void ResetGrnT3() //Światła transportowe 3 wyłączają zielone D7
{
ptd&=~0x04;
}


void SetRedT4() //Światła transportowe 2 włączają czerwone D12
{
ptd|=0x08;
}

void ResetRedT4() //Światła transportowe 2 wyłączają czerwony D12
{
ptd&=~0x08;
}

void SetYelT4() //Światła transportowe 2 włączają żółte D11
{
pt|=0x10;
}

void ResetYelT4() //Światła transportowe 2 wyłączają żółte D11
{
ptd&=~0x10;
}

void SetGrnT4() //Światła transportowe 2 zmieniają kolor na zielony D10
{
ptd|=0x20;
}

void ResetGrnT4() //Światła transportowe 2 wyłączają zielone D10
{
ptd&=~0x20;
}

// Zadeklaruj tutaj swoje zmienne globalne

puste główne (puste)
{
znak bez znaku i=0;

PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;

podczas gdy (1)
{
if (i==0) (ResetYelT1();ResetRedT1();SetGrnT1();
ResetYelT2();SetRedT2();
ResetYelT3();ResetRedT3();SetGrnT3();
ResetYelT4();SetRedT4();

); //0 s
jeśli (i==16) (ResetGrnT1();
ResetujGrnT3();

); //8s
jeśli (i==17) (SetGrnT1();
UstawGrnT3();

};
jeśli (i==18) (ResetGrnT1();
ResetujGrnT3();

};
jeśli (i==19) (SetGrnT1();
UstawGrnT3();

};
if (i==20) (ResetGrnT1();SetYelT1();
SetYelT2();
ResetGrnT3();UstawYelT3();
SetYelT4();

); //10 s
if (i==24) (ResetYelT1();SetRedT1();
ResetYelT2();ResetRedT2();SetGrnT2();
ResetYelT3();SetRedT3();
ResetYelT4();ResetRedT4();SetGrnT4();

); //12 s
jeśli (i==40) (ResetGrnT2();
ResetujGrnT4();

); //20s
jeśli (i==41) (SetGrnT2();
UstawGrnT4();

};
jeśli (i==42) (ResetGrnT2();
ResetujGrnT4();

); //21 s
jeśli (i==43) (SetGrnT2();
UstawGrnT4();

};
if (i==44) (SetYelT1();
ResetGrnT2();UstawYelT2();
SetYelT3();
ResetGrnT4();UstawYelT4();

); //22 s
ja++;
jeśli (i==48) (i=0;); // 24c=0,5*48 - cykl

//PORTB=ptb;
PORTC=ptc;
PORTD=ptd;
opóźnienie_ms(500);
};
}

Wskaźnik kolumny.

Jeśli w poprzednich przykładach wykorzystano zasoby cyfrowe mikrokontrolera, to w tym przykładzie wykorzystano zasoby analogowe - przetworniki ADC. Przetwornik analogowo-cyfrowy przeznaczony do konwersji dyskretnych sygnał analogowy na kod cyfrowy z określoną częstotliwością próbkowania. Jeśli chodzi o początkujących, mogę tylko to powiedzieć maksymalna prędkość Cyfryzacja jest ograniczona.

Wskaźnik słupkowy wyświetla napięcie wejściowe w postaci kolumny segmentów świetlnych (lub po prostu pojedynczych emiterów), co jest bardzo przydatne w przypadku wszelkiego rodzaju wskaźników, których przykładem są słupkowe wskaźniki poziomu rejestracji (RLI).

Napięcie wejściowe nie powinno przekraczać napięcia zasilania, jako napięcie odniesienia zastosowano zasilacz mikrokontrolera o napięciu 5 V, a jako filtr zastosowano zewnętrzny kondensator na pinie AREF.

Kod programu podany jest poniżej:

/*****************************************************
Typ chipa: ATmega8
Typ programu: Aplikacja
Częstotliwość zegara rdzenia AVR: 4,000000 MHz
Model pamięci: Mały
Rozmiar zewnętrznej pamięci RAM: 0
Rozmiar stosu danych: 256
*****************************************************/

#włączać
#włączać

#define ADC_VREF_TYPE 0x40 //5V Vcc + C 4,7uF AREF

//PD0 LED1
//PD1 LED2
//PD2LED3
//PD3LED4
//PD4LED5
//PD5 LED6
//PD6LED7
//PD7LED8
//PB0 LED9
//PB1 LED10
//PB2 LED11
//PB3 LED12
//PB4 LED13
//PB5 LED14

//PC4 LED15
//PC5 LED16

konst
znak bez znaku PD=
{
0b00000000, //0
0b00000001, //1
0b00000011, //2
0b00000111, //3
0b00001111, //4
0b00011111, //5
0b00111111, //6
0b01111111, //7
0b11111111, //8
//_____________
0b11111111, //9
0b11111111, //10
0b11111111, //11
0b11111111, //12
0b11111111, //13
0b11111111, //14
0b11111111, //15
0b11111111 //16
};
znak bez znaku PB=
{
0b00000000, //0
0b00000000, //1
0b00000000, //2
0b00000000, //3
0b00000000, //4
0b00000000, //5
0b00000000, //6
0b00000000, //7
0b00000000, //8
//_____________
0b00000001, //9
0b00000011, //10
0b00000111, //11
0b00001111, //12
0b00011111, //13
0b00111111, //14
//_____________
0b00111111, //15
0b00111111 //16
};

// Odczytaj wynik konwersji AD
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=wejście_adc | (ADC_VREF_TYPE i 0xff);
// Opóźnienie potrzebne do stabilizacji napięcia wejściowego ADC
opóźnienie_us(10);
// Rozpocznij konwersję AD
ADCSRA|=0x40;
// Poczekaj na zakończenie konwersji AD
podczas gdy ((ADCSRA i 0x10)==0);
ADCSRA|=0x10;
zwróć ADCW;
}

unieważnij ADC_init()
{
//Inicjalizacja ADC
//Częstotliwość zegara ADC: 125 000 kHz
// Napięcie odniesienia ADC: Vcc, poj. na AREFie
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
}

void Dekodowanie (sygnał int)
{
PORTD=PD;
PORTB=PB;

if (sygnał==15) (PORTC |= 0b00010000;PORTC &= 0b11011111;)
else if (sygnał==16) (PORTC |= 0b00110000;)
inaczej (PORTC &= 0b11001111;)
}

unieważnij SetupIO()
{
// Inicjalizacja portów wejścia/wyjścia
PORTB=0b00000000;
DDRB= 0b00111111;

PORTC=0b00001100;
DDRC= 0b00110000; //PC0,PC1 = piny konfiguracyjne ADC0,ADC1, PC2,PC3 z PUP

PORTD=0x00;
DDRD=0xFF;
}

puste główne (puste)
{
// Inicjalizacja komparatora analogowego
// Komparator analogowy: wyłączony
// Przechwytywanie wejścia komparatora analogowego przez timer/licznik 1: wyłączone
ACSR=0x80;
SFIOR=0x00;

KonfiguracjaIO();
ADC_init();

podczas gdy (1)
{
Dekoduj(odczyt_adc(0)*0,049*0,32);
opóźnienie_ms(100);
};
}

Prawie wszystkie techniki użyte w tym kodzie zostały omówione powyżej. Jedyne, na co chciałbym zwrócić uwagę, to rozszerzona konstrukcja z instrukcją if:
if () () //jeśli (warunek jest spełniony) to ( )
else if () () //w przeciwnym razie if (warunek jest spełniony) to ( )
inaczej () //w przeciwnym razie ( )

I ekspresja odczyt_adc(0)*0,049*0,32
faktem jest, że ADC generuje swoje wartości w skali 0-1023 (2^10), co odpowiada skali 0-5 woltów (ponieważ napięcie odniesienia wynosi 5 woltów) i musimy najpierw uzyskać woltów, a następnie przekonwertuj je na segmenty wielkości. 1024*0,049*0,32=16 tj. Cała skala ADC składa się z 16 segmentów.
Liczbę 0,049 przyjmuje się jako wielokrotność 5 woltów / 1024 zliczeń = 0,0048828 (~10 zliczeń ADC), a następnie mnoży się przez 0,32 metoda eksperymentalna aby ostatni segment zadziałał przy żądanym napięciu wejściowym.



Port szeregowy.

A teraz proponuję zanurzyć się w świat interfejsów. Najprostszy i najszerzej stosowany protokół szeregowy, RS232, do niedawna, choć uważany za przestarzały, nadal jest stosowany w produkcji nowoczesnych mikrokontrolerów - i to nie tylko jednego, z reguły obecnie jest ich co najmniej 4. Ponadto wiele urządzeń nadal korzysta z tego interfejsu (na przykład niektóre ekrany VFD NoritakeItron, urządzenia o powolnej produkcji itp.). Ten przykład pozwala ocenić, jak łatwo jest skonfigurować i wykorzystać RS232 (USART) w mikrokontrolerach.


Poniżej znajduje się kod przesyłający znak 0.

/*****************************************************
Typ chipa: ATmega8
Typ programu: Aplikacja
Częstotliwość zegara rdzenia AVR: 1,000000 MHz
Model pamięci: Mały
Rozmiar zewnętrznej pamięci RAM: 0
Rozmiar stosu danych: 256
*****************************************************/

#włączać

// Standardowe funkcje wejścia/wyjścia
//#włączać

#zdefiniuj szybkość transmisji 57600
#define BaudValue ((11059200UL/(BAUDRAT*16UL))-1)

void USART_Transmit (dane bez znaku)
{
//(podczas gdy (!(UCSRA i (1<
UDR = dane;
podczas(!(UCSRA & (1<
//UDR = dane; //Rozpocznij przesyłanie danych
}

nieważne USART_init(void)
{
UBRRH = Wartość transmisji >> 8;
UBRRL = wartość transmisji & 0xFF;
//
UCSRB=(1<
DDRD=0x02;
LUWSC = (1<
//UCSRA = (1<
}

puste główne (puste)
{
ACSR=0x80;
SFIOR=0x00;
USART_init();
podczas gdy (1){ USART_Transmisja (0x30);};
}


Należy pamiętać, że Proteus nie obsługuje emulacji UCSRC (ustawienie parametrów komunikacji portu), czyli ustaw częstotliwość oscylatora na 3500000, a w terminalu ustaw następujące parametry:




Witajcie Datagorianie!

Po opublikowaniu mojego pierwszego artykułu zostałem zasypany pytaniami o mikrokontrolery, jak, co, gdzie, dlaczego…

Abyś mógł zrozumieć, jak działa ta czarna skrzynka, opowiem Ci o mikrokontrolerze (zwanym dalej MK) ATmega8. W zasadzie Atmel produkuje całą serię MK z rodziny AVR – są to podrodziny Tiny i Mega. Nie będę opisywał zalet niektórych MK; to Ty decydujesz, co najbardziej Ci odpowiada. Niektórzy przedstawiciele dalszej rodziny:

Zatem ATmega8, najprostszy MK ze wszystkich ATmegas:

Zacznijmy studiować elementy wewnętrzne, korzystając z uproszczonego schematu strukturalnego:

To jest uogólniony schemat wszystkich ATmega.

Wszystkie mikrokontrolery AVR zbudowane są w oparciu o tzw. architekturę Harvarda, czyli stosuje się oddzielne adresowanie pamięci programu i pamięci danych. Zaletami tej architektury są zwiększona prędkość, np. ATmega wykonuje jedną instrukcję na impuls zegara, czyli przy częstotliwości 16 MHz MK wykonuje 16 milionów operacji na sekundę.

A teraz o flakach w porządku.
1. Generator zegara synchronizuje wszystkie urządzenia wewnętrzne.
2. ROM to urządzenie pamięci tylko do odczytu, służące do przechowywania programów i niezmiennych danych (stałych).
3. Dekoder poleceń - to on jest tutaj najważniejszy, kontroluje wszystko, co mu wpadnie do ręki.
4. ALU to urządzenie arytmetyczno-logiczne, które wykonuje operacje arytmetyczne (dodawanie, odejmowanie itp.) i logiczne (AND, OR, NOT, XOR) na liczbach.
5. RON – rejestry ogólnego przeznaczenia, ALU z nimi współpracuje, a także służą do tymczasowego przechowywania danych. Rejestry RON można łączyć w pary rejestrów:
r26: r27 – X;
r28: r29 – Y;
r30: r31 – Z.

Pary rejestrów służą do pośredniego adresowania danych w pamięci RAM.
6. RAM to urządzenie pamięci o dostępie swobodnym używane do przechowywania danych, tablic i stosów.
7. PORTA-PORTn – komunikacja ze światem zewnętrznym, porty wejścia/wyjścia, no cóż, wiadomo dlaczego…
8. Specjalne UVV to specjalne urządzenia wejścia/wyjścia, kontrolery różnych urządzeń peryferyjnych, na przykład USART (znany również jako port COM), czasami USB, ADC, DAC, I2C, w skrócie, cokolwiek tam jest...

Cóż, to wszystko teoria, ale nie możesz się doczekać, aż coś złożysz, wypróbujesz i sprawisz, że zadziała! Następnie wypiszmy, czego potrzebujemy:

1. Programista z odpowiednim oprogramowaniem, o tym pisałem w ostatnim artykule;
2. Kompilator języka C, Code Vision AVR, ma dobre narzędzia do tworzenia programów dla MK;

Zanim zaczniesz programować w C, dobrze byłoby zapoznać się z literaturą na temat tego języka, jest na przykład wspaniała książka Kernighana i Ritchiego „The C Language”.

OK, zaczynajmy...

Obwód testowy.

Ułóżmy ten diagram:

Będzie to model podstawowy. Nawiasem mówiąc, lepiej zmontować obwód na płytce stykowej i włożyć MK do gniazda. Ale taki schemat nie ma sensu. Dodajmy na przykład diodę LED i nie zapomnijmy o rezystorze ograniczającym prąd. Podłączmy go do pinu zerowego portu B.
Schemat będzie wyglądał następująco:

Włączmy zasilanie... ZERO!!! Czego chciałeś bez programu?
Oznacza…

Napiszmy program!

Uruchomiłeś CVAVR. Jaka jest pierwsza rzecz, którą powinieneś zrobić? Uruchom Code Wizard AVR, klikając przycisk koła zębatego na pasku narzędzi, pojawi się okno kreatora:

Tutaj wybieramy typ MK i częstotliwość zegara. Następnie przejdź do zakładki Porty:

I konfigurujemy, który bit którego portu będzie skonfigurowany jako wejście lub wyjście, port B bit 0 wyśle ​​sygnał, a reszta otrzyma.
Aby zapisać ustawienia, wybierz menu Plik / Generuj Zapisz i wyjdź, wprowadź nazwy plików dla wszystkich kolejnych żądań, pożądane jest, aby były takie same, na przykład „prj”. To wszystko, wygenerowaliśmy tekst źródłowy programu z ustawieniami określonymi w kreatorze.

Zobaczmy, co mamy. Pierwsze 22 linie to komentarz, to znaczy nie ma to wpływu na działanie programu, więc wszystko, co znajduje się pomiędzy „/*” a „*/” jest komentarzem, a kompilator ignoruje to wszystko. W 24-tym członie dołączamy plik nagłówkowy, opisuje on jak nazywają się rejestry i pod jakim adresem się znajdują. W przypadku programowania w języku C szczegóły są tutaj niepotrzebne.
Od linii 28 zaczynamy program główny od definicji funkcji główny(),

Przewińmy poniżej. Zwróć uwagę na linie 36 i 37, tutaj przypisywana jest wartość do portu B i wybierany jest kierunek transmisji. Ogólnie wygląda to wyraźnie tak:

Oznacza to, że jeśli do dowolnego bitu rejestru DDRB zostanie zapisana jedynka, wówczas odpowiadający mu bit portu B będzie działał jako wyjście. W naszym przypadku jest to bit 0.
Swoją drogą porty w ATmega mają jedną fajną cechę: nawet jeśli port jest skonfigurowany na wejście, a rejestr PORTx jest zapisany na jedynki, wewnętrzne rezystory podciągające zostaną podłączone do plusa zasilacza, co eliminuje użycie zewnętrznych rezystorów podwieszanych. Jest to wygodne w przypadku podłączenia dowolnych czujników i przycisków.

Skompilujmy program; w tym celu kliknij przycisk Utwórz projekt lub poprzez menu Projekt / Utwórz. Nie powinno być żadnych błędów, chyba że coś poprawiłeś.

Otwórzmy folder C:\cvavr\bin\, znajdź tam plik prj.hex. To jest program, który skompilowaliśmy dla MK. Podłączmy programator do PC i MK. Uruchommy program Pony Prog i przeciągnijmy plik prj.hex do jego okna. Włącz zasilanie MK i załaduj do niego nasz program... Znowu nic? Problem polega jednak na tym, że nie wysłaliśmy niczego do bitu zerowego portu B, a raczej wyprowadziliśmy go, tylko że wynosi zero. Aby nasza dioda LED się zaświeciła, musimy wyprowadzić jedną. Zróbmy to samo, zamień „PORTB=0x00;” w linii 36 na „PORTB=0x01;”. Skompilujmy program jeszcze raz. Natomiast w programie Pony Prog załadujemy plik ponownie za pomocą skrótu klawiaturowego Ctrl+L lub menu Plik / Załaduj ponownie pliki. Usuńmy MK i prześlijmy do niego oprogramowanie ponownie. hurra!!! TO DZIAŁA!!!

Nawiasem mówiąc, Pony Prog obsługuje skrypty i aby nie martwić się ponownym uruchomieniem, kasowaniem i pisaniem, możesz po prostu napisać skrypt z rozszerzeniem .e2s i nazwać go na przykład prog.e2s. Można to zrobić za pomocą notatnika. Jego zawartość będzie wyglądać następująco:

WYBIERZ URZĄDZENIE ATMEGA8
WYCZYŚĆ BUFOR
LOAD-ALL prj.hex
WYMAŻ WSZYSTKO
NAPISZ WSZYSTKO

Skrypt należy umieścić w tym samym folderze co plik .hex i uruchomić poprzez dwukrotne kliknięcie. Możesz umieścić skrót na pulpicie, w zależności od tego, jak wygodnie jest...

Ciąg dalszy nastąpi…