/PIC Stuff/Cerebot_32MX7_LED_Cube/CUBE.c |
---|
684,6 → 684,8 |
// Ensure that the length of the string does not exceed the storage buffer |
if (length > CUBE_STRING_MAX_LENGTH) length = CUBE_STRING_MAX_LENGTH; |
Cube_Overlay_Clear(); |
// Copy the passed data into the buffer |
int i; |
for (i = 0; i < length; i++) |
745,64 → 747,98 |
cube_data_ptr->frame_index = 0; |
cube_data_ptr->frame_checksum = 0; |
cube_data_ptr->frame_command = 0; |
cube_data_ptr->frame_escape = 0; |
cube_data_ptr->frame_state = READ_LENGTH_MSB; |
} else { |
// If the input is the escape char, XOR the next char received |
if (c == CUBE_ESCAPE_CHAR) { |
cube_data_ptr->frame_escape = 1; |
return; |
} |
// XOR the input char if needed |
if (cube_data_ptr->frame_escape) { |
c ^= CUBE_ESCAPE_XOR; |
cube_data_ptr->frame_escape = 0; |
} |
// Process data |
switch (cube_data_ptr->frame_state) { |
case IDLE: |
// Reflect the character back to the transmitter |
UART1_Write(&c, 1); |
break; |
case READ_LENGTH_MSB: // Save MSB of length |
cube_data_ptr->frame_length |= (c << 8); |
cube_data_ptr->frame_state = READ_LENGTH_LSB; |
break; |
case READ_LENGTH_LSB: // Save LSB of length |
cube_data_ptr->frame_length |= c; |
cube_data_ptr->frame_state = READ_COMMAND; |
break; |
case READ_COMMAND: // Store the command byte |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_command = c; |
return; |
} |
// If the input is the escape char, XOR the next char received |
if (c == CUBE_ESCAPE_CHAR) { |
cube_data_ptr->frame_escape = 1; |
return; |
} |
// XOR the input char if needed |
if (cube_data_ptr->frame_escape) { |
c ^= CUBE_ESCAPE_XOR; |
cube_data_ptr->frame_escape = 0; |
} |
// Process data |
switch (cube_data_ptr->frame_state) { |
case IDLE: |
// Reflect the character back to the transmitter |
UART1_Write(&c, 1); |
break; |
case READ_LENGTH_MSB: // Save MSB of length |
cube_data_ptr->frame_length |= (c << 8); |
cube_data_ptr->frame_state = READ_LENGTH_LSB; |
break; |
case READ_LENGTH_LSB: // Save LSB of length |
cube_data_ptr->frame_length |= c; |
cube_data_ptr->frame_state = READ_COMMAND; |
break; |
case READ_COMMAND: // Store the command byte |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_command = c; |
if (cube_data_ptr->frame_length == 1) |
cube_data_ptr->frame_state = READ_CHECKSUM; |
else |
cube_data_ptr->frame_state = READ_DATA; |
break; |
case READ_DATA: // Read the passed data into the buffer |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_buffer[cube_data_ptr->frame_index] = c; |
cube_data_ptr->frame_index++; |
if (cube_data_ptr->frame_index == cube_data_ptr->frame_length - 1) |
cube_data_ptr->frame_state = READ_CHECKSUM; |
break; |
case READ_CHECKSUM: // Process frame if checksum is valid |
cube_data_ptr->frame_checksum = 0xFF - cube_data_ptr->frame_checksum; |
if (cube_data_ptr->frame_checksum == c) { |
Cube_Data_In_Process_Frame(); |
} |
cube_data_ptr->frame_state = IDLE; |
break; |
default: |
break; |
} |
break; |
case READ_DATA: // Read the passed data into the buffer |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_buffer[cube_data_ptr->frame_index] = c; |
cube_data_ptr->frame_index++; |
if (cube_data_ptr->frame_index == cube_data_ptr->frame_length - 1) |
cube_data_ptr->frame_state = READ_CHECKSUM; |
break; |
case READ_CHECKSUM: // Process frame if checksum is valid |
cube_data_ptr->frame_checksum = 0xFF - cube_data_ptr->frame_checksum; |
if (cube_data_ptr->frame_checksum == c) { |
Cube_Data_In_Process_Frame(); |
} |
cube_data_ptr->frame_state = IDLE; |
cube_data_ptr->frame_index = 0; |
cube_data_ptr->frame_length = 0; |
break; |
default: |
break; |
} |
} |
void Cube_Data_In_Process_Frame(void) { |
// Here we process received frames depending on the command |
char *frame = cube_data_ptr->frame_buffer; |
switch (cube_data_ptr->frame_command) { |
case CUBE_COMMAND_SET_BC: |
TIMER5_Stop(); |
Delay_MS(1); // Need to wait for all SPI writes to complete |
Cube_Write_DCS(frame[0]); |
TIMER5_Start(); |
break; |
case CUBE_COMMAND_CLEAR: |
Cube_Clear(); |
break; |
case CUBE_COMMAND_SET_PIXEL: |
Cube_Set_Pixel(frame[0], frame[1], frame[2], frame[3], frame[4], frame[5]); |
break; |
case CUBE_COMMAND_SET_LAYER: |
Cube_Data_Direct_Write(frame[0], &frame[1]); |
break; |
case CUBE_COMMAND_START_TEXT: |
Cube_Text_Init(&frame[3], cube_data_ptr->frame_length - 4, frame[0], frame[1], frame[2]); |
TIMER4_Start(); |
break; |
case CUBE_COMMAND_STOP_TEXT: |
TIMER4_Stop(); |
Cube_Overlay_Clear(); |
break; |
default: |
break; |
} |
} |
void Cube_Data_Direct_Write(char layer, char *buffer) { |
int i; |
for (i = 0; i < GCS_LAYER_SIZE; i++) { |
cube_data_ptr->GCS[layer][i] = buffer[i]; |
} |
} |
/PIC Stuff/Cerebot_32MX7_LED_Cube/CUBE.h |
---|
40,15 → 40,19 |
#define CUBE_STRING_MAX_LENGTH 32 |
// Data Streaming In Buffer Size |
#define CUBE_FRAME_BUFFER_SIZE 128 |
#define CUBE_FRAME_BUFFER_SIZE 600 |
#define CUBE_START_CHAR 0x7E |
#define CUBE_ESCAPE_CHAR 0x7D |
#define CUBE_ESCAPE_XOR 0x20 |
// Data Streaming In Command Set |
#define CUBE_COMMAND_SET_PIXEL 0x10 // Layer, Row, Column, R, G, B <-- frame layout |
#define CUBE_COMMAND_SET_BC 0x0A // [Brightness Value] |
#define CUBE_COMMAND_CLEAR 0x0B // (no data) |
#define CUBE_COMMAND_SET_PIXEL 0x10 // [Layer, Row, Column, R, G, B] |
#define CUBE_COMMAND_SET_LAYER 0x11 // [Layer, R1, G1, B1, R2, ...] |
#define CUBE_COMMAND_START_TEXT 0x20 // [R, G, B, Char1, Char2, Char3, ...] |
#define CUBE_COMMAND_STOP_TEXT 0x21 // (no data) |
typedef enum { |
IDLE, |
READ_LENGTH_MSB, |
115,6 → 119,7 |
// Data stream in control functions |
void Cube_Data_In(char c); |
void Cube_Data_In_Process_Frame(void); |
void Cube_Data_Direct_Write(char layer, char *buffer); |
#endif /* CUBE_H */ |
/PIC Stuff/Cerebot_32MX7_LED_Cube/SPI1.c |
---|
91,7 → 91,7 |
#endif |
// Process SPI1 transmit flag |
if (IFS0bits.SPI1TXIF) { |
if (IFS0bits.SPI1TXIF && IEC0bits.SPI1TXIE) { |
int i; |
// Disable the transmit interrupt if all data has been sent |
if (spi_data_ptr->buffer_out_len == 0) { |
/PIC Stuff/Cerebot_32MX7_LED_Cube/UART1.c |
---|
5,6 → 5,17 |
static UART1_DATA *uart_data_ptr; |
/* Note: BRGH values are different from PIC18! |
* |
* Baud Rate Calculation (BRGH = 0): |
* Baud Rate = PerfBusFreq / (16 * (BRG + 1)) |
* BRG = PerfBusFreq / (16 * Baud Rate) - 1 |
* |
* Baud Rate Calculation (BRGH = 1): |
* Baud Rate = PerfBusFreq / (4 * (BRG + 1)) |
* BRG = PerfBusFreq / (4 * Baud Rate) - 1 |
*/ |
void UART1_Init(UART1_DATA *data, void (*rx_callback)(char)) { |
uart_data_ptr = data; |
uart_data_ptr->rx_callback = rx_callback; |
19,7 → 30,7 |
U1MODE = 0x00008000; // UART enabled, BRGH = 0 |
U1STA = 0x00009400; // TX interrupt on buffer empty, RX interrupt on buffer not empty |
U1BRG = 19; // Set baud rate to 256000 @ 80MHz |
U1BRG = 42; // Set baud rate to 115200 @ 80MHz |
IEC0SET = 0x0C000000; // Enable the RX and Error interrupts |
INTEnableInterrupts(); |
75,7 → 86,7 |
} |
// Process UART1 transmit flag |
if (IFS0bits.U1TXIF) { |
if (IFS0bits.U1TXIF && IEC0bits.U1TXIE) { |
// Disable the transmit interrupt if all data has been sent |
if (uart_data_ptr->buffer_out_ind == uart_data_ptr->buffer_out_len) { |
IEC0CLR = 0x10000000; |
/PIC Stuff/Cerebot_32MX7_LED_Cube/main.c |
---|
126,8 → 126,8 |
// Cube_Set_All(BLUE); |
// Delay_MS(6000); |
char start_text[] = "Cube Initialized\r\n"; |
UART1_Write(start_text, 18); |
// char start_text[] = "Cube Initialized\r\n"; |
// UART1_Write(start_text, 18); |
// Set the overlay text |
// char text_string[] = "Welcome to the CCM Lab "; |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/Makefile-default.mk |
---|
179,12 → 179,12 |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_CC} $(MP_EXTRA_LD_PRE) -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__ICD2RAM=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_PK3=1 |
${MP_CC} $(MP_EXTRA_LD_PRE) -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__ICD2RAM=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_PK3=1,--report-mem |
else |
dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION) |
${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--report-mem |
${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} |
endif |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/Makefile-genesis.properties |
---|
1,5 → 1,5 |
# |
#Wed Aug 07 21:27:20 EDT 2013 |
#Sat Aug 10 23:28:16 EDT 2013 |
default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=6b4fa04caf3910c7c3a4666b1aea8c5c |
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\xc32\\v1.20\\bin |
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=415494acd195d89b2f6d7a36797a5ab4 |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/configurations.xml |
---|
124,7 → 124,7 |
<property key="optimization-level" value=""/> |
<property key="preprocessor-macros" value=""/> |
<property key="remove-unused-sections" value="false"/> |
<property key="report-memory-usage" value="false"/> |
<property key="report-memory-usage" value="true"/> |
<property key="stack-size" value=""/> |
<property key="symbol-stripping" value=""/> |
<property key="trace-symbols" value=""/> |