
Generowanie dźwięków
Podzespół mikrokontrolera określany jako licznik/zegar ma wiele możliwych trybów pracy. Najczęściej jest używany do odmierzania interwałów czasu, ale nie jest to jego jedyna możliwość. Jak można wykorzystać informacje wynikające z „Mikroprocesorowej oślej łączki”?
Mikrokontroler ATMEGA328 dysponuje kilkoma zegarami/licznikami. Wszystkie je można wykorzystać w dowolny sposób, poprzez odpowiednie ich zaprogramowanie (wpis do rejestrów sterujących odpowiednich danych konfiguracyjnych). Jedną z takich możliwości jest wykorzystanie go jako licznika pracującego w trybie CTC (ang. Clear Timer on Compare), automatycznego wyzerowania licznika po osiągnięciu przez niego określonego stanu, mówiąc najprościej do generowania sygnału o określonej częstotliwości.
Licznik/zegar jako generator fali prostokątnej
Do tego zadania warto wybrać licznik/zegar numer 1, gdyż jest to licznik 16-bitowy, przez co można uzyskać sygnały o w miarę dobrej częstotliwościowej dokładności (rysunek 1).
Dysponuje on dwoma niezależnymi kanałami (zestaw A oraz B – w prezentowanym programie jest wykorzystany jedynie A). Sam licznik zlicza impulsy pochodzące z systemowego zegara z ewentualnym uwzględnieniem wstępnego podzielnika (preskalera). Stan licznika (jako liczba 16-bitowa) jest porównywany z liczbą zapisaną w odpowiednim rejestrze (również 16-bitową). W sytuacji gdy zaistnieje równość obu liczb, licznik jest wyzerowany oraz istnieje możliwość wykonania przy tej okazji dodatkowych czynności: może być sygnałem odpowiedniego przerwania (ten wariant nie jest wykorzystany) lub działań zmieniających stan odpowiedniego pinu portu (to jest naszym celem). Istotnymi rejestrami w tym przypadku są: TCCR1A, TCCR1B (konfigurujące pracę zespołu licznikowego 1) oraz OCR1A (przechowujący wzorzec do porównania), rysunek 2.
W tym miejscu warto wspomnieć o możliwości przenoszenia oprogramowania pomiędzy różnymi modelami mikrokontrolerów AVR (oczywiście na poziomie tekstu programu źródłowego). Rozpatrując migrację z mikrokontrolera ATMEGA328 do przykładowo ATMEGA32, należy zapoznać się ze szczegółami realizacji generacji fali prostokątnej przez docelowy mikrokontroler. Okazuje się, że w tym przypadku budowa i znaczenie poszczególnych bitów w rejestrach TCCR1A i TCCR1B jest zgodna. Same rejestry mają inną lokalizację w przestrzeni adresowej mikrokontrolera, ale nie stanowi to problemu, kompilacja programu dołączy właściwy plik definiujący zasoby mikrokontrolera, toteż kompilator sam „zauważy” zmianę adresacji. Również znaczenie poszczególnych bitów w rejestrze TCCR1A różni się o szczegóły nieistotne w tym przypadku, budowa i znaczenie bitów w rejestrze TCCR1B jest identyczna. Bardzo znacząca różnica występuje w lokalizacji wyjścia generowanego przebiegu. W mikrokontrolerze ATMEGA328 wyjście OC1A jest umiejscowione w PORTB.1, natomiast w mikrokontrolerze ATMEGA32 wyjście OC1A znajduje się w PORTD.5. Z tego powodu warto uelastycznić program poprzez możliwości stworzone przez #define, gdyż koniecznością jest skonfigurowanie wyprowadzenia OC1A jako wyjścia.
Rozpatrzmy prosty program, generujący określoną częstotliwość na tym wyjściu, pokazany w istotnym fragmencie na listingu 1. Warto zauważyć, że program po skonfigurowaniu licznika 1 nic nie robi (wszystko „dzieje się” samo):
#define OCR1AConfigPort DDRB #define OCR1AConfigPin 1 #define nop() __asm__ __volatile__ (”nop”) static void HardwareInit ( void ) { TCCR1A = ( 1 << COM1A0 ) ; TCCR1B = ( 1 << WGM12 ) | ( 1 << CS11 ) ; OCR1A = 100 ; } /* HardwareInit */ static void EnvirInit ( void ) { OCR1AConfigPort |= 1 << OCR1AConfigPin ; } /* EnvirInit */ int main ( void ) { HardwareInit ( ) ; EnvirInit ( ) ; sei ( ) ; for ( ; ; ) { nop ( ) ; nop ( ) ; } /* for */ ; return ( 0 ) ; } /* main */
(…)
——– ciach! ——–
To jest tylko fragment artykułu, którego pełna wersja ukazała się w sierpniowym numerze czasopisma Zrozumieć Elektronikę (ZE 8/2025). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 8/2025 znajduje się tutaj.
Andrzej Pawluczuk
apawluczuk@vp.pl
Uwaga! Wskazówki, jak nabyć archiwalne numery ZE znajdują się na stronie:
https://piotr-gorecki.pl/n11.