[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
void OSCILLATOR_Initialize(void) { // SCS INTOSC; IRCF 16MHz_HF; OSCCON = 0x7A; // HFIOFR disabled; HFIOFS not0.5percent_acc; LFIOFR disabled; OSCSTAT = 0x00; // Set the secondary oscillator }
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
// Configuration bits: selected in the GUI // CONFIG1 #pragma config BOREN = ON // Brown-out Reset Enable->Brown-out Reset enabled #pragma config PWRTE = ON // Power-up Timer Enable->PWRT enabled #pragma config FOSC = INTOSC // Oscillator Selection Bits->Internal Oscillator, I/O function on OSC1 #pragma config MCLRE = ON // MCLR Pin Function Select->MCLR/VPP pin function is MCLR #pragma config CP = OFF // Flash Program Memory Code Protection->Program memory code protection is disabled #pragma config WDTE = OFF // Watchdog Timer Enable->WDT disabled #pragma config CLKOUTEN = OFF // Clock Out Enable->CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection->Write protection off #pragma config LPBOR = OFF // Low-Power Brown Out Reset->Low-Power BOR is disabled #pragma config LVP = OFF // Low-Voltage Programming Enable->High-voltage on MCLR/VPP must be used for programming #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable->Stack Overflow or Underflow will cause a Reset #pragma config BORV = LO // Brown-out Reset Voltage Selection->Brown-out Reset Voltage (Vbor), low trip point selected. Argument #1: generator NCO
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.