Subversion Repositories Code-Repo

Compare Revisions

No changes between revisions

Ignore whitespace Rev 277 → Rev 342

//PIC Projects/PICX_16F1829_Controller/CPS.c
0,0 → 1,129
#include "defines.h"
#include "CPS.h"
 
static CPS_DATA *cps_data_p;
 
void CPS_Init(CPS_DATA* data) {
cps_data_p = data;
for (uint8_t i = 0; i < 4; i++) {
cps_data_p->btn_pressed[i] = 0;
cps_data_p->btn_last_value[i] = 0;
cps_data_p->btn_avg_value[i] = 0;
cps_data_p->btn_pct_value[i] = 0;
}
 
cps_data_p->channels[0] = 8;
cps_data_p->channels[1] = 9;
 
/* Initialize FVR for the upper threshold (Ref+) */
FVRCONbits.CDAFVR = 0b01; // Gain of 1x (1.024V)
FVRCONbits.FVREN = 1; // Enable FVR module
 
/* Initialize DAC for the lower threshold (Ref-) to Vss */
DACCON0bits.DACEN = 0; // Disable DAC
DACCON0bits.DACLPS = 0; // Negative reference source selected
DACCON0bits.DACOE = 0; // Output not routed to DACOUT pin
DACCON0bits.DACPSS = 0b00; // Vss used as positive source
// DACCON0bits.DACNSS = 0; // Vss used as negative source
// Output voltage formula:
// V_out = ((V_source+ - V_source-) * (DACR / 32)) + V_source-
DACCON1bits.DACR = 0b00000; // Voltage output set to 0v
 
// /* Initialize DAC for the lower threshold (Ref-) to variable setting */
// DACCON0bits.DACEN = 1; // Enable DAC
// DACCON0bits.DACLPS = 1; // Positive reference source selected
// DACCON0bits.DACOE = 0; // Output not routed to DACOUT pin
// DACCON0bits.DACPSS = 0b10; // FVR buffer2 used as positive source
//// DACCON0bits.DACNSS = 0; // Vss used as negative source
// // Output voltage formula:
// // V_out = ((V_source+ - V_source-) * (DACR / 32)) + V_source-
// DACCON1bits.DACR = 0b10000; // Voltage output set to 0.512v
 
/* Initialize Timer 0 */
OPTION_REGbits.TMR0CS = 0; // Clock source is FOSC/4
OPTION_REGbits.PSA = 0; // Prescaler enabled
OPTION_REGbits.PS = 0b110; // Prescaler of 1:128
 
/* Initialize Timer 1 */
T1CONbits.TMR1CS = 0b11; // Clock source is Capacitive Sensing Oscillator
T1CONbits.T1CKPS = 0b00; // 1:1 Prescale value
T1GCONbits.TMR1GE = 1; // Counting is controlled by the gate function
T1GCONbits.T1GPOL = 1; // Gate is active high
T1GCONbits.T1GTM = 1; // Gate toggle mode is enabled
T1GCONbits.T1GSPM = 0; // Gate single-pulse mode is disabled
T1GCONbits.T1GSS = 0b01; // Gate source is Timer 0 overflow
T1CONbits.TMR1ON = 1; // Enables timer 1
 
/* Initialize CPS Module */
CPSCON0bits.CPSRM = 1; // DAC and FVR used for Vref- and Vref+
CPSCON0bits.CPSRNG = 0b11; // Osc in high range (100uA)
CPSCON0bits.T0XCS = 0; // Timer 0 clock runs at FOSC/4
CPSCON1 = cps_data_p->channels[0];
cps_data_p->channel = 0;
CPSCON0bits.CPSON = 1; // CPS module is enabled
 
/* Initialize timer interrupts and clear timers */
INTCONbits.TMR0IE = 1; // Timer 0 interrupt enabled
PIE1bits.TMR1IE = 0; // Timer 1 interrupt disabled
CPS_Reset();
}
 
void CPS_Timer_0_Interrupt_Handler() {
uint16_t value = TMR1;
int32_t percent;
if (value < 10) {
return;
}
 
// Calculate percentage change
percent = (int32_t)cps_data_p->btn_avg_value[cps_data_p->channel]-(int32_t)value;
if (percent < 0)
percent = 0;
else {
percent *= 100;
percent /= cps_data_p->btn_avg_value[cps_data_p->channel];
}
 
cps_data_p->btn_last_value[cps_data_p->channel] = value;
cps_data_p->btn_pct_value[cps_data_p->channel] = percent;
 
if (percent < CPS_PCT_OFF) {
// Calculate average
cps_data_p->btn_avg_value[cps_data_p->channel] +=
// ((int32_t)value - (int32_t)cps_data_p->btn_avg_value[cps_data_p->channel])/CPS_AVG_COUNT;
((int32_t)value - (int32_t)cps_data_p->btn_avg_value[cps_data_p->channel]) >> 4;
// Set flag to indicate that button is not pressed
cps_data_p->btn_pressed[cps_data_p->channel] = 0;
} else if (percent > CPS_PCT_ON) {
// Set flag to indicate that button was pressed
cps_data_p->btn_pressed[cps_data_p->channel] = 1;
}
 
cps_data_p->channel = cps_data_p->channel + 1;
if (cps_data_p->channel == CPS_NUM_CHANNELS)
cps_data_p->channel = 0;
 
CPSCON1 = cps_data_p->channels[cps_data_p->channel];
 
CPS_Reset();
}
 
void CPS_Reset() {
TMR1 = 0;
TMR0 = 0;
}
 
void CPS_Enable() {
INTCONbits.TMR0IE = 1; // Timer 0 interrupt enabled
T1CONbits.TMR1ON = 1;
CPSCON0bits.CPSON = 1;
CPS_Reset();
}
 
void CPS_Disable() {
INTCONbits.TMR0IE = 0;
CPSCON0bits.CPSON = 0;
T1CONbits.TMR1ON = 0;
}
//PIC Projects/PICX_16F1829_Controller/CPS.h
0,0 → 1,31
#ifndef CPS_H
#define CPS_H
 
// Size of rolling average buffer
#define CPS_AVG_COUNT 16
 
// Number of capacitance button inputs
#define CPS_NUM_CHANNELS 2
 
// Value of capacitance change to register button press
#define CPS_PCT_ON 40
#define CPS_PCT_OFF 40
 
typedef struct {
uint8_t channel;
uint8_t channels[CPS_NUM_CHANNELS];
uint8_t btn_pressed[CPS_NUM_CHANNELS];
uint16_t btn_last_value[CPS_NUM_CHANNELS];
uint16_t btn_avg_value[CPS_NUM_CHANNELS];
uint8_t btn_pct_value[CPS_NUM_CHANNELS];
} CPS_DATA;
 
void CPS_Init(CPS_DATA *data);
void CPS_Timer_0_Interrupt_Handler(void);
void CPS_Reset(void);
 
void CPS_Enable(void);
void CPS_Disable(void);
 
#endif
 
//PIC Projects/PICX_16F1829_Controller/I2C1.c
0,0 → 1,544
#include "defines.h"
#include "I2C1.h"
 
static I2C1_DATA *i2c_data_p;
extern BTN_STATUS btns;
 
// Set up the data structures for the base_I2C.code
// Should be called once before any i2c routines are called
void I2C1_Init(I2C1_DATA *data) {
i2c_data_p = data;
i2c_data_p->buffer_in_len = 0;
i2c_data_p->buffer_in_len_tmp = 0;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
i2c_data_p->buffer_out_ind = 0;
i2c_data_p->buffer_out_len = 0;
i2c_data_p->operating_mode = 0;
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = 0;
 
i2c_data_p->slave_in_last_byte = 0;
i2c_data_p->slave_sending_data = 0;
 
i2c_data_p->master_dest_addr = 0;
i2c_data_p->master_status = I2C_MASTER_IDLE;
// Enable I2C interrupt
PIE1bits.SSP1IE = 1;
}
 
// Setup the PIC to operate as a master.
void I2C1_Configure_Master(uint8_t speed) {
i2c_data_p->operating_mode = I2C_MODE_MASTER;
 
I2C_1_CLK_TRIS = 1;
I2C_1_DAT_TRIS = 1;
 
SSP1STAT = 0x0;
SSP1CON1 = 0x0;
SSP1CON2 = 0x0;
SSP1CON3 = 0x0;
SSP1CON1bits.SSPM = 0x8; // I2C Master Mode
if (speed == 0x01) {
SSP1ADD = 0x13; // Operate at 400KHz (32MHz)
SSP1STATbits.SMP = 1; // Disable Slew Rate Control
} else if (speed == 0x02) {
SSP1ADD = 0x07; // Operate at 1Mhz (32Mhz)
SSP1STATbits.SMP = 1; // Disable Slew Rate Control
} else {
SSP1ADD = 0x4F; // Operate at 100KHz (32MHz)
SSP1STATbits.SMP = 0; // Enable Slew Rate Control
}
SSP1CON1bits.SSPEN = 1; // Enable MSSP1 Module
}
 
// Sends length number of bytes in msg to specified address (no R/W bit)
void I2C1_Master_Send(uint8_t address, uint8_t length, uint8_t *msg) {
uint8_t i;
if (length == 0)
return;
// Copy message to send into buffer and save length/address
for (i = 0; i < length; i++) {
i2c_data_p->buffer_in[i] = msg[i];
}
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_SEND;
// Generate start condition
SSP1CON2bits.SEN = 1;
}
 
// Reads length number of bytes from address (no R/W bit)
void I2C1_Master_Recv(uint8_t address, uint8_t length) {
if (length == 0)
return;
 
// Save length and address to get data from
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_RECV;
// Generate start condition
SSP1CON2bits.SEN = 1;
}
 
// Writes msg to address then reads length number of bytes from address
void I2C1_Master_Restart(uint8_t address, uint8_t msg, uint8_t length) {
uint8_t c;
if (length == 0) {
c = msg;
I2C1_Master_Send(address, 1, &c);
return;
}
 
// Save length and address to get data from
i2c_data_p->buffer_in[0] = msg;
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_RESTART;
 
// Generate start condition
SSP1CON2bits.SEN = 1;
}
 
// Setup the PIC to operate as a slave. The address must not include the R/W bit
void I2C1_Configure_Slave(uint8_t addr) {
i2c_data_p->operating_mode = I2C_MODE_SLAVE;
 
// Ensure the two lines are set for input (we are a slave)
I2C_1_CLK_TRIS = 1;
I2C_1_DAT_TRIS = 1;
 
SSP1ADD = addr << 1; // Set the slave address
 
SSP1STAT = 0x0;
SSP1CON1 = 0x0;
SSP1CON2 = 0x0;
SSP1CON3 = 0x0;
SSP1CON1bits.SSPM = 0x6; // Enable Slave 7-bit address
SSP1STATbits.SMP = 1; // Slew Off
SSP1CON2bits.SEN = 1; // Enable clock-stretching
SSP1CON3bits.PCIE = 1; // Interrupt on stop condition
SSP1CON3bits.SCIE = 0; // Disable interrupt on start condition
SSP1CON1bits.SSPEN = 1; // Enable MSSP1 Module
}
 
void I2C1_Interrupt_Handler() {
// Call interrupt depending on which mode we are operating in
if (i2c_data_p->operating_mode == I2C_MODE_MASTER) {
I2C1_Interrupt_Master();
} else if (i2c_data_p->operating_mode == I2C_MODE_SLAVE) {
I2C1_Interrupt_Slave();
}
}
 
// An internal subroutine used in the master version of the i2c_interrupt_handler
void I2C1_Interrupt_Master() {
// If we are in the middle of sending data
if (i2c_data_p->master_status == I2C_MASTER_SEND) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_SEND;
SSP1BUF = (i2c_data_p->master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK_SEND:
// Check if ACK is received or not
if (!SSP1CON2bits.ACKSTAT) {
// If an ACK is received, send next byte of data
if (i2c_data_p->buffer_in_read_ind < i2c_data_p->buffer_in_len) {
SSP1BUF = i2c_data_p->buffer_in[i2c_data_p->buffer_in_read_ind];
i2c_data_p->buffer_in_read_ind++;
} else {
// If no more data is to be sent, send stop bit
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_OK;
}
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
}
// If we are in the middle of receiving data
} else if (i2c_data_p->master_status == I2C_MASTER_RECV) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send address with write bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_RECV;
uint8_t tmp = (i2c_data_p->master_dest_addr << 1);
tmp |= 0x01;
SSP1BUF = tmp;
break;
case I2C_CHECK_ACK_RECV:
// Check if ACK is received
if (!SSP1CON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP1CON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_FAIL;
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = SSP1BUF;
i2c_data_p->buffer_in_write_ind++;
if (i2c_data_p->buffer_in_write_ind < i2c_data_p->buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data_p->operating_state = I2C_REQ_DATA;
SSP1CON2bits.ACKDT = 0; // ACK
SSP1CON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_data_p->operating_state = I2C_SEND_STOP;
SSP1CON2bits.ACKDT = 1; // NACK
SSP1CON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP1CON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit and copy message to send to Main()
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_OK;
break;
}
} else if (i2c_data_p->master_status == I2C_MASTER_RESTART) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_SEND;
SSP1BUF = (i2c_data_p->master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK_SEND:
// Check if ACK is received or not
if (!SSP1CON2bits.ACKSTAT) {
// If an ACK is received, send first byte of data
SSP1BUF = i2c_data_p->buffer_in[0];
i2c_data_p->operating_state = I2C_CHECK_ACK_RESTART;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
case I2C_CHECK_ACK_RESTART:
if (!SSP1CON2bits.ACKSTAT) {
SSP1CON2bits.RSEN = 1;
i2c_data_p->operating_state = I2C_SEND_ADDR_2;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
case I2C_SEND_ADDR_2:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_RECV;
uint8_t tmp = (i2c_data_p->master_dest_addr << 1);
tmp |= 0x01;
SSP1BUF = tmp;
break;
case I2C_CHECK_ACK_RECV:
// Check if ACK is received
if (!SSP1CON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP1CON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_FAIL;
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = SSP1BUF;
i2c_data_p->buffer_in_write_ind++;
if (i2c_data_p->buffer_in_write_ind < i2c_data_p->buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data_p->operating_state = I2C_REQ_DATA;
SSP1CON2bits.ACKDT = 0; // ACK
SSP1CON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_data_p->operating_state = I2C_SEND_STOP;
SSP1CON2bits.ACKDT = 1; // NACK
SSP1CON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP1CON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit
i2c_data_p->operating_state = I2C_IDLE;
SSP1CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_OK;
break;
}
}
}
 
void I2C1_Interrupt_Slave() {
uint8_t received_data;
uint8_t data_read_from_buffer = 0;
uint8_t data_written_to_buffer = 0;
uint8_t overrun_error = 0;
 
// Clear SSPOV (overflow bit)
if (SSP1CON1bits.SSPOV == 1) {
SSP1CON1bits.SSPOV = 0;
// We failed to read the buffer in time, so we know we
// can't properly receive this message, just put us in the
// a state where we are looking for a new message
i2c_data_p->operating_state = I2C_IDLE;
overrun_error = 1;
i2c_data_p->return_status = I2C_ERR_OVERRUN;
}
 
// Read SPPxBUF if it is full
if (SSP1STATbits.BF == 1) {
received_data = SSP1BUF;
data_read_from_buffer = 1;
}
 
if (!overrun_error) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
{
// // Ignore anything except a start
// if (SSP1STATbits.S == 1) {
// i2c_data_p->buffer_in_len_tmp = 0;
// i2c_data_p->operating_state = I2C_STARTED;
// }
// break;
// }
// case I2C_STARTED:
// {
// In this case, we expect either an address or a stop bit
if (SSP1STATbits.P == 1) {
// Return to idle mode
i2c_data_p->operating_state = I2C_IDLE;
} else if (data_read_from_buffer) {
i2c_data_p->buffer_in_len_tmp = 0;
if (SSP1STATbits.D_nA == 0) {
// Address received
if (SSP1STATbits.R_nW == 0) {
// Slave write mode
i2c_data_p->operating_state = I2C_RCV_DATA;
} else {
// Slave read mode
i2c_data_p->operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
}
} else {
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NOADDR;
}
}
break;
}
send:
case I2C_SEND_DATA:
{
if (!i2c_data_p->slave_sending_data) {
// If we are not currently sending data, figure out what to reply with
if (I2C1_Process_Receive(i2c_data_p->slave_in_last_byte)) {
// Data exists to be returned, send first byte
SSP1BUF = i2c_data_p->buffer_out[0];
i2c_data_p->buffer_out_ind = 1;
i2c_data_p->slave_sending_data = 1;
data_written_to_buffer = 1;
} else {
// Unknown request
i2c_data_p->slave_sending_data = 0;
i2c_data_p->operating_state = I2C_IDLE;
}
} else {
// Sending remaining data back to master
if (i2c_data_p->buffer_out_ind < i2c_data_p->buffer_out_len) {
SSP1BUF = i2c_data_p->buffer_out[i2c_data_p->buffer_out_ind];
i2c_data_p->buffer_out_ind++;
data_written_to_buffer = 1;
} else {
// Nothing left to send
i2c_data_p->slave_sending_data = 0;
i2c_data_p->operating_state = I2C_IDLE;
}
}
break;
}
case I2C_RCV_DATA:
{
// We expect either data or a stop bit or a (if a restart, an addr)
if (SSP1STATbits.P == 1) {
// Stop bit detected, we need to check to see if we also read data
if (data_read_from_buffer) {
if (SSP1STATbits.D_nA == 1) {
// Data received with stop bit
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = received_data;
if (i2c_data_p->buffer_in_write_ind == MAXI2C1BUF-1) {
i2c_data_p->buffer_in_write_ind = 0;
} else {
i2c_data_p->buffer_in_write_ind++;
}
i2c_data_p->buffer_in_len_tmp++;
// Save the last byte received
i2c_data_p->slave_in_last_byte = received_data;
i2c_data_p->return_status = I2C_DATA_AVAL;
} else {
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NODATA;
}
}
i2c_data_p->buffer_in_len += i2c_data_p->buffer_in_len_tmp;
i2c_data_p->operating_state = I2C_IDLE;
} else if (data_read_from_buffer) {
if (SSP1STATbits.D_nA == 1) {
// Data received
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = received_data;
if (i2c_data_p->buffer_in_write_ind == MAXI2C1BUF-1) {
i2c_data_p->buffer_in_write_ind = 0;
} else {
i2c_data_p->buffer_in_write_ind++;
}
i2c_data_p->buffer_in_len_tmp++;
// Save the last byte received
i2c_data_p->slave_in_last_byte = received_data;
i2c_data_p->return_status = I2C_DATA_AVAL;
} else {
// Restart bit detected
if (SSP1STATbits.R_nW == 1) {
i2c_data_p->buffer_in_len += i2c_data_p->buffer_in_len_tmp;
i2c_data_p->operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
} else {
// Bad to recv an address again, we aren't ready
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NODATA;
}
}
}
break;
}
}
}
 
// Release the clock stretching bit (if we should)
if (data_read_from_buffer || data_written_to_buffer) {
// Release the clock
if (SSP1CON1bits.CKP == 0) {
SSP1CON1bits.CKP = 1;
}
}
}
 
/* Returns 0 if I2C module is currently busy, otherwise returns status code */
uint8_t I2C1_Get_Status() {
if (i2c_data_p->operating_mode == I2C_MODE_MASTER) {
if (i2c_data_p->master_status != I2C_MASTER_IDLE || i2c_data_p->buffer_in_len == 0) {
return 0;
} else {
return i2c_data_p->return_status;
}
} else {
if (i2c_data_p->operating_state != I2C_IDLE || i2c_data_p->buffer_in_len == 0) {
return 0;
} else {
return i2c_data_p->return_status;
}
}
}
 
uint8_t I2C1_Buffer_Len() {
return i2c_data_p->buffer_in_len;
}
 
/* Returns 0 if I2C module is currently busy, otherwise returns buffer length */
uint8_t I2C1_Read_Buffer(uint8_t *buffer) {
uint8_t i = 0;
while (i2c_data_p->buffer_in_len != 0) {
buffer[i] = i2c_data_p->buffer_in[i2c_data_p->buffer_in_read_ind];
i++;
if (i2c_data_p->buffer_in_read_ind == MAXI2C1BUF-1) {
i2c_data_p->buffer_in_read_ind = 0;
} else {
i2c_data_p->buffer_in_read_ind++;
}
i2c_data_p->buffer_in_len--;
}
return i;
}
 
/* Put data to be returned here */
uint8_t I2C1_Process_Receive(uint8_t c) {
uint8_t ret = 0;
switch (c) {
case CMD_QUERY_BTN:
i2c_data_p->buffer_out[0] = btns.w;
i2c_data_p->buffer_out_len = 1;
ret = 1;
break;
default:
break;
}
 
return ret;
}
//PIC Projects/PICX_16F1829_Controller/I2C2.c
0,0 → 1,534
#include "defines.h"
#include "I2C2.h"
 
static I2C2_DATA *i2c_data_p;
 
// Set up the data structures for the base_I2C.code
// Should be called once before any i2c routines are called
void I2C2_Init(I2C2_DATA *data) {
i2c_data_p = data;
i2c_data_p->buffer_in_len = 0;
i2c_data_p->buffer_in_len_tmp = 0;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
i2c_data_p->buffer_out_ind = 0;
i2c_data_p->buffer_out_len = 0;
i2c_data_p->operating_mode = 0;
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = 0;
 
i2c_data_p->slave_in_last_byte = 0;
i2c_data_p->slave_sending_data = 0;
 
i2c_data_p->master_dest_addr = 0;
i2c_data_p->master_status = I2C_MASTER_IDLE;
// Enable I2C interrupt
PIE4bits.SSP2IE = 1;
}
 
// Setup the PIC to operate as a master.
void I2C2_Configure_Master(uint8_t speed) {
i2c_data_p->operating_mode = I2C_MODE_MASTER;
 
I2C_2_CLK_TRIS = 1;
I2C_2_DAT_TRIS = 1;
 
SSP2STAT = 0x0;
SSP2CON1 = 0x0;
SSP2CON2 = 0x0;
SSP2CON3 = 0x0;
SSP2CON1bits.SSPM = 0x8; // I2C Master Mode
if (speed == 0x01) {
SSP2ADD = 0x13; // Operate at 400KHz (32MHz)
SSP2STATbits.SMP = 1; // Disable Slew Rate Control
} else if (speed == 0x02) {
SSP2ADD = 0x07; // Operate at 1Mhz (32Mhz)
SSP2STATbits.SMP = 1; // Disable Slew Rate Control
} else {
SSP2ADD = 0x4F; // Operate at 100KHz (32MHz)
SSP2STATbits.SMP = 0; // Enable Slew Rate Control
}
SSP2CON1bits.SSPEN = 1; // Enable MSSP2 Module
}
 
// Sends length number of bytes in msg to specified address (no R/W bit)
void I2C2_Master_Send(uint8_t address, uint8_t length, uint8_t *msg) {
uint8_t i;
if (length == 0)
return;
// Copy message to send into buffer and save length/address
for (i = 0; i < length; i++) {
i2c_data_p->buffer_in[i] = msg[i];
}
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_SEND;
// Generate start condition
SSP2CON2bits.SEN = 1;
}
 
// Reads length number of bytes from address (no R/W bit)
void I2C2_Master_Recv(uint8_t address, uint8_t length) {
if (length == 0)
return;
 
// Save length and address to get data from
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_RECV;
// Generate start condition
SSP2CON2bits.SEN = 1;
}
 
// Writes msg to address then reads length number of bytes from address
void I2C2_Master_Restart(uint8_t address, uint8_t msg, uint8_t length) {
uint8_t c;
if (length == 0) {
c = msg;
I2C2_Master_Send(address, 1, &c);
return;
}
 
// Save length and address to get data from
i2c_data_p->buffer_in[0] = msg;
i2c_data_p->buffer_in_len = length;
i2c_data_p->master_dest_addr = address;
i2c_data_p->buffer_in_read_ind = 0;
i2c_data_p->buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data_p->operating_state = I2C_SEND_ADDR;
i2c_data_p->master_status = I2C_MASTER_RESTART;
 
// Generate start condition
SSP2CON2bits.SEN = 1;
}
 
// Setup the PIC to operate as a slave. The address must not include the R/W bit
void I2C2_Configure_Slave(uint8_t addr) {
i2c_data_p->operating_mode = I2C_MODE_SLAVE;
 
// Ensure the two lines are set for input (we are a slave)
I2C_2_CLK_TRIS = 1;
I2C_2_DAT_TRIS = 1;
 
SSP2ADD = addr << 1; // Set the slave address
 
SSP2STAT = 0x0;
SSP2CON1 = 0x0;
SSP2CON2 = 0x0;
SSP2CON3 = 0x0;
SSP2CON1bits.SSPM = 0xE; // Enable Slave 7-bit w/ start/stop interrupts
SSP2STATbits.SMP = 1; // Slew Off
SSP2CON2bits.SEN = 1; // Enable clock-stretching
SSP1CON3bits.PCIE = 1; // Interrupt on stop condition
SSP1CON3bits.SCIE = 0; // Disable interrupt on start condition
SSP2CON1bits.SSPEN = 1; // Enable MSSP2 Module
}
 
void I2C2_Interrupt_Handler() {
// Call interrupt depending on which mode we are operating in
if (i2c_data_p->operating_mode == I2C_MODE_MASTER) {
I2C2_Interrupt_Master();
} else if (i2c_data_p->operating_mode == I2C_MODE_SLAVE) {
I2C2_Interrupt_Slave();
}
}
 
// An internal subroutine used in the master version of the i2c_interrupt_handler
void I2C2_Interrupt_Master() {
// If we are in the middle of sending data
if (i2c_data_p->master_status == I2C_MASTER_SEND) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_SEND;
SSP2BUF = (i2c_data_p->master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK_SEND:
// Check if ACK is received or not
if (!SSP2CON2bits.ACKSTAT) {
// If an ACK is received, send next byte of data
if (i2c_data_p->buffer_in_read_ind < i2c_data_p->buffer_in_len) {
SSP2BUF = i2c_data_p->buffer_in[i2c_data_p->buffer_in_read_ind];
i2c_data_p->buffer_in_read_ind++;
} else {
// If no more data is to be sent, send stop bit
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_OK;
}
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
}
// If we are in the middle of receiving data
} else if (i2c_data_p->master_status == I2C_MASTER_RECV) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send address with write bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_RECV;
uint8_t tmp = (i2c_data_p->master_dest_addr << 1);
tmp |= 0x01;
SSP2BUF = tmp;
break;
case I2C_CHECK_ACK_RECV:
// Check if ACK is received
if (!SSP2CON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP2CON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_FAIL;
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = SSP2BUF;
i2c_data_p->buffer_in_write_ind++;
if (i2c_data_p->buffer_in_write_ind < i2c_data_p->buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data_p->operating_state = I2C_REQ_DATA;
SSP2CON2bits.ACKDT = 0; // ACK
SSP2CON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_data_p->operating_state = I2C_SEND_STOP;
SSP2CON2bits.ACKDT = 1; // NACK
SSP2CON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP2CON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit and copy message to send to Main()
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_OK;
break;
}
} else if (i2c_data_p->master_status == I2C_MASTER_RESTART) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_SEND;
SSP2BUF = (i2c_data_p->master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK_SEND:
// Check if ACK is received or not
if (!SSP2CON2bits.ACKSTAT) {
// If an ACK is received, send first byte of data
SSP2BUF = i2c_data_p->buffer_in[0];
i2c_data_p->operating_state = I2C_CHECK_ACK_RESTART;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
case I2C_CHECK_ACK_RESTART:
if (!SSP2CON2bits.ACKSTAT) {
SSP2CON2bits.RSEN = 1;
i2c_data_p->operating_state = I2C_SEND_ADDR_2;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_SEND_FAIL;
}
break;
case I2C_SEND_ADDR_2:
// Send the address with read bit set
i2c_data_p->operating_state = I2C_CHECK_ACK_RECV;
uint8_t tmp = (i2c_data_p->master_dest_addr << 1);
tmp |= 0x01;
SSP2BUF = tmp;
break;
case I2C_CHECK_ACK_RECV:
// Check if ACK is received
if (!SSP2CON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP2CON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_FAIL;
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = SSP2BUF;
i2c_data_p->buffer_in_write_ind++;
if (i2c_data_p->buffer_in_write_ind < i2c_data_p->buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data_p->operating_state = I2C_REQ_DATA;
SSP2CON2bits.ACKDT = 0; // ACK
SSP2CON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_data_p->operating_state = I2C_SEND_STOP;
SSP2CON2bits.ACKDT = 1; // NACK
SSP2CON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_data_p->operating_state = I2C_RCV_DATA;
SSP2CON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit
i2c_data_p->operating_state = I2C_IDLE;
SSP2CON2bits.PEN = 1;
i2c_data_p->master_status = I2C_MASTER_IDLE;
i2c_data_p->return_status = I2C_RECV_OK;
break;
}
}
}
 
void I2C2_Interrupt_Slave() {
uint8_t received_data;
uint8_t data_read_from_buffer = 0;
uint8_t data_written_to_buffer = 0;
uint8_t overrun_error = 0;
 
// Clear SSP2OV (overflow bit)
if (SSP2CON1bits.SSPOV == 1) {
SSP2CON1bits.SSPOV = 0;
// We failed to read the buffer in time, so we know we
// can't properly receive this message, just put us in the
// a state where we are looking for a new message
i2c_data_p->operating_state = I2C_IDLE;
overrun_error = 1;
i2c_data_p->return_status = I2C_ERR_OVERRUN;
}
 
// Read SPPxBUF if it is full
if (SSP2STATbits.BF == 1) {
received_data = SSP2BUF;
// DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSP2BUF);
data_read_from_buffer = 1;
}
 
if (!overrun_error) {
switch (i2c_data_p->operating_state) {
case I2C_IDLE:
// {
// // Ignore anything except a start
// if (SSP2STATbits.S == 1) {
// i2c_data_p->buffer_in_len_tmp = 0;
// i2c_data_p->operating_state = I2C_STARTED;
// }
// break;
// }
// case I2C_STARTED:
{
// In this case, we expect either an address or a stop bit
if (SSP2STATbits.P == 1) {
// Return to idle mode
i2c_data_p->operating_state = I2C_IDLE;
} else if (data_read_from_buffer) {
if (SSP2STATbits.D_nA == 0) {
// Address received
if (SSP2STATbits.R_nW == 0) {
// Slave write mode
i2c_data_p->operating_state = I2C_RCV_DATA;
} else {
// Slave read mode
i2c_data_p->operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
}
} else {
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NOADDR;
}
}
break;
}
send:
case I2C_SEND_DATA:
{
if (!i2c_data_p->slave_sending_data) {
// If we are not currently sending data, figure out what to reply with
if (I2C2_Process_Receive(i2c_data_p->slave_in_last_byte)) {
// Data exists to be returned, send first byte
SSP2BUF = i2c_data_p->buffer_out[0];
i2c_data_p->buffer_out_ind = 1;
i2c_data_p->slave_sending_data = 1;
data_written_to_buffer = 1;
} else {
// Unknown request
i2c_data_p->slave_sending_data = 0;
i2c_data_p->operating_state = I2C_IDLE;
}
} else {
// Sending remaining data back to master
if (i2c_data_p->buffer_out_ind < i2c_data_p->buffer_out_len) {
SSP2BUF = i2c_data_p->buffer_out[i2c_data_p->buffer_out_ind];
i2c_data_p->buffer_out_ind++;
data_written_to_buffer = 1;
} else {
// Nothing left to send
i2c_data_p->slave_sending_data = 0;
i2c_data_p->operating_state = I2C_IDLE;
}
}
break;
}
case I2C_RCV_DATA:
{
// We expect either data or a stop bit or a (if a restart, an addr)
if (SSP2STATbits.P == 1) {
// Stop bit detected, we need to check to see if we also read data
if (data_read_from_buffer) {
if (SSP2STATbits.D_nA == 1) {
// Data received with stop bit
// TODO: Handle I2C buffer overflow
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = received_data;
if (i2c_data_p->buffer_in_write_ind == MAXI2C2BUF-1) {
i2c_data_p->buffer_in_write_ind = 0;
} else {
i2c_data_p->buffer_in_write_ind++;
}
i2c_data_p->buffer_in_len_tmp++;
// Save the last byte received
i2c_data_p->slave_in_last_byte = received_data;
i2c_data_p->return_status = I2C_DATA_AVAL;
} else {
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NODATA;
}
}
i2c_data_p->buffer_in_len += i2c_data_p->buffer_in_len_tmp;
i2c_data_p->operating_state = I2C_IDLE;
} else if (data_read_from_buffer) {
if (SSP2STATbits.D_nA == 1) {
// Data received
i2c_data_p->buffer_in[i2c_data_p->buffer_in_write_ind] = received_data;
if (i2c_data_p->buffer_in_write_ind == MAXI2C2BUF-1) {
i2c_data_p->buffer_in_write_ind = 0;
} else {
i2c_data_p->buffer_in_write_ind++;
}
i2c_data_p->buffer_in_len_tmp++;
// Save the last byte received
i2c_data_p->slave_in_last_byte = received_data;
i2c_data_p->return_status = I2C_DATA_AVAL;
} else {
// Restart bit detected
if (SSP2STATbits.R_nW == 1) {
i2c_data_p->buffer_in_len += i2c_data_p->buffer_in_len_tmp;
i2c_data_p->operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
} else {
// Bad to recv an address again, we aren't ready
i2c_data_p->operating_state = I2C_IDLE;
i2c_data_p->return_status = I2C_ERR_NODATA;
}
}
}
break;
}
}
}
 
// Release the clock stretching bit (if we should)
if (data_read_from_buffer || data_written_to_buffer) {
// Release the clock
if (SSP2CON1bits.CKP == 0) {
SSP2CON1bits.CKP = 1;
}
}
}
 
/* Returns 0 if I2C module is currently busy, otherwise returns status code */
uint8_t I2C2_Get_Status() {
if (i2c_data_p->operating_mode == I2C_MODE_MASTER) {
if (i2c_data_p->master_status != I2C_MASTER_IDLE || i2c_data_p->buffer_in_len == 0) {
return 0;
} else {
return i2c_data_p->return_status;
}
} else {
if (i2c_data_p->operating_state != I2C_IDLE || i2c_data_p->buffer_in_len == 0) {
return 0;
} else {
return i2c_data_p->return_status;
}
}
}
 
uint8_t I2C2_Buffer_Len() {
return i2c_data_p->buffer_in_len;
}
 
/* Returns 0 if I2C module is currently busy, otherwise returns buffer length */
uint8_t I2C2_Read_Buffer(uint8_t *buffer) {
uint8_t i = 0;
while (i2c_data_p->buffer_in_len != 0) {
buffer[i] = i2c_data_p->buffer_in[i2c_data_p->buffer_in_read_ind];
i++;
if (i2c_data_p->buffer_in_read_ind == MAXI2C2BUF-1) {
i2c_data_p->buffer_in_read_ind = 0;
} else {
i2c_data_p->buffer_in_read_ind++;
}
i2c_data_p->buffer_in_len--;
}
return i;
}
 
/* Put data to be returned here */
uint8_t I2C2_Process_Receive(uint8_t c) {
uint8_t ret = 0;
 
return ret;
}
//PIC Projects/PICX_16F1829_Controller/INTERRUPTS.c
0,0 → 1,120
#include "defines.h"
#include "INTERRUPTS.h"
#include "I2C1.h"
#include "I2C2.h"
#include "IO.h"
#include "CPS.h"
 
void Interrupt_Init() {
 
}
 
void Interrupt_Enable() {
// Enable global and peripheral interrupts
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
}
 
void Interrupt_Disable() {
INTCONbits.PEIE = 0;
INTCONbits.GIE = 0;
}
 
void interrupt InterruptHandler(void) {
uint8_t tmr0_rollover = 0;
// We need to check the interrupt flag of each enabled high-priority interrupt to
// see which device generated this interrupt. Then we can call the correct handler.
 
// // Check to see if we have an SPI2 interrupt
// if (PIR3bits.SSP2IF) {
// // Call the handler
// SPI2_Recv_Interrupt_Handler();
//
// // Clear the interrupt flag
// PIR3bits.SSP2IF = 0;
//
// return;
// }
 
 
// Check to see if we have an interrupt on Timer 0 (CPS)
if (INTCONbits.TMR0IF) {
CPS_Timer_0_Interrupt_Handler();
INTCONbits.TMR0IF = 0;
return;
}
// Check to see if we have an I2C1 interrupt
if (PIR1bits.SSP1IF) {
// Call the handler
I2C1_Interrupt_Handler();
 
// Clear the interrupt flag
PIR1bits.SSP1IF = 0;
 
if (INTCONbits.TMR0IF) {
tmr0_rollover = 1;
}
}
 
// Check to see if we have an I2C2 interrupt
if (PIR4bits.SSP2IF) {
// Call the handler
I2C2_Interrupt_Handler();
 
// Clear the interrupt flag
PIR4bits.SSP2IF = 0;
 
if (INTCONbits.TMR0IF) {
tmr0_rollover = 1;
}
}
 
 
// If Timer 0 rolls over while servicing another interrupt handler,
// reset the timers as the sample will be inaccurate.
if (tmr0_rollover) {
INTCONbits.TMR0IF = 0;
CPS_Reset();
}
 
// // Check to see if we have an IO interrupt
// if (INTCONbits.IOCIF) {
// // Call the handler
// IO_Interrupt();
//
// return;
// }
 
// // Check to see if we have an interrupt on USART1 RX
// if (PIR1bits.RC1IF) {
// // Call the interrupt handler
// UART1_Recv_Interrupt_Handler();
//
// // Clear the interrupt flag
// PIR1bits.RC1IF = 0;
//
// return;
// }
 
// // Check to see if we have an interrupt on USART1 TX
// if (PIR1bits.TX1IF) {
// // Call the interrupt handler
// UART1_Send_Interrupt_Handler();
//
// // Clear the interrupt flag
// PIR1bits.TX1IF = 0;
//
// return;
// }
 
// // Check to see if we have an interrupt on USART2 RX
// if (PIR3bits.RC2IF) {
// DBG_PRINT_INT("INT: UART2 RX\r\n");
// // Call the interrupt handler
// uart_2_recv_interrupt_handler();
//
// // Clear the interrupt flag
// PIR3bits.RC2IF = 0;
// }
}
//PIC Projects/PICX_16F1829_Controller/IO.c
0,0 → 1,63
#include "defines.h"
#include "IO.h"
#include "MCP23009.h"
 
void IO_Init(void) {
// Set all pins to digital I/O
ANSELA = 0x0;
ANSELB = 0x0;
ANSELC = 0x0;
 
// Enable weak pull-up if WPU bit is set
OPTION_REGbits.nWPUEN = 0;
 
// Initialize interrupt inputs
LSM303_INT_TRIS = 1;
L3GD20_INT_TRIS = 1;
BTN_INT_TRIS = 1;
 
// Initialize UART pins
UART_RX_TRIS = 1;
UART_TX_TRIS = 0;
 
// Initialize I2C address pins
I2C_ADDR_0_TRIS = 1;
I2C_ADDR_1_TRIS = 1;
I2C_ADDR_2_TRIS = 1;
I2C_ADDR_3_TRIS = 1;
// Enable the weak-pullup on the address pins
I2C_ADDR_0_WPU = 1;
I2C_ADDR_1_WPU = 1;
I2C_ADDR_2_WPU = 1;
I2C_ADDR_3_WPU = 1;
 
// Initialize I2C pins (dont really need to as the I2C code does it)
I2C_1_CLK_TRIS = 1;
I2C_1_DAT_TRIS = 1;
I2C_2_CLK_TRIS = 1;
I2C_2_DAT_TRIS = 1;
 
// Set the CPS pins
CPS_L_TRIS = 1;
CPS_R_TRIS = 1;
CPS_L_ANSL = 1;
CPS_R_ANSL = 1;
CPS_R_WPU = 0;
CPS_L_WPU = 0;
}
 
void IO_IOC_Enable(void) {
// Clear all IOC flags
IOCAF = 0x0;
IOCBF = 0x0;
 
// Trigger interrupt on BTN_INT on falling edge
IOCANbits.IOCAN2 = 1;
// Enable IOC interrupts
INTCONbits.IOCIE = 1;
}
 
void IO_Interrupt(void) {
Reset_Board(OP_STATE_ACTIVE);
}
//PIC Projects/PICX_16F1829_Controller/TLC59116.c
0,0 → 1,93
#include "defines.h"
#include "TLC59116.h"
#include "I2C2.h"
 
void TLC59116_Init(void) {
uint8_t buffer[25];
 
buffer[0] = TLC59116_AUTO_INCR_ALL | 0x00; // Register Select
buffer[1] = TLC59116_AUTO_INCR_ALL | 0x00; // MODE1
buffer[2] = 0x00; // MODE2
buffer[3] = 0x00; // PWM0
buffer[4] = 0x00; // PWM1
buffer[5] = 0x00; // PWM2
buffer[6] = 0x00; // PWM3
buffer[7] = 0x00; // PWM4
buffer[8] = 0x00; // PWM5
buffer[9] = 0x00; // PWM6
buffer[10] = 0x00; // PWM7
buffer[11] = 0x00; // PWM8
buffer[12] = 0x00; // PWM9
buffer[13] = 0x00; // PWM10
buffer[14] = 0x00; // PWM11
buffer[15] = 0x00; // PWM12
buffer[16] = 0x00; // PWM13
buffer[17] = 0x00; // PWM14
buffer[18] = 0x00; // PWM15
buffer[19] = 0xFF; // GRPPWM (maximum brightness)
buffer[20] = 0x00; // GRPFREQ (not used)
buffer[21] = 0xFF; // LEDOUT0 (brightness and group dimming enabled)
buffer[22] = 0xFF; // LEDOUT1
buffer[23] = 0xFF; // LEDOUT2
buffer[24] = 0xFF; // LEDOUT3
 
I2C2_Master_Send(TLC59116_ADDR, 25, buffer);
uint8_t result;
do {
result = I2C2_Get_Status();
} while (!result);
}
 
//void TLC59116_Write(uint8_t led, uint8_t brightness) {
// uint8_t buffer[2];
//
// buffer[0] = led + 0x02; // Register Select
// buffer[1] = brightness;
//
// I2C2_Master_Send(TLC59116_ADDR, 2, buffer);
// uint8_t result;
// do {
// result = I2C2_Get_Status();
// } while (!result);
//}
 
void TLC59116_Write_All(LED_VALUES *values) {
uint8_t buffer[17];
 
buffer[0] = TLC59116_AUTO_INCR_ALL | TLC59116_REG_PWM0; // Register Select
buffer[1] = values->w[0];
buffer[2] = values->w[1];
buffer[3] = values->w[2];
buffer[4] = values->w[3];
buffer[5] = values->w[4];
buffer[6] = values->w[5];
buffer[7] = values->w[6];
buffer[8] = values->w[7];
buffer[9] = values->w[8];
buffer[10] = values->w[9];
buffer[11] = values->w[10];
buffer[12] = values->w[11];
buffer[13] = values->w[12];
buffer[14] = values->w[13];
buffer[15] = values->w[14];
buffer[16] = values->w[15];
 
I2C2_Master_Send(TLC59116_ADDR, 17, buffer);
uint8_t result;
do {
result = I2C2_Get_Status();
} while (!result);
}
 
void TLC59116_Write_BC(uint8_t brightness) {
uint8_t buffer[2];
 
buffer[0] = TLC59116_REG_GRPPWM; // Register Select
buffer[1] = brightness;
 
I2C2_Master_Send(TLC59116_ADDR, 2, buffer);
uint8_t result;
do {
result = I2C2_Get_Status();
} while (!result);
}
//PIC Projects/PICX_16F1829_Controller/defines.h
0,0 → 1,133
#ifndef DEFINES_H
#define DEFINES_H
 
#include <xc.h>
#include <stdint.h>
 
// <editor-fold defaultstate="collapsed" desc="I/O Pins">
/* Pins Mapping
* 2 - RA5 - LSM303_DRDY
* 3 - RA4 - L3GD20_DRDY
* 5 - RC5 - UART_RX
* 6 - RC4 - UART TX
* 7 - RC3 - ADDR_3
* 8 - RC6 - BTN_CAP_0
* 9 - RC7 - BTN_CAP_1
* 10 - RB7 - SCL_2
* 11 - RB6 - SCL_1
* 12 - RB5 - SDA_2
* 13 - RB4 - SDA_1
* 14 - RC2 - ADDR_2
* 15 - RC1 - ADDR_1
* 16 - RC0 - ADDR_0
* 17 - RA2 - BTN_INT
*/
#define LSM303_INT_TRIS TRISAbits.TRISA5
#define L3GD20_INT_TRIS TRISAbits.TRISA4
#define UART_RX_TRIS TRISCbits.TRISC5
#define UART_TX_TRIS TRISCbits.TRISC4
 
#define BTN_INT_TRIS TRISAbits.TRISA2
 
#define I2C_ADDR_3_TRIS TRISCbits.TRISC3
#define I2C_ADDR_2_TRIS TRISCbits.TRISC2
#define I2C_ADDR_1_TRIS TRISCbits.TRISC1
#define I2C_ADDR_0_TRIS TRISCbits.TRISC0
 
#define I2C_ADDR_3_WPU WPUCbits.WPUC3
#define I2C_ADDR_2_WPU WPUCbits.WPUC2
#define I2C_ADDR_1_WPU WPUCbits.WPUC1
#define I2C_ADDR_0_WPU WPUCbits.WPUC0
 
#define I2C_ADDR_3_PORT PORTCbits.RC3
#define I2C_ADDR_2_PORT PORTCbits.RC2
#define I2C_ADDR_1_PORT PORTCbits.RC1
#define I2C_ADDR_0_PORT PORTCbits.RC0
 
#define I2C_1_CLK_TRIS TRISBbits.TRISB6
#define I2C_1_DAT_TRIS TRISBbits.TRISB4
 
#define I2C_2_CLK_TRIS TRISBbits.TRISB7
#define I2C_2_DAT_TRIS TRISBbits.TRISB5
 
#define CPS_R_TRIS TRISCbits.TRISC6
#define CPS_L_TRIS TRISCbits.TRISC7
#define CPS_R_ANSL ANSELCbits.ANSC6
#define CPS_L_ANSL ANSELCbits.ANSC7
#define CPS_R_WPU WPUCbits.WPUC6
#define CPS_L_WPU WPUCbits.WPUC7
 
// </editor-fold>
 
#define _XTAL_FREQ 32000000
 
#define CMD_QUERY_BTN 0x0A
#define CMD_SET_LEDS 0x0B
#define CMD_RESET 0x0C
#define CMD_ACTIVE 0x0D
 
#define OP_STATE_IDLE 0x10
#define OP_STATE_ACTIVE 0x20
 
#define RESET_POR 0x0
#define RESET_BOR 0x1
#define RESET_MCLR 0x2
#define RESET_WDT 0x3
#define RESET_RST 0x4
#define RESET_STK 0x5
 
#define I2C1_SLAVE_PREFIX 0x10
 
#define DIR_BRIGHTNESS 0x40
#define DIR_S 0x00
#define DIR_W 0x01
#define DIR_N 0x02
#define DIR_E 0x03
 
typedef union {
struct {
unsigned BTN_L_N :1;
unsigned BTN_L_E :1;
unsigned BTN_R_E :1;
unsigned BTN_R_N :1;
unsigned BTN_R_S :1;
unsigned BTN_R_W :1;
unsigned BTN_L_S :1;
unsigned BTN_L_W :1;
};
uint8_t w;
} BTN_STATUS;
 
typedef union {
struct {
uint8_t LED_0;
uint8_t LED_1;
uint8_t LED_2;
uint8_t LED_3;
uint8_t LED_4;
uint8_t LED_5;
uint8_t LED_6;
uint8_t LED_7;
uint8_t LED_N;
uint8_t LED_W;
uint8_t LED_E;
uint8_t LED_S;
uint8_t LED_A;
uint8_t LED_B;
uint8_t LED_C;
uint8_t LED_D;
} single;
uint8_t w[16];
} LED_VALUES;
 
void Reset_Board(uint8_t next_state);
uint8_t Get_Last_Reset(void);
 
void Check_I2C_Idle(void);
void Idle_Animation(void);
 
uint8_t Direction_Rotate_Clockwise(uint8_t);
uint8_t Direction_Rotate_CClockwise(uint8_t);
 
#endif /* DEFINES_H */
 
//PIC Projects/PICX_16F1829_Controller/funclist
0,0 → 1,42
_I2C2_Interrupt_Master: CODE, 50 0 706
_Get_Last_Reset: CODE, 5000 0 43
___aldiv: CODE, 6014 0 130
_I2C1_Init: CODE, 2079 0 91
_I2C1_Interrupt_Slave: CODE, 3072 0 426
_I2C1_Read_Buffer: CODE, 5565 0 78
_CPS_Reset: CODE, 4772 0 5
_I2C2_Init: CODE, 1928 0 91
_I2C2_Interrupt_Slave: CODE, 2653 0 419
_I2C2_Read_Buffer: CODE, 5487 0 78
_main: CODE, 1462 0 466
_Interrupt_Enable: CODE, 2045 0 3
_Direction_Rotate_Clockwise: CODE, 5421 0 66
_I2C2_Master_Restart: CODE, 5643 0 79
_Direction_Rotate_CClockwise: CODE, 5355 0 66
_InterruptHandler: CODE, 4 0 44
___lmul: CODE, 5135 0 47
_Check_I2C_Idle: CODE, 5182 0 49
_Read_Address: CODE, 4798 0 15
_I2C1_Process_Receive: CODE, 2048 0 31
_Interrupt_Init: CODE, 3 0 1
__initialization: CODE, 4929 0 31
_MCP23009_Init: CODE, 5089 0 46
_I2C2_Process_Receive: CODE, 4764 0 3
_TLC59116_Init: CODE, 5805 0 85
_CPS_Timer_0_Interrupt_Handler: CODE, 2312 0 341
_I2C2_Configure_Master: CODE, 5043 0 46
_I2C1_Interrupt_Handler: CODE, 4837 0 26
_MCP23009_Query: CODE, 4963 0 37
_IO_Init: CODE, 4895 0 34
_I2C2_Master_Send: CODE, 5722 0 83
_I2C1_Configure_Slave: CODE, 4863 0 32
_I2C2_Interrupt_Handler: CODE, 2019 0 26
_TLC59116_Write_All: CODE, 2170 0 142
_Reset_Board: CODE, 4789 0 9
i1_CPS_Reset: CODE, 4767 0 5
_I2C1_Get_Status: CODE, 5293 0 62
_CPS_Init: CODE, 5890 0 124
_I2C1_Interrupt_Master: CODE, 756 0 706
_I2C2_Get_Status: CODE, 5231 0 62
_Idle_Animation: CODE, 3498 0 598
Total: 5432
//PIC Projects/PICX_16F1829_Controller/l.obj
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
//PIC Projects/PICX_16F1829_Controller/l.obj
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
//PIC Projects/PICX_16F1829_Controller/main.c
0,0 → 1,376
// <editor-fold defaultstate="collapsed" desc="Configuration Bits">
// PIC16F1825 Configuration Bit Settings
 
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT software controlled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
 
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// </editor-fold>
 
#include "defines.h"
#include "INTERRUPTS.h"
#include "IO.h"
#include "I2C1.h"
#include "I2C2.h"
#include "CPS.h"
#include "TLC59116.h"
#include "MCP23009.h"
 
persistent uint8_t op_state;
 
void Reset_Board(uint8_t next_state) {
op_state = next_state;
RESET();
}
 
uint8_t Get_Last_Reset(void) {
uint8_t ret;
if (PCONbits.nPOR == 0) {
ret = RESET_POR;
} else if (PCONbits.nBOR == 0) {
ret = RESET_BOR;
} else if (STATUSbits.nTO == 0) {
ret = RESET_WDT;
} else if (PCONbits.nRMCLR == 0) {
ret = RESET_MCLR;
} else if (PCONbits.STKOVF || PCONbits.STKUNF) {
ret = RESET_STK;
} else if (PCONbits.nRI == 0) {
ret = RESET_RST;
} else {
ret = RESET_POR;
}
 
PCON = 0x0F;
STATUSbits.nPD = 1;
STATUSbits.nTO = 1;
return ret;
}
 
uint8_t Read_Address(void) {
uint8_t ret = I2C1_SLAVE_PREFIX;
if (!I2C_ADDR_3_PORT)
ret |= 0x08;
if (!I2C_ADDR_2_PORT)
ret |= 0x04;
if (!I2C_ADDR_1_PORT)
ret |= 0x02;
if (!I2C_ADDR_0_PORT)
ret |= 0x01;
 
return ret;
}
 
BTN_STATUS btns;
LED_VALUES leds = {0x00};
 
int main(void) {
uint8_t buffer[32];
uint8_t result, length;
uint8_t i2c_slave_addr;
// uint8_t op_state;
uint8_t i;
 
// Set internal oscillator speed to 32MHz
OSCCONbits.SPLLEN = 1; // 4x PLL enable (overwritten by config bits)
OSCCONbits.IRCF = 0xE; // Base frequency @ 8MHz
OSCCONbits.SCS = 0b00; // System clock determined by config bits
 
// Initialize I/O
IO_Init();
 
uint8_t last_reset = Get_Last_Reset();
if (last_reset == RESET_POR || last_reset == RESET_BOR ||
last_reset == RESET_MCLR || last_reset == RESET_WDT ||
last_reset == RESET_STK) {
op_state = OP_STATE_IDLE;
}
// if (last_reset == RESET_RST) {
// op_state = OP_STATE_ACTIVE;
// }
 
i2c_slave_addr = Read_Address();
 
// Delay a bit to allow I2C lines to stabilize
__delay_ms(10);
 
// Initialize I2C1 in slave mode
I2C1_DATA i2c1_data;
I2C1_Init(&i2c1_data);
I2C1_Configure_Slave(i2c_slave_addr);
 
// Initialize I2C2 in master mode
I2C2_DATA i2c2_data;
I2C2_Init(&i2c2_data);
I2C2_Configure_Master(I2C_1MHZ);
 
CPS_DATA cps_data;
CPS_Init(&cps_data);
 
// Initialize interrupts
Interrupt_Init();
Interrupt_Enable();
 
MCP23009_Init(&btns);
MCP23009_Query();
 
TLC59116_Init();
// TLC59116_Write_All(&leds);
 
if (op_state == OP_STATE_IDLE) {
// IO_IOC_Enable();
Idle_Animation();
} else if (op_state == OP_STATE_ACTIVE) {
uint8_t button_R = 0, button_L = 0;
uint8_t dir_state = DIR_S;
leds.single.LED_S = DIR_BRIGHTNESS;
TLC59116_Write_All(&leds);
while (1) {
// Check if an I2C message was received
do {
result = I2C1_Get_Status();
} while (!result);
length = I2C1_Read_Buffer(buffer);
if (length == 1 && buffer[0] == CMD_RESET) {
Reset_Board(OP_STATE_IDLE);
} else if (length == 1 && buffer[0] == CMD_ACTIVE) {
Reset_Board(OP_STATE_ACTIVE);
} else if (length == 17 && buffer[0] == CMD_SET_LEDS) {
for (i = 0; i < 16; i++) {
leds.w[i] = buffer[i + 1];
}
// Reset the direction LEDs
if (dir_state == DIR_S)
leds.single.LED_S = DIR_BRIGHTNESS;
else if (dir_state == DIR_W)
leds.single.LED_W = DIR_BRIGHTNESS;
else if (dir_state == DIR_N)
leds.single.LED_N = DIR_BRIGHTNESS;
else if (dir_state == DIR_E)
leds.single.LED_E = DIR_BRIGHTNESS;
TLC59116_Write_All(&leds);
}
 
// Check if either capacitive buttons were pressed
if (cps_data.btn_pressed[0] && button_R == 0) {
// Right button went from unpressed -> pressed
dir_state = Direction_Rotate_CClockwise(dir_state);
TLC59116_Write_All(&leds);
}
if (cps_data.btn_pressed[1] && button_L == 0) {
// Left button went from unpressed -> pressed
dir_state = Direction_Rotate_Clockwise(dir_state);
TLC59116_Write_All(&leds);
}
// Save the previous button state
button_R = cps_data.btn_pressed[0];
button_L = cps_data.btn_pressed[1];
 
// Poll the hardware buttons
I2C2_Master_Restart(MCP23009_ADDR, MCP23009_GPIOA, 1);
do {
result = I2C2_Get_Status();
} while (!result);
length = I2C2_Read_Buffer(buffer);
btns.w = buffer[0];
// Change the direction according to the user's perspective
if (dir_state == DIR_W) {
uint8_t tmp = btns.BTN_R_S;
btns.BTN_R_S = btns.BTN_R_W;
btns.BTN_R_W = btns.BTN_R_N;
btns.BTN_R_N = btns.BTN_R_E;
btns.BTN_R_E = tmp;
} else if (dir_state == DIR_E) {
uint8_t tmp = btns.BTN_R_S;
btns.BTN_R_S = btns.BTN_R_E;
btns.BTN_R_E = btns.BTN_R_N;
btns.BTN_R_N = btns.BTN_R_W;
btns.BTN_R_W = tmp;
} else if (dir_state == DIR_N) {
uint8_t tmp = btns.BTN_R_S;
btns.BTN_R_S = btns.BTN_R_N;
btns.BTN_R_N = tmp;
tmp = btns.BTN_R_E;
btns.BTN_R_E = btns.BTN_R_W;
btns.BTN_R_W = tmp;
}
}
}
}
 
uint8_t Direction_Rotate_Clockwise(uint8_t dir_state) {
uint8_t ret;
switch (dir_state) {
case DIR_S:
leds.single.LED_S = 0x00;
leds.single.LED_W = DIR_BRIGHTNESS;
ret = DIR_W;
break;
case DIR_W:
leds.single.LED_W = 0x00;
leds.single.LED_N = DIR_BRIGHTNESS;
ret = DIR_N;
break;
case DIR_N:
leds.single.LED_N = 0x00;
leds.single.LED_E = DIR_BRIGHTNESS;
ret = DIR_E;
break;
case DIR_E:
leds.single.LED_E = 0x00;
leds.single.LED_S = DIR_BRIGHTNESS;
ret = DIR_S;
break;
}
return ret;
}
 
uint8_t Direction_Rotate_CClockwise(uint8_t dir_state) {
uint8_t ret;
switch (dir_state) {
case DIR_S:
leds.single.LED_S = 0x00;
leds.single.LED_E = DIR_BRIGHTNESS;
ret = DIR_E;
break;
case DIR_E:
leds.single.LED_E = 0x00;
leds.single.LED_N = DIR_BRIGHTNESS;
ret = DIR_N;
break;
case DIR_N:
leds.single.LED_N = 0x00;
leds.single.LED_W = DIR_BRIGHTNESS;
ret = DIR_W;
break;
case DIR_W:
leds.single.LED_W = 0x00;
leds.single.LED_S = DIR_BRIGHTNESS;
ret = DIR_S;
break;
}
return ret;
}
 
void Check_I2C_Idle(void) {
uint8_t buffer[32];
uint8_t result, length, i;
 
// Check if an I2C message was received
result = I2C1_Get_Status();
if (result) {
length = I2C1_Read_Buffer(buffer);
if (length == 1 && buffer[0] == CMD_RESET) {
Reset_Board(OP_STATE_IDLE);
} else if (length == 1 && buffer[0] == CMD_ACTIVE) {
Reset_Board(OP_STATE_ACTIVE);
}
}
}
 
void Idle_Animation(void) {
LED_VALUES leds = {0};
uint8_t led_direction_bar[8] = {1,0,0,0,0,0,0,0};
uint8_t led_direction_dir[8] = {1,0,0,0};
uint8_t led_direction_ind[8] = {1,0,0,0};
uint8_t led_8_high_thres = 0x80; // Max brightness of the middle section
uint8_t led_8_next_thresh = 0x40; // Threshold to start the next LED
uint8_t led_4_high_thres = 0x80; // Max brightness of the side sections
uint8_t led_4_next_thresh = 0x74; // Threshold to start the next LED
uint8_t i, next_led;
 
for (i = 0; i < 16; i++) leds.w[i] = 0x00;
while (1) {
 
// Check to see if a new message was received
Check_I2C_Idle();
 
// Update the LEDs in the middle section
for (i = 0; i < 8; i++) {
// Change the LED brightness depending on its direction
if (led_direction_bar[i] == 1) {
leds.w[i]++;
} else if (led_direction_bar[i] == 2) {
leds.w[i]--;
}
 
// Change direction if peak brightness is reached
// When the brightness reaches a middle threshold, start
// increasing the brightness of the next LED
if (led_direction_bar[i] == 1 && leds.w[i] == led_8_high_thres) {
led_direction_bar[i] = 2;
} else if (led_direction_bar[i] == 1 && leds.w[i] == led_8_next_thresh) {
next_led = (i == 7) ? 0 : i + 1;
led_direction_bar[next_led] = 1;
} else if (led_direction_bar[i] == 2 && leds.w[i] == 0x00) {
led_direction_bar[i] = 0;
}
}
 
// Update the LEDs in the right section
for (i = 0; i < 4; i++) {
// Change the LED brightness depending on its direction
if (led_direction_dir[i] == 1) {
leds.w[i+8]++;
} else if (led_direction_dir[i] == 2) {
leds.w[i+8]--;
}
 
// Change direction if peak brightness is reached
// When the brightness reaches a middle threshold, start
// increasing the brightness of the next LED
if (led_direction_dir[i] == 1 && leds.w[i+8] == led_4_high_thres) {
led_direction_dir[i] = 2;
} else if (led_direction_dir[i] == 1 && leds.w[i+8] == led_4_next_thresh) {
next_led = (i == 3) ? 0 : i + 1;
led_direction_dir[next_led] = 1;
} else if (led_direction_dir[i] == 2 && leds.w[i+8] == 0x00) {
led_direction_dir[i] = 0;
}
}
 
// Update the LEDs in the left section
for (i = 0; i < 4; i++) {
// Change the LED brightness depending on its direction
if (led_direction_ind[i] == 1) {
leds.w[i+12]++;
} else if (led_direction_ind[i] == 2) {
leds.w[i+12]--;
}
 
// Change direction if peak brightness is reached
// When the brightness reaches a middle threshold, start
// increasing the brightness of the next LED
if (led_direction_ind[i] == 1 && leds.w[i+12] == led_4_high_thres) {
led_direction_ind[i] = 2;
} else if (led_direction_ind[i] == 1 && leds.w[i+12] == led_4_next_thresh) {
next_led = (i == 3) ? 0 : i + 1;
led_direction_ind[next_led] = 1;
} else if (led_direction_ind[i] == 2 && leds.w[i+12] == 0x00) {
led_direction_ind[i] = 0;
}
}
 
// Write the LED values to the controller
TLC59116_Write_All(&leds);
 
// Delay a bit to slow down the animation
__delay_ms(1);
}
}
//PIC Projects/PICX_16F1829_Controller/nbproject/Makefile-default.mk
0,0 → 1,252
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.
 
 
# Include project Makefile
ifeq "${IGNORE_LOCAL}" "TRUE"
# do not include local makefile. User is passing all local related variables already
else
include Makefile
# Include makefile containing local settings
ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk"
include nbproject/Makefile-local-default.mk
endif
endif
 
# Environment
MKDIR=gnumkdir -p
RM=rm -f
MV=mv
CP=cp
 
# Macros
CND_CONF=default
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
IMAGE_TYPE=debug
OUTPUT_SUFFIX=elf
DEBUGGABLE_SUFFIX=elf
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
else
IMAGE_TYPE=production
OUTPUT_SUFFIX=hex
DEBUGGABLE_SUFFIX=elf
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
endif
 
# Object Directory
OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE}
 
# Distribution Directory
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
 
# Source Files Quoted if spaced
SOURCEFILES_QUOTED_IF_SPACED=main.c I2C1.c INTERRUPTS.c I2C2.c TLC59116.c MCP23009.c IO.c CPS.c
 
# Object Files Quoted if spaced
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/I2C2.p1 ${OBJECTDIR}/TLC59116.p1 ${OBJECTDIR}/MCP23009.p1 ${OBJECTDIR}/IO.p1 ${OBJECTDIR}/CPS.p1
POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/I2C1.p1.d ${OBJECTDIR}/INTERRUPTS.p1.d ${OBJECTDIR}/I2C2.p1.d ${OBJECTDIR}/TLC59116.p1.d ${OBJECTDIR}/MCP23009.p1.d ${OBJECTDIR}/IO.p1.d ${OBJECTDIR}/CPS.p1.d
 
# Object Files
OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/I2C2.p1 ${OBJECTDIR}/TLC59116.p1 ${OBJECTDIR}/MCP23009.p1 ${OBJECTDIR}/IO.p1 ${OBJECTDIR}/CPS.p1
 
# Source Files
SOURCEFILES=main.c I2C1.c INTERRUPTS.c I2C2.c TLC59116.c MCP23009.c IO.c CPS.c
 
 
CFLAGS=
ASFLAGS=
LDLIBSOPTIONS=
 
############# Tool locations ##########################################
# If you copy a project from one host to another, the path where the #
# compiler is installed may be different. #
# If you open this project with MPLAB X in the new host, this #
# makefile will be regenerated and the paths will be corrected. #
#######################################################################
# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build
FIXDEPS=fixDeps
 
.build-conf: ${BUILD_SUBPROJECTS}
${MAKE} ${MAKE_OPTIONS} -f nbproject/Makefile-default.mk dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
 
MP_PROCESSOR_OPTION=16LF1829
# ------------------------------------------------------------------------------------
# Rules for buildStep: compile
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.p1.d
@${RM} ${OBJECTDIR}/main.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/main.p1 main.c
@-${MV} ${OBJECTDIR}/main.d ${OBJECTDIR}/main.p1.d
@${FIXDEPS} ${OBJECTDIR}/main.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/I2C1.p1: I2C1.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/I2C1.p1.d
@${RM} ${OBJECTDIR}/I2C1.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/I2C1.p1 I2C1.c
@-${MV} ${OBJECTDIR}/I2C1.d ${OBJECTDIR}/I2C1.p1.d
@${FIXDEPS} ${OBJECTDIR}/I2C1.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/INTERRUPTS.p1: INTERRUPTS.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/INTERRUPTS.p1.d
@${RM} ${OBJECTDIR}/INTERRUPTS.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/INTERRUPTS.p1 INTERRUPTS.c
@-${MV} ${OBJECTDIR}/INTERRUPTS.d ${OBJECTDIR}/INTERRUPTS.p1.d
@${FIXDEPS} ${OBJECTDIR}/INTERRUPTS.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/I2C2.p1: I2C2.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/I2C2.p1.d
@${RM} ${OBJECTDIR}/I2C2.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/I2C2.p1 I2C2.c
@-${MV} ${OBJECTDIR}/I2C2.d ${OBJECTDIR}/I2C2.p1.d
@${FIXDEPS} ${OBJECTDIR}/I2C2.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/TLC59116.p1: TLC59116.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/TLC59116.p1.d
@${RM} ${OBJECTDIR}/TLC59116.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/TLC59116.p1 TLC59116.c
@-${MV} ${OBJECTDIR}/TLC59116.d ${OBJECTDIR}/TLC59116.p1.d
@${FIXDEPS} ${OBJECTDIR}/TLC59116.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/MCP23009.p1: MCP23009.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/MCP23009.p1.d
@${RM} ${OBJECTDIR}/MCP23009.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/MCP23009.p1 MCP23009.c
@-${MV} ${OBJECTDIR}/MCP23009.d ${OBJECTDIR}/MCP23009.p1.d
@${FIXDEPS} ${OBJECTDIR}/MCP23009.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/IO.p1: IO.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/IO.p1.d
@${RM} ${OBJECTDIR}/IO.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/IO.p1 IO.c
@-${MV} ${OBJECTDIR}/IO.d ${OBJECTDIR}/IO.p1.d
@${FIXDEPS} ${OBJECTDIR}/IO.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/CPS.p1: CPS.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/CPS.p1.d
@${RM} ${OBJECTDIR}/CPS.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/CPS.p1 CPS.c
@-${MV} ${OBJECTDIR}/CPS.d ${OBJECTDIR}/CPS.p1.d
@${FIXDEPS} ${OBJECTDIR}/CPS.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
else
${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.p1.d
@${RM} ${OBJECTDIR}/main.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/main.p1 main.c
@-${MV} ${OBJECTDIR}/main.d ${OBJECTDIR}/main.p1.d
@${FIXDEPS} ${OBJECTDIR}/main.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/I2C1.p1: I2C1.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/I2C1.p1.d
@${RM} ${OBJECTDIR}/I2C1.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/I2C1.p1 I2C1.c
@-${MV} ${OBJECTDIR}/I2C1.d ${OBJECTDIR}/I2C1.p1.d
@${FIXDEPS} ${OBJECTDIR}/I2C1.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/INTERRUPTS.p1: INTERRUPTS.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/INTERRUPTS.p1.d
@${RM} ${OBJECTDIR}/INTERRUPTS.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/INTERRUPTS.p1 INTERRUPTS.c
@-${MV} ${OBJECTDIR}/INTERRUPTS.d ${OBJECTDIR}/INTERRUPTS.p1.d
@${FIXDEPS} ${OBJECTDIR}/INTERRUPTS.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/I2C2.p1: I2C2.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/I2C2.p1.d
@${RM} ${OBJECTDIR}/I2C2.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/I2C2.p1 I2C2.c
@-${MV} ${OBJECTDIR}/I2C2.d ${OBJECTDIR}/I2C2.p1.d
@${FIXDEPS} ${OBJECTDIR}/I2C2.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/TLC59116.p1: TLC59116.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/TLC59116.p1.d
@${RM} ${OBJECTDIR}/TLC59116.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/TLC59116.p1 TLC59116.c
@-${MV} ${OBJECTDIR}/TLC59116.d ${OBJECTDIR}/TLC59116.p1.d
@${FIXDEPS} ${OBJECTDIR}/TLC59116.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/MCP23009.p1: MCP23009.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/MCP23009.p1.d
@${RM} ${OBJECTDIR}/MCP23009.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/MCP23009.p1 MCP23009.c
@-${MV} ${OBJECTDIR}/MCP23009.d ${OBJECTDIR}/MCP23009.p1.d
@${FIXDEPS} ${OBJECTDIR}/MCP23009.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/IO.p1: IO.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/IO.p1.d
@${RM} ${OBJECTDIR}/IO.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/IO.p1 IO.c
@-${MV} ${OBJECTDIR}/IO.d ${OBJECTDIR}/IO.p1.d
@${FIXDEPS} ${OBJECTDIR}/IO.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
${OBJECTDIR}/CPS.p1: CPS.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/CPS.p1.d
@${RM} ${OBJECTDIR}/CPS.p1
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -o${OBJECTDIR}/CPS.p1 CPS.c
@-${MV} ${OBJECTDIR}/CPS.d ${OBJECTDIR}/CPS.p1.d
@${FIXDEPS} ${OBJECTDIR}/CPS.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
endif
 
# ------------------------------------------------------------------------------------
# Rules for buildStep: assemble
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
else
endif
 
# ------------------------------------------------------------------------------------
# Rules for buildStep: link
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_CC} $(MP_EXTRA_LD_PRE) --chip=$(MP_PROCESSOR_OPTION) -G -mdist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.map -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -odist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
@${RM} dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.hex
else
dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_CC} $(MP_EXTRA_LD_PRE) --chip=$(MP_PROCESSOR_OPTION) -G -mdist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.map --double=24 --float=24 --opt=default,+asm,+asmfile,+speed,-space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s" -odist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
endif
 
 
# Subprojects
.build-subprojects:
 
 
# Subprojects
.clean-subprojects:
 
# Clean Targets
.clean-conf: ${CLEAN_SUBPROJECTS}
${RM} -r build/default
${RM} -r dist/default
 
# Enable dependency checking
.dep.inc: .depcheck-impl
 
DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES})
ifneq (${DEPFILES},)
include ${DEPFILES}
endif
//PIC Projects/PICX_16F1829_Controller/nbproject/Makefile-genesis.properties
0,0 → 1,8
#
#Wed Mar 19 00:58:38 EDT 2014
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\xc8\\v1.20\\bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=1f98a0eed69cb2a45c12981fa9470927
default.languagetoolchain.version=1.20
host.platform=windows
conf.ids=default
default.com-microchip-mplab-nbide-toolchainXC8-XC8LanguageToolchain.md5=52258db7536b2d1fec300cefc7ed9230
//PIC Projects/PICX_16F1829_Controller/nbproject/configurations.xml
0,0 → 1,173
<?xml version="1.0" encoding="UTF-8"?>
<configurationDescriptor version="62">
<logicalFolder name="root" displayName="root" projectFiles="true">
<logicalFolder name="HeaderFiles"
displayName="Header Files"
projectFiles="true">
<itemPath>defines.h</itemPath>
<itemPath>I2C1.h</itemPath>
<itemPath>INTERRUPTS.h</itemPath>
<itemPath>I2C2.h</itemPath>
<itemPath>TLC59116.h</itemPath>
<itemPath>MCP23009.h</itemPath>
<itemPath>IO.h</itemPath>
<itemPath>CPS.h</itemPath>
</logicalFolder>
<logicalFolder name="LinkerScript"
displayName="Linker Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="SourceFiles"
displayName="Source Files"
projectFiles="true">
<itemPath>main.c</itemPath>
<itemPath>I2C1.c</itemPath>
<itemPath>INTERRUPTS.c</itemPath>
<itemPath>I2C2.c</itemPath>
<itemPath>TLC59116.c</itemPath>
<itemPath>MCP23009.c</itemPath>
<itemPath>IO.c</itemPath>
<itemPath>CPS.c</itemPath>
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
projectFiles="false">
<itemPath>Makefile</itemPath>
</logicalFolder>
</logicalFolder>
<projectmakefile>Makefile</projectmakefile>
<confs>
<conf name="default" type="2">
<toolsSet>
<developmentServer>localhost</developmentServer>
<targetDevice>PIC16LF1829</targetDevice>
<targetHeader></targetHeader>
<targetPluginBoard></targetPluginBoard>
<platformTool>PICkit3PlatformTool</platformTool>
<languageToolchain>XC8</languageToolchain>
<languageToolchainVersion>1.20</languageToolchainVersion>
<platform>3</platform>
</toolsSet>
<compileType>
<linkerTool>
<linkerLibItems>
</linkerLibItems>
</linkerTool>
<loading>
<useAlternateLoadableFile>false</useAlternateLoadableFile>
<alternateLoadableFile></alternateLoadableFile>
</loading>
</compileType>
<makeCustomizationType>
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
<makeCustomizationPreStep></makeCustomizationPreStep>
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
<makeCustomizationPostStep></makeCustomizationPostStep>
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines>
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
</makeCustomizationType>
<HI-TECH-COMP>
<property key="asmlist" value="true"/>
<property key="define-macros" value=""/>
<property key="extra-include-directories" value=""/>
<property key="identifier-length" value="255"/>
<property key="operation-mode" value="free"/>
<property key="opt-xc8-compiler-strict_ansi" value="false"/>
<property key="optimization-assembler" value="true"/>
<property key="optimization-assembler-files" value="true"/>
<property key="optimization-debug" value="false"/>
<property key="optimization-global" value="true"/>
<property key="optimization-level" value="9"/>
<property key="optimization-set" value="default"/>
<property key="optimization-speed" value="true"/>
<property key="preprocess-assembler" value="true"/>
<property key="undefine-macros" value=""/>
<property key="use-cci" value="false"/>
<property key="use-iar" value="false"/>
<property key="verbose" value="false"/>
<property key="warning-level" value="0"/>
<property key="what-to-do" value="require"/>
</HI-TECH-COMP>
<HI-TECH-LINK>
<property key="additional-options-checksum" value=""/>
<property key="additional-options-code-offset" value=""/>
<property key="additional-options-command-line" value=""/>
<property key="additional-options-errata" value=""/>
<property key="additional-options-extend-address" value="false"/>
<property key="additional-options-trace-type" value=""/>
<property key="additional-options-use-response-files" value="false"/>
<property key="backup-reset-condition-flags" value="false"/>
<property key="calibrate-oscillator" value="true"/>
<property key="calibrate-oscillator-value" value=""/>
<property key="clear-bss" value="true"/>
<property key="code-model-external" value="wordwrite"/>
<property key="code-model-rom" value=""/>
<property key="create-html-files" value="false"/>
<property key="data-model-ram" value=""/>
<property key="data-model-size-of-double" value="24"/>
<property key="data-model-size-of-float" value="24"/>
<property key="display-class-usage" value="false"/>
<property key="display-hex-usage" value="false"/>
<property key="display-overall-usage" value="true"/>
<property key="display-psect-usage" value="false"/>
<property key="fill-flash-options-addr" value=""/>
<property key="fill-flash-options-const" value=""/>
<property key="fill-flash-options-how" value="0"/>
<property key="fill-flash-options-inc-const" value="1"/>
<property key="fill-flash-options-increment" value=""/>
<property key="fill-flash-options-seq" value=""/>
<property key="fill-flash-options-what" value="0"/>
<property key="format-hex-file-for-download" value="false"/>
<property key="initialize-data" value="true"/>
<property key="keep-generated-startup.as" value="false"/>
<property key="link-in-c-library" value="true"/>
<property key="link-in-peripheral-library" value="true"/>
<property key="managed-stack" value="false"/>
<property key="opt-xc8-linker-file" value="false"/>
<property key="opt-xc8-linker-link_startup" value="false"/>
<property key="opt-xc8-linker-serial" value=""/>
<property key="program-the-device-with-default-config-words" value="true"/>
</HI-TECH-LINK>
<PICkit3PlatformTool>
<property key="AutoSelectMemRanges" value="auto"/>
<property key="Freeze Peripherals" value="true"/>
<property key="SecureSegment.SegmentProgramming" value="FullChipProgramming"/>
<property key="ToolFirmwareFilePath"
value="Press to browse for a specific firmware version"/>
<property key="ToolFirmwareOption.UseLatestFirmware" value="true"/>
<property key="hwtoolclock.frcindebug" value="false"/>
<property key="memories.aux" value="false"/>
<property key="memories.bootflash" value="false"/>
<property key="memories.configurationmemory" value="false"/>
<property key="memories.eeprom" value="false"/>
<property key="memories.flashdata" value="true"/>
<property key="memories.id" value="false"/>
<property key="memories.programmemory" value="true"/>
<property key="memories.programmemory.end" value="0x1fff"/>
<property key="memories.programmemory.start" value="0x0"/>
<property key="poweroptions.powerenable" value="true"/>
<property key="programmertogo.imagename" value=""/>
<property key="programoptions.eraseb4program" value="true"/>
<property key="programoptions.pgmspeed" value="2"/>
<property key="programoptions.preserveeeprom" value="false"/>
<property key="programoptions.preserveprogramrange" value="false"/>
<property key="programoptions.preserveprogramrange.end" value="0x1fff"/>
<property key="programoptions.preserveprogramrange.start" value="0x0"/>
<property key="programoptions.preserveuserid" value="false"/>
<property key="programoptions.testmodeentrymethod" value="VPPFirst"/>
<property key="programoptions.usehighvoltageonmclr" value="false"/>
<property key="programoptions.uselvpprogramming" value="false"/>
<property key="voltagevalue" value="3.25"/>
</PICkit3PlatformTool>
<XC8-config-global>
<property key="advanced-elf" value="true"/>
<property key="output-file-format" value="-mcof,+elf"/>
<property key="stack-size-high" value="auto"/>
<property key="stack-size-low" value="auto"/>
<property key="stack-size-main" value="auto"/>
<property key="stack-type" value="compiled"/>
</XC8-config-global>
</conf>
</confs>
</configurationDescriptor>
//PIC Projects/PICX_16F1829_Controller/nbproject/Makefile-impl.mk
0,0 → 1,69
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a pre- and a post- target defined where you can add customization code.
#
# This makefile implements macros and targets common to all configurations.
#
# NOCDDL
 
 
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
# and .clean-reqprojects-conf unless SUB has the value 'no'
SUB_no=NO
SUBPROJECTS=${SUB_${SUB}}
BUILD_SUBPROJECTS_=.build-subprojects
BUILD_SUBPROJECTS_NO=
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
CLEAN_SUBPROJECTS_=.clean-subprojects
CLEAN_SUBPROJECTS_NO=
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
 
 
# Project Name
PROJECTNAME=PICX_16F1829_Controller
 
# Active Configuration
DEFAULTCONF=default
CONF=${DEFAULTCONF}
 
# All Configurations
ALLCONFS=default
 
 
# build
.build-impl: .build-pre
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf
 
 
# clean
.clean-impl: .clean-pre
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf
 
# clobber
.clobber-impl: .clobber-pre .depcheck-impl
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean
 
 
 
# all
.all-impl: .all-pre .depcheck-impl
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build
 
 
 
# dependency checking support
.depcheck-impl:
# @echo "# This code depends on make tool being used" >.dep.inc
# @if [ -n "${MAKE_VERSION}" ]; then \
# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
# echo "include \$${DEPFILES}" >>.dep.inc; \
# echo "endif" >>.dep.inc; \
# else \
# echo ".KEEP_STATE:" >>.dep.inc; \
# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
# fi
//PIC Projects/PICX_16F1829_Controller/nbproject/Makefile-local-default.mk
0,0 → 1,37
#
# Generated Makefile - do not edit!
#
#
# This file contains information about the location of compilers and other tools.
# If you commmit this file into your revision control server, you will be able to
# to checkout the project and build it from the command line with make. However,
# if more than one person works on the same project, then this file might show
# conflicts since different users are bound to have compilers in different places.
# In that case you might choose to not commit this file and let MPLAB X recreate this file
# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at
# least once so the file gets created and the project can be built. Finally, you can also
# avoid using this file at all if you are only building from the command line with make.
# You can invoke make with the values of the macros:
# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ...
#
SHELL=cmd.exe
PATH_TO_IDE_BIN=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/
# Adding MPLAB X bin directory to path.
PATH:=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/:$(PATH)
# Path to java used to run MPLAB X when this makefile was created
MP_JAVA_PATH="C:\Program Files (x86)\Microchip\MPLABX\sys\java\jre1.7.0_25-windows-x64\java-windows/bin/"
OS_CURRENT="$(shell uname -s)"
MP_CC="C:\Program Files (x86)\Microchip\xc8\v1.20\bin\xc8.exe"
# MP_CPPC is not defined
# MP_BC is not defined
# MP_AS is not defined
# MP_LD is not defined
# MP_AR is not defined
DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/extractobjectdependencies.jar"
MP_CC_DIR="C:\Program Files (x86)\Microchip\xc8\v1.20\bin"
# MP_CPPC_DIR is not defined
# MP_BC_DIR is not defined
# MP_AS_DIR is not defined
# MP_LD_DIR is not defined
# MP_AR_DIR is not defined
# MP_BC_DIR is not defined
//PIC Projects/PICX_16F1829_Controller/nbproject/Makefile-variables.mk
0,0 → 1,13
#
# Generated - do not edit!
#
# NOCDDL
#
CND_BASEDIR=`pwd`
# default configuration
CND_ARTIFACT_DIR_default=dist/default/production
CND_ARTIFACT_NAME_default=PICX_16F1829_Controller.production.hex
CND_ARTIFACT_PATH_default=dist/default/production/PICX_16F1829_Controller.production.hex
CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package
CND_PACKAGE_NAME_default=picx16f1829controller.tar
CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/picx16f1829controller.tar
//PIC Projects/PICX_16F1829_Controller/nbproject/Package-default.bash
0,0 → 1,73
#!/bin/bash -x
 
#
# Generated - do not edit!
#
 
# Macros
TOP=`pwd`
CND_CONF=default
CND_DISTDIR=dist
TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging
TMPDIRNAME=tmp-packaging
OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
OUTPUT_BASENAME=PICX_16F1829_Controller.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
PACKAGE_TOP_DIR=picx16f1829controller/
 
# Functions
function checkReturnCode
{
rc=$?
if [ $rc != 0 ]
then
exit $rc
fi
}
function makeDirectory
# $1 directory path
# $2 permission (optional)
{
mkdir -p "$1"
checkReturnCode
if [ "$2" != "" ]
then
chmod $2 "$1"
checkReturnCode
fi
}
function copyFileToTmpDir
# $1 from-file path
# $2 to-file path
# $3 permission
{
cp "$1" "$2"
checkReturnCode
if [ "$3" != "" ]
then
chmod $3 "$2"
checkReturnCode
fi
}
 
# Setup
cd "${TOP}"
mkdir -p ${CND_DISTDIR}/${CND_CONF}/package
rm -rf ${TMPDIR}
mkdir -p ${TMPDIR}
 
# Copy files and create directories and links
cd "${TOP}"
makeDirectory ${TMPDIR}/picx16f1829controller/bin
copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
 
 
# Generate tar file
cd "${TOP}"
rm -f ${CND_DISTDIR}/${CND_CONF}/package/picx16f1829controller.tar
cd ${TMPDIR}
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/picx16f1829controller.tar *
checkReturnCode
 
# Cleanup
cd "${TOP}"
rm -rf ${TMPDIR}
//PIC Projects/PICX_16F1829_Controller/nbproject/project.properties
--- nbproject/project.xml (nonexistent)
+++ nbproject/project.xml (revision 342)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>com.microchip.mplab.nbide.embedded.makeproject</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/make-project/1">
+ <name>PICX_16F1829_Controller</name>
+ <creation-uuid>a37f9b7c-e474-41b7-9a5b-bc6808e97a44</creation-uuid>
+ <make-project-type>0</make-project-type>
+ <c-extensions>c</c-extensions>
+ <cpp-extensions/>
+ <header-extensions>h</header-extensions>
+ <sourceEncoding>ISO-8859-1</sourceEncoding>
+ <asminc-extensions/>
+ <make-dep-projects/>
+ </data>
+ </configuration>
+</project>
//PIC Projects/PICX_16F1829_Controller/I2C1.h
0,0 → 1,82
#ifndef I2C1_H
#define I2C1_H
 
#define MAXI2C1BUF 32
 
// I2C Operating Speed
#define I2C_100KHZ 0x0
#define I2C_400KHZ 0x1
#define I2C_1MHZ 0x2
 
// Operating State
#define I2C_IDLE 0x1
#define I2C_STARTED 0x2
#define I2C_RCV_DATA 0x3
#define I2C_SEND_DATA 0x4
#define I2C_SEND_ADDR 0x5
#define I2C_SEND_ADDR_2 0x6
#define I2C_CHECK_ACK_SEND 0x7
#define I2C_CHECK_ACK_RECV 0x8
#define I2C_CHECK_ACK_RESTART 0x9
#define I2C_REQ_DATA 0xA
#define I2C_SEND_STOP 0xB
#define I2C_SEND_START 0xC
 
// Operating Mode
#define I2C_MODE_SLAVE 0x10
#define I2C_MODE_MASTER 0x11
 
// Master Status
#define I2C_MASTER_SEND 0x20
#define I2C_MASTER_RECV 0x21
#define I2C_MASTER_RESTART 0x22
#define I2C_MASTER_IDLE 0x23
 
// Return Status
#define I2C_SEND_OK 0x30
#define I2C_SEND_FAIL 0x31
#define I2C_RECV_OK 0x32
#define I2C_RECV_FAIL 0x33
#define I2C_DATA_AVAL 0x34
#define I2C_ERR_NOADDR 0x35
#define I2C_ERR_OVERRUN 0x36
#define I2C_ERR_NODATA 0x37
#define I2C_ERR_BUFFER_OVERRUN 0x38
 
typedef struct {
uint8_t buffer_in[MAXI2C1BUF];
uint8_t buffer_in_len;
uint8_t buffer_in_len_tmp;
uint8_t buffer_in_read_ind;
uint8_t buffer_in_write_ind;
uint8_t buffer_out[MAXI2C1BUF];
uint8_t buffer_out_len;
uint8_t buffer_out_ind;
 
uint8_t operating_mode;
uint8_t operating_state;
uint8_t return_status;
 
uint8_t master_dest_addr;
uint8_t master_status;
uint8_t slave_in_last_byte;
uint8_t slave_sending_data;
} I2C1_DATA;
 
void I2C1_Init(I2C1_DATA *data);
void I2C1_Interrupt_Handler(void);
void I2C1_Interrupt_Slave(void);
void I2C1_Interrupt_Master(void);
void I2C1_Configure_Slave(uint8_t address);
void I2C1_Configure_Master(uint8_t speed);
void I2C1_Master_Send(uint8_t address, uint8_t length, uint8_t *msg);
void I2C1_Master_Recv(uint8_t address, uint8_t length);
void I2C1_Master_Restart(uint8_t address, uint8_t msg, uint8_t length);
uint8_t I2C1_Get_Status(void);
uint8_t I2C1_Buffer_Len(void);
uint8_t I2C1_Read_Buffer(uint8_t *buffer);
uint8_t I2C1_Process_Receive(uint8_t);
 
#endif
//PIC Projects/PICX_16F1829_Controller/I2C2.h
0,0 → 1,82
#ifndef I2C2_H
#define I2C2_H
 
#define MAXI2C2BUF 32
 
// I2C Operating Speed
#define I2C_100KHZ 0x0
#define I2C_400KHZ 0x1
#define I2C_1MHZ 0x2
 
// Operating State
#define I2C_IDLE 0x1
#define I2C_STARTED 0x2
#define I2C_RCV_DATA 0x3
#define I2C_SEND_DATA 0x4
#define I2C_SEND_ADDR 0x5
#define I2C_SEND_ADDR_2 0x6
#define I2C_CHECK_ACK_SEND 0x7
#define I2C_CHECK_ACK_RECV 0x8
#define I2C_CHECK_ACK_RESTART 0x9
#define I2C_REQ_DATA 0xA
#define I2C_SEND_STOP 0xB
#define I2C_SEND_START 0xC
 
// Operating Mode
#define I2C_MODE_SLAVE 0x10
#define I2C_MODE_MASTER 0x11
 
// Master Status
#define I2C_MASTER_SEND 0x20
#define I2C_MASTER_RECV 0x21
#define I2C_MASTER_RESTART 0x22
#define I2C_MASTER_IDLE 0x23
 
// Return Status
#define I2C_SEND_OK 0x30
#define I2C_SEND_FAIL 0x31
#define I2C_RECV_OK 0x32
#define I2C_RECV_FAIL 0x33
#define I2C_DATA_AVAL 0x34
#define I2C_ERR_NOADDR 0x35
#define I2C_ERR_OVERRUN 0x36
#define I2C_ERR_NODATA 0x37
#define I2C_ERR_BUFFER_OVERRUN 0x38
 
typedef struct {
uint8_t buffer_in[MAXI2C2BUF];
uint8_t buffer_in_len;
uint8_t buffer_in_len_tmp;
uint8_t buffer_in_read_ind;
uint8_t buffer_in_write_ind;
uint8_t buffer_out[MAXI2C2BUF];
uint8_t buffer_out_len;
uint8_t buffer_out_ind;
 
uint8_t operating_mode;
uint8_t operating_state;
uint8_t return_status;
 
uint8_t master_dest_addr;
uint8_t master_status;
uint8_t slave_in_last_byte;
uint8_t slave_sending_data;
} I2C2_DATA;
 
void I2C2_Init(I2C2_DATA *data);
void I2C2_Interrupt_Handler(void);
void I2C2_Interrupt_Slave(void);
void I2C2_Interrupt_Master(void);
void I2C2_Configure_Slave(uint8_t address);
void I2C2_Configure_Master(uint8_t speed);
void I2C2_Master_Send(uint8_t address, uint8_t length, uint8_t *msg);
void I2C2_Master_Recv(uint8_t address, uint8_t length);
void I2C2_Master_Restart(uint8_t address, uint8_t msg, uint8_t length);
uint8_t I2C2_Get_Status(void);
uint8_t I2C2_Buffer_Len(void);
uint8_t I2C2_Read_Buffer(uint8_t *buffer);
uint8_t I2C2_Process_Receive(uint8_t);
 
#endif
//PIC Projects/PICX_16F1829_Controller/MCP23009.c
0,0 → 1,40
#include "defines.h"
#include "MCP23009.h"
#include "I2C2.h"
 
static BTN_STATUS *status_ptr;
 
void MCP23009_Init(BTN_STATUS *status) {
status_ptr = status;
uint8_t buffer[8];
 
buffer[0] = 0x00; // Starting register address
buffer[1] = 0xFF; // IODIR, Set all pins as inputs
buffer[2] = 0xFF; // IPOL, Reported values are inverted
// buffer[3] = 0xFF; // GPINTEN, Enable interrupt-on-change
buffer[3] = 0x00; // GPINTEN, Disable interrupt-on-change
buffer[4] = 0x00; // DEFVAL, IOC default values
buffer[5] = 0x00; // INTCON, IOC compare to previous value
buffer[6] = 0x00; // IOCON, Incrementing address, active-low interrupt cleared on GPIO read
buffer[7] = 0xFF; // GPPU, Enable pull-ups on all pins
 
I2C2_Master_Send(MCP23009_ADDR, 8, buffer);
uint8_t result;
do {
result = I2C2_Get_Status();
} while (!result);
}
 
void MCP23009_Query(void) {
uint8_t buffer[2];
 
I2C2_Master_Restart(MCP23009_ADDR, MCP23009_GPIOA, 1);
uint8_t result;
do {
result = I2C2_Get_Status();
} while (!result);
I2C2_Read_Buffer(buffer);
 
status_ptr->w = buffer[0];
}
//PIC Projects/PICX_16F1829_Controller/IO.h
0,0 → 1,13
#ifndef IO_H
#define IO_H
 
typedef struct {
uint8_t btn_change;
} IO_DATA;
 
void IO_Init(void);
void IO_IOC_Enable(void);
void IO_Interrupt(void);
 
#endif /* IO_H */
 
//PIC Projects/PICX_16F1829_Controller/MCP23009.h
0,0 → 1,23
#ifndef MCP23009_H
#define MCP23009_H
 
#define MCP23009_ADDR 0x20
 
#define MCP23009_IODIRA 0x00
#define MCP23009_IPOLA 0x01
#define MCP23009_GPINTENA 0x02
#define MCP23009_DEFVALA 0x03
#define MCP23009_INTCONA 0x04
#define MCP23009_IOCON 0x05
#define MCP23009_GPPUA 0x06
#define MCP23009_INTFA 0x07
#define MCP23009_INTCAPA 0x08
#define MCP23009_GPIOA 0x09
#define MCP23009_OLATA 0x0A
 
void MCP23009_Init(BTN_STATUS *status);
void MCP23009_Query(void);
void MSP23009_Interrupt(void);
 
#endif /* MCP23009_H */
 
//PIC Projects/PICX_16F1829_Controller/TLC59116.h
0,0 → 1,56
#ifndef TLC59116_H
#define TLC59116_H
 
#define TLC59116_ADDR 0x60
#define TLC59116_ALLCALL 0x68
 
// Write to this register to reset chip
#define TLC59116_RESET 0x6B
 
// Increment all registers, rollover from 00000 to 11011
#define TLC59116_AUTO_INCR_ALL 0x80
// Increment brightness registers, rollover from 00010 to 10001
#define TLC59116_AUTO_INCR_BRIGHTNESS 0xA0
// Increment global control registers, rollover from 10010 to 10011
#define TLC59116_AUTO_INCR_GLBL_CTRL 0xC0
// Increment individual and global registers, rollover from 00010 to 10011
#define TLC59116_AUTO_INCR_INDV_CTRL 0xE0
 
#define TLC59116_REG_MODE1 0x00
#define TLC59116_REG_MODE2 0x01
#define TLC59116_REG_PWM0 0x02
#define TLC59116_REG_PWM1 0x03
#define TLC59116_REG_PWM2 0x04
#define TLC59116_REG_PWM3 0x05
#define TLC59116_REG_PWM4 0x06
#define TLC59116_REG_PWM5 0x07
#define TLC59116_REG_PWM6 0x08
#define TLC59116_REG_PWM7 0x09
#define TLC59116_REG_PWM8 0x0A
#define TLC59116_REG_PWM9 0x0B
#define TLC59116_REG_PWM10 0x0C
#define TLC59116_REG_PWM11 0x0D
#define TLC59116_REG_PWM12 0x0E
#define TLC59116_REG_PWM13 0x0F
#define TLC59116_REG_PWM14 0x10
#define TLC59116_REG_PWM15 0x11
#define TLC59116_REG_GRPPWM 0x12
#define TLC59116_REG_GRPFREQ 0x13
#define TLC59116_REG_LEDOUT0 0x14
#define TLC59116_REG_LEDOUT1 0x15
#define TLC59116_REG_LEDOUT2 0x16
#define TLC59116_REG_LEDOUT3 0x17
#define TLC59116_REG_SUBADR1 0x18
#define TLC59116_REG_SUBADR2 0x19
#define TLC59116_REG_SUBADR3 0x1A
#define TLC59116_REG_ALLCALLADR 0x1B
#define TLC59116_REG_IREF 0x1C
#define TLC59116_REG_EFLAG1 0x1D
#define TLC59116_REG_EFLAG2 0x1E
 
void TLC59116_Init(void);
void TLC59116_Write_All(LED_VALUES *values);
void TLC59116_Write_BC(uint8_t brightness);
 
#endif /* TLC59116_H */
 
//PIC Projects/PICX_16F1829_Controller/INTERRUPTS.h
0,0 → 1,15
#ifndef INTERRUPTS_H
#define INTERRUPTS_H
 
// Initialize the interrupts
void Interrupt_Init(void);
 
// Enable all interrupts (high and low priority)
void Interrupt_Enable(void);
 
// Disable all interrupts (high and low priority)
void Interrupt_Disable(void);
 
void interrupt InterruptHandler(void);
 
#endif
//PIC Projects/PICX_16F1829_Controller/Makefile
0,0 → 1,113
#
# There exist several targets which are by default empty and which can be
# used for execution of your targets. These targets are usually executed
# before and after some main targets. They are:
#
# .build-pre: called before 'build' target
# .build-post: called after 'build' target
# .clean-pre: called before 'clean' target
# .clean-post: called after 'clean' target
# .clobber-pre: called before 'clobber' target
# .clobber-post: called after 'clobber' target
# .all-pre: called before 'all' target
# .all-post: called after 'all' target
# .help-pre: called before 'help' target
# .help-post: called after 'help' target
#
# Targets beginning with '.' are not intended to be called on their own.
#
# Main targets can be executed directly, and they are:
#
# build build a specific configuration
# clean remove built files from a configuration
# clobber remove all built files
# all build all configurations
# help print help mesage
#
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
# .help-impl are implemented in nbproject/makefile-impl.mk.
#
# Available make variables:
#
# CND_BASEDIR base directory for relative paths
# CND_DISTDIR default top distribution directory (build artifacts)
# CND_BUILDDIR default top build directory (object files, ...)
# CONF name of current configuration
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
#
# NOCDDL
 
 
# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
 
 
# build
build: .build-post
 
.build-pre:
# Add your pre 'build' code here...
 
.build-post: .build-impl
# Add your post 'build' code here...
 
 
# clean
clean: .clean-post
 
.clean-pre:
# Add your pre 'clean' code here...
# WARNING: the IDE does not call this target since it takes a long time to
# simply run make. Instead, the IDE removes the configuration directories
# under build and dist directly without calling make.
# This target is left here so people can do a clean when running a clean
# outside the IDE.
 
.clean-post: .clean-impl
# Add your post 'clean' code here...
 
 
# clobber
clobber: .clobber-post
 
.clobber-pre:
# Add your pre 'clobber' code here...
 
.clobber-post: .clobber-impl
# Add your post 'clobber' code here...
 
 
# all
all: .all-post
 
.all-pre:
# Add your pre 'all' code here...
 
.all-post: .all-impl
# Add your post 'all' code here...
 
 
# help
help: .help-post
 
.help-pre:
# Add your pre 'help' code here...
 
.help-post: .help-impl
# Add your post 'help' code here...
 
 
 
# include project implementation makefile
include nbproject/Makefile-impl.mk
 
# include project make variables
include nbproject/Makefile-variables.mk