//Listing 1. Inicjalizacja komparatora z przykładowymi ustawieniami void CMP1_Initialize(void) { // set the CMP to the options selected in MPLAB(c) Code Configurator // C1HYS enabled; C1SP hi_speed; C1ON enabled; C1POL not inverted; C1SYNC asynchronous; CM1CON0 = 0x86; // C1INTN no_intFlag; C1INTP no_intFlag; C1PCH Vss; C1NCH CIN0-; CM1CON1 = 0x30; } //Listing 2. Funkcja zwracająca stan wyjścia komparatora bool CMP1_GetOutputStatus(void) { return (CMOUTbits.MC1OUT); } //Listing 3. Funkcje konfiguracji i testowania gotowości modułu FVR void FVR_Initialize(void) { // CDAFVR 2x; FVREN enabled; TSRNG Lo_range; ADFVR off; TSEN disabled; FVRCON = 0x88; } bool FVR_IsOutputReady(void) { return (FVRCONbits.FVRRDY); } //Listing 4. Pętla testowania pracy komparatora while (1) { LATAbits.LATA2=CMP1_GetOutputStatus(); } //Listing 5. Inicjalizacja modułu przetwornika analogowo – cyfrowego void ADC_Initialize(void) { // set the ADC to the options selected in the User Interface // GO_nDONE stop; ADON enabled; CHS AN4; ADCON0 = 0x11; // ADFM right; ADPREF FVR; ADCS Frc; ADCON1 = 0xF3; // TRIGSEL no_auto_trigger; ADCON2 = 0x00; // ADRESL 0; ADRESL = 0x00;//zerowanie rejestru wyniku konwersji // ADRESH 0; ADRESH = 0x00; } //Listing 6. Wybranie wejścia i start konwersji #define ACQ_US_DELAY 5 void ADC_StartConversion(adc_channel_t channel) { // select the A/D channel ADCON0bits.CHS = channel; // Turn on the ADC module ADCON0bits.ADON = 1; // Acquisition time delay __delay_us(ACQ_US_DELAY); // Start the conversion ADCON0bits.GO_nDONE = 1; } //Listing 7. Wybranie wejścia, konwersja i zwrócenie wyniku konwersji adc_result_t ADC_GetConversion(adc_channel_t channel) { // select the A/D channel ADCON0bits.CHS = channel; // Turn on the ADC module ADCON0bits.ADON = 1; // Acquisition time delay __delay_us(ACQ_US_DELAY); // Start the conversion ADCON0bits.GO_nDONE = 1; // Wait for the conversion to finish while (ADCON0bits.GO_nDONE) { ... } // Conversion finished, return the result return ((ADRESH << 8) + ADRESL); } //Listing 8. Pomiar napięcia z potencjometru i przeliczenia na wolty //deklaracje zmiennych float volt; uint32_t res=0; char buf_res[6]; //fragment programu res=ADC_GetConversion(channel_AN4);//konwersja i odczytanie wartości volt=(float)res*3.22;//przeliczenie na wartość w woltach dla Vref=3,3V. volt=volt/1000; sprintf(buf_res,”V=%1.3f”,volt);//konwersja na znaki ASCII //Listing 9. Fragment programu do mierzenia napięcia z DAC DAC1_SetOutput(77); res=ADC_GetConversion(channel_DAC); volt=(float)res*3.22; volt=volt/1000; sprintf(buf_res,”V=%1.3f”,volt); //Listing 10. Test przetwornika DAC dla Vref=2,048V DAC1_SetOutput(125); res=ADC_GetConversion(channel_DAC); volt=(float)res*2; volt=volt/1000; sprintf(buf_res,”V=%1.3f”,volt); //Listing 11. Zapis liczby 10 bitowej do przetwornika DAC1 { //DAC input reference range should be 10bit. //Input data right justified. DAC1CON0bits.DAC1FM = 0; //Loading 10bit data to DAC1 DAC1REFL = (uint8_t) input10BitData; DAC1REFH = (uint8_t)(input10BitData >> 8); //Loading DAC1 double buffer data to latch. DACLDbits.DAC1LD = 0x01; }