/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 |
---|
--- Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/private/private.xml (nonexistent) |
+++ Classwork/ECE4534 - Embedded Systems/PIC 27J13/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 |
---|
--- Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/project.xml (nonexistent) |
+++ Classwork/ECE4534 - Embedded Systems/PIC 27J13/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 |