Spisu treści:

Czytanie przełączników za pomocą ATtiny2313: 9 kroków
Czytanie przełączników za pomocą ATtiny2313: 9 kroków

Wideo: Czytanie przełączników za pomocą ATtiny2313: 9 kroków

Wideo: Czytanie przełączników za pomocą ATtiny2313: 9 kroków
Wideo: Kurs automatyki #9 Podłączenie stycznika sterowanie przyciskiem 2024, Listopad
Anonim
Odczytywanie przełączników za pomocą ATtiny2313
Odczytywanie przełączników za pomocą ATtiny2313

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

Urządzenie wejściowe
Urządzenie wejściowe
Urządzenie wejściowe
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

Korzystanie z timera/licznika 0 dla sygnałów dźwiękowych
Korzystanie z 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

Wniosek
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: