//Classwork/ECE4534 - Embedded Systems/PIC 26J11/18f26j11.lkr |
---|
0,0 → 1,80 |
// File: 18f26j11_g.lkr |
// Generic linker script for the PIC18F26J11 processor |
#DEFINE _CODEEND _DEBUGCODESTART - 1 |
#DEFINE _CEND _CODEEND + _DEBUGCODELEN |
#DEFINE _DATAEND _DEBUGDATASTART - 1 |
#DEFINE _DEND _DATAEND + _DEBUGDATALEN |
LIBPATH . |
#IFDEF _CRUNTIME |
#IFDEF _EXTENDEDMODE |
FILES c018i_e.o |
FILES clib_e.lib |
FILES p18f26j11_e.lib |
#ELSE |
FILES c018i.o |
FILES clib.lib |
FILES p18f26j11.lib |
#FI |
#FI |
#IFDEF _DEBUGCODESTART |
CODEPAGE NAME=page START=0x0 END=_CODEEND |
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED |
#ELSE |
CODEPAGE NAME=page START=0x0 END=0xFFF7 |
#FI |
CODEPAGE NAME=config START=0xFFF8 END=0xFFFF PROTECTED |
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED |
#IFDEF _EXTENDEDMODE |
DATABANK NAME=gpre START=0x0 END=0x5F |
#ELSE |
ACCESSBANK NAME=accessram START=0x0 END=0x5F |
#FI |
DATABANK NAME=gpr0 START=0x60 END=0xFF |
DATABANK NAME=gpr1 START=0x100 END=0x1FF |
DATABANK NAME=gpr2 START=0x200 END=0x2FF |
DATABANK NAME=gpr3 START=0x300 END=0x3FF |
DATABANK NAME=gpr4 START=0x400 END=0x4FF |
DATABANK NAME=gpr5 START=0x500 END=0x5FF |
DATABANK NAME=gpr6 START=0x600 END=0x6FF |
DATABANK NAME=gpr7 START=0x700 END=0x7FF |
DATABANK NAME=gpr8 START=0x800 END=0x8FF |
DATABANK NAME=gpr9 START=0x900 END=0x9FF |
DATABANK NAME=gpr10 START=0xA00 END=0xAFF |
DATABANK NAME=gpr11 START=0xB00 END=0xBFF |
//DATABANK NAME=gpr12 START=0xC00 END=0xCFF |
//DATABANK NAME=gpr13 START=0xD00 END=0xDFF |
DATABANK NAME=buffer START=0xC00 END=0xDFF // 512 bytes |
SECTION NAME=buffer RAM=buffer |
DATABANK NAME=gpr14 START=0xE00 END=0xEBF // Stack |
//#IFDEF _DEBUGDATASTART |
// DATABANK NAME=gpr13 START=0xD00 END=_DATAEND |
// DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED |
//#ELSE //no debug |
// DATABANK NAME=gpr13 START=0xD00 END=0xDFF |
//#FI |
//DATABANK NAME=gpr14 START=0xE00 END=0xEBF |
DATABANK NAME=sfr14 START=0xEC0 END=0xEFF PROTECTED |
DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED |
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED |
#IFDEF _CRUNTIME |
SECTION NAME=CONFIG ROM=config |
// #IFDEF _DEBUGDATASTART |
// STACK SIZE=0x100 RAM=gpr12 |
// #ELSE |
// STACK SIZE=0x100 RAM=gpr13 |
STACK SIZE=0xC0 RAM=gpr14 |
// #FI |
#FI |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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 26J11/RAM Usage.txt |
---|
0,0 → 1,40 |
RAM Usage: 268 bytes (empty project) |
Main |
256 bytes (msgbuffer) |
I2C |
255 bytes (buffe) |
2 bytes (ptr) |
LED Driver |
2 bytes (last value) |
MSG Queue |
255 bytes |
255 bytes |
255 bytes |
255 bytes |
255 bytes |
255 bytes |
255 bytes |
255 bytes |
48 bytes (queues) |
1 byte (char) |
Timers |
1 byte (counter) |
XBee |
255 bytes (xbee frame) |
4 bytes (ptr) |
Pin Interrupt |
1 byte (prev state) |
Buffer |
256 bytes |
7 bytes (data) |
Avaliable free space: |
0x60 - 0xCFF (3232 bytes) |
0xE00 - 0xEBE (192 bytes) |
Space allocation: |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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, |
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 26J11/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 26J11/buffer.c |
---|
0,0 → 1,86 |
#include "buffer.h" |
#include "maindefs.h" |
#pragma udata buffer |
unsigned char buffer[BUFFER_SIZE]; |
#pragma udata |
BUFFER_DATA *buffer_data; |
void buffer_init(BUFFER_DATA *data) { |
buffer_data = data; |
buffer_data->index_read = 0; |
buffer_data->index_write = 0; |
buffer_data->stored_length = 0; |
buffer_data->buffer = buffer; |
} |
char buffer_insert_one(unsigned char c) { |
if (BUFFER_SIZE - buffer_data->stored_length == 0) { |
DBG_PRINT_BUFFER("Buffer: (ERROR) Not enough free space for insert\r\n"); |
return -1; |
} |
// Update the amount of used space in the buffer |
buffer_data->stored_length += 1; |
// Copy data from msg to buffer |
buffer_data->buffer[buffer_data->index_write] = c; |
buffer_data->index_write++; |
if (buffer_data->index_write == BUFFER_SIZE) { |
buffer_data->index_write = 0; |
} |
return 0; |
} |
char buffer_insert(unsigned char length, unsigned char *msg) { |
unsigned char i; |
// Make sure we have enough space to store message |
if (length > BUFFER_SIZE - buffer_data->stored_length) { |
DBG_PRINT_BUFFER("Buffer: (ERROR) Not enough free space for insert\r\n"); |
return -1; |
} |
// Update the amount of used space in the buffer |
buffer_data->stored_length += length; |
// Copy data from msg to buffer |
for (i = 0; i < length; i++) { |
buffer_data->buffer[buffer_data->index_write] = *(msg + i); |
buffer_data->index_write++; |
if (buffer_data->index_write == BUFFER_SIZE) { |
buffer_data->index_write = 0; |
} |
} |
return 0; |
} |
char buffer_read(unsigned char length, unsigned char *dest) { |
unsigned char i; |
// Make sure requested data is less than size of stored data |
if (length > buffer_data->stored_length) { |
DBG_PRINT_BUFFER("Buffer: (ERROR) Read length exceedes stored length\r\n"); |
return -1; |
} |
// Update the amount of used space in the buffer |
buffer_data->stored_length -= length; |
// Copy data from buffer to dest |
for (i = 0; i < length; i++) { |
*(dest + i) = buffer_data->buffer[buffer_data->index_read]; |
buffer_data->index_read++; |
if (buffer_data->index_read == BUFFER_SIZE) { |
buffer_data->index_read = 0; |
} |
} |
return 0; |
} |
unsigned int buffer_free_space() { |
return BUFFER_SIZE - buffer_data->stored_length; |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/buffer.h |
---|
0,0 → 1,21 |
#ifndef __circular_buffer_h |
#define __circular_buffer_h |
#define BUFFER_OK 0 |
#define BUFFER_ERROR -1 |
#define BUFFER_SIZE 512 |
typedef struct __BUFFER_DATA { |
unsigned int index_read; |
unsigned int index_write; |
unsigned int stored_length; |
unsigned char *buffer; |
} BUFFER_DATA; // 7 bytes overhead |
void buffer_init(BUFFER_DATA *); |
char buffer_insert_one(unsigned char); |
char buffer_insert(unsigned char length, unsigned char *msg); |
char buffer_read(unsigned char length, unsigned char *dest); |
unsigned int buffer_free_space(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/adc.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/adc.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/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 26J11/build/default/production/buffer.o.d |
---|
0,0 → 1,9 |
build/default/production/buffer.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/buffer.c \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/buffer.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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 26J11/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/PIC\ Code/PIC_26J11/i2c.c \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/i2c.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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 26J11/build/default/production/imu.o.d |
---|
0,0 → 1,11 |
build/default/production/imu.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/imu.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/i2c.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/imu.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/interrupts.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/i2c.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/timers.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/uart.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/adc.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/interrupts.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pin_interrupts.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/led_driver.o.d |
---|
0,0 → 1,13 |
build/default/production/led_driver.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/led_driver.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/led_driver.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/spi.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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 \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/main.o.d |
---|
0,0 → 1,23 |
build/default/production/main.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/main.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/i2c.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/led_driver.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pwm.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/buffer.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/interrupts.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/uart.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/adc.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/timers.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pin_interrupts.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/imu.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/sleep.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/msg_queues.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/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/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/interrupts.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/pin_interrupts.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pwm.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/pin_interrupts.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/pwm.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pwm.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pwm.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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 26J11/build/default/production/sleep.o.d |
---|
0,0 → 1,13 |
build/default/production/sleep.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/sleep.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/led_driver.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/sleep.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/timers.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/timers.o.d |
---|
0,0 → 1,14 |
build/default/production/timers.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/timers.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/timers.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pwm.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/timers.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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/PIC\ Code/PIC_26J11/uart.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/usart.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/uart.h \ |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/xbee.o.d |
---|
0,0 → 1,15 |
build/default/production/xbee.o : \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \ |
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/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/PIC\ Code/PIC_26J11/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.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/PIC\ Code/PIC_26J11/timers.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 26J11/dist/default/production/PIC_26J11.production.cof |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/dist/default/production/PIC_26J11.production.cof |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/dist/default/production/PIC_26J11.production.hex |
---|
0,0 → 1,859 |
:020000040000FA |
:06000000FBEF18F01200F6 |
:020006001200E6 |
:0600080093EF11F012005D |
:02000E00C2909E |
:040010009D9C1200A1 |
:04001400B46A1200B8 |
:06001800EEEF11F01200F2 |
:02001E000400DC |
:1000200061320000FF0700000100000060320000A4 |
:10003000FF060000010000005F320000FF05000025 |
:10004000010000005E320000FF040000010000001B |
:10005000D9CFE6FFE1CFD9FFFD0EDBCFA1F0FE0E39 |
:10006000DBCFA2F0A1C0E9FFA2C0EAFF000EEE6E56 |
:100070000B0EED6EA1C0E9FFA2C0EAFF020EEB6A13 |
:10008000030EEB6AA1C0E9FFA2C0EAFF060EE92653 |
:10009000000EEA22EF6AA1C0E9FFA2C0EAFF040E47 |
:1000A000E926000EEA22050EEF6EA1C0E9FFA2C00C |
:1000B000EAFF080EE926000EEA22EF6AA1C0E9FF76 |
:1000C000A2C0EAFF050EE926000EEA22EF6AA1C0EF |
:1000D000E9FFA2C0EAFF020EEB6A030EEB6AA1C0C1 |
:1000E000E9FFA2C0EAFF090EE926000EEA22EF6A44 |
:1000F000A1C0E9FFA2C0EAFF0B0EE926000EEA222A |
:10010000EF6AA1C0E9FFA2C0EAFF0C0EE926000ECB |
:10011000EA22EF6AA1C0E9FFA2C0EAFF0F0EE926BA |
:10012000000EEA22EF6AA1C0E9FFA2C0EAFF0D0EAD |
:10013000E926000EEA22EF6AA1C0E9FFA2C0EAFFA9 |
:100140000E0EE926000EEA22220EEF6EE552E7CFF0 |
:10015000D9FF1200A1C0E9FFA2C0EAFF0F0EE926F5 |
:10016000000EEA22110EEF6E94869488C76AC66A62 |
:10017000C56AF00EC6140809C66E630EC86EC78E37 |
:10018000C68A1200D9CFE6FFE1CFD9FF020EE126E1 |
:10019000FD0EDB506FE0DE6ADD6ADECF10F0DDCFF2 |
:1001A00011F0FD0EDB50000111AE02D0D89003D04B |
:1001B000105C000E115826E2FB0EDBCF12F0FC0E95 |
:1001C000DBCF13F0DE501224E96EDD501320EA6E0F |
:1001D000EF50E66EDECF10F0DDCF11F0A1C0E9FFE9 |
:1001E000A2C0EAFF1050EE24E76E1150EE20EA6E36 |
:1001F000E7CFE9FFE552E750EF6EDF2A010ECDE3CE |
:10020000DB2ACBD7FD0EDB50E66EA1C0E9FFA2C012 |
:10021000EAFF020EE926000EEA22E552E750EE6EF2 |
:10022000ED6AA1C0E9FFA2C0EAFF0D0EE926000EAB |
:10023000EA22FE0EDBCFEFFFA1C0E9FFA2C0EAFF7A |
:10024000050EE926000EEA22EF6AA1C0E9FFA2C06E |
:10025000EAFF040EE926000EEA22090EEF6EA1C0A5 |
:10026000E9FFA2C0EAFF0E0EE926000EEA22200EE8 |
:10027000EF6EC580020EE15C02E2E16AE552E16EDA |
:10028000E552E7CFD9FF1200D9CFE6FFE1CFD9FF82 |
:10029000FD0EDB5038E0FD0EDB50E66EA1C0E9FF3D |
:1002A000A2C0EAFF020EE926000EEA22E552E7505C |
:1002B000EE6EED6AA1C0E9FFA2C0EAFF0D0EE926CD |
:1002C000000EEA22FE0EDBCFEFFFA1C0E9FFA2C0C5 |
:1002D000EAFF050EE926000EEA22EF6AA1C0E9FF57 |
:1002E000A2C0EAFF040EE926000EEA22090EEF6E14 |
:1002F000A1C0E9FFA2C0EAFF0E0EE926000EEA2225 |
:10030000210EEF6EC580E552E7CFD9FF1200D9CF9D |
:10031000E6FFE1CFD9FFA1C0E9FFA2C0EAFF0F0EBF |
:10032000E926000EEA22100EEF6E94869488FE0EE7 |
:10033000DB50E824C86EC76AC66AC56AF00EC614E8 |
:100340000E09C66EC78EC580C68AE552E7CFD9FFB3 |
:100350001200A1C0E9FFA2C0EAFF0F0EEB50110886 |
:1003600002E1BDEF01F0A1C0E9FFA2C0EAFF0F0E5C |
:10037000EB50100801E1E4D91200A1C0E9FFA2C0CE |
:10038000EAFF0E0EEB50200801E09DD0A1C0E9FF6E |
:10039000A2C0EAFF040EEB500B0A19E0020A04E0C7 |
:1003A0000C0A01E18FD01200A1C0E9FFA2C0EAFF50 |
:1003B000040EE926000EEA220B0EEF6EA1C0E9FF43 |
:1003C000A2C0EAFF0D0EEB50E824C96E1200C5BCB6 |
:1003D00058D0A1C0E9FFA2C0EAFF050EEB50106E95 |
:1003E000116A020EE926000EEA22EECF12F0EFCFDC |
:1003F00013F011501318E8AE02D0133404D0125089 |
:10040000105C135011581BE2A1C0E9FFA2C0EAFF23 |
:10041000050EEB50116AE850EE24E76E1150EE2005 |
:10042000EA6EE7CFE9FFEF50C96EA1C0E9FFA2C0B5 |
:10043000EAFF050EE926000EEA22EF2A1200A1C00B |
:10044000E9FFA2C0EAFF040EE926000EEA22050E2B |
:10045000EF6EC584A1C0E9FFA2C0EAFF0E0EE92637 |
:10046000000EEA22220EEF6E000EE66EE66A2B0EFA |
:10047000E66EE66A80EC09F0E552E552E552E55297 |
:100480001200A1C0E9FFA2C0EAFF040EE926000E97 |
:10049000EA22050EEF6EC584A1C0E9FFA2C0EAFF03 |
:1004A0000E0EE926000EEA22220EEF6E000EE66E18 |
:1004B000E66A2C0EE66EE66A80EC09F0E552E5523B |
:1004C000E552E5521200A1C0E9FFA2C0EAFF0E0EFC |
:1004D000EB50210801E0D7D0A1C0E9FFA2C0EAFF9C |
:1004E000040EEB500D0A01E19FD0010A01E190D00A |
:1004F0000B0A40E00C0A1AE0020A04E00C0A01E1CF |
:10050000C2D01200A1C0E9FFA2C0EAFF040EE92692 |
:10051000000EEA220B0EEF6EA1C0E9FFA2C0EAFFB7 |
:100520000D0EEB50E8240109C96E1200C5AC70D065 |
:10053000A1C0E9FFA2C0EAFF040EE926000EEA22EC |
:10054000050EEF6EC584A1C0E9FFA2C0EAFF0E0E42 |
:10055000E926000EEA22220EEF6E000EE66EE66A33 |
:100560002E0EE66EE66A80EC09F0E552E552E552A1 |
:10057000E5521200A1C0E9FFA2C0EAFF050EEB5050 |
:10058000116AE850EE24E76E1150EE20EA6EE7CFD4 |
:10059000E9FFC9CFEFFFA1C0E9FFA2C0EAFF050E46 |
:1005A000E926000EEA22EF2AA1C0E9FFA2C0EAFF75 |
:1005B000050EEB50106E116A020EE926000EEA22BB |
:1005C000EECF12F0EFCF13F011501318E8AE02D0B7 |
:1005D000133404D01250105C135011580CE2A1C017 |
:1005E000E9FFA2C0EAFF040EE926000EEA220C0E83 |
:1005F000EF6EC59A0BD0A1C0E9FFA2C0EAFF040EBE |
:10060000E926000EEA220D0EEF6EC58AC58812009B |
:10061000A1C0E9FFA2C0EAFF040EE926000EEA220B |
:10062000070EEF6EC5861200A1C0E9FFA2C0EAFF67 |
:10063000040EE926000EEA22050EEF6EC584A1C065 |
:10064000E9FFA2C0EAFF0E0EE926000EEA22220E02 |
:10065000EF6EA1C0E9FFA2C0EAFFEECFE6FFEFCF49 |
:10066000E6FF2D0EE66EA1C0E9FFA2C0EAFF020E72 |
:10067000E926000EEA22EF50E66E80EC09F0E55222 |
:10068000E552E552E5521200D9CFE6FFE1CFD9FF9E |
:10069000A1C0E9FFA2C0EAFF060EE926000EEA2289 |
:1006A000010EEF6EA1C0E9FFA2C0EAFF020EEB6AE5 |
:1006B000030EEB6AFE0EDB5035E0C7AA1DD0A1C0C9 |
:1006C000E9FFA2C0EAFF040EE926000EEA22050EA9 |
:1006D000EF6EA1C0E9FFA2C0EAFF080EE926000EF6 |
:1006E000EA22EF2AA1C0E9FFA2C0EAFF070EE9262D |
:1006F000000EEA22050E1FD0C7A40AD0A1C0E9FF50 |
:10070000A2C0EAFF040EE926000EEA22080E13D06A |
:10071000A1C0E9FFA2C0EAFF040EE926000EEA220A |
:10072000070E09D0A1C0E9FFA2C0EAFF040EE92626 |
:10073000000EEA22060EEF6EE552E7CFD9FF120057 |
:10074000D9CFE6FFE1CFD9FF090EE126010EDB6A22 |
:10075000020EDB6A030EDB6A040EDB6A080EDB6A3C |
:10076000C6AC23D0C69CA1C0E9FFA2C0EAFF040E1C |
:10077000E926000EEA22050EEF6E010EF36E040E5E |
:10078000F3CFDBFFA1C0E9FFA2C0EAFF080EE92614 |
:10079000000EEA22EF2AA1C0E9FFA2C0EAFF070E7D |
:1007A000E926000EEA22040EEF6EC7A005D0C9505C |
:1007B000DF6EDE52010EDD6E040EDB5001E024D24E |
:1007C000A1C0E9FFA2C0EAFF040EEB50070A01E155 |
:1007D00060D10F0A6CE00E0A14E0030A01E014D2A3 |
:1007E000C7A612D2010EDBCFE6FF4EDFE552A1C055 |
:1007F000E9FFA2C0EAFF040EEB50080801E004D2B2 |
:1008000037D0C7A810D0A1C0E9FFA2C0EAFF060EEA |
:10081000E926000EEA22EF2A010EDB5001E1EAD1BF |
:10082000C7AA89D1D4D1010EDB5001E1EDD1A1C01D |
:10083000E9FFA2C0EAFF060EE926000EEA22EF2A2F |
:10084000C7BA18D0C7B40AD0A1C0E9FFA2C0EAFF56 |
:10085000040EE926000EEA22070ED5D1A1C0E9FF59 |
:10086000A2C0EAFF040EE926000EEA22080EEF6E8F |
:10087000030EABD1A1C0E9FFA2C0EAFF080EE92632 |
:10088000000EEA22EF2AA1C0E9FFA2C0EAFF040E8F |
:10089000E926000EEA22050EEF6EA1C0E9FFA2C014 |
:1008A000EAFF070EE926000EEA22060EACD1A1C02F |
:1008B000E9FFA2C0EAFF0B0EEB50000901E080D077 |
:1008C00047EC0AF0E76E080EE7CFDBFFDB502A08A3 |
:1008D00003E1080EDB501BE1C968A1C0E9FFA2C01B |
:1008E000EAFF050EE926000EEA22010EEF6EA1C016 |
:1008F000E9FFA2C0EAFF0B0EE926000EEA22010E74 |
:10090000EF6EA1C0E9FFA2C0EAFF0C0E53D0A1C058 |
:10091000E9FFA2C0EAFFEECFE6FFEFCFE6FFA1C0FE |
:10092000E9FFA2C0EAFF0A0EEB50E66EE66AE6684F |
:1009300027EC0AF0126E050EE15E1250106E116A7D |
:1009400010BE1168A1C0E9FFA2C0EAFF020E10C0EC |
:10095000EBFF030E11C0EBFFA1C0E9FFA2C0EAFF4D |
:10096000020EE926000EEA22EECF10F0EFCF11F0D2 |
:10097000113401E349D110500008000E115401E375 |
:1009800043D1A1C0E9FFA2C0EAFFEE50EFCFEAFFDA |
:10099000E96EEF50C96EA1C0E9FFA2C0EAFF050EE3 |
:1009A000E926000EEA22010EEF6EA1C0E9FFA2C007 |
:1009B000EAFF0B0EE926000EEA22010EEF6E5AD076 |
:1009C000A1C0E9FFA2C0EAFF0C0EEB5000091CE039 |
:1009D000A1C0E9FFA2C0EAFF050EEB50106E090EA0 |
:1009E000EB50105C02E2C9683BD0A1C0E9FFA2C095 |
:1009F000EAFF0B0EE926000EEA22EF6AA1C0E9FF2A |
:100A0000A2C0EAFF0C0E40D0A1C0E9FFA2C0EAFFDD |
:100A1000050EEB50106E116A020EE926000EEA2256 |
:100A2000EECF12F0EFCF13F011501318E8AE02D052 |
:100A3000133404D01250105C1350115820E2A1C09E |
:100A4000E9FFA2C0EAFF050EEB50116AE850EE2460 |
:100A5000E76E1150EE20EA6EE7CFE9FFEF50C96E66 |
:100A6000A1C0E9FFA2C0EAFF050EE926000EEA22B6 |
:100A7000EF2A010EF36E020EF3CFDBFFC5D0A1C04B |
:100A8000E9FFA2C0EAFF0B0EE926000EEA22EF6A98 |
:100A9000B1D0C7A856D0A1C0E9FFA2C0EAFF060E98 |
:100AA000E926000EEA22EF2A010EDB5044E0C7AA35 |
:100AB00025D0A1C0E9FFA2C0EAFFEECF10F0EFCF32 |
:100AC00011F0A1C0E9FFA2C0EAFF020EE926000E64 |
:100AD000EA221050EE24E76E1150EE20EA6EE7CFC6 |
:100AE000E9FFDFCFEFFFA1C0E9FFA2C0EAFF020EDE |
:100AF000E926000EEA22EE2AEF221DD0A1C0E9FF6E |
:100B0000A2C0EAFF080EE926000EEA22EF2AA1C0E1 |
:100B1000E9FFA2C0EAFF070EE926000EEA22060E50 |
:100B2000EF6EA1C0E9FFA2C0EAFF040EE926000EA5 |
:100B3000EA22050E5ED0010EF36E030EF3CFDBFF4B |
:100B400059D0010EDB5060E0A1C0E9FFA2C0EAFF6E |
:100B5000060EE926000EEA22EF2AC7AA25D0A1C078 |
:100B6000E9FFA2C0EAFFEECF10F0EFCF11F0A1C075 |
:100B7000E9FFA2C0EAFF020EE926000EEA221050A9 |
:100B8000EE24E76E1150EE20EA6EE7CFE9FFDFCFEB |
:100B9000EFFFA1C0E9FFA2C0EAFF020EE926000EA6 |
:100BA000EA22EE2AEF2230D0C7A411D0A1C0E9FF7B |
:100BB000A2C0EAFF040EE926000EEA22080EEF6E3C |
:100BC000010EF36E030EF3CFDBFFC96E1DD0A1C083 |
:100BD000E9FFA2C0EAFF080EE926000EEA22EF2A8A |
:100BE000A1C0E9FFA2C0EAFF070EE926000EEA2233 |
:100BF000060EEF6EA1C0E9FFA2C0EAFF040EE926CF |
:100C0000000EEA22050EEF6E010EDB5003E1020E2C |
:100C1000DB5002E0C6A8C688A1C0E9FFA2C0EAFF77 |
:100C2000020EE926000EEA22EECF10F0EFCF11F00F |
:100C3000113425E21050FD08000E115420E2030E7D |
:100C4000DB501DE1A1C0E9FFA2C0EAFF040EE926C6 |
:100C5000000EEA22050EEF6EA1C0E9FFA2C0EAFF76 |
:100C6000080EE926000EEA22EF2AA1C0E9FFA2C081 |
:100C7000EAFF070EE926000EEA22070EEF6E030ECA |
:100C8000DB506DE0A1C0E9FFA2C0EAFF020EE92639 |
:100C9000000EEA22EECF10F0EFCF11F01006115A3D |
:100CA000A1C0E9FFA2C0EAFF1050EE24E76E115088 |
:100CB000EE20EA6EE7CFE9FFEF50E66EA1C0E9FF54 |
:100CC000A2C0EAFF090EE926000EEA22E552E7502B |
:100CD000EF6EA1C0E9FFA2C0EAFF060EEB50E66E80 |
:100CE000EECF10F0EFCF11F0A1C0E9FFA2C0EAFFF4 |
:100CF000020EE926000EEA221050EE24E76E115093 |
:100D0000EE20EA6EE7CFE9FFE552E750EF6EA1C0B3 |
:100D1000E9FFA2C0EAFFEECFE6FFEFCFE6FF290E24 |
:100D2000E66EA1C0E9FFA2C0EAFF020EE926000EAE |
:100D3000EA22EECF10F0EFCF11F0010E1024E66E94 |
:100D400080EC09F0E552E552E552E552A1C0E9FF19 |
:100D5000A2C0EAFF020EEB6A030EEB6A38D0A1C014 |
:100D6000E9FFA2C0EAFF080EEB50106E010E105C06 |
:100D70002EE3A1C0E9FFA2C0EAFF080EEB50E76E28 |
:100D8000050EE7CFDBFF070EEB50E76E060EE7CF51 |
:100D9000DBFFEB50E76E070EE7CFDBFFD950050F07 |
:100DA000E66E000EDA20E66E280EE66E030EE66EA4 |
:100DB00080EC09F0E552E552E552E552A1C0E9FFA9 |
:100DC000A2C0EAFF080EE926000EEA22EF6A090E29 |
:100DD000E15C02E2E16AE552E16EE552E7CFD9FF5C |
:100DE0001200A1C0E9FFA2C0EAFF0E0EEB502208DC |
:060DF00001E1000C010C02 |
:0A0DF600D9CFE6FFE1CFD9FFE652A6 |
:100E0000FD0EDBCFE9FFFE0EDBCFEAFF0A0EE9267F |
:100E1000000EEA22EF6AFD0EDBCFE9FFFE0EDBCF0C |
:100E2000EAFF0B0EE926000EEA22EF6ADF6A020EE5 |
:100E3000DF5C11E2FD0EDBCFE9FFFE0EDBCFEAFF48 |
:100E4000DF50050DE950F324E96EEA50F420EA6E14 |
:100E5000EF6ADF2AECD7E552E552E7CFD9FF12005F |
:100E60000001906B000E636F090E646F000E686FD7 |
:100E7000080E696F000E6F6F070E706F000E746FB3 |
:100E8000060E756F000E7B6F050E7C6F000E806F77 |
:100E9000040E816F000E876F030E886F000E8C6F3B |
:100EA000020E8D6F600EE66E000EE66EA4DFE55258 |
:100EB000E5526C0EE66E000EE66E9DDFE552E552E1 |
:100EC000780EE66E000EE66E96DFE552E552840E71 |
:100ED000E66E000EE66E8FDFE552E5521200D9CFC6 |
:100EE000E6FFE1CFD9FF050EE126FC0EDB50E66EF2 |
:100EF000D950030FE96EDACFEAFFE552E750EE6E04 |
:100F0000ED6AFD0EDBCFE9FFFE0EDBCFEAFF0A0E36 |
:100F1000E926000EEA22EFCFDFFFFD0EDBCFE9FF6F |
:100F2000FE0EDBCFEAFFE9CF12F0EACF13F0DF507D |
:100F3000050DE950F324106EEA50F420116E010EF5 |
:100F400010C0DBFF020E11C0DBFF010EDBCFE9FF9B |
:100F5000020EDBCFEAFFEF5002E0FF0E58D0010E89 |
:100F6000DBCFE9FF020EDBCFEAFFEE52FC0EDBCF58 |
:100F7000EFFF010EDBCFE9FF020EDBCFEAFFE92630 |
:100F8000000EEA22FB0EDBCFEFFF030EDBCFE6FF06 |
:100F9000040EDBCFE6FFF90EDBCFE6FFFA0EDBCF68 |
:100FA000E6FF010EDBCFE9FF020EDBCFEAFF030E07 |
:100FB000E926000EEA22EECFE6FFEFCFE6FF7AEC5D |
:100FC00017F0106E060EE15E1050FD0EDBCFE9FF4C |
:100FD000FE0EDBCFEAFF0A0EE926000EEA22EF281A |
:100FE000010BE66EFD0EDBCFE9FFFE0EDBCFEAFF65 |
:100FF0000A0EE926000EEA22E552E750EF6E010ED6 |
:10100000DBCFE9FF020EDBCFEAFF010EEF6E106EC1 |
:10101000050EE15C02E2E16AE552E16E1050E55234 |
:10102000E7CFD9FF1200D9CFE6FFE1CFD9FF050EF8 |
:10103000E126FD0EDBCFE9FFFE0EDBCFEAFF0B0E54 |
:10104000E926000EEA22EFCFDFFFFD0EDBCFE9FF3E |
:10105000FE0EDBCFEAFFE9CF12F0EACF13F0DF504C |
:10106000050DE950F324106EEA50F420116E010EC4 |
:1010700010C0DBFF020E11C0DBFF010EDBCFE9FF6A |
:10108000020EDBCFEAFFEF0401E07AD0010EDBCFE6 |
:10109000E9FF020EDBCFEAFFEE52EFCF10F0FC0EBD |
:1010A000DB50D880105402E2FD0E6BD0010EDBCF76 |
:1010B000E9FF020EDBCFEAFFEE52EF50E66ED950A9 |
:1010C000030FE96EDACFEAFFE552E750EE6EED6A04 |
:1010D000030EDBCFE6FF040EDBCFE6FF010EDBCF16 |
:1010E000E9FF020EDBCFEAFF030EE926000EEA223B |
:1010F000EECFE6FFEFCFE6FFF80EDBCFE6FFF90E0F |
:10110000DBCFE6FF7AEC17F0106E060EE15E1050B2 |
:10111000FD0EDBCFE9FFFE0EDBCFEAFF0B0EE9266B |
:10112000000EEA22EF28010BE66EFD0EDBCFE9FF91 |
:10113000FE0EDBCFEAFF0B0EE926000EEA22E55297 |
:10114000E750EF6E010EDBCFE9FF020EDBCFEAFFC7 |
:10115000E926000EEA22EF50E66EFA0EDBCFE9FF39 |
:10116000FB0EDBCFEAFFE552E750EF6E010EDBCF5F |
:10117000E9FF020EDBCFEAFFEF6A030EDB5001D07E |
:10118000FC0E106E050EE15C02E2E16AE552E16ED2 |
:101190001050E552E7CFD9FF1200D9CFE6FFE1CFDB |
:1011A000D9FF030EE126FD0EDBCFE9FFFE0EDBCFFC |
:1011B000EAFF0B0EE926000EEA22EFCFDFFFFD0E5D |
:1011C000DBCFE9FFFE0EDBCFEAFFDF50050DE95074 |
:1011D000F324106EEA50F420116E010E10C0DBFFF4 |
:1011E000020E11C0DBFF010EDBCFE9FF020EDBCFE9 |
:1011F000EAFFEF040BE1010EDBCFE9FF020EDBCFCC |
:10120000EAFFE926000EEA22EF5001D0000E106E30 |
:10121000030EE15C02E2E16AE552E16E1050E55234 |
:10122000E7CFD9FF1200D9CFE6FFE1CFD9FFFD0EFE |
:10123000DBCFE9FFFE0EDBCFEAFFE9CF10F0EACF0C |
:1012400011F0FD0EDBCFE9FFFE0EDBCFEAFF0B0E48 |
:10125000E926000EEA22EF50050D1050F324E96E46 |
:101260001150F420EA6EEF50E552E7CFD9FF12009B |
:10127000D38E03001200D9CFE6FFE1CFD9FFFB0EDA |
:10128000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF9C |
:10129000FE0EDBCFE6FF600EE66E000EE66E1FDE92 |
:1012A000106E060EE15E1050E552E7CFD9FF120036 |
:1012B000D9CFE6FFE1CFD9FFFA0EDBCFE6FFFB0E79 |
:1012C000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF5C |
:1012D000FE0EDBCFE6FF600EE66E000EE66EA3DECE |
:1012E000106E070EE15E1050E552E7CFD9FF1200F5 |
:1012F000600EE66E000EE66E50DFE552E55212001B |
:10130000D9CFE6FFE1CFD9FFFB0EDBCFE6FFFC0E26 |
:10131000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF09 |
:101320006C0EE66E000EE66EDADD106E060EE15E05 |
:101330001050E552E7CFD9FF1200D9CFE6FFE1CF39 |
:10134000D9FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E8C |
:10135000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFC9 |
:101360006C0EE66E000EE66E5EDE106E070EE15E3F |
:101370001050E552E7CFD9FF12006C0EE66E000E5A |
:10138000E66E0BDFE552E5521200D9CFE6FFE1CF62 |
:10139000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E39 |
:1013A000DBCFE6FFFE0EDBCFE6FF780EE66E000E2B |
:1013B000E66E95DD106E060EE15E1050E552E7CF49 |
:1013C000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCF6C |
:1013D000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EEC |
:1013E000DBCFE6FFFE0EDBCFE6FF780EE66E000EEB |
:1013F000E66E19DE106E070EE15E1050E552E7CF83 |
:10140000D9FF1200780EE66E000EE66EC6DEE552DB |
:10141000E5521200D9CFE6FFE1CFD9FFFB0EDBCFBB |
:10142000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E98 |
:10143000DBCFE6FF840EE66E000EE66E50DD106E2A |
:10144000060EE15E1050E552E7CFD9FF1200D9CF6A |
:10145000E6FFE1CFD9FFFA0EDBCFE6FFFB0EDBCFD5 |
:10146000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E58 |
:10147000DBCFE6FF840EE66E000EE66ED4DD106E66 |
:10148000070EE15E1050E552E7CFD9FF1200840E3F |
:10149000E66E000EE66E81DEE552E55212000001B6 |
:1014A000905101E1120075EC11F0F3CF10F0F4CF80 |
:1014B00011F0F350F41001E0120059EC11F0F3CFE9 |
:1014C00010F0F4CF11F0F350F41001E112006C0EA3 |
:1014D000E66E000EE66EA7DEE552E552000901E079 |
:1014E0001200600EE66E000EE66E9DDEE552E552DD |
:1014F000000901E0120038EF09F081EC11F0F3CFA0 |
:1015000010F0F4CF11F0F350F41001E112000001DB |
:10151000010E906F6C0EE66E000EE66E84DEE552F4 |
:10152000E552000909E1600EE66E000EE66E7BDE14 |
:10153000E552E552000903E00001906B12000A0E2B |
:0A154000E66EDBEC18F0E552E5D78B |
:06154A00D9CFE6FFE1CF5E |
:10155000D9FF3B0EE126230EDB6A240EDB6A250E43 |
:10156000DB6A260EDB6A9B8C8F0ED3147009D36E58 |
:10157000FC0ED3140009D36E0F0148691F0E496F8A |
:1015800062EC16F0D9CFE6FFDACFE6FF8BEC0DF078 |
:10159000E552E552D950090FE66E000EDA20E66EEC |
:1015A00028EC00F0E552E552D950190FE66E000E16 |
:1015B000DA20E66EA0EC0FF0E552E55230EC07F0D1 |
:1015C000A6EC14F062EC12F024EC14F02AEC16F005 |
:1015D00055EC11F04AEC11F0AAEC00F062EC13F0BB |
:1015E000E66872EC18F0E55253EC16F07DEC0AF068 |
:1015F000000EE66E0A0EE66ED950220FE66E000E61 |
:10160000DA20E66EE6689DEC09F0106E050EE15EEC |
:101610001050E76E210EE7CFDBFFDBCF10F0103468 |
:1016200021E3210EDB50FC08000EE66E0A0EE66E8A |
:10163000D950220FE66E000EDA20E66EE66858EC0E |
:1016400009F0106E050EE15E1050E76E210EE7CF37 |
:10165000DBFFDBCF10F0103401E281D1210EDB5033 |
:10166000FC08C4D7220EDB50440A01E148D1070A26 |
:1016700001E13BD1010A01E135D1030A01E12FD19A |
:10168000010A01E129D17F0A01E123D1010A01E127 |
:101690001DD1030A01E1D7D0010A01E1BBD0120A32 |
:1016A000A5E0030A01E182D0010AA0E0070A9EE05A |
:1016B000020A13E0010A02E0360A98D7230EDB6A19 |
:1016C000210EDB50F36E230EDBCFF4FFF350F45CFE |
:1016D00001E38CD7230EDB2AF3D7230EDB6A210E1E |
:1016E000DB04F36E230EDBCFF4FFF350F45C03E274 |
:1016F000230EDB2AF4D70A010051090A01E176D74B |
:10170000010A01E173D70F0A01E170D7010A01E173 |
:101710006DD7020A19E0060A01E068D7010EF36EE0 |
:10172000210EF3CFDBFFD9501D0FE96EDACFEAFFB0 |
:10173000FF0ED880EE54000EED5402E2006929D06D |
:101740001D0EDBCF00FA25D0D9501D0FE96EDACF80 |
:10175000EAFFFF0ED880EE54000EED5408E2210E91 |
:10176000DB68000EE66E0A0EE66EE6680DD01D0E12 |
:10177000DB50E76E210EE7CFDBFF000EE66E0A0EB0 |
:10178000E66E1D0EDBCFE6FFBEEC10F0E552E55233 |
:10179000E552000EE66E0A0EE66E2A0EE66E210E89 |
:1017A000DBCFE6FF0AEC0AF0E55231D0230EDB6A0C |
:1017B000210EDB50F36E230EDBCFF4FFF350F45C0D |
:1017C00003E2230EDB2AF4D735EC11F0F3CF10F04F |
:1017D000F4CF11F0070EF35C000EF45801E206D7C7 |
:1017E000250EDB0402E10A0E06D0250EDB500208AE |
:1017F00001E0FCD60B0EE66ED0EC0FF0E552000EC9 |
:10180000E66E0A0EE66E060EE66E36EC10F0E55257 |
:10181000E5525AD0D950270FE96EDACFEAFF000E11 |
:10182000EE6E0A0EED6E230EDB6A210EDB50FB0F0F |
:10183000F36E230EDBCFF4FFF350F45C01E3D6D656 |
:10184000230EDB2AF2D7D950290FE96EDACFEAFF4F |
:10185000000EEE6E0A0EED6E230EDB6A210EDB50DB |
:10186000F40FF36E230EDBCFF4FFF350F45C03E2CE |
:10187000230EDB2AF3D7290EDBCFE9FF2A0EDBCFBD |
:10188000EAFF0C0EE926000EEA22E9CF10F0EACFBB |
:1018900011F0E9CFE6FFEACFE6FF210EDB50F40FAF |
:1018A000E66E36EC10F0E552E552E552290EDBCF3C |
:1018B000E9FF2A0EDBCFEAFF0C0EE926000EEA2232 |
:1018C000EF50E66EADEC12F0E55290D6D9502B0FEA |
:1018D0000ED0D9502D0F0BD0D9502F0F08D0D95082 |
:1018E000310F05D0D950330F02D0D950350FE96EE2 |
:1018F000DACFEAFF000EEE6E0A0EED6E77D6D95003 |
:10190000370FE96EDACFEAFF000EEE6E0A0EED6ECB |
:10191000370EDBCFE9FF380EDBCFEAFFEE52EF5098 |
:10192000110A01E163D6160A01E160D6010A01E15C |
:101930005DD6050A01E15AD6010A09E0030A01E170 |
:1019400055D6010A01E052D6260EDB6A4FD6010EAB |
:10195000F36E260EF3CFDBFF60EC16F047D6220EB7 |
:10196000DB500B0A31E0010A2CE05A0A01E13ED6B5 |
:101970001D0A24E0010A1FE0070A20E0010A1BE01B |
:10198000030A16E0010A0FE00F0A08E0010A01E06D |
:10199000B3D0D5EC18F0F7EC14F028D600EC15F025 |
:1019A000250EDB6A0BD0D5EC18F017EC15F01ED61F |
:1019B0001EEC15F003D0D5EC18F018D6D4EC14F0CA |
:1019C00015D6CAEC18F012D6D950390FE96EDACF15 |
:1019D000EAFF000EEE6E0A0EED6E390EDBCFE9FF68 |
:1019E0003A0EDBCFEAFF100EEF6E390EDBCFE9FFC8 |
:1019F0003A0EDBCFEAFFEE52EF6A390EDBCFE9FF9A |
:101A00003A0EDBCFEAFF020EE926000EEA22EE6A6A |
:101A1000EE6AEE6AEE6A390EDBCFE9FF3A0EDBCFF3 |
:101A2000EAFF020EE926000EEA22040EE926000E65 |
:101A3000EA22EE6AEE6AEE6AEE6A390EDBCFE9FF61 |
:101A40003A0EDBCFEAFF0A0EE926000EEA22EE6A22 |
:101A5000ED6A390EDBCFE9FF3A0EDBCFEAFF0C0E61 |
:101A6000E926000EEA22EF6A390EDBCFE9FF3A0ED3 |
:101A7000DBCFEAFF0D0EE926000EEA22010EEF6E23 |
:101A8000390EDBCFE9FF3A0EDBCFEAFF0E0EE92677 |
:101A9000000EEA22240EDBCFEFFFDBCFE6FFADEC3A |
:101AA00012F0E552240EDB2ADB50640802E1240E1A |
:101AB000DB6A0F0EF36E210EF3CFDBFFDBCFE6FF09 |
:101AC000000EE66E0A0EE66E0EEC0FF0E552E552E1 |
:101AD000E552250EDB50020807E0250EDB0404E189 |
:101AE000DDEC13F0020E03D0B3EC13F0010EF36E35 |
:101AF000250EF3CFDBFF7AD5230EDB6A210EDB50F8 |
:101B0000F36E230EDBCFF4FFF350F45C01E36ED5EC |
:061B1000230EDB2AF3D7CF |
:0A1B1600D9CFE6FFE1CFD9FF93809D |
:101B20009392949A8A908A928B9AFD0EDBCF9BF0C7 |
:101B3000FE0EDBCF9CF09BC0E9FF9CC0EAFF050EC8 |
:101B4000E926000EEA22EF6A9BC0E9FF9CC0EAFF8B |
:101B5000060EE926000EEA22EF6A9BC0E9FF9CC050 |
:101B6000EAFF070EE926000EEA220A0EEF6E9BC07E |
:101B7000E9FF9CC0EAFF030EE926000EEA22000EF0 |
:101B8000EE6E010EED6E9BC0E9FF9CC0EAFF030EF6 |
:101B9000E926000EEA22EECF9DF0EDCF9EF0E55251 |
:101BA000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0E74 |
:101BB000DB507E0823E19BC0E9FF9CC0EAFF050ED5 |
:101BC000E926000EEA22EF6A9BC0E9FF9CC0EAFF0B |
:101BD000060EE926000EEA22EF6A9BC0E9FF9CC0D0 |
:101BE000EAFF7E0EEF6E9BC0E9FF9CC0EAFF070E86 |
:101BF000E926000EEA220B0EEF6EA4D09BC0E9FF8F |
:101C00009CC0EAFF070EEB500F0A01E181D0010AE8 |
:101C10002EE0020A1AE0070A02E0010A93D09BC0F4 |
:101C2000E9FF9CC0EAFFEE52010EE926000EEA220F |
:101C3000FE0EDBCFEFFF9BC0E9FF9CC0EAFF070E63 |
:101C4000E926000EEA220C0E7CD09BC0E9FF9CC066 |
:101C5000EAFFEE52FE0EDBCFEFFF9BC0E9FF9CC018 |
:101C6000EAFF070EE926000EEA220E0E6AD09BC09C |
:101C7000E9FF9CC0EAFF050EEB50106EEE52EECF6E |
:101C800011F0EFCF12F01150105C000E125423E24D |
:101C90009BC0E9FF9CC0EAFF050EEB500001EA6A19 |
:101CA0009D25E96E9E51EA22FE0EDBCFEFFF9BC021 |
:101CB000E9FF9CC0EAFF060EE926000EEA22FE0EAE |
:101CC000DB50EF269BC0E9FF9CC0EAFF050EE9262A |
:101CD000000EEA22EF2A9BC0E9FF9CC0EAFF050E36 |
:101CE000EB50106E116AEE52EECF12F0EFCF13F000 |
:101CF0001250101827E11350111824E19BC0E9FF7E |
:101D00009CC0EAFF070EE926000EEA220F0E19D04A |
:101D10009BC0E9FF9CC0EAFF060EE926000EEA22FE |
:101D2000EF28E86C106EFE0EDB50105C01E10ED85F |
:101D30009BC0E9FF9CC0EAFF070EE926000EEA22DD |
:101D40000A0EEF6EE552E7CFD9FF1200D9CFE6FFBA |
:101D5000E1CFD9FFE6529DC0E9FF9EC0EAFFEF50F8 |
:101D60008A0A40E01F0A38E0340A30E0360A28E0E8 |
:101D7000060A20E0030A18E0190A10E01B0A08E02E |
:101D8000180A47E19DC0E6FF9EC0E6FF3C0E2FD03B |
:101D90009DC0E6FF9EC0E6FF3D0E29D09DC0E6FF38 |
:101DA0009EC0E6FF3E0E23D09DC0E6FF9EC0E6FF2C |
:101DB0003F0E1DD09DC0E6FF9EC0E6FF400E17D02F |
:101DC0009DC0E6FF9EC0E6FF410E11D09DC0E6FF1C |
:101DD0009EC0E6FF420E0BD09DC0E6FF9EC0E6FF10 |
:101DE000430E05D09DC0E6FF9EC0E6FF440EE66EA2 |
:101DF0009BC0E9FF9CC0EAFFEE52EF50E66E80EC1C |
:101E000009F0E552E552E552E552DF6EDFCF10F002 |
:101E10001034E552E552E7CFD9FF1200D9CFE6FFE3 |
:101E2000E1CFD9FF020EE126010EDB6A7E0EE66EDF |
:101E300089EC18F0E552A850020BFDE06BD80009C0 |
:101E4000FAE1E66A89EC18F0E552A850020BFDE0D1 |
:101E500061D80009FAE1FC0EDBCFE6FF89EC18F04F |
:101E6000E552A850020BFDE055D80009FAE1DF6AFF |
:101E7000FC0EDB50DF5C2DE2DF50E76EFD0EDBCFAA |
:101E8000E9FFFE0EDBCFEAFFE750E926000EEA226B |
:101E9000EF50E66E89EC18F0E552DF50E76EFD0E6C |
:101EA000DBCFE9FFFE0EDBCFEAFFE750E926000EAD |
:101EB000EA22010EDBCFE7FFEF50E726010EE7CF66 |
:101EC000DBFFA850020BFDE025D80009FAE1DF2A6C |
:101ED000CFD7010EDB28E86CE66E89EC18F0E552EE |
:101EE000A8A2FED7020EE15C02E2E16AE552E16ED1 |
:101EF000E552E7CFD9FF1200D9CFE6FFE1CFD9FFF6 |
:101F0000FE0EDB5002E08A8201D08A92E552E7CFD2 |
:101F1000D9FF1200D9CFE6FFE1CFD9FFE6528150B9 |
:101F2000010BDF6EDF5002E0010E01D0000EE55222 |
:101F3000E552E7CFD9FF12008B8A12008B9A12006C |
:101F4000D9CFE6FFE1CFD9FFFD0EDBCFA3F0FE0E28 |
:101F5000DBCFA4F0A3C0E9FFA4C0EAFFEE6AED6AFC |
:101F6000A3C0E9FFA4C0EAFF020EEB6A030EEB6A0E |
:101F7000A3C0E9FFA4C0EAFF040EEB6A050EEB6AFA |
:101F8000A3C0E9FFA4C0EAFF060EE926000EEA227C |
:101F9000000EEE6E0C0EED6EE552E7CFD9FF12008B |
:101FA000D9CFE6FFE1CFD9FFA3C0E9FFA4C0EAFF84 |
:101FB000040EE926000EEA22EECF10F0EFCF11F06A |
:101FC000D8801056020E11561050111002E1FF0E6B |
:101FD00049D0A3C0E9FFA4C0EAFF040EE926000E21 |
:101FE000EA22EE2AED22A3C0E9FFA4C0EAFF060E12 |
:101FF000E926000EEA22EECF10F0EFCF11F0A3C0D9 |
:10200000E9FFA4C0EAFF020EE926000EEA22105002 |
:10201000EE24E76E1150EE20EA6EE7CFE9FFFE0EE8 |
:10202000DBCFEFFFA3C0E9FFA4C0EAFF020EE92661 |
:10203000000EEA22EE2AEF22A3C0E9FFA4C0EAFFC5 |
:10204000020EE926000EEA22EE500BE1020EED1818 |
:1020500008E1A3C0E9FFA4C0EAFF020EEB6A030E89 |
:10206000EB6A000EE552E7CFD9FF1200D9CFE6FFA9 |
:10207000E1CFD9FFE652FE0EDBCF10F0A3C0E9FF9F |
:10208000A4C0EAFF040EE926000EEA22EECF11F00A |
:10209000EFCF12F0D8801156020E12561050115C7C |
:1020A000000E125802E2FF0E64D0FE0EDB50106EDE |
:1020B000116AA3C0E9FFA4C0EAFF040EE926000EDE |
:1020C000EA221050EE261150ED22DF6AFE0EDB50A0 |
:1020D000DF5C4EE2DF50E76EFC0EDBCFE9FFFD0E6A |
:1020E000DBCFEAFFE750E926000EEA22EF50E66E6A |
:1020F000A3C0E9FFA4C0EAFF060EE926000EEA220B |
:10210000EECF10F0EFCF11F0A3C0E9FFA4C0EAFFBB |
:10211000020EE926000EEA221050EE24E76E11505E |
:10212000EE20EA6EE7CFE9FFE552E750EF6EA3C07D |
:10213000E9FFA4C0EAFF020EE926000EEA22EE2A19 |
:10214000EF22A3C0E9FFA4C0EAFF020EE926000EB9 |
:10215000EA22EE500BE1020EED1808E1A3C0E9FF00 |
:10216000A4C0EAFF020EEB6A030EEB6ADF2AAED7C9 |
:10217000000EE552E552E7CFD9FF1200D9CFE6FFB6 |
:10218000E1CFD9FFE652FE0EDBCF10F0A3C0E9FF8E |
:10219000A4C0EAFF040EE926000EEA22EECF11F0F9 |
:1021A000EFCF12F01050115C000E125802E2FF0E39 |
:1021B00057D0FE0EDB50106E116AA3C0E9FFA4C019 |
:1021C000EAFF040EE926000EEA221050EE5E1150DE |
:1021D000ED5ADF6AFE0EDB50DF5C41E2A3C0E9FF8F |
:1021E000A4C0EAFF060EE926000EEA22EECF10F0A8 |
:1021F000EFCF11F0A3C0E9FFA4C0EAFF1050EE2416 |
:10220000E76E1150EE20EA6EE7CFE9FFEF50E66E81 |
:10221000DF50E76EFC0EDBCFE9FFFD0EDBCFEAFF00 |
:10222000E750E926000EEA22E552E750EF6EA3C020 |
:10223000E9FFA4C0EAFFEE2A000EEF22A3C0E9FFE7 |
:10224000A4C0EAFFEE5009E1020EED1806E1A3C0BA |
:10225000E9FFA4C0EAFFEE6AED6ADF2ABBD7000EF1 |
:10226000E552E552E7CFD9FF1200A3C0E9FFA4C0B1 |
:10227000EAFF040EE926000EEA22EECF10F0EFCFBF |
:1022800011F0D8801056020E115610C0F3FF11C085 |
:04229000F4FF120045 |
:0C229400A58A9F86F1949F90A292F19081 |
:1022A000F09C9D86F286F0861200D08EF28EF28C23 |
:1022B0001200F250800B800A01E0010E106E116ACC |
:1022C00010BE116810C0F3FF11C0F4FF1200F250ED |
:1022D000400B400A01E0010E106E116A10BE116839 |
:1022E00010C0F3FF11C0F4FF1200F2BC04D0E1DF14 |
:1022F000F350F41002E0F36A02D0010EF36EF46AB8 |
:102300001200F3DFF3CF10F0F4CF11F0F350F4101C |
:1023100007E1CFDFF350F41003E1010EF36E01D0BB |
:10232000F36AF46A1200DACFE4FFE2CFDAFFE9CF12 |
:10233000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CF06 |
:10234000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACFEF |
:10235000E4FFFBCFE4FF00EE00F0100EE80403E31F |
:10236000EECFE4FFFBD700EE10F0040EE80403E329 |
:10237000EECFE4FFFBD7E652A4AA03D07BEC16F025 |
:10238000A49A9EA603D0A9EC01F09E96E55200EE19 |
:1023900013F0040EE80403E3E5CFEDFFFBD700EEF6 |
:1023A0000FF0100EE80403E3E5CFEDFFFBD7E5CF18 |
:1023B000FBFFE5CFFAFFE5CFF4FFE5CFF3FFE5CF75 |
:1023C000F5FFE5CFF8FFE5CFF7FFE5CFF6FFE5CF67 |
:1023D000EAFFE5CFE9FFE5CFDAFF1100D8CFE4FF50 |
:1023E000E0CFE4FFE46EDACFE4FFE2CFDAFFE9CF3B |
:1023F000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CF46 |
:10240000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACF2E |
:10241000E4FFFBCFE4FF00EE00F0100EE80403E35E |
:10242000EECFE4FFFBD700EE10F0040EE80403E368 |
:10243000EECFE4FFFBD7E652F0A003D00EEC14F091 |
:10244000F090F2A003D035EC14F0F290F2A403D097 |
:10245000C6EC14F0F2949EA003D0DFEC14F09E9032 |
:10246000A1A203D002EC15F0A192E55200EE13F008 |
:10247000040EE80403E3E5CFEDFFFBD700EE0FF019 |
:10248000100EE80403E3E5CFEDFFFBD7E5CFFBFF3C |
:10249000E5CFFAFFE5CFF4FFE5CFF3FFE5CFF5FF9A |
:1024A000E5CFF8FFE5CFF7FFE5CFF6FFE5CFEAFF91 |
:1024B000E5CFE9FFE5CFDAFFE550E5CFE0FFE5CF77 |
:0424C000D8FF100031 |
:0C24C40092909292929492968990899244 |
:1024D0008994899600019F6BA06BE66A0AD8E55241 |
:1024E000E66A07D8E552120089820000899200004E |
:1024F0001200D9CFE6FFE1CFD9FF020EE126899085 |
:10250000DE6ADD6ADECF10F0DDCF11F0D890115019 |
:1025100004E6080E105C000E115814E2FE0EDB50AB |
:10252000010BE8B08984E8A08994DEDFFE0EDBCFE2 |
:10253000F3FFF390F342F3CFDBFFDF2A010EE2E378 |
:10254000DB2AE0D78980020EE15C02E2E16AE55213 |
:10255000E16EE552E7CFD9FF1200D9CFE6FFE1CF18 |
:10256000D9FFE652DF6A00019F6BA06B0A0E106E66 |
:102570000C6EFE0EDBCF07F009EC19F00350DF6E96 |
:10258000DF50090A34E0010A2DE00F0A26E0010AB3 |
:1025900022E0030A1EE0010A17E0070A13E0010A1D |
:1025A0000CE0030A07E0010A27E1700E00019F1307 |
:1025B0000D0E21D000019F8D13D0600E00019F13DE |
:1025C0000E0E19D0600E14D0500E00019F13030E92 |
:1025D00012D0300E0DD0300E06D0700E00019F13B9 |
:1025E000A0810AD0700E00019F130F0E04D0700E50 |
:1025F00000019F13070EA0130A0E106E0C6EFE0E44 |
:10260000DBCF07F009EC19F00750DF6EDF50090A45 |
:102610002EE0010A27E00F0A20E0010A1CE0030A6D |
:1026200018E0010A14E0070A10E0010A09E0030AB1 |
:1026300004E0010A21E10D0E16D000019F8710D0A1 |
:102640000E0E00019F13C00E16D00E0E11D00B0EF1 |
:1026500005D0070E0DD0070E06D00D0E00019F13FA |
:10266000A08B0AD00F0E00019F13E00E04D00F0EB6 |
:1026700000019F13600EA01300019F51E66E39DF29 |
:10268000E552000E00019F15106EFF0EA015116E91 |
:10269000106E116AE850E66E2CDFE552E552E55205 |
:1026A000E7CFD9FF120000019F51E66E22DFE5520D |
:1026B0000001FF0EA015106E116AE850E66E19DFDA |
:0426C000E5521200CD |
:0C26C40029D865EF13F0D9CFE6FFE1CF75 |
:1026D000D9FF020EE126200EDF6EDE52270EDD6EE0 |
:1026E000D9CFE6FFDACFE6FF020EE66E180EE66EF1 |
:1026F000C2EC00F0E552E552E552E552F1EC06F08D |
:102700000009FCE1020EE15C02E2E16AE552E16EE1 |
:10271000E552E7CFD9FF1200D9CFE6FFE1CFD9FFCD |
:10272000020EE126200EDF6EDE520F0EDD6ED9CFD7 |
:10273000E6FFDACFE6FF020EE66E690EE66EC2EC49 |
:1027400000F0E552E552E552E552F1EC06F00009E1 |
:10275000FCE1020EE15C02E2E16AE552E16EE55263 |
:10276000E7CFD9FF1200D9CFE6FFE1CFD9FFE6527C |
:10277000A80EDF6ED9CFE6FFDACFE6FF010EE66ED8 |
:10278000180EE66EC2EC00F0E552E552E552E55255 |
:10279000F1EC06F00009FCE1060EE66E180EE66E9E |
:1027A00044EC01F0E552E552F1EC06F00009FCE1E1 |
:1027B000E552E552E7CFD9FF1200D9CFE6FFE1CFCE |
:1027C000D9FFE652A80EDF6ED9CFE6FFDACFE6FFDB |
:1027D000010EE66E690EE66EC2EC00F0E552E552BF |
:1027E000E552E552F1EC06F00009FCE1060EE66E5A |
:1027F000690EE66E44EC01F0E552E552F1EC06F0AC |
:0E2800000009FCE1E552E552E7CFD9FF1200D6 |
:02280E00928AAC |
:1028100094940E01020EE76FF19A120053EC16F039 |
:10282000010EE66E17EC19F0E55260EC16F0000EA2 |
:10283000E66EE66A500EE66EE66A3BEC09F0E5529B |
:10284000E552E552E552120003010F0EFF6FF19EB3 |
:102850009388938A938C938E8188818A818C818ED0 |
:102860008A888A8A8A8C8A8E1200D9CFE6FFE1CFC5 |
:10287000D9FFE652F00E8114E8380F0BDF6EDF50FF |
:102880000301FF19010B13E0FFA105D0000EE66E56 |
:10289000E66A460E04D0000EE66EE66A470EE66E65 |
:1028A000E66A3BEC09F0E552E552E552E552DF50AD |
:1028B0000301FF19020B13E0FFA305D0000EE66E23 |
:1028C000E66A480E04D0000EE66EE66A490EE66E31 |
:1028D000E66A3BEC09F0E552E552E552E552DF507D |
:1028E0000301FF19040B13E0FFA505D0000EE66EEF |
:1028F000E66A4A0E04D0000EE66EE66A4B0EE66EFD |
:10290000E66A3BEC09F0E552E552E552E552DF504C |
:102910000301FF19080B13E0FFA705D0000EE66EB8 |
:10292000E66A4C0E04D0000EE66EE66A4D0EE66EC8 |
:10293000E66A3BEC09F0E552E552E552E552DFCF9D |
:0C294000FFF3E552E552E7CFD9FF12008B |
:04294C00970EE66E8E |
:102950003BEC18F0E552D59E7B0EE66E9B0EE66EC4 |
:10296000A5EC17F0E552E552CD900201FF6B050E84 |
:10297000E66E57EC18F0E5527F0EE66E830EE66EBB |
:1029800022EC17F0E552E5527990120016D8000EAD |
:10299000E66EE66A0A0EE66EE66A3BEC09F0E55280 |
:1029A000E552E552E5521200000EE66EE66A1FECB3 |
:1029B00018F0E552E552D58E1200D59E12000201A4 |
:1029C000FF2B030E106E0C6EFFC207F009EC19F01E |
:1029D00003500CE1000EE66EE66A0B0EE66EE66A48 |
:1029E0003BEC09F0E552E552E552E5521200000ECB |
:1029F000E66EE66A03EC18F0E552E552CD8012006F |
:102A0000CD9012000401FF5106E138EC16F00401EC |
:102A1000010EFF6F04D051EC16F00401FF6BE66A63 |
:102A2000EA0EE66EE7EC17F0E552E5521200798007 |
:102A300038EC16F00401010EFF6F1200799051EC92 |
:082A400016F00401FF6B120007 |
:082A48001E0EF66E000EF76E83 |
:102A5000000EF86E00010900F550966F0900F55060 |
:102A6000976F03E1966701D03DD00900F550916F53 |
:102A70000900F550926F0900F550936F09000900A5 |
:102A8000F550E96E0900F550EA6E090009000900E9 |
:102A9000F550946F0900F550956F09000900F6CFC5 |
:102AA00098F0F7CF99F0F8CF9AF091C0F6FF92C066 |
:102AB000F7FF93C0F8FF0001945302E1955307E03C |
:102AC0000900F550EE6E9407F8E29507F9D798C023 |
:102AD000F6FF99C0F7FF9AC0F8FF00019607000EB5 |
:062AE000975BBFD7120056 |
:0A2AE600D9CFE6FFDACFE6FFE1CF1B |
:102AF000D9FFE2CFDAFFC26AC16AFC0EDB50400D9B |
:102B0000F350C00B106EFC0EDB407F0B3C0B101023 |
:102B1000C26EFD0EDB50040DF350380B116EFD0E2E |
:102B2000DB380F0B070B106EFD0EDB50800B101007 |
:102B30001110C16EFA0EDBCF10F0FB0EDBCF11F0DF |
:102B400011C010F0116A10C048FFFA0EDBCF49FF28 |
:102B5000FC0EDBAE03D09E9C9D8CF28CC280E552B5 |
:0A2B6000E5CFDAFFE7CFD9FF12003E |
:062B6A00D9CFE6FFDACF2F |
:102B7000E6FFE1CFD9FFE2CFDAFFA86A9C6AFD0E3B |
:102B8000DBB0A888DBA202D0A88C9C8CDBB4A88E1A |
:102B9000DBA602D09C8801D09C8ADBA802D0A88446 |
:102BA00001D0A894DBBA9C86DBAC02D0A38A01D00A |
:102BB000A39ADBAE02D0A38801D0A398FB0EDB5012 |
:102BC000AB6EFC0EDBCF11F011C010F0116A10508B |
:102BD0007D6EA88A9C8EE552E5CFDAFFE7CFD9FF5C |
:022BE0001200E1 |
:0E2BE200D9CFE6FFDACFE6FFE1CFD9FFE2CF91 |
:102BF000DAFFAD6AAC6AFD0EDBB0AD88DBA202D0B5 |
:102C0000AD8CAC8CDBB4AD8EDBA602D0AC8801D031 |
:102C1000AC8ADBB8AD84DBBAAC86DBAC02D09D8A73 |
:102C200001D09D9ADBAE02D09D8801D09D98FB0E0D |
:102C3000DB50B06EFC0EDBCF11F011C010F0116A4A |
:102C400010507F6EAD8AAC8EE552E5CFDAFFE7CF4C |
:042C5000D9FF120096 |
:0C2C54009490949294948B908B928B94AB |
:102C60000E010E0ED16F0F0ED26F120ED36F120027 |
:102C70003D0EE66EB5EC18F0E552800EE66EE66AA3 |
:102C8000C6EC16F0E552E5529EA2FED7FC0EE66EAB |
:102C90003F0EE66E4EEC17F0E552E552BF80BF8264 |
:102CA00012002BEF19F0E668A0EC18F0E552800E48 |
:102CB000E66EE66A97EC16F0E552E552B98012002E |
:042CC0000AEF00F027 |
:0C2CC400400EE66EE66A3C0EE66EF1EC97 |
:102CD00015F0E552E552E5520E01050EF66FCC6F88 |
:102CE000400EE66EE66A7C0EE66EB5EC15F0E55237 |
:102CF000E552E5521200A4AA06D0C8EC17F0E66E21 |
:102D0000D3EC0DF0E5520101FFA710D0AC98AC88D0 |
:102D10009C989C88000EE66EE66A1E0EE66EE66AD9 |
:0E2D200080EC09F0E552E552E552E552120052 |
:022D2E00D9CFFB |
:102D3000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652D6 |
:102D4000E652FC0EDBCF10F0FD0EDBCF11F0060ECD |
:102D5000D89010361136E804FBE110C0DEFF11C038 |
:102D6000DDFF010EDB50B56EDF50E840E8403F0B61 |
:102D7000300B106ECF0EB4141010B46EE552E55245 |
:0C2D8000E552E5CFDAFFE7CFD9FF1200E3 |
:042D8C00D9CFE6FFB6 |
:102D9000DACFE6FFE1CFD9FFE2CFDAFFE652E65223 |
:102DA000FC0EDBCF10F0FD0EDBCF11F0060ED8903D |
:102DB00010361136E804FBE110C0DEFF11C0DDFF64 |
:102DC000010EDB50BB6EDF50E840E8403F0B300B9C |
:102DD000106ECF0EBA141010BA6EE552E552E552DD |
:0A2DE000E5CFDAFFE7CFD9FF1200BC |
:062DEA009280FE0EE66E71 |
:102DF0001F0EE66E840EE66EE10EE66E73EC15F0C5 |
:102E0000E552E552E552E55212002DEF19F007EFB9 |
:102E100000F0D9CFE6FFE1CFD9FF030EE12622EC87 |
:102E200019F0F3CFDEFFF4CFDDFF020EF36EDB6EA1 |
:102E3000030EE15C02E2E16AE552E16EE552E7CFA2 |
:042E4000D9FF1200A4 |
:0C2E4400D9CFE6FFDACFE6FFE1CFD9FFDF |
:102E5000E2CFDAFFFC0EDB50F30B976EFD0EDB507A |
:102E60007F0BE824796EFD0EDBB4CD867B6A7A6A2F |
:102E7000A192A492DBAE02D0A08201D0A092FC0E5F |
:102E8000DBA402D0A38201D0A39297BE978679805B |
:0C2E9000E552E5CFDAFFE7CFD9FF1200D2 |
:042E9C00D9CFE6FFA5 |
:102EA000DACFE6FFE1CFD9FFE2CFDAFFFD0EDB801C |
:102EB000DB82DB84DB86DB88DB8AFC0EDB84DB8663 |
:102EC000DB88DB8ADB8CDB8EFD0EDBCFE6FFC00E02 |
:102ED000BA10E552E714BA6EFC0EDBCFE6FF0F0E18 |
:102EE000BA10E552E714BA6EE552E5CFDAFFE7CF44 |
:042EF000D9FF1200F4 |
:0C2EF400D9CFE6FFDACFE6FFFA0EE3CFFD |
:102F0000D9FFFB0EE3CFDAFFFC0EE3CFE9FFFD0EA6 |
:102F1000E3CFEAFFE9CFF3FFEACFF4FFF80EE35087 |
:102F200003E1F90EE35008E0F80EE30602E2F90EC1 |
:102F3000E306DECFEEFFF2D7FF0EE3CFDAFFE55276 |
:0A2F4000FF0EE3CFD9FFE5521200A7 |
:062F4A00D9CFE6FFDACF4B |
:102F5000E6FFE1CFD9FFE2CFDAFFFC0EDB50F30B47 |
:102F60009A6EFD0EDB507F0BE824CD6ECF6ACE6AE1 |
:102F70009E90FD0EDBAE02D09D8001D09D909ABE4A |
:102F80009A86CD80E552E5CFDAFFE7CFD9FF120070 |
:102F9000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF04 |
:102FA000E652F20E0101FF179CAC03D0FF919CB0DA |
:102FB000FF819CB4FF859CB2FF87AA50DF6EDF5073 |
:0E2FC000E552E552E5CFDAFFE7CFD9FF120068 |
:022FCE00D9CF59 |
:102FD000E6FFDACFE6FFE1CFD9FFE2CFDAFFE65234 |
:102FE000E652FC0EDBCFDEFFDBCFDDFF010EDB5058 |
:102FF0007B6EDF507A6EE552E552E552E5CFDAFF9F |
:06300000E7CFD9FF12002A |
:0A300600D9CFE6FFDACFE6FFE1CFF5 |
:10301000D9FFE2CFDAFFE652E652FC0EDBCFDEFF4D |
:10302000DBCFDDFF010EDB50CF6EDF50CE6EE55201 |
:0E303000E552E552E5CFDAFFE7CFD9FF1200F7 |
:02303E00D9CFE8 |
:10304000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652C3 |
:10305000E652FC0EDBCFDEFFDBCFDDFF010EDB50E7 |
:10306000D76EDF50D66EE552E552E552E5CFDAFF76 |
:06307000E7CFD9FF1200BA |
:0A307600D9CFE6FFDACFE6FFE1CF85 |
:10308000D9FFE2CFDAFFFD0EDB507F0BD56ED76A9A |
:10309000D66AF294FD0EDBAE02D0F28A01D0F29A2B |
:0E30A000D58EE552E5CFDAFFE7CFD9FF12005B |
:0230AE00D9CF78 |
:1030B000E6FFDACFE6FFE1CFD9FFE2CFDAFFFD0E80 |
:1030C000DB50FB0BCA6ECC6A9E92FD0EDBAE02D0CB |
:1030D0009D8201D09D92CA84E552E5CFDAFFE7CF09 |
:0430E000D9FF120002 |
:0C30E400FF0EE350156EEF0E01D0F30E4E |
:1030F000E76EE72E79EF18F00C0E146EE76AE72EF4 |
:103100007FEF18F0142E7EEF18F0152E77EF18F0E1 |
:023110001200AB |
:0E311200D9CFE6FFDACFE6FFE1CFD9FFE2CF5B |
:10312000DAFFA8AC04D0A8900101FFB3A880FD0E7F |
:10313000DB50A96EE552E5CFDAFFE7CFD9FF1200E9 |
:10314000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF52 |
:103150000C0EB46ECA94FD0EDB50CB6ECA84E552E1 |
:0A316000E5CFDAFFE7CFD9FF120038 |
:06316A00D9CFE6FFDACF29 |
:10317000E6FFE1CFD9FFE2CFDAFF0C0EBA12CA9414 |
:10318000FD0EDB50CB6ECA84E552E5CFDAFFE7CF08 |
:04319000D9FF120051 |
:0C3194009CEC0FF0E66A79EC12F0E552BA |
:1031A000E66A79EC12F0E5521200DDEC14F09EECC8 |
:0631B0000FF053EF13F0D5 |
:0A31B600FF0EE350156E480E01D025 |
:1031C0004C0EE76EE72EFED7E76AE72EFED7152EE8 |
:0631D000F7D70000120019 |
:0A31D600C00EF36E00EE00F00E0EC6 |
:1031E00001D81200EA6002D0EE6AFCD7F350E96021 |
:0631F0001200EE6AFCD79C |
:0A31F6001EEE00F02EEE00F0F86A65 |
:103200000F9C24EC15F003EC00F0A5EC0AF0FBD7C2 |
:023210001200AA |
:0E321200036A080EE76ED890073603360C509C |
:0E322000035C02E3036E072AE72EF7D71200C5 |
:02322E00FF0E91 |
:10323000E350E84E1200000000D000D000D0E82E8D |
:04324000FAD71200A7 |
:0C324400C450136E126AC3501210F36ED7 |
:0632500013C0F4FF1200A0 |
:04325600BA6A12003E |
:04325A00C28212001A |
:01325E00006F |
:01325F00006E |
:01326000006D |
:01326100006C |
:01FFF800A068 |
:01FFFA00DD29 |
:01FFFD00F80B |
:00000001FF |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/i2c.c |
---|
0,0 → 1,452 |
#include "msg_queues.h" |
#include "maindefs.h" |
//#include <i2c.h> |
#include "i2c.h" |
#pragma udata i2c_data |
unsigned char i2c_buffer[MAXI2CBUF]; |
#pragma udata |
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->buffer = i2c_buffer; |
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 = 0x63; // Operate at 100KHz (40MHz) |
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 26J11/i2c.h |
---|
0,0 → 1,59 |
#ifndef __i2c_h |
#define __i2c_h |
#include "msg_queues.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; |
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; // 16 bytes overhead |
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 26J11/imu.c |
---|
0,0 → 1,42 |
#include "maindefs.h" |
#include "imu.h" |
#include "i2c.h" |
void imu_init() { |
imu_gyro_init(); |
imu_acc_init(); |
} |
void imu_acc_init() { |
unsigned char toSend[2]; |
toSend[0] = LSM303_CTRL_REG1_A; |
toSend[1] = 0x27; |
i2c_master_send(ACC_ADDRESS >> 1, 2, toSend); |
while(i2c_master_busy()); |
} |
void imu_gyro_init() { |
unsigned char toSend[2]; |
toSend[0] = L3G4200D_CTRL_REG1; |
toSend[1] = 0x0F; |
i2c_master_send(GYR_ADDRESS >> 1, 2, toSend); |
while(i2c_master_busy()); |
} |
void imu_read_acc() { |
unsigned char toSend[1]; |
toSend[0] = LSM303_OUT_X_L_A | 0x80; |
i2c_master_send(ACC_ADDRESS >> 1, 1, toSend); |
while(i2c_master_busy()); |
i2c_master_recv(ACC_ADDRESS >> 1, 6); |
while(i2c_master_busy()); |
} |
void imu_read_gyro() { |
unsigned char toSend[1]; |
toSend[0] = L3G4200D_OUT_X_L | 0x80; |
i2c_master_send(GYR_ADDRESS >> 1, 1, toSend); |
while(i2c_master_busy()); |
i2c_master_recv(GYR_ADDRESS >> 1, 6); |
while(i2c_master_busy()); |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/imu.h |
---|
0,0 → 1,29 |
#ifndef __imu_h |
#define __imu_h |
#define ACC_ADDRESS 0x30 |
#define LSM303_CTRL_REG1_A 0x20 |
#define LSM303_OUT_X_L_A 0x28 |
//#define LSM303_OUT_X_H_A 0X29 |
//#define LSM303_OUT_Y_L_A 0x2A |
//#define LSM303_OUT_Y_H_A 0X2B |
//#define LSM303_OUT_Z_L_A 0x2C |
//#define LSM303_OUT_Z_H_A 0X2D |
#define GYR_ADDRESS 0xD2 |
#define L3G4200D_CTRL_REG1 0x20 |
#define L3G4200D_OUT_X_L 0x28 |
//#define L3G4200D_OUT_X_H 0x29 |
//#define L3G4200D_OUT_Y_L 0x2A |
//#define L3G4200D_OUT_Y_H 0x2B |
//#define L3G4200D_OUT_Z_L 0x2C |
//#define L3G4200D_OUT_Z_H 0x2D |
void imu_init(void); |
void imu_acc_init(void); |
void imu_gyro_init(void); |
void imu_read_acc(void); |
void imu_read_gyro(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/interrupts.c |
---|
0,0 → 1,212 |
#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) |
// High priority interrupts |
IPR3bits.RC2IP = 1; // USART2 RX interrupt |
IPR1bits.SSPIP = 1; // I2C interrupt |
// Low priority interrupts |
// IPR1bits.RC1IP = 0; // USART1 RX interrupt |
INTCON2bits.TMR0IP = 0; // Timer0 interrupt |
IPR1bits.TMR1IP = 0; // Timer1 interrupt |
IPR2bits.TMR3IP = 0; // Timer3 interrupt |
// IPR1bits.ADIP = 0; // ADC interupt |
INTCON2bits.RBIP = 0; // Port B interrupt |
INTCON3bits.INT1IP = 0; // INT1 interrupt |
// Enable I2C interrupt |
PIE1bits.SSPIE = 1; |
// Enable Port B interrupt |
INTCONbits.RBIE = 1; |
// Enable interrupt for INT1 |
INTCON3bits.INT1IE = 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 = 1; |
} |
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 interrupt on USART2 RX |
if (PIR3bits.RC2IF) { |
DBG_PRINT_INT("INT: UART2 RX\r\n"); |
// Call the interrupt handler |
uart_recv_interrupt_handler(); |
// Clear the interrupt flag |
PIR3bits.RC2IF = 0; |
} |
// // Nofity the xbee to stop sending serial data |
// xbee_set_RTS(1); |
// Check to see if we have an I2C interrupt |
if (PIR1bits.SSPIF) { |
DBG_PRINT_INT("INT: I2C\r\n"); |
// Call the handler |
i2c_interrupt_handler(); |
// Clear the interrupt flag |
PIR1bits.SSPIF = 0; |
} |
// //Notify xbee to resume sending serial data |
// xbee_set_RTS(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 INT1 |
if (INTCON3bits.INT1IF) { |
DBG_PRINT_INT("INT: INT1\r\n"); |
int1_interrupt_handler(); |
INTCON3bits.INT1IF = 0; |
} |
// Check to see if we have an interrupt on any port B inputs <4:7> |
if (INTCONbits.RBIF) { |
DBG_PRINT_INT("INT: Port B\r\n"); |
port_b_int_interrupt_handler(); |
INTCONbits.RBIF = 0; |
} |
// Check to see if we have an interrupt on timer 0 |
if (INTCONbits.TMR0IF) { |
DBG_PRINT_INT("INT: Timer 0\r\n"); |
// Call the handler |
timer0_interrupt_handler(); |
// Clear this interrupt flag |
INTCONbits.TMR0IF = 0; |
} |
// Check to see if we have an interrupt on timer 1 |
if (PIR1bits.TMR1IF) { |
// Call the interrupt handler |
timer1_interrupt_handler(); |
// Clear the interrupt flag |
PIR1bits.TMR1IF = 0; |
} |
// Check to see if we have an interrupt on timer 3 |
if (PIR2bits.TMR3IF) { |
DBG_PRINT_INT("INT: Timer 3\r\n"); |
timer3_interrupt_handler(); |
PIR2bits.TMR3IF = 0; |
} |
// // Check to see if we have an interrupt on USART1 RX |
// if (PIR1bits.RC1IF) { |
// // Call the interrupt handler |
// uart_recv_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR1bits.RC1IF = 0; |
// } |
// // Check to see if we have an interrupt on ADC |
// if (PIR1bits.ADIF) { |
// // Call the interrupt handler |
// adc_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR1bits.ADIF = 0; |
// } |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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 26J11/led_driver.c |
---|
0,0 → 1,159 |
#include "maindefs.h" |
#include "led_driver.h" |
#include "delays.h" |
#include <spi.h> |
unsigned int led_last_value; |
#ifdef _SPI2_V1 |
/* Output Pins: |
* RA0 - LED Display Latch Enable (PPS) |
* RA1 - LED Display CLK (PPS) |
* RA2 - LED Display DIN (PPS) |
* RA3 - LED Display Output Enable (PPS) |
*/ |
#endif |
#ifdef _SPI2_V2 |
/* Output Pins: |
* RA0 - LED Display CLK (PPS) |
* RA1 - LED Display DIN (PPS) |
* RA2 - LED Display Latch Enable (PPS) |
* RA3 - LED Display Output Enable (PPS) |
*/ |
#endif |
void led_driver_init() { |
#ifdef _SPI2_V1 |
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 |
#endif |
#ifdef _SPI2_V2 |
RPOR0 = 10; // CLK |
RPOR1 = 9; // DATA |
OpenSPI2(SPI_FOSC_4, MODE_00, SMPMID); |
#endif |
led_last_value = 0; |
led_driver_data(0); |
led_driver_data(0); |
} |
#ifdef _SPI2_V1 |
void led_driver_clock() { |
LATAbits.LATA1 = 0x1; // Simple clock output toggle |
Nop(); |
LATAbits.LATA1 = 0x0; |
Nop(); |
} |
#endif |
void led_driver_data(char val) { |
#ifdef _SPI2_V1 |
int i; |
LATAbits.LATA0 = 0x0; // Set latch low to pause display |
for (i = 0; i < 8; i++) { |
LATAbits.LATA2 = val & 0x1; // Shift out bits |
led_driver_clock(); |
val >>= 1; |
} |
LATAbits.LATA0 = 0x1; // Set latch high to resume display |
#endif |
#ifdef _SPI2_V2 |
LATAbits.LATA0 = 0x0; |
WriteSPI2(val); |
LATAbits.LATA0 = 0x1; |
#endif |
} |
void led_driver_num(unsigned char data) { |
unsigned char tmp = 0; |
led_last_value = 0; |
// Determine right character (1s digit) |
tmp = data % 10; |
switch (tmp) { |
case 0: |
led_last_value |= 0x0D70; |
break; |
case 1: |
led_last_value |= 0x0140; |
break; |
case 2: |
led_last_value |= 0x0E60; |
break; |
case 3: |
led_last_value |= 0x0760; |
break; |
case 4: |
led_last_value |= 0x0350; |
break; |
case 5: |
led_last_value |= 0x0730; |
break; |
case 6: |
led_last_value |= 0x0F30; |
break; |
case 7: |
led_last_value |= 0x0170; |
break; |
case 8: |
led_last_value |= 0x0F70; |
break; |
case 9: |
led_last_value |= 0x0770; |
break; |
} |
// Determine left character (10s digit) |
tmp = data / 10; |
switch (tmp) { |
case 0: |
led_last_value |= 0xE00D; |
break; |
case 1: |
led_last_value |= 0x2008; |
break; |
case 2: |
led_last_value |= 0xC00E; |
break; |
case 3: |
led_last_value |= 0x600E; |
break; |
case 4: |
led_last_value |= 0x200B; |
break; |
case 5: |
led_last_value |= 0x6007; |
break; |
case 6: |
led_last_value |= 0xE007; |
break; |
case 7: |
led_last_value |= 0x200D; |
break; |
case 8: |
led_last_value |= 0xE00F; |
break; |
case 9: |
led_last_value |= 0x600F; |
break; |
} |
led_driver_data(led_last_value & 0x00FF); |
led_driver_data((led_last_value & 0xFF00) >> 8); |
} |
void led_driver_show_last() { |
led_driver_data(led_last_value & 0x00FF); |
led_driver_data((led_last_value & 0xFF00) >> 8); |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/led_driver.h |
---|
0,0 → 1,10 |
#ifndef __led_driver_h |
#define __led_driver_h |
void led_driver_init(void); |
void led_driver_clock(void); |
void led_driver_data(char); |
void led_driver_num(unsigned char); |
void led_driver_show_last(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/main.c |
---|
0,0 → 1,415 |
#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" |
#include "buffer.h" |
#include "imu.h" |
#include "sleep.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 IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed |
/* ----------- IO Pins ----------- |
* RA0 - LED Display Latch Enable (V1) or Display CLK (V2) (PPS) |
* RA1 - LED Display CLK (V1) or Display DIN (V2) (PPS) |
* RA2 - LED Display DIN (V1) or Display Clock (V2) |
* RA3 - LED Display Output Enable |
* 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 Tx (PPS) |
* RB3 - XBee Rx (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 msgbuffer |
unsigned char msgbuffer[MSGLEN]; |
#pragma udata |
void main(void) { |
XBEE_DATA xbee_data; |
I2C_DATA i2c_data; |
BUFFER_DATA buffer_data; |
char length; |
unsigned char msgtype; |
unsigned char i = 0; |
unsigned char counter = 0; |
enum I2C_STATE i2c_state = I2C_STATE_IDLE; |
enum XBEE_STATE xbee_state = XBEE_STATE_WAITING_TO_JOIN; |
// 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 |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
uart_init(); // Initialize the UART handler code |
xbee_init(&xbee_data); // Initialize the XBee handler code |
i2c_init(&i2c_data); // Initialize the I2C handler code |
buffer_init(&buffer_data); |
// adc_init(); // Initialize the ADC |
MQ_init(); // Initialize message queues before enabling any interrupts |
timers_init(); // Initialize timers |
led_driver_init(); // Initialize the driver for the LED display |
port_b_int_init(); // Initialze Port B interrupt handler |
// intx_init(); // IR receiver input |
pwm_init(); // Initialize the PWM output driver |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
i2c_configure_master(); // Configure the hardware i2c device as a master |
imu_init(); |
Delay10KTCYx(255); |
DBG_PRINT_MAIN("\r\nMain: Program Started\r\n"); |
// Turn on LED until XBee is connected to network |
pwm_LED_start(); |
// 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; |
// Return size of stored data in buffer |
if (buffer_data.stored_length > MSGLEN) { |
msgbuffer[0] = MSGLEN; |
} else { |
msgbuffer[0] = buffer_data.stored_length; |
} |
DBG_PRINT_MAIN("Main: (I2C Return 0x2) Returning %X\r\n", msgbuffer[0]); |
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer); |
break; |
case 0x4: |
// Return data stored in buffer |
if (buffer_data.stored_length > MSGLEN) { |
length = MSGLEN; |
buffer_read(MSGLEN, msgbuffer); |
} else { |
length = buffer_data.stored_length; |
buffer_read(buffer_data.stored_length, msgbuffer); |
} |
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("Main: (I2C Data) "); |
for (i = 0; i < length; i++) { |
DBG_PRINT_MAIN("%X ", msgbuffer[i]); |
} |
if (buffer_free_space() >= 7) { |
// Insert recorded value into buffer |
if (i2c_state == I2C_STATE_READ_ACC) { |
buffer_insert_one(RETURNID_ACC); |
buffer_insert(6, msgbuffer); |
} else if (i2c_state == I2C_STATE_READ_GYRO) { |
buffer_insert_one(RETURNID_GYRO); |
buffer_insert(6, msgbuffer); |
} |
} else { |
// Send data to base station |
} |
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"); |
// Store received data into buffer |
buffer_insert(length - XBEE_RX_DATA_PACKET_FRAME_SIZE, frame_data_packet->data); |
// Send value of first byte received to LED display |
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; |
DBG_PRINT_MAIN("Status: %X (", frame_modem_status->status); |
switch(frame_modem_status->status) { |
case 0: |
DBG_PRINT_MAIN("Hardware Reset"); |
xbee_state = XBEE_STATE_WAITING_TO_JOIN; |
break; |
case 1: |
DBG_PRINT_MAIN("Watchdog Timer Reset"); |
break; |
case 2: |
DBG_PRINT_MAIN("Joined Network"); |
xbee_state = XBEE_STATE_JOINED_NETWORK; |
// Turn off LED after XBee has joined network |
pwm_LED_stop(); |
break; |
case 3: |
DBG_PRINT_MAIN("Disassociated"); |
break; |
case 6: |
DBG_PRINT_MAIN("Coordinator Started"); |
break; |
case 7: |
DBG_PRINT_MAIN("Network Security Key Updated"); |
break; |
case 0x11: |
DBG_PRINT_MAIN("Modem Config Changed While Joining"); |
break; |
} |
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) { |
/* --- Port B Interrupt Handlers -----------------------------*/ |
case MSGTYPE_PORTB_4_DOWN: |
DBG_PRINT_MAIN("Main: Port B4 Down\r\n"); |
remote_wake(); // Wake up all components |
timer1_enable(); // Set timer to start data polling |
break; |
case MSGTYPE_PORTB_4_UP: |
DBG_PRINT_MAIN("Main: Port B4 Up\r\n"); |
timer1_disable(); // Stop data polling timer |
i2c_state = I2C_STATE_IDLE; |
timer0_enable(); // Set timer to sleep components |
break; |
case MSGTYPE_PORTB_5_DOWN: |
DBG_PRINT_MAIN("Main: Port B5 Down\r\n"); |
remote_wake(); // Wake up all components |
timer3_enable(); // Enable PWM timer |
break; |
case MSGTYPE_PORTB_5_UP: |
DBG_PRINT_MAIN("Main: Port B5 Up\r\n"); |
timer3_disable(); // Disable PWM timer |
timer0_enable(); // Set timer to sleep components |
break; |
case MSGTYPE_PORTB_6_DOWN: |
DBG_PRINT_MAIN("Main: Port B6 Down\r\n"); |
remote_wake(); // Wake up all components |
break; |
case MSGTYPE_PORTB_6_UP: |
DBG_PRINT_MAIN("Main: Port B6 Up\r\n"); |
timer0_enable(); // Set timer to sleep components |
break; |
case MSGTYPE_PORTB_7_DOWN: |
DBG_PRINT_MAIN("Main: Port B7 Down\r\n"); |
remote_wake(); // Wake up all components |
break; |
case MSGTYPE_PORTB_7_UP: |
DBG_PRINT_MAIN("Main: Port B7 Up\r\n"); |
timer0_enable(); // Set timer to sleep components |
break; |
case MSGTYPE_INT1: |
// DBG_PRINT_MAIN("Main: INT1 Interrupt\r\n"); |
break; |
/* -----------------------------------------------------------*/ |
/* --- Timer Interrupt Handlers ------------------------------*/ |
case MSGTYPE_TIMER0: |
DBG_PRINT_MAIN("Main: Timer 0 Interrupt\r\n"); |
remote_sleep(); |
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); |
// |
// adc_start(); |
// break; |
case MSGTYPE_TIMER1: |
DBG_PRINT_MAIN("Main: Timer 1 Interrupt\r\n"); |
/* 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] = counter; |
led_driver_num(counter); |
counter++; |
if (counter == 100) |
counter = 0; |
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1; |
xbee_process_transmit_frame((void *) msgbuffer, length); |
/* Read values from accelerometer and gyroscope */ |
if (i2c_state == I2C_STATE_READ_GYRO) { |
imu_read_acc(); |
i2c_state = I2C_STATE_READ_ACC; |
} else if (i2c_state == I2C_STATE_READ_ACC) { |
imu_read_gyro(); |
i2c_state = I2C_STATE_READ_GYRO; |
} else { // I2C_STATE_IDLE |
imu_read_acc(); |
i2c_state = I2C_STATE_READ_ACC; |
} |
break; |
default: |
DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in low 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; |
} |
} |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/maindefs.h |
---|
0,0 → 1,93 |
#ifndef __maindefs_h |
#define __maindefs_h |
#include <p18f26j11.h> |
#include <stdio.h> |
//#define _DEBUG |
#define _SPI2_V1 |
//#define _SPI2_V2 |
// Enable or disable debug prints depending on project preprocessor (_DEBUG) |
#ifdef _DEBUG |
#define DBG_PRINT_MAIN(x) printf(x) |
#define DBG_PRINT_I2C(x) |
#define DBG_PRINT_XBEE(x) |
#define DBG_PRINT_PORTB_INT(x) |
#define DBG_PRINT_INT(x) |
#define DBG_PRINT_BUFFER(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) |
#define DBG_PRINT_INT(x) |
#define DBG_PRINT_BUFFER(x) |
#endif |
#define RETURNID_ACC 10 |
#define RETURNID_GYRO 11 |
#define RETURNID_BTN1 12 |
#define RETURNID_BTN2 13 |
// 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 |
#define MSGTYPE_INT1 80 |
enum I2C_STATE { |
I2C_STATE_IDLE, |
I2C_STATE_READ_ACC, |
I2C_STATE_READ_GYRO |
}; |
enum XBEE_STATE { |
XBEE_STATE_WAITING_TO_JOIN, |
XBEE_STATE_JOINED_NETWORK |
}; |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/msg_queues.c |
---|
0,0 → 1,333 |
#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 |
unsigned char MQ_ToMainFromLow_Data_1[MSGLEN]; |
#pragma udata msgqueue1_2 |
unsigned char MQ_ToMainFromLow_Data_2[MSGLEN]; |
#pragma udata msgqueue2_1 |
unsigned char MQ_ToMainFromHigh_Data_1[MSGLEN]; |
#pragma udata msgqueue2_2 |
unsigned char MQ_ToMainFromHigh_Data_2[MSGLEN]; |
#pragma udata msgqueue3_1 |
unsigned char MQ_FromMainToLow_Data_1[MSGLEN]; |
#pragma udata msgqueue3_2 |
unsigned char MQ_FromMainToLow_Data_2[MSGLEN]; |
#pragma udata msgqueue4_1 |
unsigned char MQ_FromMainToHigh_Data_1[MSGLEN]; |
#pragma udata msgqueue4_2 |
unsigned char MQ_FromMainToHigh_Data_2[MSGLEN]; |
#pragma udata |
msg_queue MQ_ToMainFromLow; |
msg_queue MQ_ToMainFromHigh; |
msg_queue MQ_FromMainToLow; |
msg_queue MQ_FromMainToHigh; |
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].data = MQ_ToMainFromLow_Data_1; |
MQ_ToMainFromLow.queue[1].data = MQ_ToMainFromLow_Data_2; |
MQ_ToMainFromHigh.queue[0].data = MQ_ToMainFromHigh_Data_1; |
MQ_ToMainFromHigh.queue[1].data = MQ_ToMainFromHigh_Data_2; |
MQ_FromMainToLow.queue[0].data = MQ_FromMainToLow_Data_1; |
MQ_FromMainToLow.queue[1].data = MQ_FromMainToLow_Data_2; |
MQ_FromMainToHigh.queue[0].data = MQ_FromMainToHigh_Data_1; |
MQ_FromMainToHigh.queue[1].data = MQ_FromMainToHigh_Data_2; |
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 26J11/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 255 |
// The maximum number of messages in a single queue |
#define MSGQUEUELEN 2 // 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; // The actual message data |
} msg; // 5 bytes overhead per 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; // 12 bytes overhead per 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 26J11/nbproject/Makefile-default.mk |
---|
0,0 → 1,291 |
# |
# 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}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
else |
IMAGE_TYPE=production |
OUTPUT_SUFFIX=hex |
DEBUGGABLE_SUFFIX=cof |
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_26J11.${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}/pin_interrupts.o ${OBJECTDIR}/buffer.o ${OBJECTDIR}/sleep.o ${OBJECTDIR}/imu.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}/pin_interrupts.o.d ${OBJECTDIR}/buffer.o.d ${OBJECTDIR}/sleep.o.d ${OBJECTDIR}/imu.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}/pin_interrupts.o ${OBJECTDIR}/buffer.o ${OBJECTDIR}/sleep.o ${OBJECTDIR}/imu.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}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
MP_PROCESSOR_OPTION=18F26J11 |
MP_PROCESSOR_OPTION_LD=18f26j11 |
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}/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 |
${OBJECTDIR}/buffer.o: buffer.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/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}/buffer.o buffer.c |
@${DEP_GEN} -d ${OBJECTDIR}/buffer.o |
${OBJECTDIR}/sleep.o: sleep.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sleep.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}/sleep.o sleep.c |
@${DEP_GEN} -d ${OBJECTDIR}/sleep.o |
${OBJECTDIR}/imu.o: imu.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/imu.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}/imu.o imu.c |
@${DEP_GEN} -d ${OBJECTDIR}/imu.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}/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 |
${OBJECTDIR}/buffer.o: buffer.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/buffer.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/buffer.o buffer.c |
@${DEP_GEN} -d ${OBJECTDIR}/buffer.o |
${OBJECTDIR}/sleep.o: sleep.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sleep.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/sleep.o sleep.c |
@${DEP_GEN} -d ${OBJECTDIR}/sleep.o |
${OBJECTDIR}/imu.o: imu.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/imu.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/imu.o imu.c |
@${DEP_GEN} -d ${OBJECTDIR}/imu.o |
endif |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: link |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) "18f26j11.lkr" -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}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} |
else |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) "18f26j11.lkr" -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_26J11.${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 26J11/nbproject/Makefile-genesis.properties |
---|
0,0 → 1,8 |
# |
#Wed Apr 18 17:35:43 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 26J11/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=PIC_26J11 |
# 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 26J11/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=PIC_26J11.production.hex |
CND_ARTIFACT_PATH_default=dist/default/production/PIC_26J11.production.hex |
CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package |
CND_PACKAGE_NAME_default=pic26j11.tar |
CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/pic26j11.tar |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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}/PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
OUTPUT_BASENAME=PIC_26J11.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
PACKAGE_TOP_DIR=pic26j11/ |
# 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}/pic26j11/bin |
copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 |
# Generate tar file |
cd "${TOP}" |
rm -f ${CND_DISTDIR}/${CND_CONF}/package/pic26j11.tar |
cd ${TMPDIR} |
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/pic26j11.tar * |
checkReturnCode |
# Cleanup |
cd "${TOP}" |
rm -rf ${TMPDIR} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/nbproject/configurations.xml |
---|
0,0 → 1,160 |
<?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>pin_interrupts.h</itemPath> |
<itemPath>buffer.h</itemPath> |
<itemPath>sleep.h</itemPath> |
<itemPath>imu.h</itemPath> |
</logicalFolder> |
<logicalFolder name="LibraryFiles" |
displayName="Library Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="LinkerScript" |
displayName="Linker Files" |
projectFiles="true"> |
<itemPath>18f26j11.lkr</itemPath> |
</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>pin_interrupts.c</itemPath> |
<itemPath>buffer.c</itemPath> |
<itemPath>sleep.c</itemPath> |
<itemPath>imu.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>PIC18F26J11</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="enable.case.sensitivity" value="true"/> |
<property key="hex.output.format" value="INHX32"/> |
<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="extended-mode-mcc18" value="false"/> |
<property key="stack-analysis" value="false"/> |
<property key="stack-analysis-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="0xfff7"/> |
<property key="poweroptions.powerenable" value="true"/> |
</PICkit3PlatformTool> |
</conf> |
</confs> |
</configurationDescriptor> |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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 26J11/nbproject/private/private.properties |
---|
--- ECE4534 - Embedded Systems/PIC 26J11/nbproject/private/private.xml (nonexistent) |
+++ ECE4534 - Embedded Systems/PIC 26J11/nbproject/private/private.xml (revision 113) |
@@ -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 26J11/nbproject/project.properties |
---|
--- ECE4534 - Embedded Systems/PIC 26J11/nbproject/project.xml (nonexistent) |
+++ ECE4534 - Embedded Systems/PIC 26J11/nbproject/project.xml (revision 113) |
@@ -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>PIC_26J11</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 26J11/pin_interrupts.c |
---|
0,0 → 1,100 |
#include "maindefs.h" |
#include "pin_interrupts.h" |
#include "pwm.h" |
#include "msg_queues.h" |
#include <delays.h> |
unsigned char port_b_prev_state; |
void intx_init() { |
TRISAbits.TRISA5 = 1; |
TRISCbits.TRISC2 = 0; |
RPINR1 = 2; // Bind INT1 interrupt to RP2 |
INTCON2bits.INTEDG1 = 0; // Trigger on falling edge |
} |
void int1_interrupt_handler() { |
pwm_LED_start(); |
Delay10TCYx(1); |
pwm_LED_stop(); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_INT1, (void *) 0); |
} |
void port_b_int_init() { |
port_b_prev_state = 0x0F; |
INTCON2bits.RBPU = 0; |
// Set pins as inputs |
TRISBbits.TRISB4 = 1; |
TRISBbits.TRISB5 = 1; |
TRISBbits.TRISB6 = 1; |
TRISBbits.TRISB7 = 1; |
// Turn on internal voltage pull-up? |
PORTBbits.RB4 = 1; |
PORTBbits.RB5 = 1; |
PORTBbits.RB6 = 1; |
PORTBbits.RB7 = 1; |
LATBbits.LATB4 = 1; |
LATBbits.LATB5 = 1; |
LATBbits.LATB6 = 1; |
LATBbits.LATB7 = 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 HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B4 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B4 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x02) { |
if (port_b_prev_state & 0x02) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B5 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B5 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x04) { |
if (port_b_prev_state & 0x04) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B6 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B6 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x08) { |
if (port_b_prev_state & 0x08) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B7 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B7 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_UP, (void *) 0); |
} |
} |
// Save the new state of pins |
port_b_prev_state = new_state; |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/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 26J11/pwm.c |
---|
0,0 → 1,44 |
#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; |
TRISCbits.TRISC2 = 0; |
LATCbits.LATC0 = 0; |
LATCbits.LATC1 = 0; |
LATCbits.LATC2 = 0; |
RPOR11 = 14; // Set RP11 to ECCP1 PWM Output Channel A |
RPOR12 = 15; // Set RP12 to ECCP1 PWM Output Channel B |
RPOR13 = 18; // Set RP13 to ECCP2 PWM Output |
} |
void pwm_IR_start() { |
OpenPWM1(0x3D); // 38kHz frequency |
SetDCPWM1(0x80); // 50% duty cycle |
// Wait for completion of a full PWM cycle before enabling output mode |
while(!PIR1bits.TMR2IF); |
SetOutputPWM1(SINGLE_OUT, PWM_MODE_1); |
// Enable ECCP1 output channels A and B |
PSTR1CONbits.STRA = 1; |
PSTR1CONbits.STRB = 1; |
} |
void pwm_IR_stop() { |
ClosePWM1(); |
} |
void pwm_LED_start() { |
OpenPWM2(0xFF); // Full period from timer |
SetDCPWM2(0x80); // 50% duty cycle |
PSTR2CONbits.STRA = 1; // Enable output channel A |
} |
void pwm_LED_stop() { |
ClosePWM2(); |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/pwm.h |
---|
0,0 → 1,12 |
#ifndef __pwm_h |
#define __pwm_h |
void pwm_init(void); |
void pwm_IR_start(void); |
void pwm_IR_stop(void); |
void pwm_LED_start(void); |
void pwm_LED_stop(void); |
static char pwm_on = 0; |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/sleep.c |
---|
0,0 → 1,17 |
#include "maindefs.h" |
#include "sleep.h" |
#include "xbee.h" |
#include "timers.h" |
#include "led_driver.h" |
void remote_sleep() { |
xbee_sleep(); |
led_driver_data(0); |
led_driver_data(0); |
} |
void remote_wake() { |
timer0_disable(); |
xbee_wake(); |
led_driver_show_last(); |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/sleep.h |
---|
0,0 → 1,7 |
#ifndef __sleep_h |
#define __sleep_h |
void remote_sleep(void); |
void remote_wake(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/timers.c |
---|
0,0 → 1,96 |
/* The processor calls these handlers when an interrupt is triggered */ |
#include "maindefs.h" |
#include "msg_queues.h" |
#include <timers.h> |
#include "timers.h" |
#include "pwm.h" |
unsigned char timer1_counter; |
void timers_init() { |
/*--------------------Timer Delay Formulas-------------------- */ |
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */ |
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */ |
/* ----------------------------------------------------------- */ |
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256); |
T0CONbits.TMR0ON = 0; // Timer 0 initially off |
OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & |
T1_SOURCE_FOSC_4 & T1_PS_1_8 & |
T1_OSC1EN_OFF & T1_SYNC_EXT_OFF, |
TIMER_GATE_OFF & TIMER_GATE_INT_OFF); |
T1CONbits.TMR1ON = 0; // Timer 1 initially off |
timer1_counter = 0; |
// Open timer 2 for ECCP1 (PWM) |
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1); |
// Open timer 3 for PWM IR signaling |
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_SOURCE_FOSC_4 & |
T3_OSC1EN_OFF & T3_PS_1_1 & T3_SYNC_EXT_OFF, TIMER_GATE_OFF); |
T3CONbits.TMR3ON = 0; // Timer 3 initially off |
} |
// Interrupt handler for timer 0 |
void timer0_interrupt_handler() { |
timer0_disable(); // Run once! |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER0, (void *) 0); |
} |
void timer0_enable() { |
WriteTimer0(0); |
T0CONbits.TMR0ON = 1; |
} |
void timer0_disable() { |
T0CONbits.TMR0ON = 0; |
} |
// Interrupt handler for timer 1 |
void timer1_interrupt_handler() { |
timer1_counter++; |
if (timer1_counter % 3 == 0) { |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER1, (void *) 0); |
} |
} |
void timer1_enable() { |
WriteTimer1(0); |
T1CONbits.TMR1ON = 1; |
} |
void timer1_disable() { |
T1CONbits.TMR1ON = 0; |
} |
void timer3_interrupt_handler() { |
if (!pwm_on) { |
// Turn on PWM |
pwm_IR_start(); |
pwm_on = 1; |
WriteTimer3(0xEA00); // Send 38kHz pulses for 600us |
} else { |
// Turn off PWM |
pwm_IR_stop(); |
pwm_on = 0; |
WriteTimer3(0xEA00); // Send low for 0.6ms |
// WriteTimer3(0xD800); // Send low for 1ms |
// WriteTimer3(0xB000); // Send low for 2ms |
// WriteTimer3(0x1000); // Send low for 6ms |
} |
} |
void timer3_enable() { |
// Enable timer and start PWM |
T3CONbits.TMR3ON = 1; |
pwm_IR_start(); |
pwm_on = 1; |
} |
void timer3_disable() { |
// Disable timer and stop PWM |
T3CONbits.TMR3ON = 0; |
pwm_IR_stop(); |
pwm_on = 0; |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/timers.h |
---|
0,0 → 1,16 |
#ifndef __timer_interrupt_handler_h |
#define __timer_interrupt_handler_h |
void timers_init(void); |
void timer0_interrupt_handler(void); |
void timer0_enable(void); |
void timer0_disable(void); |
void timer1_interrupt_handler(void); |
void timer1_enable(void); |
void timer1_disable(void); |
void timer2_interrupt_handler(void); |
void timer3_interrupt_handler(void); |
void timer3_enable(void); |
void timer3_disable(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/uart.c |
---|
0,0 → 1,45 |
#include "maindefs.h" |
#include "msg_queues.h" |
#include <usart.h> |
#include "uart.h" |
#include "xbee.h" |
void uart_init() { |
// 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, 64); // Set UART speed to 38400 baud |
// UART2 RX Pin RP5 |
RPINR16 = 5; // 5 is PPS RP5 |
// UART2 TX Pin RP6 |
RPOR6 = 5; // 5 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, 64); // Set UART speed to 115200 baud |
} |
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 26J11/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(void); |
void uart_recv_interrupt_handler(void); |
#endif |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/xbee.c |
---|
0,0 → 1,227 |
#include "maindefs.h" |
#include "msg_queues.h" |
#include "xbee.h" |
#include "timers.h" |
#include <usart.h> |
#include <delays.h> |
#pragma udata xbee_data |
XBEE_FRAME data_frame; |
#pragma udata |
XBEE_DATA *xbee_data_ptr; |
void *xbee_data_array_ptr; |
/* Initialize variables used by this library */ |
void xbee_init(XBEE_DATA *xd) { |
TRISBbits.TRISB0 = 1; // RB0 is CTS, set by XBee chip |
TRISBbits.TRISB1 = 0; // RB1 is RTS, set by PIC |
TRISCbits.TRISC5 = 0; // RC5 is Sleep |
LATBbits.LATB0 = 0; // Pin set high to signal stop sending data to XBee |
LATBbits.LATB1 = 0; // Pin set high to indicate stop sending data to PIC |
LATCbits.LATC5 = 0; // Pin set high to sleep XBee module |
xbee_data_ptr = xd; |
xbee_data_ptr->dataind = 0; |
xbee_data_ptr->checksum_sum = 0; |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
xbee_data_ptr->rcv_frame.FRAME = &data_frame; |
// 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.LATB1 = 1; // Set high to stop receiving data |
} else { |
LATBbits.LATB1 = 0; // Set low to resume receiving data |
} |
} |
unsigned char xbee_read_CTS() { |
unsigned char c = PORTBbits.RB0; |
if (c) { |
return 0x1; // High indicates stop sending data |
} else { |
return 0x0; // Low indicates ok to send data |
} |
} |
void xbee_sleep() { |
LATCbits.LATC5 = 1; |
} |
void xbee_wake() { |
LATCbits.LATC5 = 0; |
} |
//Classwork/ECE4534 - Embedded Systems/PIC 26J11/xbee.h |
---|
0,0 → 1,262 |
#ifndef __xbee_h |
#define __xbee_h |
#include "msg_queues.h" |
#define XBEE_BUFFER_SIZE MSGLEN-20 |
#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 |
typedef union __XBEE_FRAME { |
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; |
} XBEE_FRAME; |
// Common Frame Components |
typedef struct __XBEE_FULL_FRAME { |
unsigned char start_delimiter; |
XBEE_ADDRESS_16 length; |
XBEE_FRAME *FRAME; |
} XBEE_FULL_FRAME; // 5 bytes overhead |
// Overall Data Structure |
typedef struct __xbee_data { |
XBEE_FULL_FRAME rcv_frame; |
unsigned char dataind; |
unsigned char checksum_sum; |
unsigned char read_state; |
unsigned char msgtype; |
} XBEE_DATA; // 9 bytes overhead |
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); |
void xbee_sleep(void); |
void xbee_wake(void); |
#endif |