Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 284 → Rev 285

/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"/>