Tuesday, May 19, 2020

Using digital input with weak pull up resistor of PIC16F887

PortB of PIC16F887 could be used as digital inputs outputs. Pins RB0 to RB5 multiplexed with analog input channel for ADC reading.


DigitalAnalog 
RB0 AN12
RB1 AN10
RB2  AN8
RB3 AN9
RB4  AN11
RB5  AN13

When using those pins as a digital input, we must clear related bits in the ANSELH register.


 BIT 7





 BIT 0
 N/AN/A ANS13 ANS12 ANS11 ANS10 ANS9 ANS8 

When any ANSx is equal to '0', the corresponding pin is a digital input, otherwise an analog input.

Optionally, PORTB has its own individual weak pull up resistor. We can turn it on/off one by one, or all of them.
To use weak pull up resistor, we must first clear the nRBPU of the OPTION_REG.

 BIT 7





 BIT 0
 nRBPUINTEDG T0CS T0SE PSA PS2 PS1 PS0 

Each weak pull up resistor stores in WPUB register.

 BIT 7





 BIT 0
 WPUB7WPUB6WPUB5WPUB4WPUB3WPUB2WPUB1WPUB0

To turn it on, set it to '1'.

In this example, I use PORTB to read digital input from switches. All weak pull up resistors are turned on.

Using digital input with weak pull up resistor of PIC16F887
Schematic diagram.
PortB connects to input switches.
PortD connects to bar graph LEDs output.
We no need to add external pull up resistors.
All pins of PORTB are internally pulled high.

Source code is written using XC8.

#include<xc.h>
// PIC16F887 Configuration Bit Settings

// CONFIG1
#pragma config FOSC = XT
#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 = OFF

// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF

void main(){
    //Clear Ports
    PORTB=0x00;
    PORTD=0x00;
    //PORTB is digital input
    TRISB=0xFF;
    //PORTD is digital output
    TRISD=0x00;
    //Disable analog input on PORTB
    ANSELH=0x00;
    //Enable Weak Pullups
    nRBPU=0;
    //Turn on all Weak Pullups
    WPUB=0xFF;
    while(1) PORTD=PORTB; //Read PORTB
}

A screen shot of the running program.

A screen shot of Using digital input with weak pull up resistor of PIC16F887
Proteus 8 simulation screen shot.
PORTB read 0x0F.
PORTD outputs 0x0F.

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)