Thursday, May 21, 2020

Using the internal calibrated RC oscillator of PIC16F887 programming with XC8

PIC16F887 comes with an internal calibrate RC oscillator. It ranges from 31 kHz to 8 MHz. Using this internal oscillator module, we have an option to use the RA6 and RA7 for digital I/O.

To use this internal oscillator module in XC8 we do the following steps:
  1. In the configuration bit 1, we select the "INTRC_NOCLKOUT" option.
  2. In the OSCCON set the SCS to '1'
  3. and select the internal oscillator frequency by assign any value between 0 to 7 to IRCF bits.
The OSCCON register listed below:

BIT 7





 BIT 0
 N/AIRCF2IRCF1IRCF0OSTSHTSLTSSCS

The IRCF is 3 bits ranging from IRCF0 to IRCF2. The table below shows the frequency relationship:

 IRCFFrequency 
 1118 MHz 
 1104 MHz 
 1012 MHz 
 100 1 MHz 
 011500 kHz 
 010250 kHz 
 001125 kHz 
 00032 kHz 

In XC8 accessing the configuration bit is done by using the "#pragma" directive.

In this example, I use the internal selective RC oscillator of PIC16F887. PortA used for digital output connects to LEDs

Using the internal calibrated RC oscillator of PIC16F887 programming with XC8
Schematic diagram.
All eight bit of PortA used for digital output.
RA6 and RA7 connect to LEDs, as a
result of using the internal RC oscillator
with no clock out option.

configuration setting of PIC16F887
PIC16F887 configuration setting in the Edit Component Window.

Source code is written in XC8.

#include<xc.h>
// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
#define _XTAL_FREQ 8000000
void selectOsc(int FREQ){
    /*Use internal clock*/
    SCS=1;
    switch(FREQ){
        /**  8 Mhz*/
        case 8:
            OSCCONbits.IRCF=0x07;
            break;
        /*4 MHz*/
        case 4:
            OSCCONbits.IRCF=0x06;
            break;
        /*2 MHz*/
        case 2:
            OSCCONbits.IRCF=0x05;
            break;
        /*1 MHz*/
        case 1:
            OSCCONbits.IRCF=0x04;
            break;
        /*500 kHz*/
        case 500:
            OSCCONbits.IRCF=0x03;
            break;
        /*250 kHz*/
        case 250:
            OSCCONbits.IRCF=0x02;
            break;
        /*125 kHz*/
        case 125:
            OSCCONbits.IRCF=0x01;
            break;
        /*31 kHz*/
        case 31:
            OSCCONbits.IRCF=0x00;
            break;
        /*If no match set 4 MHz*/
        default:
            OSCCONbits.IRCF=0x06;
            break;
    }
}
void main(void){
    /*select 8 MHz oscillator*/
    selectOsc(8);
    /*clear PortA*/
    PORTA=0x00;
    /*set PortA to output*/
    TRISA=0x00;
    /*clear analog inputs*/
    ANSEL=0x00;
    while(1){
        PORTA=0x00;
        __delay_ms(1000);
        PORTA=0xFF;
        __delay_ms(1000);
    }
}

A screen shot of the simulating program.

Using the internal calibrated RC oscillator of PIC16F887 programming with XC8
A screen shot of the simulating program while PORTA outputs High.


No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)