95 lines
4.5 KiB
C
95 lines
4.5 KiB
C
/*==============================================================================
|
|
File: UBMP410.c
|
|
Date: March 1, 2022
|
|
|
|
UBMP4.1 (PIC16F1459) hardware initialization functions
|
|
|
|
Initialization functions to configure the PIC16F1459 oscillator and on-board
|
|
UBMP4 devices. Include UMBP410.h in your main program to call these functions.
|
|
==============================================================================*/
|
|
|
|
#include "xc.h" // XC compiler general include file
|
|
|
|
#include "stdint.h" // Include integer definitions
|
|
#include "stdbool.h" // Include Boolean (true/false) definitions
|
|
|
|
#include "UBMP410.h" // Include UBMP4.1 constant and function definitions
|
|
|
|
// TODO Initialize oscillator, ports and other PIC/UBMP hardware features here:
|
|
|
|
// Configure oscillator for 48 MHz operation (required for USB bootloader).
|
|
void OSC_config(void)
|
|
{
|
|
OSCCON = 0xFC; // Set 16MHz HFINTOSC with 3x PLL enabled
|
|
ACTCON = 0x90; // Enable active clock tuning from USB clock
|
|
while(!PLLRDY); // Wait for PLL lock (disable for simulation)
|
|
}
|
|
|
|
// Configure hardware ports and peripherals for on-board UBMP4 I/O devices.
|
|
void UBMP4_config(void)
|
|
{
|
|
OPTION_REG = 0b01010111; // Enable port pull-ups, TMR0 internal, div-256
|
|
|
|
LATA = 0b00000000; // Clear Port A latches before configuring PORTA
|
|
TRISA = 0b00001111; // Set RUNLED and Beeper pins as outputs
|
|
ANSELA = 0b00000000; // Make all Port A pins digital
|
|
WPUA = 0b00001000; // Enable weak pull-up on SW1 input only
|
|
|
|
LATB = 0b00000000; // Clear Port B latches before configuring PORTB
|
|
TRISB = 0b11110000; // Enable pushbutton pins as inputs (SW2-SW5)
|
|
ANSELB = 0b00000000; // Make all Port B pins digital
|
|
WPUB = 0b11110000; // Enable weak pull-ups on pushbutton inputs
|
|
|
|
LATC = 0b00000000; // Clear Port C latches before configuring PORTC
|
|
TRISC = 0b00001110; // Set LED pins as outputs, H1-H4 pins as inputs
|
|
ANSELC = 0b00000000; // Make all Port C pins digital
|
|
|
|
// Enable interrupts here, if required.
|
|
}
|
|
|
|
// Configure ADC for 8-bit conversion from on-board phototransistor Q1 (AN7).
|
|
void ADC_config(void)
|
|
{
|
|
LATC = 0b00000000; // Clear Port C latches before configuring PORTC
|
|
// Configure RC3 for analog input. Enable additional or other inputs below:
|
|
TRISCbits.TRISC3 = 1; // Disable individual output drivers (TRISx.bit = 1)
|
|
ANSELC = 0b00001000; // Enable individual analog inputs (ANSELx.bit = 1)
|
|
// General ADC setup and configuration
|
|
ADCON0 = 0b00011100; // Set channel to AN7, leave A/D converter off
|
|
ADCON1 = 0b01100000; // Left justified result, FOSC/64 clock, +VDD ref
|
|
ADCON2 = 0b00000000; // Auto-conversion trigger disabled
|
|
}
|
|
|
|
// Enable ADC and switch the input mux to the specified channel (use channel
|
|
// constants defined in UBMP410.h header file - eg. ANQ1).
|
|
void ADC_select_channel(unsigned char channel)
|
|
{
|
|
ADON = 1; // Turn the A-D converter on
|
|
ADCON0 = (ADCON0 & 0b10000011); // Clear channel select (CHS) bits by ANDing
|
|
ADCON0 = (ADCON0 | channel); // Set channel by ORing with channel const.
|
|
}
|
|
|
|
// Convert currently selected channel and return 8-bit conversion result.
|
|
unsigned char ADC_read(void)
|
|
{
|
|
GO = 1; // Start the conversion by setting Go/~Done bit
|
|
while(GO) // Wait for the conversion to finish (GO==0)
|
|
; // Terminate the empty while loop
|
|
return (ADRESH); // Return the MSB (upper 8-bits) of the result
|
|
}
|
|
|
|
// Enable ADC, switch to specified channel, and return 8-bit conversion result.
|
|
// Use channel constants defined in UBMP410.h header file (eg. ANQ1).
|
|
unsigned char ADC_read_channel(unsigned char channel)
|
|
{
|
|
ADON = 1; // Turn the A-D converter on
|
|
ADCON0 = (ADCON0 & 0b10000011); // Clear channel select (CHS) bits by ANDing
|
|
ADCON0 = (ADCON0 | channel); // Set channel by ORing with chan. constant
|
|
__delay_us(5); // Allow input to settle (charges internal cap.)
|
|
GO = 1; // Start the conversion by setting Go/~Done bit
|
|
while(GO) // Wait for the conversion to finish (GO==0)
|
|
; // Terminate the empty while loop
|
|
ADON = 0; // Turn the A-D converter off
|
|
return (ADRESH); // Return the MSB (upper 8-bits) of the result
|
|
}
|