ma. 23 november 2020
| tags: pic programming 7seg adc
Introduction
This little program reads analog voltage on AN2, and converts it into an ADC value, and then claculates the volt, The volt is displayed on a 3 digit 7 seg.
Check out this article for the schematic.
#include <xc.h>
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Selection bits (BOR disabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
// DEFINITIONS
#define _XTAL_FREQ 8000000
#define deci_digit PORTBbits.RB4 // Decimal
#define ones_digit PORTBbits.RB5 // One's
#define tens_digit PORTBbits.RB6 // Ten's
// VARIABLES
unsigned char binary_pattern [] = { 0 b00111111 , 0 b00000110 , 0 b01011011 , 0 b01001111 , 0 b01100110 , 0 b01101101 , 0 b01111101 , 0 b00000111 , 0 b01111111 , 0 b01101111 };
unsigned char binary_pattern_dp [ 10 ] = { 0 b10111111 , 0 b10000110 , 0 b11011011 , 0 b11001111 , 0 b11100110 , 0 b11101101 , 0 b11111101 , 0 b10000111 , 0 b11111111 , 0 b11101111 }; // with dp turn on
unsigned int tens_value , ones_value , deci_value ;
unsigned int voltage ;
unsigned int adc_value ;
long tlong ;
// FUNCTIONS
// Functio to initialize the ADC part of the PIC
void adc_init ( void ) {
ADCON0bits . ADFM = 1 ; // Right justify
ADCON0bits . VCFG = 0 ; // VDD as reference
ADCON0bits . CHS = 0 b0010 ; // Analog channel AN2
ADCON0bits . ADON = 1 ; // ADC enable
ADCON1bits . ADCS = 0 b010 ; // ADC conversion set bit
}
// Function to do the ADC
void adc_read ( void ) {
ADCON0bits . GO = 1 ; // Start ADC
__delay_us ( 10 );
while ( ADCON0bits . nDONE ); // Wait for ADC to finish
adc_value = ADRESL + ( ADRESH * 256 );
}
// Main program
void main ( void ) {
CM1CON0 = 0 ; // Disable the comparators
CM2CON0 = 0 ; // Disable the comparators
PORTA = 0 b00000000 ; // All bits LOW
TRISA = 0 b00000100 ; // Setting RA2/AN2 as input
PORTB = 0 b00000000 ; // All bits LOW
TRISB = 0 b00000000 ; // All bits output
PORTC = 0 b00000000 ; // All bits LOW
TRISC = 0 b00000000 ; // All bits output
ANSEL = 0 b00000100 ; // Enabling input buffer on AN2
ANSELH = 0 b00000000 ; // Disable all input buffers
adc_init (); // Initialize the ADC module
deci_digit = 0 ; // Decimal
ones_digit = 0 ; // One's
tens_digit = 0 ; // Ten's
while ( 1 ) {
adc_read ();
tlong = ( float ) adc_value * 4.88 ;
voltage = tlong ;
tens_value = voltage / 1000 ;
ones_value = (( voltage / 100 ) % 10 );
deci_value = (( voltage / 10 ) % 10 );
// Decimal number
PORTC = binary_pattern [ deci_value ];
deci_digit = 1 ;
__delay_ms ( 5 );
deci_digit = 0 ;
// One's number
PORTC = binary_pattern_dp [ ones_value ];
ones_digit = 1 ;
__delay_ms ( 5 );
ones_digit = 0 ;
// Ten's number
PORTC = binary_pattern [ tens_value ];
tens_digit = 1 ;
__delay_ms ( 5 );
tens_digit = 0 ;
}
return ;
}
My notes and a work in progress.
Powered by Pelican . Theme blueidea , inspired by the default theme.