[PRZYKŁADY] Nowe peryferia w mikrokontrolerach Microchipa, czyli jak ponownie polubić 8-bitowce [1]

W naszym przypadku wybieramy HFINTOSC i częstotliwość 16MHz, tak jak to zostało pokazane na rysunku 4.

 

Rys. 4. Konfiguracja taktowania użyta w przykładzie

 

Po kliknięciu na przycisk Generate Code Configurator jest generowana funkcja inicjalizująca OSCILLATOR_Initialize() pokazana na listingu 1.

 

List. 1. Funkcja inicjalizująca generator taktujący

Przy okazji ustawiania oscylatora skonfigurujemy bity konfiguracyjne w oknie Generate Configuration Bits (rysunek 5). Z ważniejszych bitów ustawiamy: PWRTE ON, MCLRE ON, WDTE OFF. Bity wyboru oscylatora FOSC INTOSC są automatycznie ustawiane przy konfigurowaniu okna Clock.

 

Rys. 5. Bity konfiguracyjne generatora taktującego

 

Na podstawie ustawionych bitów MPLAB Code Configurator wygeneruje fragment programu pokazany na listingu 2.

 

List. 2. Programowe ustawienie bitów konfiguracyjnych

Przechodzimy teraz do pierwszego z zaawansowanych modułów peryferyjnych: generatora NCO (Numerically Controlled Oscillator). Jest przeznaczony do wykorzystania w aplikacjach, które wymagają generowania ściśle określonej dokładnej częstotliwości. NCO pozwala również tę częstotliwość bardzo precyzyjnie regulować (ustawiać z dużą rozdzielczością).

Częstotliwość przebiegu cyfrowego można w prosty sposób dzielić używając do tego celu liczników. W klasycznym rozwiązaniu do zmiany częstotliwości wykorzystuje się liczniki. Moduł licznika jest podstawowym układem peryferyjnym i obok układu portów, umieszcza się go w każdym mikrokontrolerze firmy Microchip, nawet najprostszych z rodziny PIC10F. Standardowo są to liczniki 8- lub 16-bitowe, wyposażane w preskalery i czasami w postskalery.

To czy uda nam się wygenerować założoną częstotliwość zależy od częstotliwości sygnału na wejściu i współczynnika podziału. Jeżeli wyliczony współczynnik podziału jest liczbą całkowitą, to można uzyskać dokładnie taki przebieg jakiego oczekujemy. Na przykład jeżeli dzielimy wejściową częstotliwość 2MHz, a potrzebujemy na przykład 100kHz, to mamy 2000000/100000=20. Problem pojawia się kiedy potrzebujemy częstotliwości 130kHz. Wtedy 2000000/130000=15.38461538… Po podzieleniu przez 15 otrzymujemy 133 3333,3333Hz. Takie proste dzielenie albo jest obarczone sporym błędem, albo wymaga dobierania częstotliwości wejściowej tak. by współczynnik podziału był całkowity. Problem znają ci, którzy stosowali lub stosują interfejs UART. Produkowane są oscylatory kwarcowe o specjalnie dobranej częstotliwości, by po podzieleniu uzyskać przebieg taktujący dokładną prędkość transmisji szeregowej w asynchronicznym standardzie RS232. Ma to szczególne znaczenie dla większych prędkości transmisji.

Microchip w swoim module NCO zastosował pomysłowe połączenie klasycznego licznika z układem modyfikującym jego wartość w czasie każdego okresu zliczanego przebiegu. Żeby zapewnić odpowiednią rozdzielczość pomiaru licznik ma długość 20 bitów, a modyfikowana wartość jest 16-bitowa. Na rysunku 6 pokazano schemat blokowy NCO.

 

Rys. 6. Schemat blokowy generatora NCO

 

Sygnał wejściowy jest wybierany selektorem programowanym bitami NxCKS. Można wybrać przebieg z dedykowanego wejścia mikrokontrolera NCOCLK, wyjścia wbudowanego układu logicznego (CLC) LC1OUT,  zewnętrznego przebiegu taktującego Fosc, lub wewnętrznego oscylatora HFINTOSC o maksymalnej częstotliwości 16MHz. Wybrany przebieg jest zliczany przez 20-bitowy licznik-akumulator. W czasie każdego narastającego zbocza sygnału wejściowego jest do niego dodawana 16 bitowa wartość zapisana przez użytkownika w 16-bitowym rejestrze inkrementacji NCOxINCL.

O autorze