Spisu treści:
- Krok 1: Urządzenie wejściowe
- Krok 2: Migające światła dla sygnału
- Krok 3: Drobna dygresja na temat debugowania
- Krok 4: Więcej debugowania
- Krok 5: Używanie timera/licznika 0 dla sygnałów dźwiękowych
- Krok 6: Konfiguracja timera/licznika 0
- Krok 7: Korzystanie z czterech przełączników
- Krok 8: Korzystanie z konstrukcji przełącznika/obudowy
- Krok 9: Wniosek
Wideo: Czytanie przełączników za pomocą ATtiny2313: 9 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:33
Istnieje kilka instrukcji dotyczących wyjść z ATtiny2313 i podobnych urządzeń AVR. Na przykład https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Silnik-z-AVR-Mikroprocesorem/. Pracując nad najnowszym programem The Real Elliot, który pokazał, jak sterować silnikami krokowymi, stwierdziłem, że bardzo pomocne byłoby uruchamianie alternatywnych sekcji kodu w tym samym programie, dzięki czemu nie musiałem przeprogramowywać ATtiny2313 za każdym razem czas chciałem wypróbować niewielką odmianę kodu (taką jak pół-krok lub bieg wsteczny). Chociaż łatwo jest napisać kod za pomocą instrukcji switch/case, aby umożliwić wybór alternatywnych odmian, potrzebny jest pewien sposób wyboru przypadku. Oznacza to, że trzeba odczytać jakieś urządzenie wejściowe, aby sterować obudową. Na szczęście ATtiny2313 ma mnóstwo pinów I/O i jest dobrze zaprojektowany do odczytu wejść z przełączników. Ta instrukcja pokaże, jak czytać dane wejściowe i podejmować decyzje na podstawie ich stanu. Ponieważ samo to byłoby dość nudne, instruktażowe, wyjaśnię prosty sposób wykorzystania funkcji timera/licznika ATtiny2313 do napędzania małego głośnika jako brzęczyka. Będzie też mała dygresja na temat prostych technik debugowania.
Krok 1: Urządzenie wejściowe
Ten Instructable opiera się na doskonałej pracy The Real Elliot i używa opisanego przez niego systemu rozwoju ATtiny2313 Ghetto. Arkusz danych ATtiny2313 firmy Atmel jest ostatecznym punktem odniesienia dla wszystkich funkcji, ale niekoniecznie jest łatwy do odczytania. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Link zawiera wszystkie arkusze danych AVR, znajdź 2313.) Rysunek przedstawia prosty zestaw przełączników wejściowych. To po prostu pakiet czterech włączników/wyłączników; znane również jako jednobiegunowe, jednokierunkowe przełączniki (SPST). Zazwyczaj jedno połączenie lub biegun każdego przełącznika jest połączone z ziemią, podczas gdy drugie połączenie jest przeciągane wysoko przez rezystor ograniczający prąd (10K lub więcej). Wejście mikrokontrolera jest połączone z biegunem z rezystorem. Jeśli przełącznik jest otwarty, mikrokontroler odczyta wejście jako HI. Jeśli przełącznik jest zamknięty, mikrokontroler odczyta wejście LO. Szczegółowe informacje można znaleźć na schemacie. ATtiny2313 upraszcza to, zapewniając programowalne rezystory podciągające na pinach we/wy, gdy są one skonfigurowane jako wejścia. Oznacza to, że przełączniki mogą po prostu mieć jeden biegun podłączony do uziemienia (LO), a drugi biegun podłączony do wejścia procesora. Pierwszy przykład pokazuje tylko dwa przełączniki. Przełączniki są odczytywane i konfigurowane za pomocą następującego kodu. Skonfiguruj przełączniki jako wejścia: (Kod nie jest wymagany; jest to ustawienie domyślne.)Włącz rezystory podciągające: PORTB = _BV(PB0) | _BV(PB1);Odczytaj wejścia: but1 = ~ PINB & 0x03; Zwróć uwagę na użycie inwersji i maskowania, aby uzyskać poprawną wartość.
Krok 2: Migające światła dla sygnału
Użyjemy tych dwóch przełączników, aby mrugnąć diodą LED programowalną liczbę razy. Diody LED, których użyjemy, będą migającymi światłami, które rozsławił The Real Elliot. Przełączniki 1 i 2 będą traktowane jako dwie cyfry binarne, więc kombinacja może reprezentować liczby 0, 1, 2 i 3. Nasz program odczyta oba przełączniki i zaświeci diodę odpowiednią ilość razy, ale tylko wtedy, gdy przełącznik ustawienia uległy zmianie. Przełączniki są usuwane przez 500 milisekund (niezoptymalizowane). Algorytm odbicia jest dość prosty. Przełączniki są odczytywane i odczyt jest odnotowywany. Jeżeli jest różna od wartości oldBut (ostatnia zapisana wartość), to program zostaje opóźniony o 500 milisekund i przełączniki są ponownie odczytywane. Jeśli wartość jest taka sama jak poprzednio odczytana, wartość oldBut zostanie zaktualizowana, a dioda LED zamiga tyle razy, ile wynika z wartości binarnej dwóch przełączników. Zwróć uwagę na odwrócenie wartości, ponieważ przełącznik, który jest "włączony", czyta LO. Przełączniki będą stale skanowane pod kątem dalszych zmian. Aby dowiedzieć się więcej o migających światłach, zapoznaj się z wcześniejszymi instrukcjami The Real Elliot. Zajrzyj na ten https://www.ganssle.com/debouncing.pdf, aby dowiedzieć się więcej o odrzucaniu przełączników. Oto kod ATtiny2313 dla tego przykładu. Podczas pracy ten program mignie dwukrotnie diodę LED na PB4 (fizyczny pin 8), aby pokazać, że jest zainicjowany. Następnie odczyta przełączniki jeden i dwa i zamruga od jednego do trzech razy w zależności od ustawienia przełącznika za każdym razem, gdy zostaną zmienione. Gdy przełączniki się nie zmieniają, dioda LED będzie powoli migać. Aby uruchomić ten kod, utwórz nowy katalog (nazwij go "Basic", jeśli chcesz) i pobierz do niego następujący plik kodu C i makefile. Zmień nazwę Makefile1.txt na Makefile. Używając WinAVR, skompiluj program i załaduj go do ATtiny2313.
Krok 3: Drobna dygresja na temat debugowania
Jeśli jesteś podobny do mnie (i każdego innego programisty na świecie), prawdopodobnie doświadczyłeś sytuacji, w których „bezbłędny” kod, który starannie wpisałeś i skompilowałeś, nie robi tego, czego oczekujesz. Może po prostu nic nie robi! Więc w czym problem? Jak się dowiesz? Na szczęście istnieje kilka podejść do działania. (Pobierz tę książkę, aby uzyskać doskonałe omówienie tematu debugowania. https://www.debuggingrules.com/) Chciałbym przedstawić kilka prostych sugestii dotyczących tematu debugowania aplikacji mikrokontrolerów. co wiesz. Jeśli raz uruchomiłeś migające światło, użyj go ponownie, aby zobaczyć, gdzie jesteś w swoim programie. Lubię, gdy dioda LED mignie dwa razy, aby zasygnalizować rozpoczęcie programu. Możesz umieścić kod, aby zrobić to początkowo na początku programu. Gdy już wiesz, że nic nie jest nie tak z twoim sprzętem, utwórz funkcję migania. Oto funkcja, której używam./*------------------------------------------ ------------------------------** blinkEm - funkcja migania diody LED za pomocą PD4** PD4 musi być skonfigurowane jako wyjście. **------------------------------------------------ ---------------------*/unieważnij blinkEm(uint8_t licznik){ while (liczba > 0){ PORTD = _BV(PD4); _delay_ms(1000); PORTD = ~_BV(PD4); _delay_ms(1000); liczyć--; }} Teraz można używać tej funkcji w różnych punktach kodu jako sygnału, że kod został wykonany tak daleko. Wiedza, że kod jest uruchomiony, oznacza, że możesz dokładnie sprawdzić każdą sekcję, która została uruchomiona, ale nie zrobiła tego, czego oczekiwałeś, aby znaleźć błędy. Zmiana jednej rzeczy na raz jest również kluczową techniką debugowania (opisaną w powyższym odnośniku). Ta klasyczna metoda działa w połączeniu z „dziel i rządź”: podejmowanie małych kroków w celu stopniowego dodawania funkcjonalności. Może się to wydawać powolnym podejściem, ale nie jest tak powolne, jak próba debugowania dużej części niedziałającego kodu naraz.
Krok 4: Więcej debugowania
Wiele razy chcemy sprawdzić fragment kodu, pomijając większość zawartych w nim wierszy, a następnie włączać je pojedynczo, gdy sprawdzamy, czy każdy z nich działa. Zazwyczaj robimy to poprzez „komentowanie” wierszy, które chcemy pominąć. Rozszerzeniem tej techniki jest wycinanie i wklejanie bloku kodu, skomentowanie oryginału (abyśmy go nie zgubili) i złamanie kopii. C ma cztery proste sposoby komentowania wierszy. Umieszczenie "//" przed wierszem komentuje ten wiersz. Zamknięcie jednego lub więcej wierszy w "/*" i "*/" spowoduje wykomentowanie całej sekcji. Aby ta metoda działała efektywnie, w bloku kodu nie może być żadnego innego znaku „*/” (poza końcowym). Tak więc skuteczną dyscypliną jest używanie // dla komentarzy w blokach kodu i zarezerwowanie konstrukcji /* */ dla bloków komentarzy i komentowania sekcji kodu. Umieszczanie "#if 0" na początku bloku w celu wykomentowania i kończąc sekcję "#endif". Bardziej selektywne sterowanie jest możliwe przy użyciu "#ifdef (identyfikator)" na początku bloku i "#endif" na końcu. Jeśli chcesz, aby blok został skompilowany, użyj wcześniej w programie „#define (identyfikator)”. Zwróć uwagę, że cudzysłowy służą tylko do podkreślenia i nie należy ich umieszczać. Łączenie tych technik powinno zapewnić użyteczne podejście do debugowania programów ATtiny2313. Te narzędzia mogą okazać się przydatne, gdy przejdziemy przez tę instrukcję.
Krok 5: Używanie timera/licznika 0 dla sygnałów dźwiękowych
ATtiny2313 ma dwa potężne zasoby timera/licznika: jeden 8-bitowy i jeden 16-bitowy. Mogą być one skonfigurowane jako generatory częstotliwości, regulatory modulacji o zmiennej szerokości impulsów i wyjściowe rejestry porównawcze. Pełna ich funkcjonalność została opisana na 49 stronach karty katalogowej. Jednak użyjemy prostego przypadku. Tylko Timer/Licznik 0 (8-bitowy) będzie używany i będzie używany po prostu jako generator częstotliwości. Częstotliwość zostanie skierowana do małego głośnika, aby wyemitować sygnał dźwiękowy. Timer/Licznik 0 jest w pełni opisany na stronach 66 do 83 arkusza danych ATtiny2313. Uważne zapoznanie się z tym materiałem zapewni pełne zrozumienie funkcji Czas/Licznik 0. Na szczęście dość prosty tryb, Clear Timer on Compare (CTC), jest wszystkim, co jest wymagane do wygenerowania pożądanego sygnału dźwiękowego.
W trybie, którego użyjemy, działanie Timera/Licznika jest proste. Po wybraniu sygnału zegarowego licznik zaczyna od zera i zwiększa każdy impuls zegarowy. Gdy wartość licznika osiągnie wartość w rejestrze Output Compare (TOP), licznik zeruje się i zliczanie rozpoczyna się od nowa. Bit wyjściowy powiązany z Timerem/Licznikiem jest przełączany w celu wytworzenia fali prostokątnej. To bezpośrednio steruje przetwornikiem audio, aby wydać sygnał dźwiękowy. Mały przetwornik audio TDK generuje sygnał dźwiękowy. Odpowiednią jednostką jest Digikey 445-2530-ND, TDK SD1209T3-A1 (użyłem wczesnej wersji tego). To jest wersja 3 V; wersja 5 V również będzie działać, oczekuję. Napędzam to bezpośrednio z portu wyjściowego Attiny2313 i wydaje się, że działa dobrze. Sparkfun ma podobne urządzenie.
Krok 6: Konfiguracja timera/licznika 0
Tryb CTC może być używany do przełączania wyjścia OC0A na Pin 2, Port B (fizyczny pin 14). Aby włączyć wyjście na tym pinie, należy odpowiednio ustawić DDRB. Kod C do tego jest podobny do konfigurowania wyjścia dla migającego światła. DDRB = _BV(PB2); // Port B2 jest wyjściem. Następnym krokiem jest dostarczenie sygnału zegarowego i załadowanie wyjściowego rejestru porównawczego w celu wytworzenia kształtu fali jako częstotliwości. Równanie na wynikową częstotliwość podano w arkuszu danych (strona 72). Terminy w równaniu zostaną opisane poniżej. Oto równanie: fOC0A = fclk_I/O / 2*N*(1+OCR0A)Gdzie fOC0A:= częstotliwość wyjściowa fclk_I/O:= częstotliwość źródła zegara N:= współczynnik przeskalowania zegara OCR0A:= wartość na wyjściu rejestru porównawczego dla timera/ Licznik 0A. Clock Source Frequency, fclk_I/OJest to częstotliwość zegara systemowego. Domyślna wartość to 1 MHz. Bity CS00, CS01 i CS02 TCCR0B kontrolują ten wybór. Ponieważ te bity również wybierają wartość N, zostanie to opisane dalej. Wartość preskalowania, NN jest wartością używaną do dzielenia lub przeskalowania zegara systemowego. Bity CS00, CS01 i CS02 TCCR0B kontrolują ten wybór. Tabela 41 na stronie 81 karty danych ATtiny2313 opisuje kombinacje. Ponieważ pożądana jest częstotliwość bliska 1kHz, bity CS00 i CS01 TCCR0B zostaną ustawione. Zauważ, że ustawienie wszystkich trzech bitów na 0, a tym samym brak źródła zegara, skutecznie zatrzymuje wyjście. Jest to metoda, która będzie używana do uruchamiania i zatrzymywania sygnału dźwiękowego. TOP Value, OCR0ATa wartość jest najwyższą wartością licznika, który jest ładowany do rejestru Output Compare dla timera/licznika 0A. Po osiągnięciu tej wartości licznik zostanie zresetowany do zera i zliczanie rozpocznie się od nowa, aż do osiągnięcia TOP i powtórzenia cyklu. TOP można łatwo modyfikować, dzięki czemu można łatwo zmienić częstotliwość brzęczyka. Ponieważ pożądana jest częstotliwość zbliżona do 1kHz, TOP jest ustawiony na 7. (Zauważ, że preskaler mógł być ustawiony na 8, a TOP na 63. Ten sam wynik - twój wybór). in: fOC0A = 1 000, 000 / 2 * 64 * (1+7) fOC0A = 977HzWystarczająco blisko! Oto kod do załadowania rejestru porównującego wyjścia i rejestru sterującego licznikiem czasu 0B. Proszę zapoznać się z rzeczywistym kodem programu, aby zrozumieć, w jaki sposób są one używane. OCR0A = 7; // Wartość czasu TCCR0B = _BV(CS01) | _BV(CS00); // Wybierz zegar wewnętrzny & prescale=8 TCCR0B = 0; // żadne źródło zegara nie wyłącza tonu Ustawianie trybu zegara/licznika Na koniec określimy żądany tryb zegara/licznika, ustawiając odpowiednie bity w rejestrze sterującym zegara/licznika 0A. Tryb CTC jest wybierany przez ustawienie bitu WGM01 zgodnie z opisem w Tabeli 40, strona 79 arkusza danych. Ponieważ chcemy, aby wyjście przełączało się w każdym cyklu, bit COM0A0 również musi być ustawiony zgodnie z opisem w Tabeli 34 na stronie 77. Oto kod: TCCR0A = _BV(COM0A0) | _BV(WGM01); // Tryb przełączania CTC
Krok 7: Korzystanie z czterech przełączników
Wdrażając brzęczyk, rozszerzmy nasz sprzęt i oprogramowanie o obsługę czterech przełączników. Ponieważ wyjście licznika czasowego 0A znajduje się na porcie B, pin 2, nie możemy po prostu podłączyć kolejnych przełączników sekwencyjnie do portu B. Prostym rozwiązaniem byłoby użycie portu D, ale pozostawmy ten port dostępny dla innych funkcji (być może silnik krokowy). Podepnijmy więc dodatkowe przełączniki do PB3 i PB4. Odczyt przełączników w większości pozostaje bez zmian. Wartość maski jest zmieniana na 0x1B (00011011 binarnie), aby zamaskować bit 2 wraz z 5, 6 i 7. Jeszcze jedna sztuczka służy do utworzenia 4-bitowej liczby binarnej. Przesuń bity 3 i 4 w prawo o jeden bit i połącz je z bitami 0 i 1 w 4-bitową liczbę binarną. Jest to standardowa składnia C do przesuwania i łączenia bitów, ale może nie być dobrze znana nowicjuszom. but1a = (but1 i 0x03) | ((ale1 i 0x18) >> 1); // but1 ma przełącznik odczytu Podczas pracy program zamiga dwa razy i dwa razy wyda sygnał dźwiękowy, aby zasygnalizować inicjalizację. Za każdym razem, gdy przełączniki są zmieniane, numer, który reprezentują, zostanie wyemitowany. Gdy przełączniki się nie zmieniają, dioda LED będzie migać. Aby uruchomić ten kod, utwórz nowy katalog (nazwij go Beep, jeśli chcesz) i pobierz do niego następujący plik kodu C i makefile. Zmień nazwę Makefile2.txt na Makefile. Używając WinAVR, skompiluj program i załaduj go do swojego Attiny2313.
Krok 8: Korzystanie z konstrukcji przełącznika/obudowy
Ostatnim krokiem jest „tylko oprogramowanie”: zgodnie z obietnicą zaimplementujemy konstrukcję switch/case. Chociaż ten przykład pokazuje tylko dwie alternatywne akcje, powinno być bardzo jasne, jak użyć tej konstrukcji do wybrania jednej z kilku alternatywnych sekcji kodu. Podczas pracy ten program monitoruje przełączniki i jeśli nastąpi zmiana, wyda odpowiedni numer, jeśli jest nieparzysty; będzie migać, jeśli liczba jest parzysta. Nie robi nic, chyba że zmieni się przełącznik.
Aby uruchomić ten kod, utwórz nowy katalog (nazwij go Switch, jeśli chcesz) i pobierz do niego następujący plik kodu C i makefile. Zmień nazwę Makefile3.txt na Makefile. Używając WinAVR, skompiluj program i załaduj go do swojego Attiny2313.
Krok 9: Wniosek
Więc to jest to! Teraz wiesz, jak używać przełączników do kontrolowania wykonywania programu, wczytując je i wybierając akcję w oparciu o ustawienie przełącznika. Wiesz również, jak stworzyć sygnał dźwiękowy, a także nauczyłeś się strategii debugowania.
Jeśli chcesz sprawdzić swoje zrozumienie, spróbuj zmodyfikować ostatni program tak, aby wydawał wysoki dźwięk, jeśli parzysty, niski dźwięk, jeśli jest nieparzysty, i migaj diodą LED w sposób ciągły, jeśli nie ma zmian w przełącznikach. Wróć do sekcji debugowania, aby uzyskać pomoc.
Zalecana:
Programowalna stacja pętli efektów gitarowych True Bypass za pomocą przełączników DIP: 11 kroków
Programowalna stacja pętli efektów gitarowych True Bypass za pomocą przełączników DIP: Jestem entuzjastą gitary i hobbystą. Większość moich projektów dotyczy akcesoriów gitarowych. Buduję własne wzmacniacze i kilka efektów. W przeszłości grałem w małym zespole i przekonałem się, że potrzebuję tylko wzmacniacza z re
Battery Eater - rzeźba robota Joule Thief jako czytanie / lampka nocna: 3 kroki (ze zdjęciami)
Battery Eater - Robot Joule Thief Sculpture jako Reading / Night Light: Witaj w moim pierwszym instruktażu, mam nadzieję, że ci się spodoba, a mój zły angielski nie jest tak dużą barierą.: x Miałem kilka części leżących i chciałem zbudować małego robota . Ponieważ chcę zrobić taki z funkcją, przeszukałem i znalazłem Instr
Czytanie kciuka LED: 6 kroków (ze zdjęciami)
Kciuk LED do czytania: Jak być może wiesz, istnieje uchwyt na stronę / pierścień do czytania, dzięki któremu ludzie mogą czytać jedną ręką. Nigdy go nie używałem, więc chcę mieć taki, który 1) działa podobnie, ale pozwala mi 2) czytać w ciemności przed snem; trzeba też 3) wyłączyć
Sterowanie silnikiem serwo RC za pomocą Arduino i dwóch chwilowych przełączników: 4 kroki
Sterowanie serwomotorem RC za pomocą Arduino i dwóch chwilowych przełączników: nazwa mówi wszystko. Sterowanie serwomotorem samochodu RC za pomocą Arduino i niektórych rezystorów, przewodów połączeniowych i dwóch przełączników dotykowych. Zrobiłem to drugiego dnia, kiedy dostałem Arduino, więc jestem z siebie dość dumny
Jak odczytać wiele przełączników za pomocą jednego pinu MCU: 4 kroki
Jak odczytywać wiele przełączników za pomocą jednego pinu MCU: Czy kiedykolwiek zdarzyło Ci się pochłonąć projekt (projekty), a projekt wciąż rośnie i rośnie, podczas gdy Ty dodajesz do niego więcej rzeczy (nazywamy to Feaping Creaturism)? W ostatnim projekcie budowałem miernik częstotliwości i dodałem pięć funkcji