Subversion Repositories Code-Repo

Compare Revisions

No changes between revisions

Ignore whitespace Rev 106 → Rev 107

/Classwork/ECE4534 - Embedded Systems/PIC 27J13/Makefile
0,0 → 1,108
#
# 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...
 
.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
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/adc.c
0,0 → 1,29
#include "maindefs.h"
#include "msg_queues.h"
#include "adc.h"
#include <adc.h>
 
void adc_init() {
TRISAbits.TRISA0 = 1;
OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_0_TAD,
ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, 0,
ADC_1ANA);
}
 
void adc_start() {
ConvertADC();
}
 
void adc_stop() {
CloseADC();
}
 
void adc_interrupt_handler() {
// Sends the ADC value to main()
unsigned int ret;
unsigned char length;
ret = ReadADC();
length = 2;
// MQ_sendmsg_ToMainFromLow(length, MSGTYPE_ADC_NEWVALUE, &ret);
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/adc.h
0,0 → 1,9
#ifndef __adc_h
#define __adc_h
 
void adc_init(void);
void adc_start(void);
void adc_stop(void);
void adc_interrupt_handler(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/adc.o.d
0,0 → 1,13
build/default/production/adc.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/adc.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/adc.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/adc.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/circular_buffer.o.d
0,0 → 1,9
build/default/production/circular_buffer.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/circular_buffer.c \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/circular_buffer.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/i2c.o.d
0,0 → 1,10
build/default/production/i2c.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/i2c.c \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/i2c.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/interrupts.o.d
0,0 → 1,16
build/default/production/interrupts.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/interrupts.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/uart.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/i2c.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/adc.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/interrupts.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pin_interrupts.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/led_driver.o.d
0,0 → 1,11
build/default/production/led_driver.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/led_driver.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/led_driver.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/main.o.d
0,0 → 1,20
build/default/production/main.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/main.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/uart.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/i2c.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/led_driver.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/interrupts.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/adc.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pin_interrupts.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/msg_queues.o.d
0,0 → 1,13
build/default/production/msg_queues.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/interrupts.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/pin_interrupts.o.d
0,0 → 1,13
build/default/production/pin_interrupts.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pin_interrupts.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pin_interrupts.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/pwm.o.d
0,0 → 1,12
build/default/production/pwm.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pwm.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pwm.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/timers.o.d
0,0 → 1,15
build/default/production/timers.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/timers.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/adc.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/uart.o.d
0,0 → 1,14
build/default/production/uart.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/uart.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/usart.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/uart.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/xbee.o.d
0,0 → 1,14
build/default/production/xbee.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/msg_queues.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/xbee.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/usart.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/27J13_3_MQ_Mod/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/circular_buffer.c
0,0 → 1,20
#include "circular_buffer.h"
#include "maindefs.h"
 
#pragma udata buffer1
static unsigned char buffer1[256];
#pragma udata buffer2
static unsigned char buffer2[256];
#pragma udata buffer3
static unsigned char buffer3[256];
 
#pragma udata
 
static BUFFER_DATA *buffer_data;
 
void buffer_init() {
buffer_data->read_ind = 0;
buffer_data->read_block = 0;
buffer_data->write_ind = 0;
buffer_data->write_block = 0;
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/circular_buffer.h
0,0 → 1,18
#ifndef __circular_buffer_h
#define __circular_buffer_h
 
#define BUFFER_OK 0
#define BUFFER_FULL -1
 
typedef struct __BUFFER_DATA {
unsigned char read_ind;
unsigned char read_block;
 
unsigned char write_ind;
unsigned char write_block;
} BUFFER_DATA;
 
void buffer_init(BUFFER_DATA *);
char buffer_insert(unsigned char length, unsigned char *msg);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/dist/default/production/27J13_3_MQ_Mod.production.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/dist/default/production/27J13_3_MQ_Mod.production.cof
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/dist/default/production/27J13_3_MQ_Mod.production.hex
0,0 → 1,698
:020000040000FA
:0600000048EF14F01200AD
:020006001200E6
:060008000BEF0FF01200E7
:02000E00C2909E
:040010009D9C1200A1
:04001400B46A1200B8
:060018006FEF0FF0120073
:02001E000200DE
:10002000F3280000DF07000011000000E2280000B4
:08003000DF06000011000000D2
:08003800D9CFE6FFE1CFD9FFAB
:10004000FD0EDBCFFCF6FE0EDBCFFDF6FCC6E9FFB6
:10005000FDC6EAFFDC0EE926000EEA22EE6AED6A32
:10006000FCC6E9FFFDC6EAFFE00EE926000EEA2223
:10007000EF6AFCC6E9FFFDC6EAFFDE0EE926000EC8
:10008000EA22050EEF6EFCC6E9FFFDC6EAFFE20EAE
:10009000E926000EEA22EF6AFCC6E9FFFDC6EAFF88
:1000A000DF0EE926000EEA22EF6AFCC6E9FFFDC674
:1000B000EAFFDC0EE926000EEA22EE6AED6AFCC6D3
:1000C000E9FFFDC6EAFFE30EE926000EEA22EF6A29
:1000D000FCC6E9FFFDC6EAFFE50EE926000EEA22AE
:1000E000EF6AFCC6E9FFFDC6EAFFE60EE926000E50
:1000F000EA22EF6AFCC6E9FFFDC6EAFFE90EE9263F
:10010000000EEA22EF6AFCC6E9FFFDC6EAFFE70E31
:10011000E926000EEA22EF6AFCC6E9FFFDC6EAFF07
:10012000E80EE926000EEA22220EEF6EE552E7CF36
:10013000D9FF1200FCC6E9FFFDC6EAFFE90EE92679
:10014000000EEA22110EEF6E94869488C76AC66A82
:10015000C56AF00EC6140809C66E770EC86EC78E43
:10016000C68A1200D9CFE6FFE1CFD9FF020EE12601
:10017000FD0EDB5069E0DE6ADD6ADECF10F0DDCF18
:1001800011F0FD0EDB50000111AE02D0D89003D06B
:10019000105C000E115820E2FB0EDBCF12F0FC0EBB
:1001A000DBCF13F0DE501224E96EDD501320EA6E2F
:1001B000EF50E66EFCC610F0FDC611F0DE501024C4
:1001C000E96EDD501120EA6EE552E750EF6EDF2A4E
:1001D000010ED3E3DB2AD1D7FD0EDB50E66EFCC661
:1001E000E9FFFDC6EAFFDC0EE926000EEA22E55231
:1001F000E750EE6EED6AFCC6E9FFFDC6EAFFE70ECA
:10020000E926000EEA22FE0EDBCFEFFFFCC6E9FF77
:10021000FDC6EAFFDF0EE926000EEA22EF6AFCC601
:10022000E9FFFDC6EAFFDE0EE926000EEA22090E0E
:10023000EF6EFCC6E9FFFDC6EAFFE80EE926000EF8
:10024000EA22200EEF6EC580020EE15C02E2E16A56
:10025000E552E16EE552E7CFD9FF1200D9CFE6FFB4
:10026000E1CFD9FFFD0EDB5038E0FD0EDB50E66E2E
:10027000FCC6E9FFFDC6EAFFDC0EE926000EEA2215
:10028000E552E750EE6EED6AFCC6E9FFFDC6EAFFF7
:10029000E70EE926000EEA22FE0EDBCFEFFFFCC6DA
:1002A000E9FFFDC6EAFFDF0EE926000EEA22EF6A4B
:1002B000FCC6E9FFFDC6EAFFDE0EE926000EEA22D3
:1002C000090EEF6EFCC6E9FFFDC6EAFFE80EE9265F
:1002D000000EEA22210EEF6EC580E552E7CFD9FF6E
:1002E0001200D9CFE6FFE1CFD9FFFCC6E9FFFDC67A
:1002F000EAFFE90EE926000EEA22100EEF6E948660
:100300009488FE0EDB50E824C86EC76AC66AC56AC8
:10031000F00EC6140E09C66EC78EC580C68AE55299
:10032000E7CFD9FF1200FCC6E9FFFDC6EAFFE90EE0
:10033000E926000EEA22EF50110802E1ADEF01F0CC
:10034000FCC6E9FFFDC6EAFFE90EE926000EEA2237
:10035000EF50100801E10CDA1200FCC6E9FFFDC6FF
:10036000EAFFE80EE926000EEA22EF50200801E03D
:10037000ADD0FCC6E9FFFDC6EAFFDE0EE926000EA1
:10038000EA22EF500B0A1CE0020A04E00C0A01E129
:100390009CD01200FCC6E9FFFDC6EAFFDE0EE9268E
:1003A000000EEA220B0EEF6EFCC6E9FFFDC6EAFF67
:1003B000E70EE926000EEA22EF50E824C96E12008B
:1003C000C5BC62D0FCC6E9FFFDC6EAFFDF0EE92628
:1003D000000EEA22EF50106E116AFCC6E9FFFDC65E
:1003E000EAFFDC0EE926000EEA22EECF12F0EFCF94
:1003F00013F011501318E8AE02D0133404D0125089
:10040000105C135011581EE2FCC6E9FFFDC6EAFF5E
:10041000FCC610F0FDC611F0DF0EE926000EEA2240
:10042000EF501024E96E000E1120EA6EEF50C96EF5
:10043000FCC6E9FFFDC6EAFFDF0EE926000EEA2250
:10044000EF2A1200FCC6E9FFFDC6EAFFDE0EE92630
:10045000000EEA22050EEF6EC584FCC6E9FFFDC65C
:10046000EAFFE80EE926000EEA22220EEF6E000EE9
:10047000E66EE66A2B0EE66EE66A80EC09F0E5525F
:10048000E552E552E5521200FCC6E9FFFDC6EAFF5F
:10049000DE0EE926000EEA22050EEF6EC584FCC6CC
:1004A000E9FFFDC6EAFFE80EE926000EEA22220E69
:1004B000EF6E000EE66EE66A2C0EE66EE66A80ECE3
:1004C00009F0E552E552E552E5521200FCC6E9FF9B
:1004D000FDC6EAFFE80EE926000EEA22EF502108E9
:1004E00001E0E7D0FCC6E9FFFDC6EAFFDE0EE92623
:1004F000000EEA22EF500D0A01E1ACD0010A01E141
:100500009DD00B0A43E00C0A1DE0020A04E00C0A2D
:1005100001E1CFD01200FCC6E9FFFDC6EAFFDE0E06
:10052000E926000EEA220B0EEF6EFCC6E9FFFDC6BF
:10053000EAFFE70EE926000EEA22EF50E82401095F
:10054000C96E1200C5AC7AD0FCC6E9FFFDC6EAFF51
:10055000DE0EE926000EEA22050EEF6EC584FCC60B
:10056000E9FFFDC6EAFFE80EE926000EEA22220EA8
:10057000EF6E000EE66EE66A2E0EE66EE66A80EC20
:1005800009F0E552E552E552E5521200FCC6E9FFDA
:10059000FDC6EAFFFCC610F0FDC611F0DF0EE9262D
:1005A000000EEA22EF501024E96E000E1120EA6ED0
:1005B000C9CFEFFFFCC6E9FFFDC6EAFFDF0EE92663
:1005C000000EEA22EF2AFCC6E9FFFDC6EAFFDF0EB5
:1005D000E926000EEA22EF50106E116AFCC6E9FF10
:1005E000FDC6EAFFDC0EE926000EEA22EECF12F08D
:1005F000EFCF13F011501318E8AE02D0133404D02B
:100600001250105C135011580CE2FCC6E9FFFDC6F5
:10061000EAFFDE0EE926000EEA220C0EEF6EC59A06
:100620000BD0FCC6E9FFFDC6EAFFDE0EE926000E90
:10063000EA220D0EEF6EC58AC5881200FCC6E9FFDE
:10064000FDC6EAFFDE0EE926000EEA22070EEF6E77
:10065000C5861200FCC6E9FFFDC6EAFFDE0EE926EC
:10066000000EEA22050EEF6EC584FCC6E9FFFDC64A
:10067000EAFFE80EE926000EEA22220EEF6EFCC623
:10068000E9FFFDC6EAFFFCC610F0FDC611F0FCC68E
:10069000E6FFFDC6E6FF2D0EE66EDC0EE926000E37
:1006A000EA22EF50E66E80EC09F0E552E552E552A1
:1006B000E5521200D9CFE6FFE1CFD9FFFCC6E9FF32
:1006C000FDC6EAFFE00EE926000EEA22010EEF6EFB
:1006D000FCC6E9FFFDC6EAFFDC0EE926000EEA22B1
:1006E000EE6AED6AFE0EDB5035E0C7AA1DD0FCC6EF
:1006F000E9FFFDC6EAFFDE0EE926000EEA22050E3E
:10070000EF6EFCC6E9FFFDC6EAFFE20EE926000E29
:10071000EA22EF2AFCC6E9FFFDC6EAFFE10EE92660
:10072000000EEA22050E1FD0C7A40AD0FCC6E9FFBE
:10073000FDC6EAFFDE0EE926000EEA22080E13D0FF
:10074000FCC6E9FFFDC6EAFFDE0EE926000EEA223E
:10075000070E09D0FCC6E9FFFDC6EAFFDE0EE9265A
:10076000000EEA22060EEF6EE552E7CFD9FF120027
:10077000D9CFE6FFE1CFD9FF090EE126010EDB6AF2
:10078000020EDB6A030EDB6A040EDB6A080EDB6A0C
:10079000C6AC23D0C69CFCC6E9FFFDC6EAFFDE0E50
:1007A000E926000EEA22050EEF6E010EF36E040E2E
:1007B000F3CFDBFFFCC6E9FFFDC6EAFFE20EE92648
:1007C000000EEA22EF2AFCC6E9FFFDC6EAFFE10EB1
:1007D000E926000EEA22040EEF6EC7A005D0C9502C
:1007E000DF6EDE52010EDD6E040EDB5001E03AD208
:1007F000FCC6E9FFFDC6EAFFDE0EE926000EEA228E
:10080000EF50070A01E17BD10F0A01E16FD00E0A18
:1008100017E0030A01E026D2C7A624D2010EDBCFDF
:10082000E6FF48DFE552FCC6E9FFFDC6EAFFDE0E43
:10083000E926000EEA22EF50080801E013D237D073
:10084000C7A810D0FCC6E9FFFDC6EAFFE00EE92606
:10085000000EEA22EF2A010EDB5001E1F9D1C7AA0E
:100860009CD1E3D1010EDB5001E1FCD1FCC6E9FFD4
:10087000FDC6EAFFE00EE926000EEA22EF2AC7BA1B
:1008800018D0C7B40AD0FCC6E9FFFDC6EAFFDE0EE9
:10089000E926000EEA22070EE4D1FCC6E9FFFDC6F8
:1008A000EAFFDE0EE926000EEA22080EEF6E030EC6
:1008B000BAD1FCC6E9FFFDC6EAFFE20EE926000E4A
:1008C000EA22EF2AFCC6E9FFFDC6EAFFDE0EE926B2
:1008D000000EEA22050EEF6EFCC6E9FFFDC6EAFF38
:1008E000E10EE926000EEA22060EBBD1FCC6E9FFA6
:1008F000FDC6EAFFE50EE926000EEA22EF5001E010
:100900007ED002EC0AF0E76E080EE7CFDBFFDB508B
:100910002A0803E1080EDB501BE1C968FCC6E9FFA9
:10092000FDC6EAFFDF0EE926000EEA22010EEF6E99
:10093000FCC6E9FFFDC6EAFFE50EE926000EEA2245
:10094000010EEF6EFCC6E9FFFDC6EAFFE60E51D0D0
:10095000FCC6E9FFFDC6EAFFFCC612F0FDC613F0B7
:10096000FCC6E6FFFDC6E6FFE40EE926000EEA221D
:10097000EF50E66EE66ADC0EE66EE2EC09F0146E0D
:10098000050EE15E1450106E116A10BE1168FCC6AF
:10099000E9FFFDC6EAFFDC0EE926000EEA2210C0E0
:1009A000EEFF11C0EDFFFCC6E9FFFDC6EAFFDC0E5D
:1009B000E926000EEA22EECF10F0EFCF11F011344D
:1009C00001E350D110500008000E115401E34AD148
:1009D000FCC6E9FFFDC6EAFFEF50C96EDF0EE9264F
:1009E000000EEA22010EEF6EFCC6E9FFFDC6EAFF2B
:1009F000E50EE926000EEA22010EEF6E71D0FCC66C
:100A0000E9FFFDC6EAFFE60EE926000EEA22EF50F6
:100A100026E0FCC6E9FFFDC6EAFFDF0EE926000E70
:100A2000EA22EFCF10F0FCC6E9FFFDC6EAFFE30EB5
:100A3000E926000EEA22EF50105C02E2C96846D0B7
:100A4000FCC6E9FFFDC6EAFFE50EE926000EEA2234
:100A5000EF6AFCC6E9FFFDC6EAFFE60E4BD0FCC616
:100A6000E9FFFDC6EAFFDF0EE926000EEA22EF509D
:100A7000106E116AFCC6E9FFFDC6EAFFDC0EE9262E
:100A8000000EEA22EECF12F0EFCF13F01150131840
:100A9000E8AE02D0133404D01250105C1350115839
:100AA00024E2FCC6E9FFFDC6EAFFFCC610F0FDC665
:100AB00011F0DF0EE926000EEA22EF500F0110249C
:100AC000E96E000E1120EA6EEF50C96EFCC6E9FF18
:100AD000FDC6EAFFDF0EE926000EEA22EF2A010E2C
:100AE000F36E020EF3CFDBFFBDD0FCC6E9FFFDC6FF
:100AF000EAFFE50EE926000EEA22EF6AA9D0C7A8B0
:100B000052D0FCC6E9FFFDC6EAFFE00EE926000E62
:100B1000EA22EF2A010EDB5040E0C7AA21D0FCC632
:100B2000E9FFFDC6EAFFFCC610F0FDC611F0DC0EC1
:100B3000E926000EEA221050EE24E76E1150EE2056
:100B4000EA6EE7CFE9FFDFCFEFFFFCC6E9FFFDC6A6
:100B5000EAFFDC0EE926000EEA22EE2AEF221DD083
:100B6000FCC6E9FFFDC6EAFFE20EE926000EEA2216
:100B7000EF2AFCC6E9FFFDC6EAFFE10EE926000EFA
:100B8000EA22060EEF6EFCC6E9FFFDC6EAFFDE0EA6
:100B9000E926000EEA22050E5AD0010EF36E030E6E
:100BA000F3CFDBFF55D0010EDB505CE0FCC6E9FF64
:100BB000FDC6EAFFE00EE926000EEA22EF2AC7AAE8
:100BC00021D0FCC6E9FFFDC6EAFFFCC610F0FDC659
:100BD00011F0DC0EE926000EEA221050EE24E76E3A
:100BE0001150EE20EA6EE7CFE9FFDFCFEFFFFCC642
:100BF000E9FFFDC6EAFFDC0EE926000EEA22EE2A36
:100C0000EF2230D0C7A411D0FCC6E9FFFDC6EAFF31
:100C1000DE0EE926000EEA22080EEF6E010EF36EDC
:100C2000030EF3CFDBFFC96E1DD0FCC6E9FFFDC686
:100C3000EAFFE20EE926000EEA22EF2AFCC6E9FFEF
:100C4000FDC6EAFFE10EE926000EEA22060EEF6E6F
:100C5000FCC6E9FFFDC6EAFFDE0EE926000EEA2229
:100C6000050EEF6E010EDB5003E1020EDB5002E0D9
:100C7000C6A8C688FCC6E9FFFDC6EAFFDC0EE92669
:100C8000000EEA22EECF10F0EFCF11F0113425E282
:100C90001050DA08000E115420E2030EDB501DE163
:100CA000FCC6E9FFFDC6EAFFDE0EE926000EEA22D9
:100CB000050EEF6EFCC6E9FFFDC6EAFFE20EE9266F
:100CC000000EEA22EF2AFCC6E9FFFDC6EAFFE10EAC
:100CD000E926000EEA22070EEF6E030EDB5070E0ED
:100CE000FCC6E9FFFDC6EAFFFCC610F0FDC611F028
:100CF000DC0EE926000EEA22EECF12F0EFCF13F061
:100D00001206135A10501224E96E11501320EA6E85
:100D1000EF50E66EFCC6E9FFFDC6EAFFE30EE926EA
:100D2000000EEA22E552E750EF6EFCC6E9FFFDC671
:100D3000EAFFE00EE926000EEA22EF50E66EFCC65E
:100D4000E9FFFDC6EAFFFCC610F0FDC611F0DC0E9F
:100D5000E926000EEA221050EE24E76E1150EE2034
:100D6000EA6EE7CFE9FFE552E750EF6EFCC6E9FF18
:100D7000FDC6EAFFFCC610F0FDC611F0FCC6E6FF9A
:100D8000FDC6E6FF290EE66EDC0EE926000EEA221D
:100D9000EECF12F0EFCF13F0010E1224E66E80ECCE
:100DA00009F0E552E552E552E552FCC6E9FFFDC601
:100DB000EAFFDC0EE926000EEA22EE6AED6A47D071
:100DC000FCC6E9FFFDC6EAFFE20EE926000EEA22B4
:100DD000EFCF10F0010E105C3AE3FCC6E9FFFDC650
:100DE000EAFFE20EE926000EEA22050EEFCFDBFF56
:100DF000FCC6E9FFFDC6EAFFE10EE926000EEA2285
:100E0000060EEFCFDBFFFCC6E9FFFDC6EAFFE00EF2
:100E1000E926000EEA22070EEFCFDBFFD950050FBF
:100E2000E66E000EDA20E66E280EE66E030EE66E23
:100E300080EC09F0E552E552E552E552FCC6E9FFC7
:100E4000FDC6EAFFE20EE926000EEA22EF6A090E6D
:100E5000E15C02E2E16AE552E16EE552E7CFD9FFDB
:100E60001200FCC6E9FFFDC6EAFFE80EE926000E07
:0C0E7000EA22EF50220801E1000C010C06
:040E7C00D9CFE6FFE5
:100E8000E1CFD9FFE652FD0EDBCFE9FFFE0EDBCF4F
:100E9000EAFF060EE926000EEA22EF6AFD0EDBCF1E
:100EA000E9FFFE0EDBCFEAFF070EE926000EEA227D
:100EB000EF6ADF6A030EDF5C15E2FD0EDBCFE9FFB0
:100EC000FE0EDBCFEAFFDF50020DE950F324E96E9E
:100ED000EA50F420EA6EEE50EFCFEAFFE96EEF6AD7
:100EE000DF2AE8D7E552E552E7CFD9FF1200050126
:100EF000FA6B000EEA6F0B0EEB6F000EEC6F0A0E32
:100F0000ED6F000EEE6F090EEF6F000EF26F080E20
:100F1000F36F000EF46F070EF56F000EF66F060EFE
:100F2000F76FEA0EE66E050EE66EA8DFE552E552B3
:100F3000F20EE66E050EE66EA1DFE552E5521200F6
:100F4000D9CFE6FFE1CFD9FF050EE126FC0EDB503D
:100F5000E66ED950030FE96EDACFEAFFE552E750AB
:100F6000EE6EED6AFD0EDBCFE9FFFE0EDBCFEAFF92
:100F7000060EE926000EEA22EFCFDFFFFD0EDBCFE3
:100F8000E9FFFE0EDBCFEAFFDF50020DE950F3244C
:100F9000E96EEA50F420EA6E010EEECFDBFF020E9E
:100FA000EDCFDBFF010EDBCFE9FF020EDBCFEAFF67
:100FB000EF5002E0FF0E64D0010EDBCFE9FF020E1E
:100FC000DBCFEAFFEE52FC0EDBCFEFFF010EDBCFF3
:100FD000E9FF020EDBCFEAFFE926000EEA22FB0E54
:100FE000DBCFEFFF030EDBCFE6FF040EDBCFE6FF28
:100FF000F90EDBCFE6FFFA0EDBCFE6FF010EDBCF0B
:10100000E9FF020EDBCFEAFF030EE926000EEA221B
:10101000E9CF10F0EACF11F0E9CFE6FFEACFE6FF23
:101020004BEC13F0126E060EE15E1250FD0EDBCF9C
:10103000E9FFFE0EDBCFEAFF060EE926000EEA22EC
:10104000EF28106E030E116E0C6E10C007F056ECF8
:1010500014F00350E66EFD0EDBCFE9FFFE0EDBCF92
:10106000EAFF060EE926000EEA22E552E750EF6E8F
:10107000010EDBCFE9FF020EDBCFEAFF010EEF6EC0
:10108000106E050EE15C02E2E16AE552E16E10507D
:10109000E552E7CFD9FF1200D9CFE6FFE1CFD9FF64
:1010A000050EE126FD0EDBCFE9FFFE0EDBCFEAFFEA
:1010B000070EE926000EEA22EFCFDFFFFD0EDBCFA1
:1010C000E9FFFE0EDBCFEAFFDF50020DE950F3240B
:1010D000E96EEA50F420EA6E010EEECFDBFF020E5D
:1010E000EDCFDBFF010EDBCFE9FF020EDBCFEAFF26
:1010F000EF0401E086D0010EDBCFE9FF020EDBCF6B
:10110000EAFFEE52EFCF10F0FC0EDB50D880105407
:1011100002E2FD0E77D0010EDBCFE9FF020EDBCF3E
:10112000EAFFEE52EF50E66ED950030FE96EDACFC8
:10113000EAFFE552E750EE6EED6A030EDBCFE6FF05
:10114000040EDBCFE6FF010EDBCFE9FF020EDBCFA3
:10115000EAFF030EE926000EEA22E9CF10F0EACFFB
:1011600011F0E9CFE6FFEACFE6FFF80EDBCFE6FFAE
:10117000F90EDBCFE6FF4BEC13F0126E060EE15ECC
:101180001250FD0EDBCFE9FFFE0EDBCFEAFF070EAC
:10119000E926000EEA22EF28106E030E116E0C6E87
:1011A00010C007F056EC14F00350E66EFD0EDBCFD6
:1011B000E9FFFE0EDBCFEAFF070EE926000EEA226A
:1011C000E552E750EF6E010EDBCFE9FF020EDBCFF9
:1011D000EAFFE926000EEA22EF50E66EFA0EDBCFB8
:1011E000E9FFFB0EDBCFEAFFE552E750EF6E010EA1
:1011F000DBCFE9FF020EDBCFEAFFEF6A030EDB5025
:1012000001D0FC0E106E050EE15C02E2E16AE552CF
:10121000E16E1050E552E7CFD9FF1200D9CFE6FFBB
:10122000E1CFD9FF030EE126FD0EDBCFE9FFFE0E75
:10123000DBCFEAFF070EE926000EEA22EFCFDFFF41
:10124000FD0EDBCFE9FFFE0EDBCFEAFFDF50020D24
:10125000E950F324E96EEA50F420EA6E010EEECF75
:10126000DBFF020EEDCFDBFF010EDBCFE9FF020E4D
:10127000DBCFEAFFEF040BE1010EDBCFE9FF020E4B
:10128000DBCFEAFFE926000EEA22EF5001D0000E84
:10129000106E030EE15C02E2E16AE552E16E10506D
:1012A000E552E7CFD9FF1200D9CFE6FFE1CFD9FF52
:1012B000FD0EDBCFE9FFFE0EDBCFEAFFE9CF10F03A
:1012C000EACF11F0FD0EDBCFE9FFFE0EDBCFEAFF28
:1012D000070EE926000EEA22EF50020D1050F3240B
:1012E000E96E1150F420EA6EEE50EFCFEAFFE96E9E
:1012F000EF50E552E7CFD9FF1200D38E0300120062
:10130000D9CFE6FFE1CFD9FFFB0EDBCFE6FFFC0E26
:10131000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF09
:10132000EA0EE66E050EE66E0BDE106E060EE15E50
:101330001050E552E7CFD9FF1200D9CFE6FFE1CF39
:10134000D9FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E8C
:10135000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFC9
:10136000EA0EE66E050EE66E97DE106E070EE15E83
:101370001050E552E7CFD9FF1200EA0EE66E050ED7
:10138000E66E4CDFE552E5521200D9CFE6FFE1CF21
:10139000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E39
:1013A000DBCFE6FFFE0EDBCFE6FFF20EE66E050EAC
:1013B000E66EC6DD106E060EE15E1050E552E7CF18
:1013C000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCF6C
:1013D000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EEC
:1013E000DBCFE6FFFE0EDBCFE6FFF20EE66E050E6C
:1013F000E66E52DE106E070EE15E1050E552E7CF4A
:10140000D9FF1200F20EE66E050EE66E07DFE5521A
:10141000E55212000501FA5101E11200EDEC0EF067
:10142000F3CF10F0F4CF11F0F350F41001E01200FC
:10143000D1EC0EF0F3CF10F0F4CF11F0F350F41024
:1014400001E11200EA0EE66E050EE66E2DDFE552B2
:10145000E552000901E012007DEF09F0F9EC0EF011
:10146000F3CF10F0F4CF11F0F350F41001E11200BB
:101470000501010EFA6FEA0EE66E050EE66E14DF48
:10148000E552E552000903E00501FA6B12000A0E6D
:0A149000E66E18EC14F0E552EED7FA
:06149A00D9CFE6FFE1CF0F
:1014A000D9FF9388939A8A988A9AFD0EDBCFFBF531
:1014B000FE0EDBCFFCF5FBC5E9FFFCC5EAFFF30E32
:1014C000E926000EEA22EF6AFBC5E9FFFCC5EAFF48
:1014D000F40EE926000EEA22EF6AFBC5E9FFFCC51F
:1014E000EAFFF50EE926000EEA220A0EEF6EFBC5B2
:1014F000E9FFFCC5EAFF030EE926000EEA22E9CF68
:10150000FDF5EACFFEF5E552E7CFD9FF1200D9CFBE
:10151000E6FFE1CFD9FFFE0EDB507E0823E1FBC5DD
:10152000E9FFFCC5EAFFF30EE926000EEA22EF6AA6
:10153000FBC5E9FFFCC5EAFFF40EE926000EEA222E
:10154000EF6AFBC5E9FFFCC5EAFF7E0EEF6EFBC547
:10155000E9FFFCC5EAFFF50EE926000EEA220B0EB4
:10156000EF6EB8D0FBC5E9FFFCC5EAFFF50EE92632
:10157000000EEA22EF500F0A01E192D0010A2EE09C
:10158000020A1AE0070A02E0010AA4D0FBC5E9FF3B
:10159000FCC5EAFFEE52010EE926000EEA22FE0E1D
:1015A000DBCFEFFFFBC5E9FFFCC5EAFFF50EE9263F
:1015B000000EEA220C0E8DD0FBC5E9FFFCC5EAFF48
:1015C000EE52FE0EDBCFEFFFFBC5E9FFFCC5EAFFE5
:1015D000F50EE926000EEA220E0E7BD0FBC5E9FFD0
:1015E000FCC5EAFFF30EE926000EEA22EFCF10F069
:1015F000FBC5E9FFFCC5EAFFEE52EECF11F0EFCFDD
:1016000012F01150105C000E125426E2FBC5E9FFE7
:10161000FCC5EAFFF30EE926000EEA22EF500501B1
:10162000EA6AFD25E96EFE51EA22FE0EDBCFEFFFEE
:10163000FBC5E9FFFCC5EAFFF40EE926000EEA222D
:10164000FE0EDB50EF26FBC5E9FFFCC5EAFFF30EFB
:10165000E926000EEA22EF2AFBC5E9FFFCC5EAFFF6
:10166000F30EE926000EEA22EF50106E116AFBC558
:10167000E9FFFCC5EAFFEE52EECF12F0EFCF13F018
:101680001250101827E11350111824E1FBC5E9FF8F
:10169000FCC5EAFFF50EE926000EEA220F0E19D06E
:1016A000FBC5E9FFFCC5EAFFF40EE926000EEA22BD
:1016B000EF28E86C106EFE0EDB50105C01E10ED8D6
:1016C000FBC5E9FFFCC5EAFFF50EE926000EEA229C
:1016D0000A0EEF6EE552E7CFD9FF1200D9CFE6FF31
:1016E000E1CFD9FFE652FDC5E9FFFEC5EAFFEF50A5
:1016F0008A0A40E01F0A38E0340A30E0360A28E05F
:10170000060A20E0030A18E0190A10E01B0A08E0A4
:10171000180A47E1FDC5E6FFFEC5E6FF3C0E2FD0E7
:10172000FDC5E6FFFEC5E6FF3D0E29D0FDC5E6FF7F
:10173000FEC5E6FF3E0E23D0FDC5E6FFFEC5E6FF73
:101740003F0E1DD0FDC5E6FFFEC5E6FF400E17D0DB
:10175000FDC5E6FFFEC5E6FF410E11D0FDC5E6FF63
:10176000FEC5E6FF420E0BD0FDC5E6FFFEC5E6FF57
:10177000430E05D0FDC5E6FFFEC5E6FF440EE66E4E
:10178000FBC5E9FFFCC5EAFFEE52EF50E66E80ECC8
:1017900009F0E552E552E552E552DF6EDFCF10F079
:1017A0001034E552E552E7CFD9FF1200D9CFE6FF5A
:1017B000E1CFD9FF020EE126010EDB6A7E0EE66E56
:1017C00001EC14F0E552A850020BFDE06BD80009C3
:1017D000FAE1E66A01EC14F0E552A850020BFDE0D4
:1017E00061D80009FAE1FC0EDBCFE6FF01EC14F052
:1017F000E552A850020BFDE055D80009FAE1DF6A76
:10180000FC0EDB50DF5C2DE2DF50E76EFD0EDBCF20
:10181000E9FFFE0EDBCFEAFFE750E926000EEA22E1
:10182000EF50E66E01EC14F0E552DF50E76EFD0E6E
:10183000DBCFE9FFFE0EDBCFEAFFE750E926000E23
:10184000EA22010EDBCFE7FFEF50E726010EE7CFDC
:10185000DBFFA850020BFDE025D80009FAE1DF2AE2
:10186000CFD7010EDB28E86CE66E01EC14F0E552F0
:10187000A8A2FED7020EE15C02E2E16AE552E16E47
:10188000E552E7CFD9FF1200D9CFE6FFE1CFD9FF6C
:10189000FE0EDB5002E08A8A01D08A9AE552E7CF39
:1018A000D9FF1200D9CFE6FFE1CFD9FFE652815030
:1018B000100B01E0010EDF6EDF5002E0010E01D0DF
:0C18C000000EE552E552E7CFD9FF120000
:0418CC00D9CFE6FF8B
:1018D000E1CFD9FF180EE126020EDB6A030EDB6AA8
:1018E000FC0ED3140009D36EF70EE66E040EE66EFE
:1018F000D0EC11F0E552E552000EE66E040EE66EF5
:101900004DEC0AF0E552E552000EE66E050EE66E6D
:101910001CEC00F0E552E55277EC07F0BEEC0DF060
:101920000DEC12F028EC14F080EC0FF0CDEC0EF082
:10193000C8EC0EF05F0EE66E71EC01F0E5522EEC95
:101940000AF0000EE66E0C0EE66ED950010FE66E40
:10195000000EDA20E66EDC0EE66E9DEC09F0106EED
:10196000050EE15E1050DF6EDFCF10F0103403E3A0
:10197000FC0EDF5CE4D7010EDB504D0AE0E0010A0B
:10198000DEE0070ADCE0010ADAE0030AD8E0010A37
:10199000D6E00F0AD4E0010AD2E0020A01E1D6D073
:1019A000070A01E1D0D0010A01E1CAD0030A01E12E
:1019B000C4D0010A01E1BED07F0A01E1B8D0010A1A
:1019C00001E1B2D0030A01E17BD0010A61E0120A11
:1019D000B6E0030A4FE0010AB2E0070AB0E0020AEB
:1019E00012E0010A03E0360AAAE0BAD0020EDB6A6E
:1019F000DF50F36E020EDBCFF4FFF350F45C9FE296
:101A0000020EDB2AF5D7020EDB6ADF04F36E020E4C
:101A1000DBCFF4FFF350F45C03E2020EDB2AF5D7D0
:101A20000C010051090A01E18AD7010A01E187D7B7
:101A30000F0A01E184D7010A01E181D7020A07E018
:101A4000060A01E07CD7010EDF6E006F05D0010EA3
:101A5000DF6E030EDBCF00FC000EE66E0C0EE66EB2
:101A60002A0EE66EDFCFE6FFC5EC09F0E552E5523F
:101A7000E55258D0020EDB6ADF50F36E020EDBCF68
:101A8000F4FFF350F45C01E35AD7020EDB2AF4D7DB
:101A9000D950040FE96EDACFEAFF000EEE6E0C0E9D
:101AA000ED6E020EDB6A050EDF5CF36E020EDBCF1D
:101AB000F4FFF350F45C01E342D7020EDB2AF3D7C4
:101AC000D950060FE96EDACFEAFF000EEE6E0C0E6B
:101AD000ED6E020EDB6A0C0EDF5CF36E020EDBCFE6
:101AE000F4FFF350F45C03E2020EDB2AF4D7060E97
:101AF000DBCFE9FF070EDBCFEAFF0C0EE926000E75
:101B0000EA22030EEFCFDBFF060EDBCFE9FF070E65
:101B1000DBCFEAFF0C0EE926000EEA22EF50E66E5C
:101B200027EC0EF0E5520BD7D950080F11D0D95041
:101B30000A0F0ED0D9500C0F0BD0D9500E0F08D071
:101B4000D950100F05D0D950120F02D0D950140F10
:101B5000E96EDACFEAFF000EEE6E0C0EED6EEFD6F8
:101B6000020EDB6ADF50F36E020EDBCFF4FFF350A0
:0C1B7000F45C01E3E4D6020EDB2AF4D79B
:041B7C00929092921F
:101B8000929492968990899289948996E66AE66AF7
:101B900008D8E552E55212008982000089920000BF
:101BA0001200D9CFE6FFE1CFD9FF020EE1268990DE
:101BB000DE6ADD6ADECF10F0DDCF11F0D890115073
:101BC00004E6080E105C000E115814E2FD0EDB5006
:101BD000010BE8B08984E8A08994DEDFFD0EDBCF3D
:101BE000F3FFF390F342F3CFDBFFDF2A010EE2E3D2
:101BF000DB2AE0D7DE6ADD6ADECF10F0DDCF11F040
:101C0000D890115004E6080E105C000E115814E232
:101C1000FE0EDB50010BE8B08984E8A08994BCDF9C
:101C2000FE0EDBCFF3FFF390F342F3CFDBFFDF2AAF
:101C3000010EE2E3DB2AE0D78980020EE15C02E2DA
:101C4000E16AE552E16EE552E7CFD9FF1200D9CF44
:101C5000E6FFE1CFD9FF030EE126DF6A010EDB6A62
:101C6000020EDB6A0A0E106E0C6EFE0EDBCF07F062
:101C700056EC14F0020E03C0DBFFDB50090A36E01D
:101C8000010A30E00F0A2AE0010A24E0030A1EE0FC
:101C9000010A18E0070A12E0010A0CE0030A06E054
:101CA000010A27E1010EE6C7DBFF23D0010EE7C7DB
:101CB000DBFF1FD0010EE8C7DBFF1BD0010EE9C719
:101CC000DBFF17D0010EEAC7DBFF13D0010EEBC715
:101CD000DBFF0FD0010EECC7DBFF0BD0010EEDC711
:101CE000DBFF07D0010EEEC7DBFF03D0010EEFC70D
:101CF000DBFF0A0E106E0C6EFE0EDBCF07F056EC0B
:101D000014F0020E07C0DBFFDB50090A2DE0010AC8
:101D100028E00F0A23E0010A1EE0030A19E0010A85
:101D200014E0070A0FE0010A0AE0030A05E0010ACD
:101D30001DE1E6C7DFFF1AD0E7C7DFFF17D0E8C70E
:101D4000DFFF14D0E9C7DFFF11D0EAC7DFFF0ED0F5
:101D5000EBC7DFFF0BD0ECC7DFFF08D0EDC7DFFF1D
:101D600005D0EEC7DFFF02D0EFC7DFFF010EDBCFEC
:101D7000E6FFDFCFE6FF15DFE552E552030EE15C3B
:101D800002E2E16AE552E16EE552E7CFD9FF1200C7
:101D9000A58A9F86F08C9D861200D08EF28EF29CD2
:101DA0001200F250800B800A01E0010E106E116AE1
:101DB00010BE116810C0F3FF11C0F4FF1200F25002
:101DC000400B400A01E0010E106E116A10BE11684E
:101DD00010C0F3FF11C0F4FF1200F2BC04D0E1DF29
:101DE000F350F41002E0F36A02D0010EF36EF46ACD
:101DF0001200F3DFF3CF10F0F4CF11F0F350F41032
:101E000007E1CFDFF350F41003E1010EF36E01D0D0
:101E1000F36AF46A1200DACFE4FFE2CFDAFFE9CF27
:101E2000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CF1B
:101E3000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACF04
:101E4000E4FFFBCFE4FF00EE00F0100EE80403E334
:101E5000EECFE4FFFBD700EE10F0050EE80403E33D
:101E6000EECFE4FFFBD7E6529EA60CD0010EE66E45
:101E700044EC0CF0E5529E9693EC01F0E66A44ECDB
:101E80000CF0E552A4AA03D0F1EC11F0A49AE552AB
:101E900000EE14F0050EE80403E3E5CFEDFFFBD7F9
:101EA00000EE0FF0100EE80403E3E5CFEDFFFBD7E3
:101EB000E5CFFBFFE5CFFAFFE5CFF4FFE5CFF3FF7A
:101EC000E5CFF5FFE5CFF8FFE5CFF7FFE5CFF6FF6C
:101ED000E5CFEAFFE5CFE9FFE5CFDAFF1100D8CF84
:101EE000E4FFE0CFE4FFE46EDACFE4FFE652E55230
:101EF000E5CFDAFFE550E5CFE0FFE5CFD8FF1000F2
:101F0000928A94948B940E01100EE16FF086F19AF0
:101F100012008B84640EE66EEAEC13F0E5528B94AB
:101F2000120004010F0EF96FF19E9388938A938C2F
:101F3000938E8A988A9A8A9C8A9EF2861200D9CFBA
:101F4000E6FFE1CFD9FFE652F00E8114E8380F0B1F
:101F5000DF6EDF500401F919010B13E0F9A105D080
:101F6000000EE66EE66A470E04D0000EE66EE66AE4
:101F7000460EE66EE66A80EC09F0E552E552E5525F
:101F8000E552DF500401F919020B13E0F9A305D063
:101F9000000EE66EE66A490E04D0000EE66EE66AB2
:101FA000480EE66EE66A80EC09F0E552E552E5522D
:101FB000E552DF500401F919040B13E0F9A505D02F
:101FC000000EE66EE66A4B0E04D0000EE66EE66A80
:101FD0004A0EE66EE66A80EC09F0E552E552E552FB
:101FE000E552DF500401F919080B13E0F9A705D0F9
:101FF000000EE66EE66A4D0E04D0000EE66EE66A4E
:102000004C0EE66EE66A80EC09F0E552E552E552C8
:10201000E552DFCFF9F4E552E552E7CFD9FF1200E0
:10202000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF83
:10203000E652E652E652DF6AF8CF01F0F6CF02F040
:10204000FD0EDB80DB82DB84DB86DB88DB8AFC0E3B
:10205000DB84DB86DB88DB8ADB8CDB8EFD0EDBCF73
:10206000E6FFC00EBA10E552E714BA6EFC0EDBCFE5
:10207000E6FF0F0EBA10E552E714BA6E3F0E106E6F
:10208000FD0EDB50105C02E194940FD0FD0EDB508E
:10209000BF0802E1949409D0FD0EDB507F0804E0F4
:1020A000FD0EDB50FF0801E1949401C0F8FF02C06F
:1020B000F6FFE552E552E552E552E5CFDAFFE7CF0C
:0420C000D9FF120032
:0C20C400D9CFE6FFDACFE6FFE1CFD9FF6D
:1020D000E2CFDAFFC26AC16AFC0EDB50400DF3505A
:1020E000C00B106EFC0EDB407F0B3C0B1010C26E61
:1020F000FD0EDB50040DF350380B116EFD0EDB3876
:102100000F0B070B106EFD0EDB50800B1010111023
:10211000C16EF90EDBCF10F0FA0EDBCF11F011C05B
:1021200010F0116A10C048FFF90EDBCF49FF060E10
:10213000106EFB0EDB50C00B10C0E7FFE75204E04F
:10214000E8427F0BE706FCE10E01B86FFC0EDBAE48
:1021500003D09E9C9D8CF28CC280E552E5CFDAFFC5
:06216000E7CFD9FF1200D9
:0A2166001E0EF66E000EF76E000E5E
:10217000F86E06010900F550F56F0900F550F66F8D
:1021800003E1F56701D03DD00900F550F06F09007B
:10219000F550F16F0900F550F26F09000900F55094
:1021A000E96E0900F550EA6E090009000900F550D2
:1021B000F36F0900F550F46F09000900F6CFF7F648
:1021C000F7CFF8F6F8CFF9F6F0C6F6FFF1C6F7FF4D
:1021D000F2C6F8FF0601F35302E1F45307E00900E9
:1021E000F550EE6EF307F8E2F407F9D7F7C6F6FFFD
:1021F000F8C6F7FFF9C6F8FF0601F507000EF65B13
:04220000BFD7120032
:0C220400D9CFE6FFDACFE6FFE1CFD9FF2B
:10221000E2CFDAFFE652E652E652DF6AF8CF01F08B
:10222000F6CF02F0FD0EDB80DB82DB84DB86DB8811
:10223000DB8AFC0EDB84DB86DB88DB8ADB8CDB8ED7
:10224000FD0EDBCFE6FFC00EB410E552E714B46E0E
:10225000FC0EDBCFE6FF0F0EB410E552E714B46EB0
:102260003F0E106EFD0EDB50105C01E10DD0FD0E37
:10227000DB50BF0801E108D0FD0EDB507F0804E011
:10228000FD0EDB50FF0800E101C0F8FF02C0F6FFC1
:10229000E552E552E552E552E5CFDAFFE7CFD9FF47
:0222A00012002A
:0E22A200D9CFE6FFDACFE6FFE1CFD9FFE2CFDA
:1022B000DAFF0C0EBA6EFC0E0F015217DB50180B32
:1022C000E840E840E8401F0B5213070E521506E1A4
:1022D000CA94FD0EDB50CB6ECA841DD0070E52157A
:1022E000010806E17694FD0EDB50776E768413D0FC
:1022F000070E5215020806E11E95FD0EDBCF1FFFEB
:102300001E8509D0070E5215030805E11B95FD0E29
:10231000DBCF1CFF1B85E552E5CFDAFFE7CFD9FF06
:022320001200A9
:0E232200D9CFE6FFDACFE6FFE1CFD9FFE2CF59
:10233000DAFF0C0EB46EC70E0F015217FC0EDB5005
:10234000700BE8407F0B5213380E521506E1CA9409
:10235000FD0EDB50CB6ECA841DD0380E5215080816
:1023600006E17694FD0EDB50776E768413D0380E3E
:102370005215100806E11E95FD0EDBCF1FFF1E85CE
:1023800009D0380E5215180805E11B95FD0EDBCF5C
:102390001CFF1B85E552E5CFDAFFE7CFD9FF12001E
:1023A000D9CFE6FFE1CFD9FF190EE66EE66A3C0E03
:1023B000E66E86EC12F0E552E552E5520E010A0E89
:1023C000F76F060EC96F190EE66EE66A7C0EE66EB2
:1023D0004AEC12F0E552E552E552E552E7CFD9FF5B
:1023E0001200A4AA06D076EC13F0E66E87EC0AF091
:1023F000E5520501FFA710D0AC98AC889C989C884A
:10240000000EE66EE66A1E0EE66EE66A80EC09F0E5
:0A241000E552E552E552E5521200D4
:06241A00949094928B9057
:102420008B920E010E0ECB6F120ECC6F12008F0E20
:10243000E66EE66851EC11F0E552E552F40EE66EF8
:10244000010EE66EEEEC12F0E552E552FC0EE66E81
:102450003F0EE66E10EC10F0E552E5528F0EE66E80
:10246000E66891EC11F0E552E552F40EE66E010ECD
:10247000E66EBFEC12F0E552E552FC0EE66E3F0E42
:10248000E66E02EC11F0E552E55212006DEC14F02C
:042490000AEF00F05F
:0C249400D9CFE6FFDACFE6FFE1CFD9FF99
:1024A000E2CFDAFFA86A9C6AFD0EDBB0A888DBA247
:1024B00002D0A88C9C8CDBB4A88EDBA602D09C88B2
:1024C00001D09C8ADBA802D0A88401D0A894DBBAF2
:1024D0009C86DBAC02D0A38A01D0A39ADBAE02D0EB
:1024E000A38801D0A398FB0EDB50AB6EFC0EDBCFB4
:1024F00011F011C010F0116A10507D6EA88A9C8EE8
:0C250000E552E5CFDAFFE7CFD9FF12006B
:04250C00D9CFE6FF3E
:10251000DACFE6FFE1CFD9FFE2CFDAFFAD6AAC6AEE
:10252000FD0EDBB0AD88DBA202D0AD8CAC8CDBB491
:10253000AD8EDBA602D0AC8801D0AC8ADBB8AD840E
:10254000DBBAAC86DBAC02D09D8A01D09D9ADBAEB3
:1025500002D09D8801D09D98FB0EDB50B06EFC0E22
:10256000DBCF11F011C010F0116A10507F6EAD8AF0
:0E257000AC8EE552E5CFDAFFE7CFD9FF1200BF
:02257E00D9CFB3
:10258000E6FFDACFE6FFE1CFD9FFE2CFDAFFE6528E
:10259000E652FC0EDBCF10F0FD0EDBCF11F0060E85
:1025A000D89010361136E804FBE110C0DEFF11C0F0
:1025B000DDFF010EDB50B56EDF50E840E8403F0B19
:1025C000300B106ECF0EB4141010B46EE552E552FD
:0C25D000E552E5CFDAFFE7CFD9FF12009B
:0425DC00D9CFE6FF6E
:1025E000DACFE6FFE1CFD9FFE2CFDAFFE652E652DB
:1025F000FC0EDBCF10F0FD0EDBCF11F0060ED890F5
:1026000010361136E804FBE110C0DEFF11C0DDFF1B
:10261000010EDB50BB6EDF50E840E8403F0B300B53
:10262000106ECF0EBA141010BA6EE552E552E55294
:0A263000E5CFDAFFE7CFD9FF120073
:06263A009280FE0EE66E28
:102640001F0EE66EE66A840EE66EE10EE66E62EC42
:1026500010F0106E050EE15E105012006FEF14F0D6
:1026600007EF00F0D9CFE6FFE1CFD9FF030EE12657
:1026700064EC14F0F3CFDEFFF4CFDDFF020EF36E57
:10268000DB6E030EE15C02E2E16AE552E16EE552C7
:06269000E7CFD9FF1200A4
:0A269600D9CFE6FFDACFE6FFFA0E17
:1026A000E3CFD9FFFB0EE3CFDAFFFC0EE3CFE9FF68
:1026B000FD0EE3CFEAFFE9CFF3FFEACFF4FFF80E18
:1026C000E35003E1F90EE35008E0F80EE30602E2FE
:1026D000F90EE306DECFEEFFF2D7FF0EE3CFDAFF0F
:0C26E000E552FF0EE3CFD9FFE5521200D7
:0426EC00D9CFE6FF5D
:1026F000DACFE6FFE1CFD9FFE2CFDAFFE652F20E02
:102700000501FF179CAC03D0FF919CB0FF819CB4E6
:10271000FF859CB2FF87AA50DF6EDF50E552E5527D
:0A272000E5CFDAFFE7CFD9FF120082
:06272A00FEC6E9FFFFC638
:10273000EAFFEF6AFEC6E9FFFFC6EAFFEE52EF6A64
:10274000FEC6E9FFFFC6EAFF020EE926000EEA22F6
:10275000EF6AFEC6E9FFFFC6EAFF030EE926000E98
:06276000EA22EF6A1200FC
:0A276600D9CFE6FFDACFE6FFE1CF9E
:10277000D9FFE2CFDAFFE652E652FC0EDBCFDEFFF6
:10278000DBCFDDFF010EDB50CF6EDF50CE6EE552AA
:0E279000E552E552E5CFDAFFE7CFD9FF1200A0
:02279E00D9CF91
:1027A000E6FFDACFE6FFE1CFD9FFE2CFDAFFFD0E99
:1027B000DB50FB0BCA6ECC6A9E92FD0EDBAE02D0E4
:1027C0009D8201D09D92CA84E552E5CFDAFFE7CF22
:0427D000D9FF12001B
:0C27D400FF0EE350166EEF0E01D0F30E66
:1027E000E76EE72EF1EF13F00C0E156EE76AE72E99
:1027F000F7EF13F0152EF6EF13F0162EEFEF13F0A0
:022800001200C4
:0E280200D9CFE6FFDACFE6FFE1CFD9FFE2CF74
:10281000DAFFA8AC04D0A8900501FFB3A880FD0E94
:10282000DB50A96EE552E5CFDAFFE7CFD9FF120002
:10283000FF0EE350166E480E01D04C0EE76EE72EE9
:10284000FED7E76AE72EFED7162EF7D70000120054
:10285000050EE66ECFEC13F0E55212001200330EB7
:10286000E66EF30EE66EB3EC13F0E552E55212009D
:10287000B00EF36E00EE00F00E0E01D81200EA600A
:1028800002D0EE6AFCD7F350E9601200EE6AFCD782
:102890001DEE00F02DEE00F0F86A0F9CB3EC10F086
:0C28A00003EC00F066EC0CF0FBD712001B
:0428AC00036A080EA5
:1028B000E76ED890073603360C50035C02E3036ED4
:0828C000072AE72EF7D71200EA
:0828C800C450136E126AC350E4
:0A28D0001210F36E13C0F4FF1200A3
:0428DA00BA6A1200C4
:0228DE00C282B4
:0228E0001200E4
:0E28E20000EEFE9CFC9E8EFC60DAF266B6BE36
:0328F000E4FEF60D
:0D28F30000EEFE9CFC9E8EFC60DAF266B6E4
:04290000BEE4FEF63D
:020000040001F9
:01FFF800AA5E
:01FFFA00FD09
:01FFFD00F80B
:00000001FF
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/i2c.c
0,0 → 1,448
#include "msg_queues.h"
#include "maindefs.h"
//#include <i2c.h>
#include "i2c.h"
 
static I2C_DATA *i2c_pdata;
 
// Set up the data structures for the i2c code
// Should be called once before any i2c routines are called
void i2c_init(I2C_DATA *data) {
i2c_pdata = data;
i2c_pdata->buflen = 0;
i2c_pdata->slave_event_count = 0;
i2c_pdata->status = I2C_IDLE;
i2c_pdata->slave_error_count = 0;
i2c_pdata->bufind = 0;
i2c_pdata->buflen = 0;
i2c_pdata->slave_in_last_byte = 0;
i2c_pdata->slave_sending_data = 0;
i2c_pdata->slave_sending_blank_data = 0;
i2c_pdata->mode = 0;
i2c_pdata->master_dest_addr = 0;
i2c_pdata->master_state = I2C_MASTER_IDLE;
}
 
// Setup the PIC to operate as a master.
void i2c_configure_master() {
i2c_pdata->mode = I2C_MODE_MASTER;
 
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
 
SSPSTAT = 0x0;
SSPCON1 = 0x0;
SSPCON2 = 0x0;
SSPCON1bits.SSPM = 0x8; // I2C Master Mode
SSPADD = 0x77; // Operate at 100KHz (48MHz)
SSPSTATbits.SMP = 1; // Disable Slew Rate Control
SSPCON1bits.SSPEN = 1; // Enable MSSP Module
}
 
// Sends length number of bytes in msg to specified address (no R/W bit)
void i2c_master_send(unsigned char address, unsigned char length, unsigned char *msg) {
int i;
if (length == 0)
return;
// Copy message to send into buffer and save length/address
for (i = 0; i < length; i++) {
i2c_pdata->buffer[i] = msg[i];
}
i2c_pdata->buflen = length;
i2c_pdata->master_dest_addr = address;
i2c_pdata->bufind = 0;
 
// Change status to 'next' operation
i2c_pdata->status = I2C_SEND_ADDR;
i2c_pdata->master_state = I2C_MASTER_SEND;
// Generate start condition
SSPCON2bits.SEN = 1;
}
 
// Reads length number of bytes from address (no R/W bit)
void i2c_master_recv(unsigned char address, unsigned char length) {
if (length == 0)
return;
 
// Save length and address to get data from
i2c_pdata->buflen = length;
i2c_pdata->master_dest_addr = address;
i2c_pdata->bufind = 0;
 
// Change status to 'next' operation
i2c_pdata->status = I2C_SEND_ADDR;
i2c_pdata->master_state = I2C_MASTER_RECV;
// Generate start condition
SSPCON2bits.SEN = 1;
}
 
// Setup the PIC to operate as a slave. The address must not include the R/W bit
void i2c_configure_slave(unsigned char addr) {
i2c_pdata->mode = I2C_MODE_SLAVE;
// Ensure the two lines are set for input (we are a slave)
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
 
SSPADD = addr << 1; // Set the slave address
 
SSPSTAT = 0x0;
SSPCON1 = 0x0;
SSPCON2 = 0x0;
SSPCON1bits.SSPM = 0xE; // Enable Slave 7-bit w/ start/stop interrupts
SSPSTATbits.SMP = 1; // Slew Off
SSPCON2bits.SEN = 1; // Enable clock-stretching
SSPCON1bits.SSPEN = 1; // Enable MSSP Module
}
 
void i2c_interrupt_handler() {
// Call interrupt depending on which mode we are operating in
if (i2c_pdata->mode == I2C_MODE_MASTER) {
i2c_interrupt_master();
} else if (i2c_pdata->mode == I2C_MODE_SLAVE) {
i2c_interrupt_slave();
}
}
 
// An internal subroutine used in the master version of the i2c_interrupt_handler
void i2c_interrupt_master() {
// If we are in the middle of sending data
if (i2c_pdata->master_state == I2C_MASTER_SEND) {
switch (i2c_pdata->status) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_pdata->status = I2C_CHECK_ACK;
SSPBUF = (i2c_pdata->master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK:
// Check if ACK is received or not
if (!SSPCON2bits.ACKSTAT) {
// If an ACK is received, send next byte of data
if (i2c_pdata->bufind < i2c_pdata->buflen) {
SSPBUF = i2c_pdata->buffer[i2c_pdata->bufind];
i2c_pdata->bufind++;
} else {
// If no more data is to be sent, send stop bit
i2c_pdata->status = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_COMPLETE, (void *) 0);
}
} else {
// If a NACK is received, stop transmission and send error
i2c_pdata->status = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_FAILED, (void *) 0);
}
break;
}
// If we are in the middle of receiving data
} else if (i2c_pdata->master_state == I2C_MASTER_RECV) {
switch (i2c_pdata->status) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send address with write bit set
i2c_pdata->status = I2C_CHECK_ACK;
SSPBUF = (i2c_pdata->master_dest_addr << 1) | 0x1;
break;
case I2C_CHECK_ACK:
// Check if ACK is received
if (!SSPCON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_pdata->status = I2C_RCV_DATA;
SSPCON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_pdata->status = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_RECV_FAILED, (void *) 0);
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
i2c_pdata->buffer[i2c_pdata->bufind] = SSPBUF;
i2c_pdata->bufind++;
if (i2c_pdata->bufind < i2c_pdata->buflen) {
// If we still need to read, send an ACK to the slave
i2c_pdata->status = I2C_REQ_DATA;
SSPCON2bits.ACKDT = 0; // ACK
SSPCON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_pdata->status = I2C_SEND_STOP;
SSPCON2bits.ACKDT = 1; // NACK
SSPCON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_pdata->status = I2C_RCV_DATA;
SSPCON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit and copy message to send to Main()
i2c_pdata->status = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(i2c_pdata->buflen, MSGTYPE_I2C_MASTER_RECV_COMPLETE, (void *) i2c_pdata->buffer);
break;
}
}
}
 
// An internal subroutine used in the slave version of the i2c_interrupt_handler
void i2c_handle_start(unsigned char data_read) {
i2c_pdata->slave_event_count = 1;
i2c_pdata->buflen = 0;
 
// Check to see if we also got the address
if (data_read) {
if (SSPSTATbits.D_A == 1) {
DBG_PRINT_I2C("I2C Start: (ERROR) no address recieved\r\n");
// This is bad because we got data and we wanted an address
i2c_pdata->status = I2C_IDLE;
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_NOADDR;
} else {
if (SSPSTATbits.R_W == 1) {
i2c_pdata->status = I2C_SEND_DATA;
} else {
i2c_pdata->status = I2C_RCV_DATA;
}
}
} else {
i2c_pdata->status = I2C_STARTED;
}
}
 
void i2c_interrupt_slave() {
unsigned char i2c_data;
unsigned char data_read_from_buffer = 0;
unsigned char data_written_to_buffer = 0;
unsigned char msg_send_data_to_main = 0;
unsigned char overrun_error = 0;
unsigned char error_buf[3];
unsigned char msgtype = 0;
 
// Clear SSPOV (overflow bit)
if (SSPCON1bits.SSPOV == 1) {
DBG_PRINT_I2C("I2C: overflow detected\r\n");
SSPCON1bits.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_pdata->status = I2C_IDLE;
overrun_error = 1;
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_OVERRUN;
}
 
// Read SPPxBUF if it is full
if (SSPSTATbits.BF == 1) {
i2c_data = SSPBUF;
DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSPBUF);
data_read_from_buffer = 1;
}
 
if (!overrun_error) {
switch (i2c_pdata->status) {
case I2C_IDLE:
{
// Ignore anything except a start
if (SSPSTATbits.S == 1) {
i2c_handle_start(data_read_from_buffer);
// If we see a slave read, then we need to handle it here
if (i2c_pdata->status == I2C_SEND_DATA) {
// Return the first byte (message id)
SSPBUF = 0x3;
}
}
break;
}
case I2C_STARTED:
{
// In this case, we expect either an address or a stop bit
if (SSPSTATbits.P == 1) {
// We need to check to see if we also read an address (a message of length 0)
i2c_pdata->slave_event_count++;
if (data_read_from_buffer) {
if (SSPSTATbits.D_A == 0) {
msg_send_data_to_main = 1;
} else {
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_NODATA;
}
}
// Return to idle mode
i2c_pdata->status = I2C_IDLE;
} else if (data_read_from_buffer) {
i2c_pdata->slave_event_count++;
if (SSPSTATbits.D_A == 0) {
if (SSPSTATbits.R_W == 0) { // Slave write
i2c_pdata->status = I2C_RCV_DATA;
} else { // Slave read
i2c_pdata->status = I2C_SEND_DATA;
// Return the first byte (message id)
SSPBUF = 0x3;
}
} else {
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_pdata->slave_error_count++;
i2c_pdata->status = I2C_IDLE;
i2c_pdata->slave_error_code = I2C_ERR_NODATA;
}
}
break;
}
case I2C_SEND_DATA:
{
// If we arnt current in the middle of sending data, check to see
// if there is a message in the queue to send
if (!i2c_pdata->slave_sending_data) {
// Check the message type of the next message in queue
msgtype = MQ_peek_FromMainToHigh();
if (msgtype != MSGTYPE_I2C_REPLY || msgtype == 0) {
// If the message queue is empty or to another interrupt processor, return 0xFF
DBG_PRINT_I2C("I2C: Returning 0xFF [%d:%d]\r\n", 0, i2c_pdata->slave_in_last_byte-1);
SSPBUF = 0xFF;
i2c_pdata->bufind = 1;
i2c_pdata->slave_sending_data = 1;
i2c_pdata->slave_sending_blank_data = 1;
data_written_to_buffer = 1;
} else {
i2c_pdata->buflen = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *)i2c_pdata->slave_outbufmsgtype, (void *) i2c_pdata->buffer);
// DBG_PRINT_I2C("%x\r\n",i2c_ptr->buffer[0]);
// DBG_PRINT_I2C("I2C: buffer Message Length: %d\r\n",i2c_ptr->outbuflen);
if (i2c_pdata->buflen > 0) {
// Otherwise return the first byte of data
DBG_PRINT_I2C("I2C: Returning %x [%d,%d]\r\n", i2c_pdata->buffer[0], 0, i2c_pdata->buflen-1);
SSPBUF = i2c_pdata->buffer[0];
i2c_pdata->bufind = 1;
i2c_pdata->slave_sending_data = 1;
data_written_to_buffer = 1;
} else {
DBG_PRINT_I2C("I2C: (ERROR) Unexpected msg in queue, type = %x\r\n", i2c_pdata->slave_outbufmsgtype);
}
}
} else if (i2c_pdata->slave_sending_blank_data) {
// If we are currently sending 0xFFs back, keep sending for the requested number of bytes
if (i2c_pdata->bufind < i2c_pdata->slave_in_last_byte) {
DBG_PRINT_I2C("I2C: Returning 0xFF [%d:%d]\r\n", i2c_pdata->bufind, i2c_pdata->slave_in_last_byte-1);
SSPBUF = 0xFF;
i2c_pdata->bufind++;
data_written_to_buffer = 1;
} else {
// We have nothing left to send
i2c_pdata->slave_sending_data = 0;
i2c_pdata->slave_sending_blank_data = 0;
i2c_pdata->status = I2C_IDLE;
}
} else {
// Otherwise keep sending back the requested data
if (i2c_pdata->bufind < i2c_pdata->buflen) {
DBG_PRINT_I2C("I2C: Returning %x [%d,%d]\r\n", i2c_pdata->buffer[i2c_pdata->bufind], i2c_pdata->bufind, i2c_pdata->buflen-1);
SSPBUF = i2c_pdata->buffer[i2c_pdata->bufind];
i2c_pdata->bufind++;
data_written_to_buffer = 1;
} else {
// We have nothing left to send
i2c_pdata->slave_sending_data = 0;
i2c_pdata->status = I2C_IDLE;
}
}
break;
}
case I2C_RCV_DATA:
{
// We expect either data or a stop bit or a (if a restart, an addr)
if (SSPSTATbits.P == 1) {
// We need to check to see if we also read data
i2c_pdata->slave_event_count++;
if (data_read_from_buffer) {
if (SSPSTATbits.D_A == 1) {
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_data;
i2c_pdata->buflen++;
msg_send_data_to_main = 1;
} else {
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_NODATA;
i2c_pdata->status = I2C_IDLE;
}
} else {
msg_send_data_to_main = 1;
}
i2c_pdata->status = I2C_IDLE;
} else if (data_read_from_buffer) {
i2c_pdata->slave_event_count++;
if (SSPSTATbits.D_A == 1) {
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_data;
i2c_pdata->buflen++;
} else /* a restart */ {
if (SSPSTATbits.R_W == 1) {
i2c_pdata->status = I2C_SEND_DATA;
msg_send_data_to_main = 1;
// Return the first byte (message id)
SSPBUF = 0x3;
 
} else { // Bad to recv an address again, we aren't ready
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_NODATA;
i2c_pdata->status = I2C_IDLE;
}
}
}
break;
}
}
}
 
// Release the clock stretching bit (if we should)
if (data_read_from_buffer || data_written_to_buffer) {
// Release the clock
if (SSPCON1bits.CKP == 0) {
SSPCON1bits.CKP = 1;
}
}
 
// Must check if the message is too long
if ((i2c_pdata->buflen > MAXI2CBUF - 2) && (!msg_send_data_to_main)) {
DBG_PRINT_I2C("I2C: (ERROR) message too long\r\n");
i2c_pdata->status = I2C_IDLE;
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_MSGTOOLONG;
}
 
if (msg_send_data_to_main) {
DBG_PRINT_I2C("I2C: sending message to main()\r\n");
i2c_pdata->slave_in_last_byte = i2c_pdata->buffer[i2c_pdata->buflen-1];
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_pdata->slave_event_count;
MQ_sendmsg_ToMainFromHigh(i2c_pdata->buflen + 1, MSGTYPE_I2C_DATA, (void *) i2c_pdata->buffer);
i2c_pdata->buflen = 0;
} else if (i2c_pdata->slave_error_count >= I2C_ERR_THRESHOLD) {
DBG_PRINT_I2C("I2C: (ERROR) error threshold passed\r\n");
error_buf[0] = i2c_pdata->slave_error_count;
error_buf[1] = i2c_pdata->slave_error_code;
error_buf[2] = i2c_pdata->slave_event_count;
MQ_sendmsg_ToMainFromHigh(sizeof (unsigned char) *3, MSGTYPE_I2C_DBG, (void *) error_buf);
i2c_pdata->slave_error_count = 0;
}
}
 
unsigned char i2c_master_busy() {
if (i2c_pdata->master_state == I2C_MASTER_IDLE) {
return 0;
} else {
return 1;
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/i2c.h
0,0 → 1,57
#ifndef __i2c_h
#define __i2c_h
 
#define MAXI2CBUF MSGLEN
 
#define I2C_IDLE 0x5
#define I2C_STARTED 0x6
#define I2C_RCV_DATA 0x7
#define I2C_SEND_DATA 0x8
#define I2C_SEND_ADDR 0x9
#define I2C_CHECK_ACK 0xB
#define I2C_REQ_DATA 0xC
#define I2C_SEND_STOP 0xD
 
#define I2C_MODE_SLAVE 0x10
#define I2C_MODE_MASTER 0x11
 
#define I2C_MASTER_SEND 0x20
#define I2C_MASTER_RECV 0x21
#define I2C_MASTER_IDLE 0x22
 
#define I2C_ERR_THRESHOLD 1
#define I2C_ERR_OVERRUN 0x4
#define I2C_ERR_NOADDR 0x5
#define I2C_ERR_NODATA 0x6
#define I2C_ERR_MSGTOOLONG 0x7
#define I2C_ERR_MSG_TRUNC 0x8
 
typedef struct __I2C_DATA {
unsigned char buffer[MAXI2CBUF];
int buflen;
unsigned char status;
unsigned char bufind;
unsigned char slave_event_count;
unsigned char slave_error_code;
unsigned char slave_error_count;
unsigned char slave_in_last_byte;
unsigned char slave_outbufmsgtype;
unsigned char slave_sending_data;
unsigned char slave_sending_blank_data;
 
unsigned char master_dest_addr;
unsigned char master_state;
unsigned char mode;
} I2C_DATA;
 
void i2c_init(I2C_DATA *);
void i2c_interrupt_handler(void);
void i2c_interrupt_slave(void);
void i2c_interrupt_master(void);
void i2c_configure_slave(unsigned char);
void i2c_configure_master(void);
void i2c_master_send(unsigned char address, unsigned char length,unsigned char *msg);
void i2c_master_recv(unsigned char address, unsigned char length);
unsigned char i2c_master_busy(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/interrupts.c
0,0 → 1,188
#include "maindefs.h"
#include "timers.h"
#include "msg_queues.h"
#include "uart.h"
#include "i2c.h"
#include "adc.h"
#include "interrupts.h"
#include "xbee.h"
#include "pin_interrupts.h"
 
//----------------------------------------------------------------------------
// Note: This code for processing interrupts is configured to allow for high and
// low priority interrupts. The high priority interrupt can interrupt the
// the processing of a low priority interrupt. However, only one of each type
// can be processed at the same time. It is possible to enable nesting of low
// priority interrupts, but this code is not setup for that and this nesting
// is not enabled.
 
void interrupt_init() {
// Peripheral interrupts can have their priority set to high or low
// Decide on the priority of the enabled peripheral interrupts (0 is low, 1 is high)
// INTCON2bits.TMR0IP = 0; // Timer0 interrupt
// IPR1bits.TMR1IP = 1; // Timer1 interrupt
// IPR1bits.RC1IP = 0; // USART1 RX interrupt
IPR3bits.RC2IP = 1; // USART2 RX interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
// IPR1bits.ADIP = 0; // ADC interupt
// INTCON2bits.RBIP = 1; // Port B interrupt
INTCON3bits.INT1IP = 1; // INT1 interrupt
// I2C interupts must be specifically enabled
PIE1bits.SSPIE = 1;
}
 
void interrupt_enable() {
// Peripheral interrupts can have their priority set to high or low.
// Enable both high-priority interrupts and low-priority interrupts
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 0;
}
 
int interrupt_in_high_interrupt_routine() {
return (!INTCONbits.GIEH);
}
 
int interrupt_low_int_active() {
return (!INTCONbits.GIEL);
}
 
int interrupt_in_low_interrupt_routine() {
if (INTCONbits.GIEL == 1) {
return (0);
} else if (interrupt_in_high_interrupt_routine()) {
return (0);
} else {
return (1);
}
}
 
int interrupt_in_main_routine() {
if ((!interrupt_in_low_interrupt_routine()) && (!interrupt_in_high_interrupt_routine())) {
return (1);
} else {
return (0);
}
}
 
// Set up the interrupt vectors
void InterruptHandlerHigh();
void InterruptHandlerLow();
 
#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow(void) {
_asm
goto InterruptHandlerLow //jump to interrupt routine
_endasm
}
 
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void) {
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
 
//----------------------------------------------------------------------------
// High priority interrupt routine
// this parcels out interrupts to individual handlers
 
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh() {
// 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 I2C interrupt
if (PIR1bits.SSPIF) {
// Nofity the xbee to stop sending serial data
xbee_set_RTS(1);
 
// Clear the interrupt flag
PIR1bits.SSPIF = 0;
// Call the handler
i2c_interrupt_handler();
 
// Notify xbee to resume sending serial data
xbee_set_RTS(0);
}
 
// Check to see if we have an interrupt on USART2 RX
if (PIR3bits.RC2IF) {
// Call the interrupt handler
uart_recv_interrupt_handler();
 
// Clear the interrupt flag
PIR3bits.RC2IF = 0;
}
 
#ifdef _MASTER
// Check to see if we have an interrupt on INT1
if (INTCON3bits.INT1IF) {
INTCON3bits.INT1IF = 0;
 
int1_interrupt_handler();
}
#endif
 
// // Check to see if we have an interrupt on timer 1
// if (PIR1bits.TMR1IF) {
// // Clear the interrupt flag
// PIR1bits.TMR1IF = 0;
//
// // Call the interrupt handler
// timer1_interrupt_handler();
// }
 
// // Check to see if we have an interrupt on any port B inputs <4:7>
// if (INTCONbits.RBIF) {
// port_b_int_interrupt_handler();
//
// INTCONbits.RBIF = 0;
// }
 
// The *last* thing I do here is check to see if we can
// allow the processor to go to sleep
// This code *DEPENDS* on the code in messages.c being
// initialized using "init_queues()" -- if you aren't using
// this, then you shouldn't have this call here
// MQ_sleep_high_interrupt_if_okay();
}
 
//----------------------------------------------------------------------------
// Low priority interrupt routine
// this parcels out interrupts to individual handlers
#pragma code
#pragma interruptlow InterruptHandlerLow
// This works the same way as the "High" interrupt handler
void InterruptHandlerLow() {
 
// // Check to see if we have an interrupt on timer 0
// if (INTCONbits.TMR0IF) {
// // Clear this interrupt flag
// INTCONbits.TMR0IF = 0;
//
// // Call the handler
// timer0_interrupt_handler();
// }
 
// // Check to see if we have an interrupt on USART1 RX
// if (PIR1bits.RC1IF) {
// // Clear the interrupt flag
// PIR1bits.RC1IF = 0;
//
// // Call the interrupt handler
// uart_recv_interrupt_handler();
// }
// // Check to see if we have an interrupt on ADC
// if (PIR1bits.ADIF) {
// // Clear the interrupt flag
// PIR1bits.ADIF = 0;
//
// // Call the interrupt handler
// adc_interrupt_handler();
// }
}
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/interrupts.h
0,0 → 1,29
#ifndef __interrupts_h
#define __interrupts_h
 
// Note: As the interrupt system is currently setup, at the end
// of each high-priority interrupt, the system will check to
// see if the processor may be put to sleep. This is done
// with the call sleep_high_interrupt_if_okay() which is defined
// in msg_queues.h -- init_queues() MUST be called prior to
// enabling interrupts if sleep_high_interrupt_if_okay() is called!
 
// Initialize the interrupts
void interrupt_init(void);
 
// enable the interrupts (high and low priority)
void interrupt_enable(void);
 
// Are we calling from a high-priority interrupt?
int interrupt_in_high_interrupt_routine(void);
 
// Is a low-priority interrupt active?
int interrupt_low_int_active(void);
 
// Are we calling from a low-priority interrupt?
int interrupt_in_low_interrupt_routine(void);
 
// Are we calling this from the "main" routine (i.e., not an interrrupt handler?)
int interrupt_in_main_routine(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/led_driver.c
0,0 → 1,152
#include "maindefs.h"
#include "led_driver.h"
#include "delays.h"
 
/* Output Pins:
* RA0 - LED Display Latch Enable (PPS)
* RA1 - LED Display CLK (PPS)
* RA2 - LED Display DIN (PPS)
* RA3 - LED Display Output Enable (PPS)
*/
 
void led_driver_init() {
TRISAbits.TRISA0 = 0; // LE
TRISAbits.TRISA1 = 0; // CLK
TRISAbits.TRISA2 = 0; // DAT
TRISAbits.TRISA3 = 0; // OE
LATAbits.LATA0 = 0; // LE
LATAbits.LATA1 = 0; // CLK
LATAbits.LATA2 = 0; // DAT
LATAbits.LATA3 = 0; // OE
 
led_driver_data(0,0);
}
 
void led_driver_clock() {
LATAbits.LATA1 = 0x1; // Simple clock output toggle
Nop();
LATAbits.LATA1 = 0x0;
Nop();
}
 
void led_driver_data(char left, char right) {
int i;
LATAbits.LATA0 = 0x0; // Set latch low to pause display
for (i = 0; i < 8; i++) {
LATAbits.LATA2 = right & 0x1; // Shift out right character first
led_driver_clock();
right >>= 1;
}
for (i = 0; i < 8; i++) {
LATAbits.LATA2 = left & 0x1; // Then shift out left character
led_driver_clock();
left >>= 1;
}
LATAbits.LATA0 = 0x1; // Set latch high to resume display
}
 
void led_driver_num(unsigned char data) {
unsigned char left = 0;
unsigned char right = 0;
unsigned char tmp = 0;
// if (data > 99) {
// led_driver_data(0,0);
// return;
// }
// Determine right character (1s digit)
tmp = data % 10;
switch (tmp) {
case 0:
right = LED_CHAR_0;
break;
case 1:
right = LED_CHAR_1;
break;
case 2:
right = LED_CHAR_2;
break;
case 3:
right = LED_CHAR_3;
break;
case 4:
right = LED_CHAR_4;
break;
case 5:
right = LED_CHAR_5;
break;
case 6:
right = LED_CHAR_6;
break;
case 7:
right = LED_CHAR_7;
break;
case 8:
right = LED_CHAR_8;
break;
case 9:
right = LED_CHAR_9;
break;
}
 
// Determine left character (10s digit)
tmp = data / 10;
switch (tmp) {
case 0:
left = LED_CHAR_0;
break;
case 1:
left = LED_CHAR_1;
break;
case 2:
left = LED_CHAR_2;
break;
case 3:
left = LED_CHAR_3;
break;
case 4:
left = LED_CHAR_4;
break;
case 5:
left = LED_CHAR_5;
break;
case 6:
left = LED_CHAR_6;
break;
case 7:
left = LED_CHAR_7;
break;
case 8:
left = LED_CHAR_8;
break;
case 9:
left = LED_CHAR_9;
break;
}
 
led_driver_data(left, right);
// if (data <= 25) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_0);
// } else if (data > 25 && data <= 50) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_1);
// } else if (data > 50 && data <= 75) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_2);
// } else if (data > 75 && data <= 100) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_3);
// } else if (data > 100 && data <= 125) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_4);
// } else if (data > 125 && data <= 150) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_5);
// } else if (data > 150 && data <= 175) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_6);
// } else if (data > 175 && data <= 200) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_7);
// } else if (data > 200 && data <= 225) {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_8);
// } else {
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_9);
// }
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/led_driver.h
0,0 → 1,47
#ifndef __led_driver_h
#define __led_driver_h
 
static char LED_CHAR_BLANK = 0b00000000;
static char LED_CHAR_A = 0b11101110;
static char LED_CHAR_B = 0b11111110;
static char LED_CHAR_C = 0b10011100;
static char LED_CHAR_D = 0b11111100;
static char LED_CHAR_E = 0b10011110;
static char LED_CHAR_F = 0b10001110;
 
static char LED_CHAR_0 = 0b11111100;
static char LED_CHAR_1 = 0b01100000;
static char LED_CHAR_2 = 0b11011010;
static char LED_CHAR_3 = 0b11110010;
static char LED_CHAR_4 = 0b01100110;
static char LED_CHAR_5 = 0b10110110;
static char LED_CHAR_6 = 0b10111110;
static char LED_CHAR_7 = 0b11100100;
static char LED_CHAR_8 = 0b11111110;
static char LED_CHAR_9 = 0b11110110;
 
//#define LED_CHAR_BLANK (char)0b00000000;
//#define LED_CHAR_A (char)0b11101110;
//#define LED_CHAR_B (char)0b11111110;
//#define LED_CHAR_C (char)0b10011100;
//#define LED_CHAR_D (char)0b11111100;
//#define LED_CHAR_E (char)0b10011110;
//#define LED_CHAR_F (char)0b10001110;
//
//#define LED_CHAR_0 (char)0b11111100;
//#define LED_CHAR_1 (char)0b01100000;
//#define LED_CHAR_2 (char)0b11011010;
//#define LED_CHAR_3 (char)0b11110010;
//#define LED_CHAR_4 (char)0b01100110;
//#define LED_CHAR_5 (char)0b10110110;
//#define LED_CHAR_6 (char)0b10111110;
//#define LED_CHAR_7 (char)0b11100100;
//#define LED_CHAR_8 (char)0b11111110;
//#define LED_CHAR_9 (char)0b11110110;
 
void led_driver_init(void);
void led_driver_clock(void);
void led_driver_data(char, char);
void led_driver_num(unsigned char);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/main.c
0,0 → 1,375
#include "maindefs.h"
#include "msg_queues.h"
#include "interrupts.h"
#include "uart.h"
#include "i2c.h"
#include "adc.h"
#include "timers.h"
#include "xbee.h"
#include "led_driver.h"
#include "pwm.h"
#include "delays.h"
#include "pin_interrupts.h"
 
#pragma config WDTEN = OFF // Turn off watchdog timer
#pragma config XINST = OFF // Turn off extended instruction set
#pragma config OSC = HSPLL // Use external oscillator (101)
#pragma config PLLDIV = 3 // Set PPL prescaler to 3 (to get 4MHz)
#pragma config CFGPLLEN = ON // Enable PLL on startup
#pragma config PLLSEL = PLL96 // Use 96MHz PLL 4MHz -> 96MHz / 2 = 48MHz
//#pragma config SOSCSEL = HIGH // High Power T1OSC/SOSC circuit selected
#pragma config ADCSEL = BIT12 // 12-bit ADrC
#pragma config IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed
 
/* ----------- IO Pins -----------
* RA0 - LED Display Latch Enable (PPS)
* RA1 - LED Display CLK (PPS)
* RA2 - LED Display DIN (PPS)
* RA3 - LED Display Output Enable (PPS)
* RA4 - [CANNOT BE USED (VDDCORE/VCAP)]
* RA5 - IR Reciever (PPS)
* RA6 - Oscillator
* RA7 - Oscillator
*
* RC0 - PWM Output (IR) (PPS, Ports B and C only)
* RC1 - PWM Output (IR) (PPS, Ports B and C only)
* RC2 - LED Output (PPS, Ports B and C only)
* RC3 - I2C SCL
* RC4 - I2C SDA
* RC5 - XBee Sleep (PPS)
* RC6 - UART Debug Output
* RC7 - UART Debug Input
*
* RB0 - XBee CTS (PPS)
* RB1 - XBee RTS (PPS)
* RB2 - XBee RX (PPS)
* RB3 - XBee Tx (PPS)
* RB4 - Button Input (Port B Interrupt on Change)
* RB5 - Button Input (Port B Interrupt on Change)
* RB6 - Button Input (Port B Interrupt on Change)
* RB7 - Button Input (Port B Interrupt on Change)
* ---------------------------- */
 
#pragma udata umain_1
static unsigned char msgbuffer[MSGLEN + 1];
#pragma udata umain_2
static I2C_DATA i2c_i;
#pragma udata
static XBEE_DATA xbee_c;
static UART_DATA uart_c;
 
void main(void) {
char length;
unsigned char msgtype;
unsigned char i = 0;
unsigned char last_data_received = 0;
// unsigned int adc_last_value; // Holds 12 bit ADC value
// unsigned char adc_last_value_shifted; // Holds upper 4 bits
 
// Pointers to allow parsing of xbee data from arbitrary byte array
XBEE_RX_AT_COMMAND_RESPONSE_FRAME *frame_at_cmd_response;
XBEE_RX_DATA_PACKET_FRAME *frame_data_packet;
XBEE_RX_DATA_TX_STATUS_FRAME *frame_tx_status;
XBEE_RX_IO_DATA_SAMPLE_FRAME *frame_io_sample;
XBEE_RX_EXPLICIT_COMMAND_FRAME *frame_explicit_cmd;
XBEE_RX_REMOTE_AT_COMMAND_FRAME *frame_remote_at_cmd;
XBEE_RX_ROUTE_RECORD_FRAME *frame_route_record;
XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME *frame_node_identification;
XBEE_RX_MODEM_STATUS_FRAME *frame_modem_status;
 
XBEE_TX_DATA_PACKET_FRAME *frame_tx_data;
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
// OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
uart_init(&uart_c); // Initialize the UART handler code
xbee_init(&xbee_c); // Initialize the XBee handler code
i2c_init(&i2c_i); // Initialize the I2C handler code
// adc_init(); // Initialize the ADC
MQ_init(); // Initialize message queues before enabling any interrupts
led_driver_init(); // Initialize the driver for the LED display
pwm_init(); // Initialize the PWM output driver
timers_init(); // Initialize timers
intx_init();
// port_b_int_init(); // Initialze Port B interrupt handler
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
// Configure the hardware i2c device as a slave
#ifdef _MASTER
i2c_configure_master();
#endif
#ifdef _SLAVE
i2c_configure_slave(0x5F);
#endif
DBG_PRINT_MAIN("\r\nMain: Program Started\r\n");
 
#ifdef _MASTER
// Delay a bit to allow XBees to start up
for (i = 0; i < 20; i++)
Delay10KTCYx(255);
 
pwm_start();
 
while (1) {
/* XBee Demo */
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
frame_tx_data->destination_16.INT_16.int_value = 0x0000;
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = i;
i++;
if (i == 100)
i = 0;
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
Delay10KTCYx(100);
 
/* I2C Demo */
// Write 2 bytes
msgbuffer[0] = 0x4;
msgbuffer[1] = 0x2;
i2c_master_send(0x5F, 2, msgbuffer);
while (i2c_master_busy());
 
// Read 2 bytes back
i2c_master_recv(0x5F, 2);
while (i2c_master_busy());
Delay10KTCYx(100);
}
#endif
// Loop and process recieved messages from interrupts
while (1) {
// Call a routine that blocks until either message queues are not empty
MQ_wait_on_incoming_msg_queues();
 
// Process high priority message queue
length = MQ_recvmsg_ToMainFromHigh(MSGLEN, &msgtype, (void *) msgbuffer);
if (length < 0) {
// No message, check the error code to see if it is concern
if (length != MSG_QUEUE_EMPTY) {
DBG_PRINT_MAIN("Main: (ERROR) Bad high priority receive, code = %d\r\n", length);
}
} else {
switch (msgtype) {
/* --- I2C Message Handlers ----------------------------------*/
case MSGTYPE_OVERRUN:
DBG_PRINT_MAIN("Main: (ERROR) UART overrun detected, type = %d\r\n", msgtype);
break;
case MSGTYPE_I2C_DBG:
DBG_PRINT_MAIN("Main: I2C Dbg Data Recieved: ");
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
}
DBG_PRINT_MAIN("\r\n");
break;
case MSGTYPE_I2C_DATA:
DBG_PRINT_MAIN("Main: I2C Data Recieved: ");
for (i = 0; i < length - 1; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
}
DBG_PRINT_MAIN(" Event Count: %d", msgbuffer[length - 1]);
DBG_PRINT_MAIN("\r\n");
switch (msgbuffer[0]) {
case 0x2:
length = 1;
msgbuffer[0] = 1; // Size
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
break;
case 0x4:
length = 1;
msgbuffer[0] = last_data_received;
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
break;
case 0x6:
break;
case 0x7:
break;
case 0x8:
break;
case 0x9:
break;
default:
DBG_PRINT_MAIN("Main: (ERROR) Unexpected message type recieved: %d\r\n", msgbuffer[0]);
break;
};
break;
case MSGTYPE_I2C_MASTER_SEND_COMPLETE:
DBG_PRINT_MAIN("Main: I2C Master Send Complete\r\n");
break;
case MSGTYPE_I2C_MASTER_SEND_FAILED:
DBG_PRINT_MAIN("Main: (ERROR) I2C Master Send Failed\r\n");
break;
case MSGTYPE_I2C_MASTER_RECV_COMPLETE:
DBG_PRINT_MAIN("Main: I2C Master Receive Complete\r\n");
DBG_PRINT_MAIN("Data: ");
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
}
DBG_PRINT_MAIN("\r\n");
break;
case MSGTYPE_I2C_MASTER_RECV_FAILED:
DBG_PRINT_MAIN("Main: (ERROR) I2C Master Receive Failed\r\n");
break;
/* -----------------------------------------------------------*/
/* --- XBee Message Handlers ---------------------------------*/
case MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE:
DBG_PRINT_MAIN("Main: XBee AT command frame\r\n");
frame_at_cmd_response = (void *) msgbuffer;
DBG_PRINT_MAIN("Command: %c%c\r\n", frame_at_cmd_response->command[0], frame_at_cmd_response->command[0]);
DBG_PRINT_MAIN("Status: %d\r\n", frame_at_cmd_response->command_status);
DBG_PRINT_MAIN("Data: ");
for (i = 0; i < length - XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE; i++) {
DBG_PRINT_MAIN("%X ", frame_data_packet->data[i]);
}
DBG_PRINT_MAIN("\r\n");
break;
case MSGTYPE_XBEE_RX_DATA_PACKET:
DBG_PRINT_MAIN("Main: XBee data packet frame\r\n");
frame_data_packet = (void *) msgbuffer;
DBG_PRINT_MAIN("Data: ");
for (i = 0; i < length - XBEE_RX_DATA_PACKET_FRAME_SIZE; i++) {
DBG_PRINT_MAIN("%X ", frame_data_packet->data[i]);
}
DBG_PRINT_MAIN("\r\n");
last_data_received = frame_data_packet->data[0];
led_driver_num(frame_data_packet->data[0]);
break;
case MSGTYPE_XBEE_RX_DATA_TX_STATUS:
DBG_PRINT_MAIN("Main: XBee TX status frame\r\n");
frame_tx_status = (void *) msgbuffer;
DBG_PRINT_MAIN("Destination: %X\r\n", frame_tx_status->destination_16);
DBG_PRINT_MAIN("Transmit Retry Count: %X\r\n", frame_tx_status->transmit_retry_count);
DBG_PRINT_MAIN("Delivery Status: %X\r\n", frame_tx_status->delivery_status);
DBG_PRINT_MAIN("Discovery Status: %X\r\n", frame_tx_status->discovery_status);
break;
case MSGTYPE_XBEE_RX_IO_DATA_SAMPLE:
DBG_PRINT_MAIN("Main: XBee IO data sample frame\r\n");
frame_io_sample = (void *) msgbuffer;
break;
case MSGTYPE_XBEE_RX_EXPLICIT_COMMAND:
DBG_PRINT_MAIN("Main: XBee explicit command frame\r\n");
frame_explicit_cmd = (void *) msgbuffer;
break;
case MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE:
DBG_PRINT_MAIN("Main: XBee remote AT command response frame\r\n");
frame_remote_at_cmd = (void *) msgbuffer;
break;
case MSGTYPE_XBEE_RX_ROUTE_RECORD:
DBG_PRINT_MAIN("Main: XBee route record frame\r\n");
frame_route_record = (void *) msgbuffer;
break;
case MSGTYPE_XBEE_RX_NODE_IDENTIFICATION:
DBG_PRINT_MAIN("Main: XBee node identification frame\r\n");
frame_node_identification = (void *) msgbuffer;
break;
case MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS:
DBG_PRINT_MAIN("Main: XBee modem status frame\r\n");
frame_modem_status = (void *) msgbuffer;
break;
/* -----------------------------------------------------------*/
/* --- Port B Interrupt Handlers -----------------------------*/
case MSGTYPE_PORTB_4_DOWN:
 
break;
case MSGTYPE_PORTB_4_UP:
 
break;
case MSGTYPE_PORTB_5_DOWN:
 
break;
case MSGTYPE_PORTB_5_UP:
 
break;
case MSGTYPE_PORTB_6_DOWN:
 
break;
case MSGTYPE_PORTB_6_UP:
 
break;
case MSGTYPE_PORTB_7_DOWN:
 
break;
case MSGTYPE_PORTB_7_UP:
 
break;
/* -----------------------------------------------------------*/
default:
DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in high queue, length = %d, type = %d\r\n", length, msgtype);
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
}
DBG_PRINT_MAIN("\r\n");
break;
};
continue;
}
 
// // Process low priority queue
// length = MQ_recvmsg_ToMainFromLow(MSGLEN, &msgtype, (void *) msgbuffer);
// if (length < 0) {
// // No message, check the error code to see if it is concern
// if (length != MSG_QUEUE_EMPTY) {
// DBG_PRINT_MAIN("Main: (ERROR) Bad low priority receive, code = %d\r\n", length);
// }
// } else {
// switch (msgtype) {
// case MSGTYPE_TIMER0:
// DBG_PRINT_MAIN("Timer 0 Triggered\r\n");
// // Write 2 bytes
// msgbuffer[0] = 0x4;
// msgbuffer[1] = 0x3;
// i2c_master_send(0x5F, 2, msgbuffer);
// while (i2c_master_busy());
//
// // Read 3 bytes
// i2c_master_recv(0x5F, 3);
// while (i2c_master_busy());
//
// break;
// break;
// case MSGTYPE_ADC_NEWVALUE:
// // Get the value in the ADC
// adc_last_value = *((unsigned int*)msgbuffer);
// adc_last_value_shifted = adc_last_value >> 4;
// DBG_PRINT_MAIN("Main: ADC Value = %d\r\n", adc_last_value);
//
// frame_tx_data = (void *) msgbuffer;
// frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
// frame_tx_data->frame_id = 0;
// frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
// frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
// frame_tx_data->destination_16.INT_16.int_value = 0x0000;
// frame_tx_data->broadcast_radius = 0;
// frame_tx_data->options = 0x01; // Disable ACK
//
// frame_tx_data->data[0] = adc_last_value_shifted;
//
// length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
//
// xbee_process_transmit_frame((void *) msgbuffer, length);
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// Delay10KTCYx(255);
//
// adc_start();
// break;
// default:
// DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in low queue, type = %d\r\n", msgtype);
// break;
// };
// continue;
// }
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/maindefs.h
0,0 → 1,76
#ifndef __maindefs_h
#define __maindefs_h
 
#include <p18f27j13.h>
#include <stdio.h>
 
//#define _DEBUG
//#define _MASTER
#define _SLAVE
 
// Enable or disable debug prints depending on project preprocessor (_DEBUG)
#ifdef _DEBUG
#define DBG_PRINT_MAIN(x) printf(x)
#define DBG_PRINT_I2C(x) printf(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x) printf(x)
#else
#define DBG_PRINT_MAIN(x)
#define DBG_PRINT_I2C(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x)
#endif
 
//#define memcpy(a,b,c) memcpy((a),(const void*)(b),(c))
//#define memcmp(a,b,c) memcmp((const void*)(a),(const void*)(b),(c))
//#define strcpy(a,b) strcpy((char*)(a),(const char*)(b))
 
// Message type definitions
#define MSGTYPE_RESEND 1
 
#define MSGTYPE_TIMER0 10
#define MSGTYPE_TIMER1 11
#define MSGTYPE_TIMER2 12
#define MSGTYPE_TIMER3 13
#define MSGTYPE_TIMER4 14
#define MSGTYPE_TIMER5 15
#define MSGTYPE_TIMER6 16
#define MSGTYPE_TIMER8 17
#define MSGTYPE_MAIN1 20
#define MSGTYPE_OVERRUN 30
#define MSGTYPE_UART_DATA 31
#define MSGTYPE_I2C_DBG 40
#define MSGTYPE_I2C_DATA 41
#define MSGTYPE_I2C_REPLY 42
//#define MSGTYPE_I2C_RQST 43
 
// Unused (Used for I2C Master Mode)
#define MSGTYPE_I2C_MASTER_SEND_COMPLETE 43
#define MSGTYPE_I2C_MASTER_SEND_FAILED 44
#define MSGTYPE_I2C_MASTER_RECV_COMPLETE 45
#define MSGTYPE_I2C_MASTER_RECV_FAILED 46
 
#define MSGTYPE_ADC_NEWVALUE 50
 
#define MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE 60
#define MSGTYPE_XBEE_RX_DATA_PACKET 61
#define MSGTYPE_XBEE_RX_DATA_TX_STATUS 62
#define MSGTYPE_XBEE_RX_IO_DATA_SAMPLE 63
#define MSGTYPE_XBEE_RX_EXPLICIT_COMMAND 64
#define MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE 65
#define MSGTYPE_XBEE_RX_ROUTE_RECORD 66
#define MSGTYPE_XBEE_RX_NODE_IDENTIFICATION 67
#define MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS 68
 
#define MSGTYPE_PORTB_4_DOWN 70
#define MSGTYPE_PORTB_4_UP 71
#define MSGTYPE_PORTB_5_DOWN 72
#define MSGTYPE_PORTB_5_UP 73
#define MSGTYPE_PORTB_6_DOWN 74
#define MSGTYPE_PORTB_6_UP 75
#define MSGTYPE_PORTB_7_DOWN 76
#define MSGTYPE_PORTB_7_UP 77
 
 
#endif
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/msg_queues.c
0,0 → 1,339
#include "maindefs.h"
#include "interrupts.h"
#include "msg_queues.h"
#include <delays.h>
#include <string.h>
 
// The key to making this code safe for interrupts is that
// each queue is filled by only one writer and read by one reader.
// ToMainQueueFromLow: Writer is a low priority interrupt, Reader is main()
// ToMainQueueFromHigh: Writer is a high priority interrupt, Reader is main()
// FromMainQueueToLow: Writer is main(), Reader is a low priority interrupt
// FromMainQueueToHigh: Writer is main(), Reader is a high priority interrupt
 
//#pragma udata msgqueue1_1
//static msg MQ_ToMainFromLow_1;
//#pragma udata msgqueue1_2
//static msg MQ_ToMainFromLow_2;
 
#pragma udata msgqueue2_1
static msg MQ_ToMainFromHigh_1;
#pragma udata msgqueue2_2
static msg MQ_ToMainFromHigh_2;
#pragma udata msgqueue2_3
static msg MQ_ToMainFromHigh_3;
 
//#pragma udata msgqueue3_1
//static msg MQ_FromMainToLow_1;
//#pragma udata msgqueue3_2
//static msg MQ_FromMainToLow_2;
 
#pragma udata msgqueue4_1
static msg MQ_FromMainToHigh_1;
#pragma udata msgqueue4_2
static msg MQ_FromMainToHigh_2;
#pragma udata msgqueue4_3
static msg MQ_FromMainToHigh_3;
 
#pragma udata
//static msg_queue MQ_ToMainFromLow;
static msg_queue MQ_ToMainFromHigh;
//static msg_queue MQ_FromMainToLow;
static msg_queue MQ_FromMainToHigh;
 
static unsigned char MQ_Main_Willing_To_Block;
 
void MQ_init_queue(msg_queue *qptr) {
unsigned char i;
 
qptr->cur_write_index = 0;
qptr->cur_read_index = 0;
for (i=0;i<MSGQUEUELEN;i++) {
qptr->queue[i]->full = 0;
}
}
 
void MQ_init() {
MQ_Main_Willing_To_Block = 0;
 
// MQ_ToMainFromLow.queue[0] = &MQ_ToMainFromLow_1;
// MQ_ToMainFromLow.queue[1] = &MQ_ToMainFromLow_2;
 
MQ_ToMainFromHigh.queue[0] = &MQ_ToMainFromHigh_1;
MQ_ToMainFromHigh.queue[1] = &MQ_ToMainFromHigh_2;
MQ_ToMainFromHigh.queue[2] = &MQ_ToMainFromHigh_3;
 
// MQ_FromMainToLow.queue[0] = &MQ_FromMainToLow_1;
// MQ_FromMainToLow.queue[1] = &MQ_FromMainToLow_2;
 
MQ_FromMainToHigh.queue[0] = &MQ_FromMainToHigh_1;
MQ_FromMainToHigh.queue[1] = &MQ_FromMainToHigh_2;
MQ_FromMainToHigh.queue[2] = &MQ_FromMainToHigh_3;
 
// MQ_init_queue(&MQ_ToMainFromLow);
MQ_init_queue(&MQ_ToMainFromHigh);
// MQ_init_queue(&MQ_FromMainToLow);
MQ_init_queue(&MQ_FromMainToHigh);
}
 
signed char MQ_send_msg(msg_queue *qptr,unsigned char length,unsigned char msgtype, void *data) {
unsigned char slot;
msg *qmsg;
size_t tlength = length;
 
#ifdef DEBUG
if (length > MSGLEN) {
return(MSG_BAD_LEN);
} else if (length < 0) {
return(MSG_BAD_LEN);
}
#endif
 
// Get the index in the msg queue to write to
slot = qptr->cur_write_index;
 
// Retrieve the address of the slot in the queue to write to
qmsg = qptr->queue[slot];
 
// If the slot isn't empty, then we should return
if (qmsg->full != 0) {
return(MSG_QUEUE_FULL);
}
 
// Otherwise fill in the message details
qmsg->length = length;
qmsg->msgtype = msgtype;
 
// Copy the message itself
memcpy(qmsg->data,data,tlength);
 
// Increment the next location in the queue to write to
// Note: the index will loop back to the start (implements a FIFO queue)
qptr->cur_write_index = (qptr->cur_write_index + 1) % MSGQUEUELEN;
 
// Mark the slot in the queue as filled and return
qmsg->full = 1;
return(MSG_SEND_OKAY);
}
 
signed char MQ_recv_msg(msg_queue *qptr, unsigned char maxlength, unsigned char *msgtype, void *data) {
unsigned char slot;
msg *qmsg;
size_t tlength;
 
// Get the index in the message queue to read from
slot = qptr->cur_read_index;
 
// Retrieve the address of the message in the queue to read from
qmsg = qptr->queue[slot];
 
// If the retrieved message contains data..
if (qmsg->full == 1) {
// Check if the recieving buffer can hold the message data
if (qmsg->length > maxlength) {
return(MSG_BUFFER_TOOSMALL);
}
// Get the length of the message data
tlength = qmsg->length;
 
// Copy the message data into *data
memcpy(data,(const void*)qmsg->data,tlength);
 
// Increment the read index to the next message to be read
qptr->cur_read_index = (qptr->cur_read_index + 1) % MSGQUEUELEN;
 
// Copy the message type to the returned message
(*msgtype) = qmsg->msgtype;
 
// Mark the slot in the queue as empty
qmsg->full = 0;
 
// Return the size of the message returned
return (tlength);
// Slot does not contain any messages
} else {
return(MSG_QUEUE_EMPTY);
}
}
 
unsigned char MQ_peek_msg(msg_queue *qptr) {
unsigned char slot;
msg *qmsg;
 
// Get the index in the message queue to read from
slot = qptr->cur_read_index;
// Retrieve the address of the message in the queue to read from
qmsg = qptr->queue[slot];
if (qmsg->full == 1) {
// Return the message type of the first message in queue
return qmsg->msgtype;
} else {
// If there are no messages in the queue, return 0
return 0;
}
}
 
// Check if there is an unread message in the queue
unsigned char MQ_check_msg_queue_unread(msg_queue *qptr) {
return (qptr->queue[qptr->cur_read_index]->full);
}
 
void MQ_enter_sleep_mode(void) {
OSCCONbits.IDLEN = 1; // set to idle on sleep
 
_asm
sleep
_endasm
}
 
///* Message Queue 1 - Low Interrupt -> Main */
//signed char MQ_sendmsg_ToMainFromLow(unsigned char length, unsigned char msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_low_interrupt_routine()) {
// return (MSG_NOT_IN_LOW);
// }
//#endif
// return (MQ_send_msg(&MQ_ToMainFromLow, length, msgtype, data));
//}
//
//signed char MQ_recvmsg_ToMainFromLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_main_routine()) {
// return (MSG_NOT_IN_MAIN);
// }
//#endif
// return (MQ_recv_msg(&MQ_ToMainFromLow, maxlength, msgtype, data));
//}
//
//unsigned char MQ_peek_ToMainFromLow() {
// return (MQ_peek_msg(&MQ_ToMainFromLow));
//}
 
/* Message Queue 2 - High Interrupt -> Main */
signed char MQ_sendmsg_ToMainFromHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_high_interrupt_routine()) {
return (MSG_NOT_IN_HIGH);
}
#endif
return (MQ_send_msg(&MQ_ToMainFromHigh, length, msgtype, data));
}
 
signed char MQ_recvmsg_ToMainFromHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
}
#endif
return (MQ_recv_msg(&MQ_ToMainFromHigh, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_ToMainFromHigh() {
return (MQ_peek_msg(&MQ_ToMainFromHigh));
}
 
///* Message Queue 3 - Main -> Low Interrupt */
//signed char MQ_sendmsg_FromMainToLow(unsigned char length, unsigned char msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_main_routine()) {
// return (MSG_NOT_IN_MAIN);
// }
//#endif
// return (MQ_send_msg(&MQ_FromMainToLow, length, msgtype, data));
//}
//
//signed char MQ_recvmsg_FromMainToLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_low_interrupt_routine()) {
// return (MSG_NOT_IN_LOW);
// }
//#endif
// return (MQ_recv_msg(&MQ_FromMainToLow, maxlength, msgtype, data));
//}
//
//unsigned char MQ_peek_FromMainToLow() {
// return (MQ_peek_msg(&MQ_FromMainToLow));
//}
 
/* Message Queue 4 - Main -> High Interrupt */
signed char MQ_sendmsg_FromMainToHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
}
#endif
return (MQ_send_msg(&MQ_FromMainToHigh, length, msgtype, data));
}
 
signed char MQ_recvmsg_FromMainToHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_high_interrupt_routine()) {
return (MSG_NOT_IN_HIGH);
}
#endif
return (MQ_recv_msg(&MQ_FromMainToHigh, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_FromMainToHigh() {
return (MQ_peek_msg(&MQ_FromMainToHigh));
}
 
// This should only be called from a High Priority Interrupt
void MQ_sleep_high_interrupt_if_okay() {
// Check to see if main is willing to block
if (MQ_Main_Willing_To_Block == 0) {
return;
}
// Dont sleep if currently handling low interrupt
if (interrupt_in_low_interrupt_routine()) {
return;
}
 
// Check to make sure that we're in high interrupt
if (!interrupt_in_high_interrupt_routine()) {
return;
}
 
// Since we are the only thing executing that could be
// putting something into a message queue destined for main()
// we can safely check the message queues now
 
// Check the message queues to make sure that they're empty
if (MQ_check_msg_queue_unread(&MQ_ToMainFromHigh)) {
return;
}
// if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
// return;
// }
 
// If everything checks out, go to sleep
MQ_enter_sleep_mode();
}
 
/* Called from main(), blocks until message recieved in queue to main */
void MQ_wait_on_incoming_msg_queues() {
// Only run from the main function
if (!interrupt_in_main_routine()) {
return;
}
 
MQ_Main_Willing_To_Block = 1;
while (1) {
// If any incoming message queues are not empty, break out of wait
if (MQ_check_msg_queue_unread(&MQ_ToMainFromHigh)) {
MQ_Main_Willing_To_Block = 0;
return;
}
// if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
// MQ_Main_Willing_To_Block = 0;
// return;
// }
// Sleep for a period of time before checking again
Delay1KTCYx(10);
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/msg_queues.h
0,0 → 1,78
#ifndef __msg_queues_h
#define __msg_queues_h
 
// The maximum length (in bytes) of a message
#define MSGLEN 220
 
// The maximum number of messages in a single queue
#define MSGQUEUELEN 3 // DO NOT CHANGE THIS!
 
typedef struct __msg {
unsigned char full; // Indicates that data resides in this msg
unsigned char length; // Length of message data to store
unsigned char msgtype; // Indicates type of message (see maindefs.h)
 
unsigned char data[MSGLEN]; // The actual message data
} msg;
 
typedef struct __msg_queue {
msg *queue[MSGQUEUELEN];
unsigned char cur_write_index; // Location to write to next
unsigned char cur_read_index; // Location to read from next
} msg_queue;
 
// Error Codes
#define MSG_SEND_OKAY 1 // Message sent okay
#define MSG_QUEUE_FULL -1 // Too many messages in the queue
#define MSG_BAD_LEN -2 // The length of the message is either too large or negative
#define MSG_BUFFER_TOOSMALL -3 // The message buffer is too small to receive the message in the queue
#define MSG_QUEUE_EMPTY -4 // The message queue is empty
#define MSG_NOT_IN_LOW -5 // This call must be made from a low-priority interrupt handler
#define MSG_NOT_IN_HIGH -6 // This call must be made from a high-priority interrupt handler
#define MSG_NOT_IN_MAIN -7 // This call must be made from the "main()" thread
 
// This MUST be called before anything else in messages and should
// be called before interrupts are enabled
void MQ_init(void);
 
// This is called from a high priority interrupt to decide if the
// processor may sleep. It is currently called in interrupts.c
void MQ_sleep_high_interrupt_if_okay(void);
 
// This is called in the "main()" thread (if desired) to block
// until a message is received on one of the two incoming queues
void MQ_wait_on_incoming_msg_queues(void);
 
// Queue:
// The "MQ_ToMainToLow" queue is a message queue from low priority
// interrupt handlers to the "main()" thread. The send is called
// in the interrupt handlers and the receive from "main()"
signed char MQ_sendmsg_ToMainFromLow(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_ToMainFromLow(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_ToMainFromLow(void);
 
// Queue:
// The "MQ_ToMainFromHigh" queue is a message queue from high priority
// interrupt handlers to the "main()" thread. The send is called
// in the interrupt handlers and the receive from "main()"
signed char MQ_sendmsg_ToMainFromHigh(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_ToMainFromHigh(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_ToMainFromHigh(void);
 
// Queue:
// The "MQ_FromMainToLow" queue is a message queue from the "main()"
// thread to the low priority interrupt handlers. The send is called
// in the "main()" thread and the receive from the interrupt handlers.
signed char MQ_sendmsg_FromMainToLow(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_FromMainToLow(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_FromMainToLow(void);
 
// Queue:
// The "MQ_FromMainToHigh" queue is a message queue from the "main()"
// thread to the high priority interrupt handlers. The send is called
// in the "main()" thread and the receive from the interrupt handlers.
signed char MQ_sendmsg_FromMainToHigh(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_FromMainToHigh(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_FromMainToHigh(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/Makefile-default.mk
0,0 → 1,267
#
# 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
include Makefile
 
# Environment
SHELL=cmd.exe
# Adding MPLAB X bin directory to path
PATH:=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/:$(PATH)
MKDIR=gnumkdir -p
RM=rm -f
MV=mv
CP=cp
 
# Macros
CND_CONF=default
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
IMAGE_TYPE=debug
OUTPUT_SUFFIX=cof
DEBUGGABLE_SUFFIX=cof
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
else
IMAGE_TYPE=production
OUTPUT_SUFFIX=hex
DEBUGGABLE_SUFFIX=cof
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
endif
 
# Object Directory
OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE}
 
# Distribution Directory
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
 
# Object Files Quoted if spaced
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/circular_buffer.o ${OBJECTDIR}/pin_interrupts.o
POSSIBLE_DEPFILES=${OBJECTDIR}/adc.o.d ${OBJECTDIR}/i2c.o.d ${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/led_driver.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/msg_queues.o.d ${OBJECTDIR}/timers.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/xbee.o.d ${OBJECTDIR}/pwm.o.d ${OBJECTDIR}/circular_buffer.o.d ${OBJECTDIR}/pin_interrupts.o.d
 
# Object Files
OBJECTFILES=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/circular_buffer.o ${OBJECTDIR}/pin_interrupts.o
 
 
CFLAGS=
ASFLAGS=
LDLIBSOPTIONS=
 
# Path to java used to run MPLAB X when this makefile was created
MP_JAVA_PATH="C:\Program Files\Java\jre6/bin/"
OS_CURRENT="$(shell uname -s)"
############# 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. #
#######################################################################
MP_CC="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mcc18.exe"
# MP_BC is not defined
MP_AS="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\..\mpasm\MPASMWIN.exe"
MP_LD="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mplink.exe"
MP_AR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mplib.exe"
DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/extractobjectdependencies.jar"
# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build
FIXDEPS=fixDeps
MP_CC_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin"
# MP_BC_DIR is not defined
MP_AS_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\..\mpasm"
MP_LD_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin"
MP_AR_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin"
# MP_BC_DIR is not defined
 
.build-conf: ${BUILD_SUBPROJECTS}
${MAKE} -f nbproject/Makefile-default.mk dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
 
MP_PROCESSOR_OPTION=18F27J13
MP_PROCESSOR_OPTION_LD=18f27j13
MP_LINKER_DEBUG_OPTION=
# ------------------------------------------------------------------------------------
# Rules for buildStep: assemble
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
else
endif
 
# ------------------------------------------------------------------------------------
# Rules for buildStep: compile
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
${OBJECTDIR}/adc.o: adc.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/adc.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/adc.o adc.c
@${DEP_GEN} -d ${OBJECTDIR}/adc.o
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/interrupts.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o
${OBJECTDIR}/led_driver.o: led_driver.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/led_driver.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_driver.o led_driver.c
@${DEP_GEN} -d ${OBJECTDIR}/led_driver.o
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
${OBJECTDIR}/msg_queues.o: msg_queues.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/msg_queues.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/msg_queues.o msg_queues.c
@${DEP_GEN} -d ${OBJECTDIR}/msg_queues.o
${OBJECTDIR}/timers.o: timers.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/timers.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/timers.o timers.c
@${DEP_GEN} -d ${OBJECTDIR}/timers.o
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/uart.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c
@${DEP_GEN} -d ${OBJECTDIR}/uart.o
${OBJECTDIR}/xbee.o: xbee.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/xbee.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/xbee.o xbee.c
@${DEP_GEN} -d ${OBJECTDIR}/xbee.o
${OBJECTDIR}/pwm.o: pwm.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pwm.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pwm.o pwm.c
@${DEP_GEN} -d ${OBJECTDIR}/pwm.o
${OBJECTDIR}/circular_buffer.o: circular_buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/circular_buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/circular_buffer.o circular_buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/circular_buffer.o
${OBJECTDIR}/pin_interrupts.o: pin_interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pin_interrupts.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pin_interrupts.o pin_interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/pin_interrupts.o
else
${OBJECTDIR}/adc.o: adc.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/adc.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/adc.o adc.c
@${DEP_GEN} -d ${OBJECTDIR}/adc.o
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/interrupts.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o
${OBJECTDIR}/led_driver.o: led_driver.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/led_driver.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_driver.o led_driver.c
@${DEP_GEN} -d ${OBJECTDIR}/led_driver.o
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
${OBJECTDIR}/msg_queues.o: msg_queues.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/msg_queues.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/msg_queues.o msg_queues.c
@${DEP_GEN} -d ${OBJECTDIR}/msg_queues.o
${OBJECTDIR}/timers.o: timers.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/timers.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/timers.o timers.c
@${DEP_GEN} -d ${OBJECTDIR}/timers.o
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/uart.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c
@${DEP_GEN} -d ${OBJECTDIR}/uart.o
${OBJECTDIR}/xbee.o: xbee.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/xbee.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/xbee.o xbee.c
@${DEP_GEN} -d ${OBJECTDIR}/xbee.o
${OBJECTDIR}/pwm.o: pwm.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pwm.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pwm.o pwm.c
@${DEP_GEN} -d ${OBJECTDIR}/pwm.o
${OBJECTDIR}/circular_buffer.o: circular_buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/circular_buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/circular_buffer.o circular_buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/circular_buffer.o
${OBJECTDIR}/pin_interrupts.o: pin_interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pin_interrupts.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pin_interrupts.o pin_interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/pin_interrupts.o
endif
 
# ------------------------------------------------------------------------------------
# Rules for buildStep: link
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -x -u_DEBUG -z__MPLAB_BUILD=1 -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_PK3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
else
dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
endif
 
 
# Subprojects
.build-subprojects:
 
# Clean Targets
.clean-conf:
${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
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/Makefile-genesis.properties
0,0 → 1,8
#
#Thu Mar 29 10:49:24 EDT 2012
default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=eb0ef9909fcaf68601725ab898eb3904
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.40\\bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=aacb4af1231509e2c363b0acdc0000a5
default.languagetoolchain.version=3.40
host.platform=windows
conf.ids=default
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/Makefile-impl.mk
0,0 → 1,57
#
# 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=27J13_3_MQ_Mod
 
# 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
 
# 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
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/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=27J13_3_MQ_Mod.production.hex
CND_ARTIFACT_PATH_default=dist/default/production/27J13_3_MQ_Mod.production.hex
CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package
CND_PACKAGE_NAME_default=27j133mqmod.tar
CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/27j133mqmod.tar
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/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}/27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
OUTPUT_BASENAME=27J13_3_MQ_Mod.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
PACKAGE_TOP_DIR=27j133mqmod/
 
# 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}/27j133mqmod/bin
copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
 
 
# Generate tar file
cd "${TOP}"
rm -f ${CND_DISTDIR}/${CND_CONF}/package/27j133mqmod.tar
cd ${TMPDIR}
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/27j133mqmod.tar *
checkReturnCode
 
# Cleanup
cd "${TOP}"
rm -rf ${TMPDIR}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/configurations.xml
0,0 → 1,155
<?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>adc.h</itemPath>
<itemPath>i2c.h</itemPath>
<itemPath>interrupts.h</itemPath>
<itemPath>led_driver.h</itemPath>
<itemPath>maindefs.h</itemPath>
<itemPath>msg_queues.h</itemPath>
<itemPath>timers.h</itemPath>
<itemPath>uart.h</itemPath>
<itemPath>xbee.h</itemPath>
<itemPath>pwm.h</itemPath>
<itemPath>circular_buffer.h</itemPath>
<itemPath>pin_interrupts.h</itemPath>
</logicalFolder>
<logicalFolder name="LibraryFiles"
displayName="Library Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="LinkerScript"
displayName="Linker Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="ObjectFiles"
displayName="Object Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="SourceFiles"
displayName="Source Files"
projectFiles="true">
<itemPath>adc.c</itemPath>
<itemPath>i2c.c</itemPath>
<itemPath>interrupts.c</itemPath>
<itemPath>led_driver.c</itemPath>
<itemPath>main.c</itemPath>
<itemPath>msg_queues.c</itemPath>
<itemPath>timers.c</itemPath>
<itemPath>uart.c</itemPath>
<itemPath>xbee.c</itemPath>
<itemPath>pwm.c</itemPath>
<itemPath>circular_buffer.c</itemPath>
<itemPath>pin_interrupts.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>PIC18F27J13</targetDevice>
<targetHeader></targetHeader>
<platformTool>PICkit3PlatformTool</platformTool>
<languageToolchain>C18</languageToolchain>
<languageToolchainVersion>3.40</languageToolchainVersion>
<platform>3</platform>
</toolsSet>
<compileType>
<linkerTool>
<linkerLibItems>
</linkerLibItems>
</linkerTool>
</compileType>
<makeCustomizationType>
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
<makeCustomizationPreStep></makeCustomizationPreStep>
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
<makeCustomizationPostStep></makeCustomizationPostStep>
<makeCustomizationAlternativeFileToLoadEnabled>false</makeCustomizationAlternativeFileToLoadEnabled>
<makeCustomizationAlternativeFileToLoad></makeCustomizationAlternativeFileToLoad>
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
</makeCustomizationType>
<C18>
<property key="storage-class" value="sca"/>
<property key="enable-opa" value="true"/>
<property key="enable-all-optimizations" value="true"/>
<property key="preprocessor-macros" value=""/>
<property key="default-char-unsigned" value="false"/>
<property key="optimization-master" value="Enable all"/>
<property key="code-model" value="mL"/>
<property key="warning-level" value="2"/>
<property key="extra-include-directories" value=""/>
<property key="enable-ow" value="true"/>
<property key="verbose" value="false"/>
<property key="enable-ou" value="true"/>
<property key="enable-ot" value="true"/>
<property key="enable-os" value="true"/>
<property key="data-model" value="Oa-"/>
<property key="enable-or" value="true"/>
<property key="enable-op" value="true"/>
<property key="enable-on" value="true"/>
<property key="enable-om" value="true"/>
<property key="procedural-abstraction-passes" value="0"/>
<property key="enable-multi-bank-stack-model" value="false"/>
<property key="enable-int-promotion" value="false"/>
<property key="enable-od" value="true"/>
<property key="enable-ob" value="true"/>
</C18>
<C18-AS>
<property key="default.radix" value="HEX"/>
<property key="hex.output.format" value="INHX32"/>
<property key="enable.case.sensitivity" value="true"/>
<property key="preprocessor.macros" value=""/>
<property key="warning.level" value="0"/>
<property key="cross.reference.file" value=""/>
</C18-AS>
<C18-LD>
<property key="hex-output-format" value="INHX32"/>
<property key="cod-file" value="false"/>
<property key="map-file" value=""/>
<property key="extra-lib-directories" value=""/>
</C18-LD>
<C18LanguageToolchain>
<property key="stack-analysis-mplink" value="false"/>
<property key="stack-analysis-mcc18" value="false"/>
<property key="stack-analysis" value="false"/>
<property key="extended-mode-mcc18" value="false"/>
<property key="extended-mode" value="false"/>
<property key="extended-mode-mpasm" value="false"/>
<property key="extended-mode-mplink" value="false"/>
</C18LanguageToolchain>
<PICkit3PlatformTool>
<property key="programoptions.preserveprogramrange.end" value="0x3f"/>
<property key="memories.id" value="false"/>
<property key="Freeze Peripherals" value="true"/>
<property key="programoptions.preserveeeprom" value="false"/>
<property key="programmertogo.imagename" value=""/>
<property key="memories.programmemory" value="true"/>
<property key="SecureSegment.SegmentProgramming" value="FullChipProgramming"/>
<property key="AutoSelectMemRanges" value="auto"/>
<property key="hwtoolclock.frcindebug" value="false"/>
<property key="programoptions.usehighvoltageonmclr" value="false"/>
<property key="memories.eeprom" value="false"/>
<property key="ToolFirmwareFilePath"
value="Press to browse for a specific firmware version"/>
<property key="ToolFirmwareOption.UseLatestFirmware" value="true"/>
<property key="programoptions.preserveprogramrange.start" value="0x0"/>
<property key="voltagevalue" value="3.25"/>
<property key="programoptions.preserveprogramrange" value="false"/>
<property key="programoptions.eraseb4program" value="true"/>
<property key="memories.programmemory.start" value="0x0"/>
<property key="memories.programmemory.end" value="0x1fff7"/>
<property key="poweroptions.powerenable" value="false"/>
</PICkit3PlatformTool>
</conf>
</confs>
</configurationDescriptor>
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/private/configurations.xml
0,0 → 1,25
<?xml version="1.0" encoding="UTF-8"?>
<configurationDescriptor version="62">
<projectmakefile>Makefile</projectmakefile>
<defaultConf>0</defaultConf>
<confs>
<conf name="default" type="2">
<platformToolSN>:=MPLABCommUSB:=04D8:=900A:=0002:=Microchip Technology Inc.:=PICkit 3:=BUR114189291:=x:=en</platformToolSN>
<languageToolchainDir>C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin</languageToolchainDir>
<mdbdebugger version="1">
<placeholder1>place holder 1</placeholder1>
<placeholder2>place holder 2</placeholder2>
</mdbdebugger>
<runprofile version="6">
<args></args>
<rundir></rundir>
<buildfirst>true</buildfirst>
<console-type>0</console-type>
<terminal-type>0</terminal-type>
<remove-instrumentation>0</remove-instrumentation>
<environment>
</environment>
</runprofile>
</conf>
</confs>
</configurationDescriptor>
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/private/private.properties
--- nbproject/private/private.xml (nonexistent)
+++ nbproject/private/private.xml (revision 107)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/project.properties
--- nbproject/project.xml (nonexistent)
+++ nbproject/project.xml (revision 107)
@@ -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>27J13_3_MQ_Mod</name>
+ <creation-uuid>116783ce-ce82-4f46-901c-ed02c852cd72</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>
+ <make-dep-projects/>
+ </data>
+ </configuration>
+</project>
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pin_interrupts.c
0,0 → 1,100
#include "maindefs.h"
#include "pin_interrupts.h"
#include "pwm.h"
#include "msg_queues.h"
#include <delays.h>
 
static unsigned char port_b_prev_state;
 
void intx_init() {
TRISAbits.TRISA5 = 1;
TRISCbits.TRISC2 = 0;
LATCbits.LATC2 = 0;
 
RPINR1 = 16; // Bind INT1 interrupt to RP2
 
INTCON3bits.INT1IE = 1; // Enable interrupt for INT1
INTCON2bits.INTEDG1 = 0; // Trigger on falling edge
}
 
void int1_interrupt_handler() {
LATCbits.LATC2 = 1;
Delay10KTCYx(100);
LATCbits.LATC2 = 0;
}
 
void port_b_int_init() {
port_b_prev_state = 0x0F;
 
// Turn on internal pull-up for all port B pins
INTCON2bits.RBPU = 0;;
 
// Set pins as inputs
TRISBbits.TRISB4 = 1;
TRISBbits.TRISB5 = 1;
TRISBbits.TRISB6 = 1;
TRISBbits.TRISB7 = 1;
 
LATBbits.LATB4 = 0;
LATBbits.LATB5 = 0;
LATBbits.LATB6 = 0;
LATBbits.LATB7 = 0;
 
// Enable Port B interrupt
INTCONbits.RBIE = 1;
}
 
void port_b_int_interrupt_handler() {
// Pull the new pin values
unsigned char new_state = (PORTB & 0xF0) >> 4;
 
// Query which pin input value changed and send value to main()
if ((new_state ^ port_b_prev_state) & 0x01) {
if (port_b_prev_state & 0x01) {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B4 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_4_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B4 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_4_DOWN, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x02) {
if (port_b_prev_state & 0x02) {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B5 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_5_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B5 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_5_DOWN, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x04) {
if (port_b_prev_state & 0x04) {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B6 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_6_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B6 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_6_DOWN, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x08) {
if (port_b_prev_state & 0x08) {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B7 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_7_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B7 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_7_DOWN, (void *) 0);
}
}
// Save the new state of pins
port_b_prev_state = new_state;
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pin_interrupts.h
0,0 → 1,10
#ifndef __pin_interrupts_h
#define __pin_interrupts_h
 
void intx_init(void);
void int1_interrupt_handler(void);
 
void port_b_int_init(void);
void port_b_int_interrupt_handler(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pwm.c
0,0 → 1,29
#include "maindefs.h"
#include "pwm.h"
#include <pwm.h>
 
void pwm_init() {
// Configure pins RC5 and RC7 as outputs
TRISCbits.TRISC0 = 0;
TRISCbits.TRISC1 = 0;
LATCbits.LATC0 = 0;
LATCbits.LATC1 = 0;
 
RPOR11 = 14; // Set RP11 to ECCP1 PWM Output Channel A
RPOR12 = 18; // Set RP12 to ECCP2 PWM Output Channel A
}
 
void pwm_start() {
OpenEPWM1(0xFF, ECCP_1_SEL_TMR12);
SetDCEPWM1(500);
SetOutputEPWM1(SINGLE_OUT, PWM_MODE_1);
 
OpenEPWM2(0xFF, ECCP_2_SEL_TMR12);
SetDCEPWM2(500);
SetOutputEPWM2(SINGLE_OUT, PWM_MODE_1);
}
 
void pwm_stop() {
CloseEPWM1();
CloseEPWM2();
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pwm.h
0,0 → 1,8
#ifndef __pwm_h
#define __pwm_h
 
void pwm_init(void);
void pwm_start(void);
void pwm_stop(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/timers.c
0,0 → 1,40
/* The processor calls these handlers when an interrupt is triggered */
#include "maindefs.h"
#include "msg_queues.h"
#include <timers.h>
#include "timers.h"
#include "adc.h"
#include "xbee.h"
 
void timers_init() {
/*--------------------Timer Delay Formulas-------------------- */
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */
/* ----------------------------------------------------------- */
 
// Set timer 0 to overflow every 512 clocks
// OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256);
// Set timer 1 to overflow every two seconds
// OpenTimer1(TIMER_INT_ON & T1_16BIT_RW &
// T1_SOURCE_PINOSC & T1_PS_1_1 &
// T1_OSC1EN_ON & T1_SYNC_EXT_OFF,
// TIMER_GATE_OFF & TIMER_GATE_INT_OFF);
 
// Open timer 2 for CCP1 (PWM)
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
}
 
// Interrupt handler for timer 0
void timer0_interrupt_handler() {
// xbee_process_transmit_frame_interrupt();
 
}
 
// Interrupt handler for timer 1
void timer1_interrupt_handler() {
// Set timer to overflow every 10ms
WriteTimer1(62259);
 
// xbee_process_transmit_frame_interrupt();
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/timers.h
0,0 → 1,9
#ifndef __timer_interrupt_handler_h
#define __timer_interrupt_handler_h
 
void timers_init(void);
void timer0_interrupt_handler(void);
void timer1_interrupt_handler(void);
void timer2_interrupt_handler(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/uart.c
0,0 → 1,51
#include "maindefs.h"
#include "msg_queues.h"
#include <usart.h>
#include "uart.h"
#include "xbee.h"
 
static UART_DATA *uart_data_ptr;
 
void uart_init(UART_DATA *ud) {
// Configure the hardware USART device
 
// UART1 TX RC6
// UART1 RX RC7
Open1USART(USART_TX_INT_OFF & // Interrupt on TX off
USART_RX_INT_OFF & // Interrupt on RX on
USART_ASYNCH_MODE & // Operate in async mode
USART_EIGHT_BIT & // Operate in 8-bit mode
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 25); // Set UART speed to 115200 baud
 
// UART2 RX Pin RP6
RPINR16 = 10; // 10 is PPS RP10
// UART2 TX Pin RP9
RPOR9 = 6; // 6 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output)
Open2USART(USART_TX_INT_OFF & // Interrupt on TX off
USART_RX_INT_ON & // Interrupt on RX on
USART_ASYNCH_MODE & // Operate in async mode
USART_EIGHT_BIT & // Operate in 8-bit mode
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 25); // Set UART speed to 115200 baud
 
// // Create the buffer that holds UART messages
// uart_data_ptr = ud;
// uart_data_ptr->buflen = 0;
}
 
void uart_recv_interrupt_handler() {
if (DataRdy2USART()) {
xbee_read_serial(Read2USART());
}
 
if (USART2_Status.OVERRUN_ERROR == 1) {
// We've overrun the USART and must reset
RCSTA1bits.CREN = 0;
RCSTA1bits.CREN = 1;
RCSTA2bits.CREN = 0;
RCSTA2bits.CREN = 1;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_OVERRUN, (void *) 0);
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/uart.h
0,0 → 1,17
#ifndef __uart_h
#define __uart_h
 
#define MAXUARTBUF 1
#if (MAXUARTBUF > MSGLEN)
#define MAXUARTBUF MSGLEN
#endif
 
typedef struct __UART_DATA {
unsigned char buffer[MAXUARTBUF];
unsigned char buflen;
} UART_DATA;
 
void uart_init(UART_DATA *);
void uart_recv_interrupt_handler(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/xbee.c
0,0 → 1,211
#include "maindefs.h"
#include "msg_queues.h"
#include "xbee.h"
#include <usart.h>
#include <delays.h>
 
static XBEE_DATA *xbee_data_ptr;
static void *xbee_data_array_ptr;
 
/* Initialize variables used by this library */
void xbee_init(XBEE_DATA *xd) {
TRISBbits.TRISB4 = 1; // RB0 is CTS, set by XBee chip
TRISBbits.TRISB5 = 0; // RB1 is RTS, set by PIC
 
LATBbits.LATB4 = 0; // Pin set high to signal stop sending data to XBee
LATBbits.LATB5 = 0; // Pin set high to indicate stop sending data to PIC
 
xbee_data_ptr = xd;
xbee_data_ptr->dataind = 0;
xbee_data_ptr->checksum_sum = 0;
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
 
// Grab a pointer to where the unique frame array starts
xbee_data_array_ptr = &(xbee_data_ptr->rcv_frame.FRAME);
}
 
/* Here we handle the serial input from the UART interrupt */
void xbee_read_serial(unsigned char c) {
// Reset on start bit and start saving data
if (c == XBEE_START_DELIMITER) {
// On detect start delimiter, clear out initial array
xbee_data_ptr->dataind = 0;
xbee_data_ptr->checksum_sum = 0;
xbee_data_ptr->rcv_frame.start_delimiter = XBEE_START_DELIMITER;
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_HIGH;
} else {
switch(xbee_data_ptr->read_state) {
case XBEE_STATE_READ_START:
// Do nothing and wait till start bit is read
break;
case XBEE_STATE_READ_LENGTH_HIGH:
// Read length (MSB)
xbee_data_ptr->rcv_frame.length.INT_16.char_value[1] = c;
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_LOW;
break;
case XBEE_STATE_READ_LENGTH_LOW:
// Read length (LSB)
xbee_data_ptr->rcv_frame.length.INT_16.char_value[0] = c;
xbee_data_ptr->read_state = XBEE_STATE_READ_FRAME_DATA;
break;
case XBEE_STATE_READ_FRAME_DATA:
// Read unique frame data
if (xbee_data_ptr->dataind < xbee_data_ptr->rcv_frame.length.INT_16.int_value) {
*((char*)xbee_data_array_ptr + xbee_data_ptr->dataind) = c;
xbee_data_ptr->checksum_sum += c;
xbee_data_ptr->dataind++;
}
// If total length is read, the next byte is the expected checksum
if (xbee_data_ptr->dataind == xbee_data_ptr->rcv_frame.length.INT_16.int_value) {
xbee_data_ptr->read_state = XBEE_STATE_READ_CHECKSUM;
}
break;
case XBEE_STATE_READ_CHECKSUM:
// Calculate and compare checksum
if (0xFF - xbee_data_ptr->checksum_sum == c) {
// Frame was recieved successfully
xbee_process_recieved_frame();
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
} else {
// If checksum does not match, drop frame
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n");
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
}
break;
}
}
}
 
/* This is called when a full frame arrives to process the frame data */
void xbee_process_recieved_frame() {
char ret_status;
// Here we want to process each frame and send the data to Main()
// Send the frame to main() with the message type depending on the frame type
switch(*((unsigned char *) xbee_data_array_ptr)) {
case XBEE_RX_AT_COMMAND_RESPONSE:
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_DATA_PACKET:
DBG_PRINT_XBEE("XBEE: parsing recieved data recieved frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_PACKET, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_DATA_TX_STATUS:
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_TX_STATUS, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_IO_DATA_SAMPLE:
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_IO_DATA_SAMPLE, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_EXPLICIT_COMMAND:
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_EXPLICIT_COMMAND, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE:
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_ROUTE_RECORD:
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_ROUTE_RECORD, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_NODE_IDENTIFICATION:
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_NODE_IDENTIFICATION, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
case XBEE_RX_FRAME_MODEM_STATUS:
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n");
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS, (void *)xbee_data_array_ptr);
if (ret_status < 0) {
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
}
break;
default:
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n");
}
}
 
//void xbee_process_transmit_frame_interrupt(void) {
// unsigned char i;
// char length;
//
// if (MQ_peek_FromMainToHigh() == MSGTYPE_XBEE_TX_FRAME) {
// length = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *) xbee_data_ptr->msgtype, (void *) xbee_data_array_ptr);
// xbee_data_ptr->checksum_sum = 0;
// Write2USART(XBEE_START_DELIMITER);
// while (Busy2USART());
// Write2USART(0x00);
// while (Busy2USART());
// Write2USART(length);
// while (Busy2USART());
// for (i = 0; i < length; i++) {
// Write2USART(*((unsigned char *) xbee_data_array_ptr + i));
// xbee_data_ptr->checksum_sum += *((unsigned char *) xbee_data_array_ptr + i);
// while (Busy2USART());
// }
// Write2USART(0xFF - xbee_data_ptr->checksum_sum);
// while (Busy2USART());
// }
//}
 
void xbee_process_transmit_frame(void *data, unsigned char length) {
unsigned char i;
unsigned char checksum = 0;
 
Write2USART(XBEE_START_DELIMITER);
while (Busy2USART() || xbee_read_CTS());
Write2USART(0x00);
while (Busy2USART() || xbee_read_CTS());
Write2USART(length);
while (Busy2USART() || xbee_read_CTS());
for (i = 0; i < length; i++) {
Write2USART(*((unsigned char *) data + i));
checksum += *((unsigned char *) data + i);
while (Busy2USART() || xbee_read_CTS());
}
Write2USART(0xFF - checksum);
while (Busy2USART());
}
 
void xbee_set_RTS(unsigned char c) {
if (c) {
LATBbits.LATB5 = 1; // Set high to stop receiving data
} else {
LATBbits.LATB5 = 0; // Set low to resume receiving data
}
}
 
unsigned char xbee_read_CTS() {
unsigned char c = PORTBbits.RB4;
if (c) {
return 0x1; // High indicates stop sending data
} else {
return 0x0; // Low indicates ok to send data
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/xbee.h
0,0 → 1,256
#ifndef __xbee_h
#define __xbee_h
 
#define XBEE_BUFFER_SIZE MSGLEN
#define XBEE_START_DELIMITER 0x7E
 
// Expected 'next' state
#define XBEE_STATE_READ_START 10
#define XBEE_STATE_READ_LENGTH_HIGH 11
#define XBEE_STATE_READ_LENGTH_LOW 12
#define XBEE_STATE_READ_FRAME_DATA 14
#define XBEE_STATE_READ_CHECKSUM 15
 
// Command Frame Type
#define XBEE_TX_AT_COMMAND 0x08
#define XBEE_TX_AT_COMMAND_QUEUE 0x09
#define XBEE_RX_AT_COMMAND_RESPONSE 0x88
 
#define XBEE_TX_DATA_PACKET 0x10
#define XBEE_RX_DATA_PACKET 0x90
#define XBEE_RX_DATA_TX_STATUS 0x8B
#define XBEE_RX_IO_DATA_SAMPLE 0x92
#define XBEE_TX_EXPLICIT_COMMAND 0x11
#define XBEE_RX_EXPLICIT_COMMAND 0x91
 
#define XBEE_TX_REMOTE_AT_COMMAND 0x17
#define XBEE_RX_REMOTE_AT_COMMAND_RESPONSE 0x97
 
#define XBEE_TX_CREATE_SOURCE_ROUTE 0x21
#define XBEE_RX_ROUTE_RECORD 0xA1
#define XBEE_RX_NODE_IDENTIFICATION 0x95
#define XBEE_RX_FRAME_MODEM_STATUS 0x8A
 
typedef struct {
union {
unsigned long long_value;
unsigned char char_value[4]; // Little Endian!!
} UPPER_32;
union {
unsigned long long_value;
unsigned char char_value[4]; // Little Endian!!
} LOWER_32;
} XBEE_ADDRESS_64;
 
typedef struct {
union {
unsigned int int_value;
unsigned char char_value[2]; // Little Endian!!
} INT_16;
} XBEE_ADDRESS_16;
 
// Unique Frame Components
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
unsigned char command[2];
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_AT_COMMAND_FRAME;
#define XBEE_TX_AT_COMMAND_FRAME_SIZE 4
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
unsigned char command[2];
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_AT_COMMAND_QUEUE_FRAME;
#define XBEE_TX_AT_COMMAND_QUEUE_FRAME_SIZE 4
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
unsigned char command[2];
unsigned char command_status;
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_AT_COMMAND_RESPONSE_FRAME;
#define XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE 5
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_64 destination_64;
XBEE_ADDRESS_16 destination_16;
unsigned char broadcast_radius;
unsigned char options;
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_DATA_PACKET_FRAME;
#define XBEE_TX_DATA_PACKET_FRAME_SIZE 14
 
typedef struct {
unsigned char frame_type;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char recieve_options;
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_DATA_PACKET_FRAME;
#define XBEE_RX_DATA_PACKET_FRAME_SIZE 12
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_16 destination_16;
unsigned char transmit_retry_count;
unsigned char delivery_status;
unsigned char discovery_status;
} XBEE_RX_DATA_TX_STATUS_FRAME;
#define XBEE_RX_DATA_TX_STATUS_FRAME_SIZE 7
 
typedef struct {
unsigned char frame_type;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char recieve_options;
unsigned char number_of_samples;
unsigned char digital_ch_mask[2];
unsigned char analog_ch_mask;
unsigned char digital_samples[2];
unsigned char analog_samples[8];
} XBEE_RX_IO_DATA_SAMPLE_FRAME;
#define XBEE_RX_IO_DATA_SAMPLE_FRAME_SIZE 26
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_64 destination_64;
XBEE_ADDRESS_16 destination_16;
unsigned char source_endpoint;
unsigned char destination_endpoint;
unsigned char cluster_id[2];
unsigned char profile_id[2];
unsigned char broadcast_radius;
unsigned char transmit_options;
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_EXPLICIT_COMMAND_FRAME;
#define XBEE_TX_EXPLICIT_COMMAND_FRAME_SIZE 20
 
typedef struct {
unsigned char frame_type;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char source_endpoint;
unsigned char destination_endpoint;
unsigned char cluster_id[2];
unsigned char profile_id[2];
unsigned char recieve_options;
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_EXPLICIT_COMMAND_FRAME;
#define XBEE_RX_EXPLICIT_COMMAND_FRAME_SIZE 18
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_64 destination_64;
XBEE_ADDRESS_16 destination_16;
unsigned char remote_options;
unsigned char command[2];
unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_REMOTE_AT_COMMAND_FRAME;
#define XBEE_TX_REMOTE_AT_COMMAND_FRAME_SIZE 15
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char command[2];
unsigned char command_status;
unsigned char command_data[4];
} XBEE_RX_REMOTE_AT_COMMAND_FRAME;
#define XBEE_RX_REMOTE_AT_COMMAND_FRAME_SIZE 19
 
typedef struct {
unsigned char frame_type;
unsigned char frame_id;
XBEE_ADDRESS_64 destination_64;
XBEE_ADDRESS_16 destination_16;
unsigned char route_options;
unsigned char num_of_addresses;
unsigned char addresses[XBEE_BUFFER_SIZE];
} XBEE_TX_CREATE_SOURCE_ROUTE_FRAME;
#define XBEE_TX_CREATE_SOURCE_ROUTE_FRAME_SIZE 14
 
typedef struct {
unsigned char frame_type;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char recieve_options;
unsigned char num_of_addresses;
unsigned char addresses[XBEE_BUFFER_SIZE];
} XBEE_RX_ROUTE_RECORD_FRAME;
#define XBEE_RX_ROUTE_RECORD_FRAME_SIZE 13
 
typedef struct {
unsigned char frame_type;
XBEE_ADDRESS_64 source_64;
XBEE_ADDRESS_16 source_16;
unsigned char recieve_options;
XBEE_ADDRESS_16 remote_16;
XBEE_ADDRESS_64 remote_64;
unsigned char NI_string[2];
XBEE_ADDRESS_16 parent_16;
unsigned char device_type;
unsigned char source_event;
unsigned char profile_id[2];
unsigned char manufacturer_id[2];
} XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME;
#define XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME_SIZE 32
 
typedef struct {
unsigned char frame_type;
unsigned char status;
} XBEE_RX_MODEM_STATUS_FRAME;
#define XBEE_RX_MODEM_STATUS_FRAME_SIZE 2
 
// Common Frame Components
typedef struct __XBEE_FRAME {
unsigned char start_delimiter;
XBEE_ADDRESS_16 length;
union {
XBEE_TX_AT_COMMAND_FRAME TX_AT_COMMAND;
XBEE_TX_AT_COMMAND_QUEUE_FRAME TX_AT_COMMAND_QUEUE;
XBEE_RX_AT_COMMAND_RESPONSE_FRAME RX_AT_COMMAND_RESPONSE;
XBEE_TX_DATA_PACKET_FRAME TX_DATA_PACKET;
XBEE_RX_DATA_PACKET_FRAME RX_DATA_PACKET;
XBEE_RX_DATA_TX_STATUS_FRAME RX_DATA_TX_STATUS;
XBEE_RX_IO_DATA_SAMPLE_FRAME RX_IO_DATA_SAMPLE;
XBEE_TX_EXPLICIT_COMMAND_FRAME TX_EXPLICIT_COMMAND;
XBEE_RX_EXPLICIT_COMMAND_FRAME RX_EXPLICIT_COMMAND;
XBEE_TX_REMOTE_AT_COMMAND_FRAME TX_REMOTE_AT_COMMAND;
XBEE_RX_REMOTE_AT_COMMAND_FRAME RX_REMOTE_AT_COMMAND;
XBEE_TX_CREATE_SOURCE_ROUTE_FRAME TX_CREATE_SOURCE_ROUTE;
XBEE_RX_ROUTE_RECORD_FRAME RX_ROUTE_RECORD;
XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME RX_NODE_IDENTIFICATION;
XBEE_RX_MODEM_STATUS_FRAME RX_MODEM_STATUS;
} FRAME;
} XBEE_FRAME;
 
// Overall Data Structure
typedef struct __xbee_data {
XBEE_FRAME rcv_frame;
unsigned char dataind;
unsigned char checksum_sum;
unsigned char read_state;
unsigned char msgtype;
} XBEE_DATA;
 
 
void xbee_init(XBEE_DATA *);
void xbee_read_serial(unsigned char);
void xbee_process_recieved_frame(void);
//void xbee_process_transmit_frame_interrupt(void);
void xbee_process_transmit_frame(void *data, unsigned char length);
 
void xbee_set_RTS(unsigned char);
unsigned char xbee_read_CTS(void);
 
#endif