//PIC Stuff/PICX_16F1825_Sabertooth/INTERRUPTS.c |
---|
1,6 → 1,7 |
#include "defines.h" |
#include "INTERRUPTS.h" |
#include "I2C1.h" |
#include "UART.h" |
void Interrupt_Init() { |
} |
31,4 → 32,27 |
return; |
} |
if (PIR1bits.RCIF) { |
// Call the handler |
UART_RX_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.RCIF = 0; |
return; |
} |
if (PIR1bits.TXIF) { |
// Call the handler |
UART_TX_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.TXIF = 0; |
return; |
} |
} |
//PIC Stuff/PICX_16F1825_Sabertooth/UART.c |
---|
0,0 → 1,106 |
#include <xc.h> |
#include "defines.h" |
#include "UART.h" |
static UART_DATA *data_ptr; |
void UART_Init(UART_DATA *data) { |
data_ptr = data; |
APFCON0bits.RXDTSEL = 1; // Change RX from RB5 to RC5 |
APFCON0bits.TXCKSEL = 1; // Change TX from RB7 to RC4 |
UART_RX_TRIS = 1; |
UART_TX_TRIS = 0; |
SPBRG = 16; // Set baud rate to 115200 @ 32MHz |
BAUDCONbits.BRG16 = 0; // 8-bit baud rate generator |
TXSTAbits.BRGH = 1; // High baud rate select |
TXSTAbits.SYNC = 0; // Async operation |
RCSTAbits.CREN = 1; // Enable reception module |
TXSTAbits.TXEN = 1; // Enable transmission module |
RCSTAbits.SPEN = 1; // Enable EUSART module |
PIE1bits.RCIE = 1; // UART RX interrupt starts enabled |
PIE1bits.TXIE = 0; // UART TX interrupt starts disabled |
// Initialize local variables |
data_ptr->buffer_in_read_ind = 0; |
data_ptr->buffer_in_write_ind = 0; |
data_ptr->buffer_in_len = 0; |
data_ptr->buffer_out_ind = 0; |
data_ptr->buffer_out_len = 0; |
} |
void UART_TX_Interrupt_Handler(void) { |
// Send more data when transmit buffer is empty |
if (data_ptr->buffer_out_ind != data_ptr->buffer_out_len) { |
TXREG = data_ptr->buffer_out[data_ptr->buffer_out_ind]; |
data_ptr->buffer_out_ind++; |
} else { |
// Stop processing TX interrupts if there is no more data to send |
while (!TXSTAbits.TRMT); |
PIE1bits.TXIE = 0; |
data_ptr->buffer_out_ind = 0; |
data_ptr->buffer_out_len = 0; |
} |
} |
void UART_RX_Interrupt_Handler(void) { |
char c = RCREG; |
// Read received data into buffer |
data_ptr->buffer_in[data_ptr->buffer_in_write_ind] = c; |
if (data_ptr->buffer_in_write_ind == UART_BUFFER_SIZE - 1) { |
data_ptr->buffer_in_write_ind = 0; |
} else { |
data_ptr->buffer_in_write_ind++; |
} |
// Increment read counter to keep only the latest data |
if (data_ptr->buffer_in_len < UART_BUFFER_SIZE) { |
data_ptr->buffer_in_len++; |
} else { |
if (data_ptr->buffer_in_read_ind == UART_BUFFER_SIZE - 1) { |
data_ptr->buffer_in_read_ind = 0; |
} else { |
data_ptr->buffer_in_read_ind++; |
} |
} |
// Reset receiver module on overrun error |
if (RCSTAbits.OERR == 1) { |
RCSTAbits.CREN = 0; |
RCSTAbits.CREN = 1; |
} |
} |
void UART_Write(char *data, char length) { |
// Ensure that no transmission is currently running |
while (PIE1bits.TXIE); |
data_ptr->buffer_out_len = length; |
data_ptr->buffer_out_ind = 0; |
for (char i = 0; i < length; i++) { |
data_ptr->buffer_out[i] = data[i]; |
} |
// Start transmission |
PIE1bits.TXIE = 1; |
} |
char UART_Read(char *buffer) { |
PIE1bits.RCIE = 0; // Disable receiver interrupt |
char length = data_ptr->buffer_in_len; |
for (char i = 0; i < length; i++) { |
buffer[i] = data_ptr->buffer_in[data_ptr->buffer_in_read_ind]; |
if (data_ptr->buffer_in_read_ind == UART_BUFFER_SIZE - 1) { |
data_ptr->buffer_in_read_ind = 0; |
} else { |
data_ptr->buffer_in_read_ind++; |
} |
} |
data_ptr->buffer_in_len -= length; |
PIE1bits.RCIE = 1; // Re-enable receiver interrupt |
return length; |
} |
//PIC Stuff/PICX_16F1825_Sabertooth/UART.h |
---|
0,0 → 1,25 |
#ifndef UART_H |
#define UART_H |
#define UART_BUFFER_SIZE 30 |
typedef struct { |
char buffer_in[UART_BUFFER_SIZE]; |
char buffer_in_read_ind; |
char buffer_in_write_ind; |
char buffer_in_len; |
char buffer_out[UART_BUFFER_SIZE]; |
char buffer_out_ind; |
char buffer_out_len; |
} UART_DATA; |
void UART_Init(UART_DATA *data); |
void UART_Write(char *data, char length); |
char UART_Read(char *buffer); |
void UART_TX_Interrupt_Handler(void); |
void UART_RX_Interrupt_Handler(void); |
#endif /* UART_H */ |
//PIC Stuff/PICX_16F1825_Sabertooth/defines.h |
---|
4,6 → 4,9 |
#include <xc.h> |
#include <stdint.h> |
//#define CONTROL_FROM_CONTROLLER |
#define CONTROL_FROM_UART |
// <editor-fold defaultstate="collapsed" desc="I/O Pins"> |
#define LED_1_TRIS TRISCbits.TRISC2 |
#define LED_1_LAT LATCbits.LATC2 |
19,6 → 22,9 |
#define I2C_1_CLK_TRIS TRISCbits.TRISC0 |
#define I2C_1_DAT_TRIS TRISCbits.TRISC1 |
#define UART_RX_TRIS TRISAbits.TRISA1 |
#define UART_TX_TRIS TRISAbits.TRISA0 |
// </editor-fold> |
#define _XTAL_FREQ 32000000 |
27,4 → 33,13 |
#define PWM_MAX 1950 |
#define PWM_MIN 1050 |
#define UART_STATE_READ_CMD 0x1 |
#define UART_STATE_READ_DATA 0x2 |
#define UART_CMD_RESET 0x1 |
#define UART_CMD_LEFT_FORWARD 0x2 |
#define UART_CMD_LEFT_BACKWARD 0x3 |
#define UART_CMD_RIGHT_FORWARD 0x4 |
#define UART_CMD_RIGHT_BACKWARD 0x5 |
#endif /* DEFINES_H */ |
//PIC Stuff/PICX_16F1825_Sabertooth/funclist |
---|
1,28 → 1,31 |
___awdiv: CODE, 1543 0 84 |
_LED_2_On: CODE, 3936 0 3 |
_LED_2_Off: CODE, 3939 0 3 |
_I2C1_Init: CODE, 1627 0 78 |
_I2C1_Interrupt_Slave: CODE, 1070 0 386 |
_I2C1_Read_Buffer: CODE, 1853 0 65 |
_I2C1_Master_Restart: CODE, 1781 0 72 |
_main: CODE, 661 0 409 |
_Interrupt_Enable: CODE, 2045 0 3 |
_InterruptHandler: CODE, 4 0 13 |
_I2C1_Process_Receive: CODE, 3927 0 3 |
_PWM_1_Set: CODE, 4022 0 37 |
_Interrupt_Init: CODE, 3 0 1 |
__initialization: CODE, 3942 0 1 |
_Controller_Read: CODE, 1456 0 87 |
_I2C1_Configure_Master: CODE, 1973 0 45 |
_Controller_Init: CODE, 2 0 1 |
_PWM_1_Init: CODE, 2018 0 27 |
_PWM_2_Set: CODE, 4059 0 37 |
_I2C1_Master_Send: CODE, 1705 0 76 |
_I2C1_Interrupt_Handler: CODE, 3967 0 24 |
_PWM_2_Init: CODE, 3991 0 31 |
_I2C1_Get_Status: CODE, 1918 0 55 |
_LED_1_On: CODE, 3930 0 3 |
_I2C1_Interrupt_Master: CODE, 19 0 642 |
_LED_1_Off: CODE, 3933 0 3 |
_Pins_Init: CODE, 3946 0 21 |
Total: 2210 |
_LED_2_On: CODE, 2041 0 3 |
_LED_2_Off: CODE, 2038 0 3 |
_I2C1_Init: CODE, 1681 0 78 |
_I2C1_Interrupt_Slave: CODE, 677 0 386 |
_UART_Read: CODE, 1598 0 83 |
_I2C1_Read_Buffer: CODE, 1907 0 65 |
_I2C1_Master_Restart: CODE, 1835 0 72 |
_UART_Init: CODE, 4039 0 57 |
_main: CODE, 1063 0 359 |
_Interrupt_Enable: CODE, 2035 0 3 |
_InterruptHandler: CODE, 4 0 29 |
_I2C1_Process_Receive: CODE, 3754 0 3 |
_UART_TX_Interrupt_Handler: CODE, 1972 0 58 |
_PWM_1_Set: CODE, 3865 0 37 |
_Interrupt_Init: CODE, 2047 0 1 |
__initialization: CODE, 2030 0 2 |
_Controller_Read: CODE, 1512 0 86 |
_I2C1_Configure_Master: CODE, 3939 0 45 |
_Controller_Init: CODE, 3 0 1 |
_PWM_1_Init: CODE, 3807 0 27 |
_PWM_2_Set: CODE, 3902 0 37 |
_I2C1_Master_Send: CODE, 1759 0 76 |
_I2C1_Interrupt_Handler: CODE, 3783 0 24 |
_UART_RX_Interrupt_Handler: CODE, 1422 0 90 |
_PWM_2_Init: CODE, 3834 0 31 |
_I2C1_Get_Status: CODE, 3984 0 55 |
_LED_1_On: CODE, 3757 0 3 |
_I2C1_Interrupt_Master: CODE, 35 0 642 |
_LED_1_Off: CODE, 2044 0 3 |
_Pins_Init: CODE, 3760 0 23 |
Total: 2382 |
//PIC Stuff/PICX_16F1825_Sabertooth/l.obj |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
//PIC Stuff/PICX_16F1825_Sabertooth/main.c |
---|
25,6 → 25,7 |
#include "INTERRUPTS.h" |
#include "PWM.h" |
#include "I2C1.h" |
#include "UART.h" |
#include "CONTROLLER.h" |
void Pins_Init(void) { |
37,6 → 38,11 |
// CCP2 on RC3 |
APFCON1bits.CCP2SEL = 0; |
// TX/CK function on RA0 |
APFCON0bits.TXCKSEL = 1; |
// RX/DT function on RA1 |
APFCON0bits.RXDTSEL = 1; |
LED_1_LAT = 1; |
LED_1_TRIS = 0; |
84,6 → 90,9 |
I2C1_Init(&i2c_data); |
I2C1_Configure_Master(I2C_100KHZ); |
UART_DATA uart_data; |
UART_Init(&uart_data); |
Controller_Init(); |
// Initialize interrupts |
104,11 → 113,67 |
CTRL_BTN_STATUS ctrl; |
Controller_Read(&ctrl); |
uint8_t median; |
int16_t L_X, L_Y, R_X, R_Y; |
uint16_t pwm_left = PWM_NOMINAL; |
uint16_t pwm_right = PWM_NOMINAL; |
#ifdef CONTROL_FROM_UART |
uint8_t buffer[32]; |
uint8_t length; |
uint8_t uart_state = UART_STATE_READ_CMD; |
uint8_t uart_cmd; |
while(1) { |
length = UART_Read(buffer); |
for (uint8_t i = 0; i < length; i++) { |
if (uart_state == UART_STATE_READ_CMD) { |
if (buffer[i] == UART_CMD_RESET) { |
RESET(); |
} else { |
// Read and save first byte (command) |
uart_cmd = buffer[i]; |
uart_state = UART_STATE_READ_DATA; |
} |
} else if (uart_state == UART_STATE_READ_DATA) { |
uart_state = UART_STATE_READ_CMD; |
// Process received data |
if (uart_cmd == UART_CMD_LEFT_FORWARD) { |
pwm_left = PWM_NOMINAL + (uint16_t)(buffer[i] * 2); |
if (buffer[i] != 0) LED_2_On(); |
else LED_2_Off(); |
} else if (uart_cmd == UART_CMD_LEFT_BACKWARD) { |
pwm_left = PWM_NOMINAL - (uint16_t)(buffer[i] * 2); |
if (buffer[i] != 0) LED_2_On(); |
else LED_2_Off(); |
} else if (uart_cmd == UART_CMD_RIGHT_FORWARD) { |
pwm_right = PWM_NOMINAL + (uint16_t)(buffer[i] * 2); |
if (buffer[i] != 0) LED_1_On(); |
else LED_1_Off(); |
} else if (uart_cmd == UART_CMD_RIGHT_BACKWARD) { |
pwm_right = PWM_NOMINAL - (uint16_t)(buffer[i] * 2); |
if (buffer[i] != 0) LED_1_On(); |
else LED_1_Off(); |
} |
if (pwm_left > PWM_MAX) |
pwm_left = PWM_MAX; |
if (pwm_left < PWM_MIN) |
pwm_left = PWM_MIN; |
if (pwm_right > PWM_MAX) |
pwm_right = PWM_MAX; |
if (pwm_right < PWM_MIN) |
pwm_right = PWM_MIN; |
PWM_1_Set(pwm_right); |
PWM_2_Set(pwm_left); |
} |
} |
} |
#endif |
#ifdef CONTROL_FROM_CONTROLLER |
uint8_t median; |
int16_t L_X, L_Y, R_X, R_Y; |
while (1) { |
if (!Controller_Read(&ctrl)) { |
median = ctrl.REF / 2; |
167,4 → 232,5 |
LED_2_Off(); |
} |
} |
#endif |
} |
//PIC Stuff/PICX_16F1825_Sabertooth/nbproject/Makefile-default.mk |
---|
45,17 → 45,17 |
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} |
# Source Files Quoted if spaced |
SOURCEFILES_QUOTED_IF_SPACED=main.c INTERRUPTS.c PWM.c I2C1.c CONTROLLER.c |
SOURCEFILES_QUOTED_IF_SPACED=main.c INTERRUPTS.c PWM.c I2C1.c CONTROLLER.c UART.c |
# Object Files Quoted if spaced |
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/PWM.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/CONTROLLER.p1 |
POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/INTERRUPTS.p1.d ${OBJECTDIR}/PWM.p1.d ${OBJECTDIR}/I2C1.p1.d ${OBJECTDIR}/CONTROLLER.p1.d |
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/PWM.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/CONTROLLER.p1 ${OBJECTDIR}/UART.p1 |
POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/INTERRUPTS.p1.d ${OBJECTDIR}/PWM.p1.d ${OBJECTDIR}/I2C1.p1.d ${OBJECTDIR}/CONTROLLER.p1.d ${OBJECTDIR}/UART.p1.d |
# Object Files |
OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/PWM.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/CONTROLLER.p1 |
OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/INTERRUPTS.p1 ${OBJECTDIR}/PWM.p1 ${OBJECTDIR}/I2C1.p1 ${OBJECTDIR}/CONTROLLER.p1 ${OBJECTDIR}/UART.p1 |
# Source Files |
SOURCEFILES=main.c INTERRUPTS.c PWM.c I2C1.c CONTROLLER.c |
SOURCEFILES=main.c INTERRUPTS.c PWM.c I2C1.c CONTROLLER.c UART.c |
CFLAGS= |
118,6 → 118,14 |
@-${MV} ${OBJECTDIR}/CONTROLLER.d ${OBJECTDIR}/CONTROLLER.p1.d |
@${FIXDEPS} ${OBJECTDIR}/CONTROLLER.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/UART.p1: UART.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/UART.p1.d |
@${RM} ${OBJECTDIR}/UART.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=ignore --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}/UART.p1 UART.c |
@-${MV} ${OBJECTDIR}/UART.d ${OBJECTDIR}/UART.p1.d |
@${FIXDEPS} ${OBJECTDIR}/UART.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
else |
${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
159,6 → 167,14 |
@-${MV} ${OBJECTDIR}/CONTROLLER.d ${OBJECTDIR}/CONTROLLER.p1.d |
@${FIXDEPS} ${OBJECTDIR}/CONTROLLER.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/UART.p1: UART.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/UART.p1.d |
@${RM} ${OBJECTDIR}/UART.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=ignore --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}/UART.p1 UART.c |
@-${MV} ${OBJECTDIR}/UART.d ${OBJECTDIR}/UART.p1.d |
@${FIXDEPS} ${OBJECTDIR}/UART.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
endif |
# ------------------------------------------------------------------------------------ |
//PIC Stuff/PICX_16F1825_Sabertooth/nbproject/Makefile-genesis.properties |
---|
1,5 → 1,5 |
# |
#Sun Apr 06 14:31:06 EDT 2014 |
#Sun Apr 20 17:21:55 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 |
//PIC Stuff/PICX_16F1825_Sabertooth/nbproject/configurations.xml |
---|
9,6 → 9,7 |
<itemPath>PWM.h</itemPath> |
<itemPath>I2C1.h</itemPath> |
<itemPath>CONTROLLER.h</itemPath> |
<itemPath>UART.h</itemPath> |
</logicalFolder> |
<logicalFolder name="LinkerScript" |
displayName="Linker Files" |
22,6 → 23,7 |
<itemPath>PWM.c</itemPath> |
<itemPath>I2C1.c</itemPath> |
<itemPath>CONTROLLER.c</itemPath> |
<itemPath>UART.c</itemPath> |
</logicalFolder> |
<logicalFolder name="ExternalFiles" |
displayName="Important Files" |
140,7 → 142,7 |
<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="poweroptions.powerenable" value="false"/> |
<property key="programmertogo.imagename" value=""/> |
<property key="programoptions.eraseb4program" value="true"/> |
<property key="programoptions.pgmspeed" value="2"/> |