Subversion Repositories Code-Repo

Compare Revisions

No changes between revisions

Ignore whitespace Rev 112 → Rev 113

/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