Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu
  • Transfer

Tanie elektroniczne "świece" ostatnio wydaje się wszędzie. Nie dodałem na nich specjalna uwagaDopóki nie zauważył, że w rzeczywistości używana jest specjalna dioda LED - z wbudowanym sterownikiem "migającym". Teraz coś zupełnie innego: Kto nie lubią tajemniczych diod LED? Pół godziny później strzeliłem już połyskujące chińskie diody produkcyjne.

Oczywiście najciekawsze pytanie - jak działają? Biorąc pod uwagę, że są one dosłownie kilku centów, w środku nie może być jakiejkolwiek drogiej elektroniki. W tym względzie pojawia się kolejne pytanie: czy te diody te są gorsze niż liczne "świece" na mikrokontrolerach, czyje schematy są pełne w Internecie?

Urządzenie jest stosunkowo proste. Standardowy obudowy 5-milimetra zawiera kryształ LED i układ chip, który jest nieco więcej niż pierwsza wielkość. Obwód sterownika jest podłączony zarówno z dodatnimi, jak i negatywnymi wnioskami. Anoda diody LED jest podłączona do trzeciej zworki do niego, podczas gdy katoda jest "siedzi" na wyjściu negatywnym.

Zły szalony blog naukowy był niedawno opowieści o podobnych diodach diod. Pokazano, że "śpiewają", jeśli konwertujesz zmiany jasności na dźwięk. A także - jak zarządzać z nimi potężniejszą diodą. Takie sztuczki opierają się na fakcie, że dioda LED zużywa większy prąd w tych momentach, gdy kontroler zapala go jaśniej. Zwykła dioda jest zawarta w sekwencyjnie połyskująca pokazuje bardzo podobne zmiany jasności. Innymi słowy, spadek napięcia na dodatkowym rezystorze różni się proporcjonalnie do jasności.


Służyłem do wyodrębniania kontrolera kontrolera i uruchamiałem go na analizatorze logicznym (patrz schemat powyżej). Dzięki regulacji rezystora zmiennego osiągnęłam, że analizator postrzegał prądy prądu jako "zer" i "jednostki", a dioda LED normalnie pracują.


Wykres powyżej pokazuje zmiany jasności diody przez około minutę nagraną częstotliwości próbkowania 1 MHz. Interwały są zauważalne, gdy dioda LED jest stale włączona i okresy, gdy jego jasność jest w jakiś sposób modulowana. Dioda nigdy nie wyłącza się przez długi czas. Jest to rozsądne, ponieważ prawdziwa świeca również świeci przez większość czasu, zmniejszając jasność na krótkie okresy migotania.


Bliższe wywołanie połączeń, że sygnał ma modulację impulsów. Oznacza to, że mamy diagram cyfrowy, bez żadnych sztuczek analogowych.

Jest ciekawy, że częstotliwość sygnału wynosi około 440 Hz, podobnie jak standardowy chateneton ( uwaga dla pierwszej oktawy - około. Tłumaczyć ). Zbieg okoliczności? Czy deweloper po prostu wziął generator z jakiegoś schematu muzycznego? Więc w historiach jest jakaś prawda o "muzykalności" tych diod LED. Każda "ramka" stałej jasności jest dokładnie 32 razy i trwa około 72 ms. Odpowiada to 13-14 klatek na sekundę.

Napisałem mały program, aby określić jasność w każdej ramce na współczynnik napełnienia sygnału PWM. Program odczytuje przepływ próbek z analizatora logicznego i wyświetla szereg liczb rzeczywistych - jeden dla każdej klatki.


Harmonogram jasności, w zależności od czasu, prowadzi do niektórych myśli: zmiany w jasności losowo, są dyskretne i mają nierówną dystrybucję. Wydaje się, że istnieje 16 poziomów jasności, z których niższe 4 są używane bardzo rzadko. Odpowiada tylko 13 z 3600 próbek.


Rozgałęzienie histogramu otwiera cały obraz: W rzeczywistości używany jest tylko 12 poziomów jasności. Dokładnie pół ramki mają maksymalną jasność, pozostałe wartości są rozprowadzane w przybliżeniu równo.

W jaki sposób można to być wdrożone na poziomie sprzętu? Prawdopodobnie wykorzystywany jest generator jednolicie rozproszone liczby losowe, które są przekazywane przez prostą funkcję formatora. W przypadku dystrybucji, które obserwujemy, jest wymagane co najmniej 12x2 \u003d 24 poziomy dyskretnych. Połowa z nich jest wyświetlana w jednym. Jest to bardzo ciekaw, ponieważ generator jest najprawdopodobniej wydany liczby binarne. Najbardziej logicznym byłoby wyładowanie wielu 5 bitów, a to jest 32 państwa. Wyświetl 32-poziomowy dyskretną wartość losową na 24 poziomach bez zmiany dystrybucji, a nie tak prosta, jak się wydaje. Nie zapominaj również, że w ogóle nie jest to krytyczny system, a deweloper prawdopodobnie nie miał dużo czasu na pięknym rozwiązaniu. Dlatego zastosował najprostszy, rodzaj hack.

Jedynym prostym sposobem, w jaki przychodzą na myśl, jest po prostu odrzucając nieodpowiednie wartości i przejmuj następną liczbę losową. Niechciane wartości można łatwo oddzielić maską bitową. Ponieważ schemat jest synchroniczny, istnieje tylko skończona liczba prób, aż rozpocznie się następna ramka. Jeśli kontroler nie spełnił ustalonej liczby prób, utknie na "złej" wartości. Pamiętaj o rzadkich emisji na harmonogramie jasności?

Wdrożenie na ANSI-C może wyglądać tak:
char próby \u003d 0; Znak; Podczas (próby ++ 15) Out \u003d 15; // Górna połowa zakresu odpowiada maksymalnej jasności

Możesz dowiedzieć się, jak wiele prób? Według statystyk, podziel się a \u003d 0,25. Wszystkie numery muszą być wyrzucane i ponownie wygenerowane. Prawdopodobieństwo n. Próby nie zostaną wybrane "poprawne" numer, równy n..
n \u003d 1 0,25 n \u003d 2 0,0625 N \u003d 3 0,015625 n \u003d 4 0,003906

Proporcja nienormalnie niskich poziomów jasności jest 13/3600=0,0036 Co jest dobrze zbiegło się z opcją n \u003d 4.. W ten sposób, Max_attices \u003d\u003d 4..

Zauważ, że więcej. prosta decyzja Łatwo byłoby użyć wartości z poprzedniej klatki, jeśli nieważny numer spotkał się. Ta opcja może być wykluczona na podstawie autokorelacji (patrz poniżej). Najprostszym, prawdopodobnie rozwiązaniem jest zmianę schematu Phim - nie był tutaj używany.

Ostatni kawałek układanki jest sam generator liczby losowej. Typowy sposób generowania losowych sekwencji w obwodach cyfrowych jest użycie rejestrów ścinających z liniową informacją zwrotną. Taki rejestr wydaje pseudo-losową sekwencję ugryzienia, która powtarza nie później niż przez 2 x -1. zegary, gdzie. x. - Wyładowanie rejestru. Jedną z cech takich sekwencji (i dobre pseudo-losowe sekwencje jako całość) jest to, że ich funkcja autokorrelacji jest równa tylko w punkcie 0 iw współrzędnych, wiele długości sekwencji. We wszystkich innych odstępach czasu jest zero.


Obliczyłem autokorelację całej sekwencji wartości. Samopodobność nie została znaleziona do 3500 klatek (wykres powyżej pokazuje tylko 1200), co oznacza wyjątkowość migotania przez co najmniej 4 minuty. Nie jest jasne, czy zaobserwowano dalsze powtórzenie sekwencji, lub analizator logiczny autora po prostu nie pozwolił na nagrywanie dłużej - około. Tłumaczyć Ponieważ każda ramka wymaga co najmniej 5 bitów losowych danych (i biorąc pod uwagę mechanizm odrzucania niechcianych liczb - jeszcze więcej), sekwencja pseudo-losowa ma długość co najmniej 17500 bitów. Wymaga to rejestru rozładowania co najmniej 17 lub prawdziwego generatora sprzętu liczb losowych. W każdym przypadku jest to interesujące, ile uwagi, gdy rozwijała, została powtórzona, że \u200b\u200bfilm błyskawicy został powtórzony.

Podsumowując, odpowiem na pytania zadawane na początku artykułu. Mimagering LED okazał się znacznie bardziej skomplikowany niż się spodziewałem (nie spodziewałem się spędzić 4 godziny na niego). Wiele realizacji świec mikrokontrolerów świec służy po prostu bity z generatora liczb pseudo-losowej na wyjściu PWM. Zakupiona dioda LED wykorzystuje bardziej przebiegły algorytm zmiany jasności. Oczywiście pewna uwaga została wypłacona na rozwój algorytmu, a kryształ jest prawie minimalnie możliwy. Udział pamięci nie jest wydawany na próżno.

Jaki jest najlepszy algorytm migotania? Czy to możliwe, aby to poprawić?

Suplement: W końcu znalazłem czas, aby napisać emulator. Napisany w programie ANSI-C emulujący zachowanie tej diody LED,

Piszemy pierwszy program!

Najbardziej zaczyna się od migających diod LED, a nie jesteśmy wyjątkiem. Jeśli mikrokontroler, nawet najszybszy, nie "komunikowanie się" ze światem zewnętrznym, jego wartość jest zmniejszona do zera. Potrzebujemy mikrokontrolera do wprowadzenia informacji, przetwarzanych zgodnie z danym algorytmem i wydał wynik w formularzu zrozumiałym.

Algorytm, (W imieniu Perskiej Matematyki Al-Khorezmi) - dokładny zestaw instrukcji opisujących procedurę działań wykonawcy, aby osiągnąć wyniki rozwiązania problemu przez pewien czas.
Aby poprawnie pisać programy, musisz zrozumieć, jak działa mikrokontroler, co zrobimy, ale nadal tworzą pierwszy program na asemblerze.

Ogólnie rzecz biorąc, możesz napisać program w dowolnym edytor tekstuTak jak na przykład napisać list do znajomego. Następnie tekst musi być skompilowany (czasami mówią - zmontowane) I.e. Przetłumacz na kształt, zrozumiały procesor. Wcześniej rozszerzenie pliku tekstowego.txt zmieniono przemieszczone i przetworzone program specjalny, zwany kompilatorem. Istotą pracy kompilatora jest przetłumaczenie znaków pisemnych, które są jasne dla ludzi w kodzie maszyny (w kodzie zerule i jednostki) i tworząc nowy plik z rozszerzeniem. Hex

Co z tym zrobić. Plik sześciokątny? I to jest potrzebne dla programisty do rejestrowania kodu programu w pamięci ROM (stałe urządzenia do przechowywania danych) mikrokontrolera. Użyjemy programu zamiast programatora Odmieniec.który moduluje prawdziwy obwód roboczy.
W AVR Studio 5. Redaktor, kompilator, debuger i programator w jednej butelce!

Dyrektywa - To jest recepta redakcji, z którym będziemy pracować. W większości nazwa dyrektywy i jego funkcja w różnych redaktach pokrywa się. Na przykład, jeśli porównujesz edytor MPLAB IDE. Dla mikrokontrolerów PIC, praktycznie nie ma różnicy!
Ale zespoły są wyróżnione. Lista poleceń jest utworzona przez producenta i do pewnego stopnia zależy od technologii produkcji. Nawet jeden producent w różnych rodzinach może mieć inną listę zespołów, ponieważ zmieniają strukturę.
Zespół- Jest to jednofunkcyjny, z którym możemy kontrolować mikrokontrolera.
Program- Jest to sekwencja rozkazów odpowiadających konkretnym algorytmem (przygotowanym przez nas).
Każdy program zaczyna się „czapki”, gdzie podstawowe funkcje programu są wymagane, jego autor, nazwa sterownika, który będzie używany, częstotliwość zegara i innych danych. "Czapka" to "zasada dobra ton" w programowaniu.
Zwykle plik inicjalizacji jest przepisywany w "Czapka" .inCludeHxhxdef.inc. Dyrektywa.Device,. Lista, .nolist i inne.
W AVR Studio 5. Te dyrektywy są domyślnie przepisywane. W poprzednia wersja AVR Studio 4. Te dyrektywy potrzebne do przepisywania, więc zostawiłem je w formie komentarzy.
Komentarze są napisane arbitralnie, jak chcesz, a co najważniejsze, aby pozostają nienaruszone dla ciebie. Często, z powodu niekompletnych komentarzy, po określonym czasie, sam autor nie może dowiedzieć się program. Przed komentarzami umieść znak (;).
Wprowadziłem "czapkę" zaproponowaną przez Johna Mortona ...

Redaktor Avr Studio 5 - Rozumieją pisemne, dyrektywy i zespoły podkreślające je w niebieskich, danych numerycznych pozostają czarne, niezrozumiałe wyrażenia podkreśla czerwone, komentarze na zielono.

Przed rozpoczęciem napisz coś, aby wziąć pod uwagę dyrektywy asemblera mikrokontrolery AVR..
Przed każdą dyrektywą jest punktem:
Dyrektywa Opis.Byte Bujte bajty w Ram.CSEG Segment Program.db Zdefiniuj bajt - stała w pamięci flash lub EEPROM .Def przypisuje nazwę symboliczną .Device definiuje urządzenie, dla którego program jest kompilowany W pamięci flash lub EEPROM .endm End Macro.endeMacro End of Macro.EQUIN Zainstaluj Permanent Expressions.SEG Segment Eeprom .exit Exit file.Include, aby zainwestować kolejny plik Wyłącz listę generacji.org Ustaw pozycję w segmencie. Zestaw do zmiennej ekwiwalentu wyrażenia

Pełny opis Dyrektywy zespołu i asemblera w tłumaczeniu rosyjskim Ruslana Shimkevich. Możesz tu zobaczyć:
🕗 24/09/11 ⚖️ 397,28 KB ⇣ 244 Witaj, czytnik! Nazywam się Igor, mam 45 lat, jestem syberyjskim i zapalonym e-mailem. Wymyślałem, stworzone i zawierałem tę wspaniałą stronę od 2006 roku.
Od ponad 10 lat nasz magazyn istnieje tylko do moich funduszy.

Dobrze! Halyawa się skończyła. Chcesz pliki i przydatne artykuły - pomóż mi!

--
Dziękuję za uwagę!

Wrócimy więcej niż po raz kolejny do dyrektyw asemblera, a teraz spróbujemy napisać mały tekst programu, gdzie będziemy włączyć diody LED.
Dla wygody wybierz mikrokontroler ATTINY2313A.. Jeśli ktoś przejdzie i będzie eksperymentować w "sprzęcie", sterownik ten jest jednym z najbardziej dostępnych, bardzo często stosowanych w różnych projektach, które można znaleźć w niekończących się przestrzeniach sieci.

--
Dziękuję za uwagę!
Igor Kotov, redaktor naczelny magazynu "Datgorod"


Musisz tylko rozpakować i zacząć go (pod warunkiem Odmieniec.już zainstalowane).
Powinien być taki obraz:

Początek AVR Studio 5.A w edytorze napiszemy mały program ze szczegółowymi komentarzami:
.Def temp \u003d r16; Cesjonariusze Directive.Def zarejestrować R16 TEMP; \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d; Program startowy.CSEG; Dyrektywa. CSEG określa początek segmentu, w którym będzie się znajdować; Główny kod programu. W AVR Studio 5 nie jest to dyrektywa; Obowiązkowy .org 0; Początek pierwszego rzędu programu startu RJMP; Względne przejście do etykiety startowej (na zdjęciu jest zgodne; polecenie goto); \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d. \u003d\u003d Start: Ser Temp; Ustawia wszystkie bity rejestru Temp w 1 DDRB, temp; Tłumaczy wszystkie bity DDRD, TEMP; Port B i D do wyjścia CLR TEMP; Zresetuj rejestr Temp (Ustawia wszystkie bitów Rejestracji Temp w 0) Out PortB, Temp; Wyłącza rezystory do napinania Portudd, temp; Porty B i D CICLE: LDI TEMP, 0B11001100; Obejmuje portb, diody LED TEMP; Port B RJMP Cicle; Wróć do etykiety Cicle, zapętlona

Skompiluj go, klikając F7
W oknie Output pojawi się informacja o kompilacji, w końcu nie musi być napis produkcji udało, co potwierdza udany montaż. Plik HEX.


Ten domyślny plik jest opublikowany w moich dokumentach, w projekcie AVR Studio 5.

Idź do B. Odmieniec.Kliknij na rysunku regulatora i wprowadź ścieżkę gdzie jest plik HEX.:




Uruchom emulację programu.
Po naciśnięciu przycisku Start widzimy wynik!



Aby zatrzymać emulację - kliknij przycisk Stop.
Jeśli miga mikrokontrolera przez programistę i zebrać schemat, wtedy wynik będzie taki sam.

Spróbujmy dowiedzieć się, z programem:

Linia:
.Def temp \u003d r16; Dyrektywa.Def przypisuje się do rejestracji temp nazwy R16
Dla wygody przypisaliśmy nazwę temp do rejestru R16, oznacza to, że w dowolnym miejscu programu, podczas pisania słowa Temp, program będzie dostęp do rejestru R16.
Co to jest rejestr - R16?
Odnosi się do rejestrów ogólny cel, Które są określane jako R0 ... .R31, to znaczy są one tylko 32 do 8 bitów. Druga połowa rejestrów ogólnego przeznaczenia R16 ... R31 wykonuje tymczasową funkcję pamięci (jako baterie, może otrzymać i może dać informacje do porównania - sterowniki PIC są tylko jedna bateria w). Ostatnie 6 rejestrów ogólnego przeznaczenia są warunkowo połączone w trzech 16-bitowych:

Należy pamiętać, że najstarszy bajt jest napisany wcześniej, najmłodszy później.

r27: R26 nazywa się rejestrem X,
r29: R28 nazywa się rejestrem Y,
r31: R30 nazywa się rejestrem z
Program będzie również działał, jeśli słowo TEMP jest przypisane do dowolnego innego rejestru ogólnego przeznaczenia z R16 do R31 na przykład .def Temp \u003d R20. Po kompilacji (klucz F7 w studio AVR 5), nie ma różnicy w programie.
(Możesz spróbować, teraz wiesz, jak to zrobić!)

Linia:
.CSEG; Dyrektywa.CSEG określa początek segmentu, w którym znajduje się główny kod programu
W AVR Studio 5 niniejsza dyrektywa jest domyślnie przepisywana.
W mikrokontrolerrach AVR, różne obszary pamięci są przydzielane do przechowywania kodu programu, danych w pamięci stałej lub EEPROM, istnieją katalogi do oznaczenia tego obszaru:
.CSEG - Segment oprogramowania
.dseg - segment danych
.SEG - Segment EEPROM

Linia:
.org 0; Początek pierwszej linii programu
Program rozpoczyna się od linii określonej dyrektywy.org, a po zakończeniu zostanie zwrócona do niego.

Linia:
Start RJMP; Względne przejście do etykiety startowej (PIC spotyka polecenie Goto)
Jest to względne przejście do etykiety startowej.
Program jest wykonywany sekwencyjnie od górnej części odpływu do dołu. Jeśli chcesz przejść do innego obszaru programu, polecenie RJMP jest używane.

Wydziwianie:
Ser Temp; Ustawia wszystkie bity rejestru Temp w 1 CLR TEMP; Usuwa rejestr temp (Ustawia wszystkie bity rejestru TEMP w 0)
Polecenie SER jest wykonywane z rejestrami R16 ... R31, a polecenie CLR można wykonać do wszystkich rejestrów, w tym rejestry we / wy (rejestry celowe). Wyznaczanie tych rejestrów będziemy wyglądać później.

Linia:
LDI TEMP, 0B11001100
Polecenie LDI jest rejestrowane w rejestrze TEMP Numer binarny 11001100 (nie będzie błędu, jeśli zamiast 0B11001100 pisz 204 lub CCH, w jednym przypadku w postaci dziesiętnej w drugiej w szesnastce)

Linia:
Out ddrb, temp
Polecenie OUT Wyświetla wartość rejestru TEMP do rejestru portu DDRB.

Jaki jest port i jak to działa?

Jeśli uproszczysz się do minimum, port może być reprezentowany jako wyjściowy z mikrokontrolera, do którego w trybie wyjściowym można dowolnie przesłać napięcie lub wyłączanie, aw trybie wejściowym możliwe jest określenie Jeśli pojawi się napięcie z zewnątrz lub nie.
Istnieją trzy tryby pracy portów: Ten wyjście, stan wejściowy i odłączony.
Zarządzaj portami PinX, PortX, rejestry DDRX.
X - oznacza port, który zarządza te rejestry.
Rejestr DDRX Steruje trybami we / wy jako przekaźniki - włączone (nagrane 1) - podłączone do linii wyjściowej, wyłączone (nagrane 0) - przełączone do linii wejściowej (domyślnie).

Aby wyświetlić dane w Port X, potrzebujesz rejestru DDRX, aby przełączyć się na tryb wyjściowy (Drukuj 1) i wyślij dane do rejestru PortX.
można odczytać wartość portu x, jeśli DDRX zarejestrować przełącznik trybu wejściowego (przepisać 0) z rejestru pinx. Aby połączyć pull-up rezystory w trybie wejściowym, trzeba wysłać dane do Portx.
Rezystory dokręcające Wyeliminuj nas z konieczności podłączenia zewnętrznych rezystorów do drutu dodatnich iz pomocą jednego polecenia podawanego przez jednostkę logiczną do wejścia.

Głosowanie do czytania.

Artykuł zatwierdzony 23 czytelnikami.

Aby wziąć udział w głosowaniu, zarejestruj się i zaloguj się z loginem i hasłem.

Artykuł rozważy podłączenie diody LED do mikrokontrolera, pracując z portami i zapisując program na C. Artykuł jest przeznaczony przede wszystkim dla początkujących, którzy wzięli tylko mikrokontrolery AVR.

Najpierw musisz wybrać mikrokontroler. W moim przypadku jest atmega8535. W takim przypadku mikrokontroler można przyjmować, ponieważ to zadanie Łatwo zaimplementowany pod dowolnym MK. Możesz napisać program do mikrokontrolera na asembler, C, Pascal-E i Bascom. Użyłem języka C, wszystkie te języki są różne.
Poniżej znajduje się określona różnica między SI a Pascalami.

// migająca dioda brak główna () (DDRB \u003d 0B11111111 // porty ustawione B do PORTB \u003d 0B111111111); // Dodać opóźnienie 100 ms))

Program pierwszy; Rozpocznij DDRB: \u003d $ FF; // Ustaw port B do wyjścia portowego: \u003d $ FF; // Domyślnie nic nie świeci while (1) należy rozpocząć PORTB: \u003d nie (PORTB); // Przełącz stan LED do odwrotnej opóźnienia_ms (100); // wykonaj mały koniec opóźnienia; koniec.

Lista elementów radiowych

Przeznaczenie Typ Nominalny numer UwagaWynikMój notebook
U1. MK AVR 8-bit

Atmega8535.

1 W notebooku.
R1-R8. Rezystor

220 omów - 1 com

8 W notebooku.
R9-R11. Rezystor

10 Com.

3 W notebooku.
V1-V8. Dioda LED 8 W notebooku.
Przycisk zegara 3

Pisząc program, często konieczne jest, aby utworzyć pewien odstęp czasu między poszczególnymi zespołami. Wizualny przykład może służyć jako girlanda, w której żarówki świecą w pewnej sekwencji przez odstępy czasu. W naszym przypadku, aby wskazać czas opóźnienia, użyjemy migająca dioda LED, a lepiej dwa i różne kolory. Będziemy kontrolować czas włączenia i wyłączenia ich, to znaczy zmienić częstotliwość miga.

Większość poleceń mikrokontrolery AVR są wykonywane w jednym zegar generatora częstotliwości zegara. Co jest szeroko stosowane przez łańcuch RC osadzony w MK lub podłączyć rezonator kwarcowy do wniosków XTal1 i XTal2.

Na przykład, jeśli MK działa z częstotliwością 1 Hz, to jedno polecenie zostanie wykonane w ciągu jednej sekundy

Domyślnie ATMEGA8 MK jest zaangażowany w własny wewnętrzny generator częstotliwości, lub raczej łańcuch RC, który działa w częstotliwości 1000 000 Hz \u003d 1 MHz. Dlatego czas wykonania jednego polecenia jest:

Z tego wynika, że \u200b\u200bjeśli piszemy dwa drużyny z rzędu, z których każdy będzie pływać oddzielną diodę LED, wtedy zobaczymy, że oboje oświetliły się w tym samym czasie.

#Zawierać.

int main (void)

Ddrd \u003d 0B000000011;

podczas gdy (1)

Portd \u003d 0B000000001; // Zastosuj do pierwszej diody LED

Portd \u003d 0B000000010; // opłata w drugiej diody LED

Ale w rzeczywistości druga dioda LED świeci się z różnicą czasu 0,000001 sekund od pierwszego. Nasze oczy nie widzą tak małej różnicy czasu. Już przy częstotliwości obrazu ponad 24 Hz (t \u003d 1/24 ≈ 0.042 C), nasza wizja tworzy ciągłą folię z indywidualnych zdjęć. Dlatego w większości przypadków nie rozróżniamy 25. ramy.

Aby oba diody LED zapalają się z różnicą czasu 0,5 sekundy, konieczne jest pomiędzy odpowiednimi dwoma poleceniami (Portd \u003d 0B000000001; i Portd \u003d 0B000000010;) umieścić kolejne 500 000 pustych pustych poleceń, tj. W celu zmuszenia MK Połowa IM wykonać wszelkie przydatne działania. Albo, jak mówią, musisz "zabijać" 500 000 zegarów. Jeśli kod zostanie zapisany na asemblerze, programistom używają różnych cykli, które "jedzą" pewną liczbę zegarów, a tym samym uzyskać różne odstępy czasu.

#Zawierać.

int main (void)

Ddrd \u003d 0B000000011;

podczas gdy (1)

Portd \u003d 0B000000001; // Zastosuj do pierwszej diody LED

Aby uzyskać opóźnienie 0,5 sekundy, musisz tu wstawić

500 000 pojedynczych poleceń.

Portd \u003d 0B000000010; // Zastosuj moc 2nd

Funkcjonować _delay_ms () I migająca dioda LED

Podczas pisania kodu na C w studiu Atmel znajduje się bardzo wygodna funkcja. _delay_ms.(). Aby pracować tej funkcji, musi być wstępnie podłączony przez dyrektywę przedprocesora .

W nawiasach tej funkcji można ustawić czas w milisekundach, a następnie musisz nagrywać MS przed nawiasami lub mikrosekundami - USA:

Podczas korzystania z tej funkcji, tak że Atmel Studio nie daje żadnych alertów podczas kompilowania ATMEL Studio, należy zadeklarować częstotliwość za pomocą operatora #Define. Ponieważ domyślnie dla Atmega8 wynosi 1 000 000 Hz, zadeklarujemy tę wartość. Odbywa się następna linia:

#Definiować F_cpu. 1000000ul.

W przyszłości, gdy podłączamy rezonator kwarcowy do MK, bez tej linii nie jest już gotowy. Struktura pozostanie taka sama, tylko zamiast 1 000 000 będzie musiała nagrać częstotliwość rezonatora kwarcowego.

Poprawmy nasz program, dzięki czemu jedna dioda LED po raz pierwszy, potem po pół sekundie, poszedł, a potem na pół najgorsze spojrzał na drugie i ponownie w 0,5 s Gully.

# definiować.

Spójrzmy ponownie na kod powyżej. Jeśli musimy zmienić wartość opóźnienia czasu w funkcji _ oPÓŹNIENIE. 500, na przykład 300, musimy znaleźć wszystkie wiersze ze swoją nazwą i wykonać odpowiednią wymianę. Teraz wyobraź sobie, że setki takich rzędów, a nawet tysiąca. Zmień wartość każdej liczby oddzielnie jest niezwykle niewygodne i długie. Ponadto można przypadkowo pominąć ciąg. Dlatego konieczne jest stosowanie innego, wygodnego i praktycznego podejścia.

Istnieje kilka takich podejść. Najłatwiej jest zadeklarować zmienną i przypisać go żądaną wartość. Następnie zmienna ta jest podstawiona w odpowiednich funkcjach. To dobry sposób. W przyszłości rozważymy to bardziej szczegółowe. Teraz przyjrzymy się jeszcze lepiej!

Za pomocą operatora #define przypisujemy wartość liczbową dowolnej nazwy. Ta nazwa jest nazywana stały. W przeciwieństwie do zmiennej, stała nie może się zmienić w programie. To wygląda tak:

#Define MIG 300.

_ oPÓŹNIENIE._ sM.(MIG);

Nazwa stałej można określić przez prawie dowolną, używając znaków łacińskich i numerów. W tym przypadku nazwa MIG mówi, że stosujemy opóźnienie za chwilęannia diody LED.

Po ciągach z dyrektywą preprocesor #define nie jest umieszczony. Między nazwą stałej a wartością liczbową jest luka.

Ten ciąg działa w następujący sposób. Przed rozpoczęciem kompilacji liczba 300 wszystkich stałych o nazwie MIG jest wykonywana.

#Definiować i rejestruje

Ponadto operator #Define jest dobry, że można ustawić nazwy rejestrów. Na przykład, jeśli połączymy się z portem LEDS D, a następnie zamiast portd, możemy się spalić, na przykład VD:

#DEFINE VD Portd.

VD \u003d 0B00000001;

Przepiszmy program za pomocą dyrektywy #Define:

#Definiować F_cpu. 1000000ul.

#Zawierać.

#Zawierać.

Dodano: 06.28.2017 o 13:00

W tym przykładzie będziemy napisać nasz pierwszy program SI dla mikrokontrolera attiny13. Zakłada się, że już przygotowaliśmy do pracy wszystko, czego potrzebujesz: środowisko rozwojowe, kompilator itp. Będę miał odpowiednio samodzielnie debugowanie zarządu, każdy kod zostanie złożony.
Tak jak program testowy Piszemy klasyczny, najprostszy przykład "mrugania", który miga diodę LED z pewną częstotliwością.

Więc utwórz nowy projekt i kontynuuj. Dam natychmiastowy kod programu natychmiast, a następnie wyjaśnię wszystko bardziej szczegółowo:

/ * * Tiny13_board_blink * Oprogramowanie demo-oprogramowania debugowania na Attiny13 * W celu weryfikacji wydajności MK. * Migająca dioda LED. * / #define f_cpu 1200000ul // Wskazać częstotliwość zegara MK #Define LED PB2 // Użyj LED podłączony do PB2 (7 PIN) #include // Podłącz definicje we / wy #include // Podłączymy bibliotekę głównych funkcji opóźnienia (Void) (// DDRB LED | \u003d (1<

Na samym początku określamy stałe wartości i podłączamy pliki nagłówkowe i biblioteki.
Plik aVR / IO.H. Podłącza definicje wejścia / wyjścia dla określonego typu mikrokontrolera (typ MK jest określony jako opcja dla kompilatora).
Biblioteka util / opóźnienie.h. Łączymy do korzystania z funkcji opóźnienia w naszym przypadku: _delay_ms (). Aby uzyskać funkcjonowanie funkcji opóźnienia, musimy określić częstotliwość zegara procesora. w związku z tym PRZED Znajomości util / opóźnienie.h. Określ stałą F_cpu. (W tym przypadku 1,2 MHz).

Wtedy mamy główną funkcję główny. - To jest w rzeczywistości ciało naszego programu. Tutaj musimy, najpierw opisać wszystkie działania, które wystąpią, gdy uruchomi się mikrokontroler, a następnie w nieskończonej pętli, uruchom wykonywanie programu głównego:

podczas (1) (...)

Aby rozpocząć, musimy skonfigurować port I / O. W MK AVR starszych modeli portów w / w może wynosić kilka (A, B, C, D). Każdy port może być podłączony do ośmiu nóg. Każda z nóg może być skonfigurowana zarówno na wejściu, jak i wyjściu. Attiny13 ma tylko jeden port (b), do którego podłączony jest sześć nóg (PB0-PB5, patrz arkusz danych). Domyślnie wszystkie nogi są skonfigurowane do wejścia i kontrolować LED, musimy użyć odpowiedniej nogi jako wyjścia. W mikrokontrolerrach AVR cały sprzęt jest skonfigurowany przez rejestry osiem bitów. Kierunek (wejście) jest ustawione przez rejestry DDRX (gdzie X jest listem portowym w naszym przypadku b). Wartość bitowa "0" - odpowiada wejściu, "1" - wyjście. Tak więc, aby użyć nogi PB2 jako wyjścia, musimy ustawić drugi bit rejestru Ddrb. Jednostka:

Ddrb | \u003d (1<

Rejestry PortX są zaprojektowane do zarządzania stanem wyjściowym. Na przykład, aby wyłączyć dioda LED podłączona do nogi PB2 (złożyć niski poziom sygnału), musimy nagrywać zero w drugim bit rejestru Portb.:

Portb & \u003d ~ (1<

Aby włączyć (prześlij wysoki poziom sygnału) - odpowiednio napisz jednostkę:

Portb | \u003d (1<

Teraz ten port w / w jest skonfigurowany, uruchomimy główny cykl, w którym odwrócimy stan wyjściowy PB2 (zmienną poziom wysokiego i niskiego poziomu sygnału) z opóźnieniem 500ms. Tak więc dioda LED błyska z częstotliwością 1 raz na sekundę.

Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu