/PIC Stuff/PIC_27J13/Makefile |
---|
0,0 → 1,108 |
# |
# There exist several targets which are by default empty and which can be |
# used for execution of your targets. These targets are usually executed |
# before and after some main targets. They are: |
# |
# .build-pre: called before 'build' target |
# .build-post: called after 'build' target |
# .clean-pre: called before 'clean' target |
# .clean-post: called after 'clean' target |
# .clobber-pre: called before 'clobber' target |
# .clobber-post: called after 'clobber' target |
# .all-pre: called before 'all' target |
# .all-post: called after 'all' target |
# .help-pre: called before 'help' target |
# .help-post: called after 'help' target |
# |
# Targets beginning with '.' are not intended to be called on their own. |
# |
# Main targets can be executed directly, and they are: |
# |
# build build a specific configuration |
# clean remove built files from a configuration |
# clobber remove all built files |
# all build all configurations |
# help print help mesage |
# |
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and |
# .help-impl are implemented in nbproject/makefile-impl.mk. |
# |
# Available make variables: |
# |
# CND_BASEDIR base directory for relative paths |
# CND_DISTDIR default top distribution directory (build artifacts) |
# CND_BUILDDIR default top build directory (object files, ...) |
# CONF name of current configuration |
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) |
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) |
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) |
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) |
# CND_PACKAGE_NAME_${CONF} name of package (current configuration) |
# CND_PACKAGE_PATH_${CONF} path to package (current configuration) |
# |
# NOCDDL |
# Environment |
MKDIR=mkdir |
CP=cp |
CCADMIN=CCadmin |
RANLIB=ranlib |
# build |
build: .build-post |
.build-pre: |
# Add your pre 'build' code here... |
.build-post: .build-impl |
# Add your post 'build' code here... |
# clean |
clean: .clean-post |
.clean-pre: |
# Add your pre 'clean' code here... |
.clean-post: .clean-impl |
# Add your post 'clean' code here... |
# clobber |
clobber: .clobber-post |
.clobber-pre: |
# Add your pre 'clobber' code here... |
.clobber-post: .clobber-impl |
# Add your post 'clobber' code here... |
# all |
all: .all-post |
.all-pre: |
# Add your pre 'all' code here... |
.all-post: .all-impl |
# Add your post 'all' code here... |
# help |
help: .help-post |
.help-pre: |
# Add your pre 'help' code here... |
.help-post: .help-impl |
# Add your post 'help' code here... |
# include project implementation makefile |
include nbproject/Makefile-impl.mk |
# include project make variables |
include nbproject/Makefile-variables.mk |
/PIC Stuff/PIC_27J13/adc.c |
---|
0,0 → 1,29 |
#include "maindefs.h" |
#include "msg_queues.h" |
#include "adc.h" |
#include <adc.h> |
void adc_init() { |
TRISAbits.TRISA0 = 1; |
OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_0_TAD, |
ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, 0, |
ADC_1ANA); |
} |
void adc_start() { |
ConvertADC(); |
} |
void adc_stop() { |
CloseADC(); |
} |
void adc_interrupt_handler() { |
// Sends the ADC value to main() |
unsigned int ret; |
unsigned char length; |
ret = ReadADC(); |
length = 2; |
// MQ_sendmsg_ToMainFromLow(length, MSGTYPE_ADC_NEWVALUE, &ret); |
} |
/PIC Stuff/PIC_27J13/adc.h |
---|
0,0 → 1,9 |
#ifndef __adc_h |
#define __adc_h |
void adc_init(void); |
void adc_start(void); |
void adc_stop(void); |
void adc_interrupt_handler(void); |
#endif |
/PIC Stuff/PIC_27J13/buffer.c |
---|
0,0 → 1,57 |
#include "buffer.h" |
#include "maindefs.h" |
#pragma udata buffer1 |
static unsigned char buffer1[256]; |
#pragma udata |
static 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; |
} |
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++) { |
buffer1[buffer_data->index_write] = *(msg + i); |
buffer_data->index_write++; // Will automatically overflow to 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) = buffer1[buffer_data->index_read]; |
buffer_data->index_read++; // Will automatically overflow to 0 |
} |
return 0; |
} |
/PIC Stuff/PIC_27J13/buffer.h |
---|
0,0 → 1,18 |
#ifndef __circular_buffer_h |
#define __circular_buffer_h |
#define BUFFER_OK 0 |
#define BUFFER_ERROR -1 |
#define BUFFER_SIZE 256 |
typedef struct __BUFFER_DATA { |
unsigned char index_read; |
unsigned char index_write; |
unsigned char stored_length; |
} BUFFER_DATA; |
void buffer_init(BUFFER_DATA *); |
char buffer_insert(unsigned char length, unsigned char *msg); |
char buffer_read(unsigned char length, unsigned char *dest); |
#endif |
/PIC Stuff/PIC_27J13/build/default/production/interrupts.o.d |
---|
0,0 → 1,10 |
build/default/production/interrupts.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.h \ |
/PIC Stuff/PIC_27J13/build/default/production/main.o.d |
---|
0,0 → 1,14 |
build/default/production/main.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/main.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.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/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
/PIC Stuff/PIC_27J13/build/default/production/uart.o.d |
---|
0,0 → 1,10 |
build/default/production/uart.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.cof |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.cof |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.hex |
---|
0,0 → 1,364 |
:020000040000FA |
:0600000078EF0AF0120087 |
:020006000000F8 |
:06000800C9EF07F0120031 |
:02000E001200DE |
:020010001200DC |
:0600180033EF08F01200B6 |
:02001E004BECA9 |
:1000200005F0FB0EDBCFF3FFDB06F35000090AE01F |
:1000300099EC05F0FA0E04EC06F0F3E1151CF1E181 |
:10004000010E01D0000E7AEF05F04BEC05F03B0EEF |
:10005000E12402E3E168E652E16E010EDB6A020E82 |
:10006000DB6AF90EDBCFF6FFFA0EDBCFF7FFFB0EF4 |
:10007000DBCFF8FF0800F550DF6EDF5002E19EEFA6 |
:1000800004F0250EDF5C02E091EF04F0030EDB6A62 |
:10009000040EDB6A050EDB6A060EDB6A070EDB6AFE |
:1000A000B3EC04F02D0EDF5C0CE02B0EDF5C09E0FE |
:1000B000200EDF5C06E0230EDF5C03E0300EDF5C29 |
:1000C0001AE1DF50300A14E0130A0FE0030A0AE0D5 |
:1000D0000B0A05E0060AE4E1030EDB80E1D7030E1C |
:1000E000DB82DED7030EDB84DBD7030EDB86D8D7BB |
:1000F000030EDB88D5D72A0EDF5C1BE1AFEC04F0E2 |
:10010000FDEC04F010E0030EDB8008680968130EB4 |
:10011000DBCF0DF0140EDBCF0EF0D0EC09F0040EA7 |
:1001200006C0DBFF03D0130EE6EC04F0B3EC04F0E2 |
:100130000BD0090EDB6A54EC05F003E0C8EC05F0C7 |
:10014000FAD7090EE6EC04F0030EDBB0DB982E0EB6 |
:10015000DF5C1BE1B3EC04F02A0EDF5C0BE1AFECDB |
:1001600004F0FDEC04F003E1130E38EC05F0B3EC01 |
:1001700004F00BD0090EDB6A54EC05F003E0C8EC88 |
:1001800005F0FAD7090E38EC05F0680EDF5C07E1E0 |
:10019000B3EC04F0680EDF5C1DE1030E18D0740EA2 |
:1001A000DF5C17E07A0EDF5C14E0480EDF5C06E0EF |
:1001B000540EDF5C03E05A0EDF5C02E1020E07D052 |
:1001C0006C0EDF5C03E06A0EDF5C04E1010E8BEC79 |
:1001D00005F0C9DBDF506E0A01E17FD31E0A01E1A1 |
:1001E00092D1200A01E18FD13F0A01E149D11A0AD7 |
:1001F00001E146D10D0A01E143D1200A01E140D1DC |
:100200003A0A01E13DD1200A01E13AD1260A01E191 |
:1002100035D10D0A01E132D11A0A01E1D9D0200A03 |
:100220004AE0300A1FE0460A0EE0250A01E083D3C7 |
:10023000D950F90FE96EFF0EDA20EA6E010EEE5E7C |
:10024000000EEE5AEE5A99EC05F0250EE66E95DB9F |
:1002500003E1151C01E169D395EC05F001E26BD3D4 |
:10026000DB2A69D3080EDB6A040EDB50010806E2C4 |
:10027000040EDB045DEC05F0DB508BDB080EDB507D |
:1002800009E0030EDB50010B05E172DB01E04DD309 |
:10029000080EDB6A64DBEFCFDFFF0DEC06F003E155 |
:1002A000151C01E142D395EC05F001E3DB2A60DB8C |
:1002B00001E141D33AD3070EDB5002080FE1D9EC3C |
:1002C00005F0030EA0EC05F00E0EEECFDBFF0F0ED7 |
:1002D000EECFDBFF100EEECFDBFF20D0F70EDBCF33 |
:1002E00017F0F80EDBCF18F0020E175E000E185A4A |
:1002F000F70E17C0DBFFF80E18C0DBFF17C0E9FFD1 |
:1003000018C0EAFF90EC05F0166A0E0E14C0DBFF71 |
:100310000F0E15C0DBFF100E16C0DBFF0E0EDBCF7D |
:10032000E6FF0F0EDBCFE6FF100EDBCFE6FFABECF8 |
:1003300009F0E552E552E552130E07C0DBFF140E3B |
:1003400008C0DBFF060EDB5005E0130ED4EC05F011 |
:1003500001E26ADBF8EC05F002E2130E37DBBBECDE |
:1003600005F006E0040ED4EC05F002E2050E2EDBEB |
:10037000030EDBB005D0FCDA01E0D7D2080EDB6A51 |
:10038000090EDB6A0E0EDBCFF6FF0F0EDBCFF7FF99 |
:10039000100EDBCFF8FF0800F550DF6EDF5014E0E1 |
:1003A000FEEC05F011E20DEC06F003E1151C01E195 |
:1003B000BCD2BBDB01E3DB2A090EDB2AD9500E0FCE |
:1003C000E96E000ECBDBE7D7D3DA01E1B4D2ADD2D0 |
:1003D000C6DA110EEECFDBFF120EEDCFDBFF110EF2 |
:1003E000DBCFE6FF120EDBCFE6FF9DEC09F0E55216 |
:1003F000E552130EF3CFDBFF140EF4CFDBFF060E36 |
:10040000DB5004E0130ED0DB01E20EDBF8EC05F06C |
:1004100002E2130EDBDAAFDB05E0040EC5DB02E21D |
:10042000050ED4DA030EDBB005D0A2DA01E07DD2EE |
:10043000080EDB6A090EDB6A110EDBCFE9FF120E34 |
:10044000DBCFEAFFEFCFDFFFDF5014E0D7DB12E2B4 |
:10045000E4DB03E1151C01E168D267DB01E3DB2A81 |
:10046000090EDB2A110EDB2ADBCFE9FF120EE8E3CF |
:10047000DB2AE6D77DDA01E15ED257D2030EDB8EAE |
:10048000070EDB0410E195DB040E5ADB0A0EEECFFB |
:10049000DBFF0B0EEECFDBFF0C0EEECFDBFF0D0E06 |
:1004A000EECFDBFF6CD0070EDB5003082CE1030E10 |
:1004B000DBAE0DD0B2DA020E76DAEFCF14F0156AA9 |
:1004C000166A176A14AE39D01568166835D0F70E5B |
:1004D000DBCF15F0F80EDBCF16F0020E155E000E26 |
:1004E000165AF70E15C0DBFFF80E16C0DBFF15C05D |
:1004F000E9FF16C0EAFFEFCF14F00A0E14C0DBFFCD |
:100500000B0EDB6A38D0070EDB50020809E1030E40 |
:10051000DBAE04D059DB16AE10D00ED055DB0DD0BB |
:10052000030EDBAE12D079DA020E3DDAF9DA166A82 |
:10053000176A15AE02D016681768E2DA0C0E16C0FC |
:10054000DBFF0D0E17C0DBFF1AD0F70EDBCF16F066 |
:10055000F80EDBCF17F0020E165E000E175AF70EDC |
:1005600016C0DBFFF80E17C0DBFF16C0E9FF17C08F |
:10057000EAFFD6DAC5DA0C0EDB6A0D0EDB6A060E70 |
:10058000DB5005E1010EF36E050EF3CFDBFF150E18 |
:10059000DB6A160EDB6AD950370F146E000EDA20B4 |
:1005A000156E390E14C0DBFF3A0E15C0DBFF380E96 |
:1005B000DB6A080EDB6A0A0EAEDADF50780A12E058 |
:1005C000200A10E0280A0CE0200A0AE03F0A06E0B0 |
:1005D0000D0A02E0200A08E1020E05D0080E03D041 |
:1005E000080EDF26100E97DA030EDBBE02D0DB9278 |
:1005F000DB94DB50800B24E08ADAD890030EEB50BA |
:10060000000A08E6000EEE5C000EEE58000EEE58F2 |
:10061000000EEE5815E213DA0B680C680D680E68D0 |
:1006200065EC09F00A0E02C0DBFF0B0E03C0DBFF16 |
:100630000C0E04C0DBFF0D0E05C0DBFF2D0E08D035 |
:10064000030EDBA202D02B0E03D0DBA408D0200EB9 |
:10065000F36E170EF3CFDBFF150EDB2A02D0170E59 |
:10066000DB6A050EDB5003E1B7D901E189D0280E22 |
:10067000146E150E156E000E166E070EDBCF17F0FA |
:10068000186A196A1A6A17C00BF018C00CF019C062 |
:100690000DF01AC00EF0D3D9FDEC09F0145002246D |
:1006A000F36E15500320F46E16500420F86EF4CF4C |
:1006B000F7FFF3CFF6FF0800090EF5CFDBFF580E6A |
:1006C000DF5C0FE1610EF36E090E7BD90AE3200EA9 |
:1006D000146E090EDBCFE7FF1450E75E090EE7CF7B |
:1006E000DBFF070EDBCF14F0156A166A176A0FDA04 |
:1006F00014C00BF015C00CF016C00DF017C00EF0B2 |
:10070000EECF06F0EECF07F0EECF08F0EFCF09F016 |
:10071000FDEC09F009C0EDFF08C0EDFF07C0EDFFDB |
:1007200006C0EFFF390EDBCFE9FFDB063A0EDBCF69 |
:10073000EAFF01E2DB06090EDBCFEFFF150EDB2A35 |
:100740004BD995E1030EDBA61DD06F0EDF5C06E1F1 |
:10075000C1D918E3150EDB285BDA14D0780EDF5C04 |
:1007600009E0580EDF5C06E0620EDF5C03E0420E3B |
:10077000DF5C08E1020EF36E160EF3CFDBFF02D052 |
:10078000150EDB6A030EDB50100B0EE0040EDBCF00 |
:1007900014F0050EDB50D880145406E2060EDB5030 |
:1007A00003E1040EDB5034DA95D90AE2050EDBCF03 |
:1007B000E7FF150EDB50E75E050EE7CFDBFF02D04B |
:1007C000050EDB6A040EDBCF14F0160E45D9D88077 |
:1007D000145414E2160EDBCFE6FF150EDBCFE6FF56 |
:1007E000040EDBCFE6FF050EDB50E552E75CE55279 |
:1007F000D880E754E552D880E7545FD9030EDB5028 |
:10080000010B0BE1080EDB5008E0B2D801E08DD0FF |
:10081000080EDB50BED8080EDB6A170EDB5007E06F |
:1008200088D9170EF1D903E1151C01E17ED0160E0F |
:10083000DB5016E07ED9300EE66E9FD802E1151C23 |
:1008400074E077D9DFCFE6FF23EC09F0E552E552FB |
:10085000E552F4CF15F00001F31C02E1151C65E030 |
:10086000050EDBCF14F0160EDB50D880145409E2CD |
:10087000050EDBCFE7FF160EDB50E75E050EE7CF78 |
:10088000DBFF300EE66E050ECBD94FE1390EDB2AC9 |
:10089000DBCFE9FF3A0E01E3DB2ADBCFEAFF090EEB |
:1008A000EFCFDBFFDB500EE044D9090EADD902E1FA |
:1008B000151C3BE0390EDB2ADBCFE9FF3A0EEDE3F6 |
:1008C000DB2AEBD755D831E1160EDBCFE6FF080E59 |
:1008D000C3D8E552E7245DD82ED0070EDB50030ABB |
:1008E0001CE0010A14E0030A07E07BD9DBCFEEFF2E |
:1008F000020EDBCFEDFF1FD0F5D8196A17AE02D07C |
:10090000186819682CD8BCD819C0EEFF14D0EAD8E2 |
:1009100017BE186824D8B4D80ED063D9DBCFEFFF48 |
:100920000AD07BD905E1151C03E1F368F46810D007 |
:10093000FCD801E3DB2A79D93AEF00F0010EDBCFD6 |
:1009400014F0020EDBCF15F014C0F3FF15C0F4FF56 |
:100950003B0EE15C02E2E16AE552E16ECBD029D9BF |
:10096000020EA0EF05F061D90800F550DF6E12000D |
:10097000200EE66E080E10EF06F023EC09F0E552AB |
:10098000E552E552F3CF14F0F4CF15F00001F31C5B |
:100990001200146E156AD950010F4DD91450EE266D |
:1009A0001550ED221200185E000E195AF70E18C0ED |
:1009B000DBFFF80E19C0DBFF18C0E9FF19C0EAFF22 |
:1009C0001200DBCFF4FFF350F45C1200DB50E76E53 |
:1009D000040EE7CFDBFF12000A0EDBCF14F00B0E84 |
:1009E000DBCF15F00C0EDBCF16F00D0EDBCF17F0C2 |
:1009F00014501510161017101200130EEECFDBFF57 |
:100A0000140EEDCFDBFF130EDBCF14F0140EDBCF93 |
:100A100015F00001800E15141200F70EDBCF18F050 |
:100A2000F80EDBCF19F01200050EDB50E66ED95040 |
:100A3000130F01D9E552E750EE6EED6A12000A0E6F |
:100A4000DBCF06F00B0EDBCF07F00C0EDBCF08F090 |
:100A50000D0EDBCF09F01200DBCFE6FF150EDBCF6A |
:100A6000E6FF050EDB50E552E724E552E7241200CD |
:100A7000DB50CED8010EF36E060EF3CFDBFF120073 |
:100A8000EE50EFCFEAFFE96E16C0EEFF17C0EEFFA3 |
:100A900018C0EEFF1200D9CFE6FFDACFE6FFE1CFB4 |
:100AA000D9FFE2CFDAFF1200DFCFE6FFE66A56ECAD |
:100AB0000AF0E552E552F3501200E76E080EE7CF58 |
:100AC000DBFF1200EECF14F0EECF15F0EFCF16F0F3 |
:100AD000176A1200050EDBCF14F0150EDB50D8801C |
:100AE00014541200010EDBCF16F0020EDBCF17F00C |
:100AF000186A1200E552E5CFDAFFE7CFD9FF1200FE |
:100B00000A0E14C0DBFF0B0E15C0DBFF1200D9501C |
:100B10000A0F1BEF06F0F36E070EF3CFDBFF120098 |
:100B2000EECF14F0EFCF15F01200010EDB2A020E0B |
:100B30001200FC0EDBCFE6FFFD0EDBCFE6FF12005E |
:100B4000145E000E155AF70E14C0DBFFF80E15C028 |
:100B5000DBFF14C0E9FF15C0EAFF1200DA20EA6EDD |
:100B6000EF2AEECFF6FF000EEF22EECFF7FFEF22D7 |
:100B7000EECFF8FF1200040EDBCFE6FF130EDB50C2 |
:100B8000E552E75C9ADFDB5004DF060EDB50120013 |
:100B9000090EDB500A0DF350DF24D00FE76E090E6B |
:100BA000E7CFDBFFB3EF04F0DB50F36E050EE1EFB0 |
:100BB00004F0F70EDBCF14F0F80EDBCF15F01200C7 |
:100BC000DFCFE6FFBDEF04F028DF030EECDE62EFBF |
:100BD00005F00FEC00F0E552E552E552E552000950 |
:100BE0001200BDDEEE50EFCFEAFFE96E010E1200FB |
:100BF000130EDB50F36E040EE1EF04F0040EDB5035 |
:100C0000F36E090EE1EF04F0DBCFE6FFBDEF04F079 |
:100C1000E76E050EE7CFDBFF12008BDFE0EF05F09C |
:100C2000DBCFE6FF86DFE9EF05F0D950F90FE96E7B |
:100C3000FF0EAEEF05F0E96E000EDA20EA6E12004C |
:100C4000949C948E7E96190EB06EAD84AD98AC8E49 |
:100C5000AD9CAC9CAD9AAC889D889D8A0001A06B30 |
:100C6000A16BA26B1200D9CFE6FFE1CFD9FFE6520C |
:100C70009E50200B01E0010E156AE85015102EE081 |
:100C80000001A251146E156A3F0E141810E11550A0 |
:100C90000EE1AD9A650EE66E140EE66E000EE66E7F |
:100CA0005FD8E552E552E552AF50DF6E17D0AF5036 |
:100CB000E66EA151EA6A600FE96E000EEA22E55283 |
:100CC000E750EF6EA151146E156A3F0E141804E13F |
:100CD000155002E1A16B01D0A12BA22BAC50020B4D |
:100CE00001E0010E146E156A010E14180FE1155083 |
:100CF0000DE1AC98AC88AD9A540EE66E140EE66E1B |
:100D0000000EE66E2DD8E552E552E552E552E55269 |
:100D1000E7CFD9FF12000001E351146E156AE451C8 |
:100D2000166E176A1650141802E1175015180AE0CB |
:100D3000E351EA6AA30FE96E000EEA22EF50AE6EAD |
:100D4000E32B1200AD50020B01E0010E146E156A88 |
:100D5000E8501510F7E0AD9A0001E36BE46B120068 |
:100D6000D9CFE6FFE1CFD9FF020EE126AD50200B2F |
:100D700001E0010E156AE8501510F8E1D950FC0F9A |
:100D8000146EFF0EDA20156E14C0DEFFDD6EDECFAE |
:100D9000E6FFDDCFE6FFFC0EDBCFE6FFFD0EDBCF8F |
:100DA000E6FFFE0EDBCFE6FFA30EE66E000EE66E5C |
:100DB000DFEC08F0146E070EE15E1450A30EE66E31 |
:100DC000000EE66E9DEC09F0E552E552F3CFE4F03B |
:100DD0000001010EE36FA351AE6EAD8A020EE15C1D |
:100DE00002E2E16AE552E16EE552E7CFD9FF120077 |
:100DF000D9CFE6FFE1CFD9FFE652AD50200B01E09D |
:100E0000010E156AE8501510F8E1FC0EDB500001E8 |
:100E1000E46F010EE36FDF6ADF50146E156AFC0E9B |
:100E2000DB50000115AE02D0D89003D0145C000E48 |
:100E3000155819E2DF50E76EFD0EDBCFE9FFFE0E1D |
:100E4000DBCFEAFFE750E926000EEA22EFCF14F0ED |
:100E5000156ADF50EA6AA30FE96E000EEA2214C099 |
:100E6000EFFFDF2AD9D70001A351AE6EAD8AE5525C |
:100E7000E552E7CFD9FF1200D9CFE6FFE1CFD9FF86 |
:100E8000E652DF6A0001A251146E156A1450151063 |
:100E900025E0A051EA6A600FE96E000EEA22EF50E9 |
:100EA000E66EDF50E76EFD0EDBCFE9FFFE0EDBCF17 |
:100EB000EAFFE750E926000EEA22E552E750EF6E1E |
:100EC000DF2AA051146E156A3F0E141804E1155064 |
:100ED00002E1A06B01D0A02BA207D4D7DF50E552CE |
:080EE000E552E7CFD9FF120033 |
:080EE8009F8A9F881200D08E42 |
:100EF000F28EF28C1200F250800B01E0010E176AA4 |
:100F0000E850171002E0000E01D0010E156AF36ED2 |
:100F100015C0F4FF1200F250400B01E0010E176AF9 |
:100F2000E850171002E0000E01D0010E156AF36EB2 |
:100F300015C0F4FF1200F250400B01E0010E146ED8 |
:100F4000156A010E141802E1155004E0D4DFF350C5 |
:100F5000F41002E0F36A02D0010EF36EF46A12009C |
:100F6000EADFF3CF16F0F4CF17F0F350F41004E1FA |
:100F7000C2DFF350F41002E0000E01D0010E156A3A |
:100F8000E850151003E0010EF36E01D0F36AF46A25 |
:100F90001200DACFE4FFE2CFDAFFE9CFE4FFEACFD5 |
:100FA000E4FFF6CFE4FFF7CFE4FFF8CFE4FFF5CF9F |
:100FB000E4FFF3CFE4FFF4CFE4FFFACFE4FFFBCF8D |
:100FC000E4FF00EE00F0140EE80403E3EECFE4FFCC |
:100FD000FBD700EE14F0070EE80403E3EECFE4FFC6 |
:100FE000FBD7E6529E50200B01E0010E1B6E1C6ADF |
:100FF000E8501C1004E033EC06F09E9A0CD09E5092 |
:10100000100B01E0010E1B6E1C6AE8501C1003E07F |
:101010008BEC06F09E98E55200EE1AF0070EE804FD |
:1010200003E3E5CFEDFFFBD700EE13F0140EE80469 |
:1010300003E3E5CFEDFFFBD7E5CFFBFFE5CFFAFFFD |
:10104000E5CFF4FFE5CFF3FFE5CFF5FFE5CFF8FF00 |
:10105000E5CFF7FFE5CFF6FFE5CFEAFFE5CFE9FF04 |
:10106000E5CFDAFF1100D8CFE4FFE0CFE4FFE46E74 |
:10107000DACFE4FFE652E552E5CFDAFFE550E5CFFF |
:08108000E0FFE5CFD8FF1000EE |
:08108800060EF66E000EF76E75 |
:10109000000EF86E00010900F550EA6F0900F550E6 |
:1010A000EB6F03E1EA6701D03DD00900F550E56F31 |
:1010B0000900F550E66F0900F550E76F09000900D7 |
:1010C000F550E96E0900F550EA6E090009000900C3 |
:1010D000F550E86F0900F550E96F09000900F6CFF7 |
:1010E000ECF0F7CFEDF0F8CFEEF0E5C0F6FFE6C09C |
:1010F000F7FFE7C0F8FF0001E85302E1E95307E01A |
:101100000900F550EE6EE807F8E2E907F9D7ECC000 |
:10111000F6FFEDC0F7FFEEC0F8FF0001EA07000E92 |
:06112000EB5BBFD71200DB |
:0A112600D9CFE6FFE1CFD9FF660E36 |
:10113000E126DF6A010EDB6A8F0ED3147009D36ECD |
:10114000FC0ED3140009D36E0F0148691F0E496FBE |
:1011500020EC06F077EC07F074EC07F0420EE66E38 |
:10116000140EE66E000EE66EB0EC06F0E552E552A7 |
:10117000E552D950020FE66E000EDA20E66E3CEC26 |
:1011800007F0E552E552E76E010EE7CFDBFFDB50DB |
:10119000146E156AE85015100EE0010EDB50E66E75 |
:1011A000D950020FE66E000EDA20E66EF8EC06F07B |
:0E11B000E552E552E552E6683FEC0AF0D9D769 |
:0211BE00D9CF87 |
:1011C000E6FFDACFE6FFE1CFD9FFE2CFDAFFE65262 |
:1011D000E652F70EDBCFE6FFF80EDBCFE6FFF90EA7 |
:1011E000DBCFE6FFFA0EDBCFE6FFFB0EDBCFE6FF41 |
:1011F000D950FC0FE66EFF0EDA20E66E25EC00F00B |
:10120000146E070EE15C02E2E16AE552E16E1450F1 |
:10121000F3CFDEFFF4CFDDFFFC0EDBCFE9FFFD0EE9 |
:10122000DBCFEAFFEF6ADECF14F0DDCF15F014C09C |
:10123000F3FF15C0F4FFE552E552E552E5CFDAFFC2 |
:06124000E7CFD9FF120008 |
:0A124600D9CFE6FFDACFE6FFE1CFD3 |
:10125000D9FFE2CFDAFFFB0EDBCF14F0FC0EDBCFC1 |
:1012600015F00001800E15141AE1FB0EDBCFE9FF2B |
:10127000FC0EDBCFEAFFEECFF3FFEDCFF4FFEE2A5B |
:10128000000EEF22F3CFE9FFF4CFEAFFFD0EDBCF34 |
:10129000EFFFEF50156AF36E15C0F4FF10D0FB0E90 |
:1012A000DB50FE0806E1FD0EDBCFE6FF86EC0AF020 |
:1012B00005D0FD0EDBCFE6FF07EC00F0E552E5526E |
:0A12C000E5CFDAFFE7CFD9FF1200F7 |
:0612CA0006500B02F3CFF9 |
:1012D00002F0F4CF03F00C02F3500326000EF420CA |
:1012E000046E06500D02F3500426000EF420056E25 |
:1012F00006500E02F350052607500B02F35003264A |
:10130000F4500422000E052207500C02F35004266C |
:10131000F450052207500D02F350052608500B0229 |
:10132000F3500426F450052208500C02F350052611 |
:0A13300009500B02F35005261200CD |
:06133A00FE0EE3CFE9FF07 |
:10134000FF0EE3CFEAFFF36AF46AEE5203E0F34ADA |
:10135000F42AFBD71200FF0EE3CFF8FFE552FF0E91 |
:10136000E3CFF7FFE552FF0EE3CFF6FFE552E66A63 |
:10137000E66AE66A0900F55209E0FD0EE32A05E196 |
:10138000FE0EE32A02E1FF0EE32AF4D7FD0EE3CFBF |
:1013900007F0FE0EE3CF08F0FF0EE3CF09F01200D6 |
:1013A00009C013F008C012F008500D02F4CF07F086 |
:1013B000F3CF06F009500E02F4CF09F0F3CF08F096 |
:1013C0000D02F3500726F4500822E86A0922125051 |
:1013D0000E02F3500726F4500822E86A09220EAEE6 |
:1013E000F6EF09F01250085E1350095A13AE000CC4 |
:0A13F0000D50085E0E50095A000C63 |
:0613FA00056A046A036AA3 |
:10140000026A200EE76ED89006360736083609368F |
:1014100002360336043605360B50025C0C50035876 |
:101420000D5004580E50055809E30B50025E0C5045 |
:10143000035A0D50045A0E50055A062AE72EE4D7D7 |
:02144000120098 |
:0E1442000D0A426567696E2050726F67726115 |
:101450006D0D0A005541525431204F7665727275F8 |
:101460006E210D0A00554152543120427566666561 |
:0E14700072204F766572666C6F77210D0A0050 |
:02147E00FF0E5F |
:10148000E3501E6EEF0E01D0F30EE76EE72E46EF2F |
:101490000AF00C0E1D6EE76AE72E4CEF0AF01D2EC7 |
:0C14A0004BEF0AF01E2E44EF0AF0120081 |
:0414AC00F36AF46A81 |
:1014B000FF0EE124E96EFF0EE220EA6EED6607D032 |
:1014C0002F0EEF6404D03A0EEF6001D0F32A120021 |
:1014D000B00EF36E00EE00F00E0E01D81200EA60BE |
:1014E00002D0EE6AFCD7F350E9601200EE6AFCD736 |
:1014F0001DEE00F02DEE00F0F86A019C44EC08F0BF |
:0C15000008EC00F093EC08F0FBD71200A0 |
:04150C00FF0EE3509B |
:10151000ADBA04D0B06AAC8EAD8A949CADA2FED7B1 |
:08152000AE6EF36EF46A1200D6 |
:0815280030313233343536371F |
:09153000383961626364656600EC |
:020000040001F9 |
:01FFF800AA5E |
:01FFFA00FD09 |
:01FFFD00FB08 |
:00000001FF |
/PIC Stuff/PIC_27J13/i2c.c |
---|
0,0 → 1,448 |
#include "msg_queues.h" |
#include "maindefs.h" |
//#include <i2c.h> |
#include "i2c.h" |
static I2C_DATA *i2c_pdata; |
// Set up the data structures for the i2c code |
// Should be called once before any i2c routines are called |
void i2c_init(I2C_DATA *data) { |
i2c_pdata = data; |
i2c_pdata->buflen = 0; |
i2c_pdata->slave_event_count = 0; |
i2c_pdata->status = I2C_IDLE; |
i2c_pdata->slave_error_count = 0; |
i2c_pdata->bufind = 0; |
i2c_pdata->buflen = 0; |
i2c_pdata->slave_in_last_byte = 0; |
i2c_pdata->slave_sending_data = 0; |
i2c_pdata->slave_sending_blank_data = 0; |
i2c_pdata->mode = 0; |
i2c_pdata->master_dest_addr = 0; |
i2c_pdata->master_state = I2C_MASTER_IDLE; |
} |
// Setup the PIC to operate as a master. |
void i2c_configure_master() { |
i2c_pdata->mode = I2C_MODE_MASTER; |
TRISCbits.TRISC3 = 1; |
TRISCbits.TRISC4 = 1; |
SSPSTAT = 0x0; |
SSPCON1 = 0x0; |
SSPCON2 = 0x0; |
SSPCON1bits.SSPM = 0x8; // I2C Master Mode |
SSPADD = 0x77; // Operate at 100KHz (48MHz) |
SSPSTATbits.SMP = 1; // Disable Slew Rate Control |
SSPCON1bits.SSPEN = 1; // Enable MSSP Module |
} |
// Sends length number of bytes in msg to specified address (no R/W bit) |
void i2c_master_send(unsigned char address, unsigned char length, unsigned char *msg) { |
int i; |
if (length == 0) |
return; |
// Copy message to send into buffer and save length/address |
for (i = 0; i < length; i++) { |
i2c_pdata->buffer[i] = msg[i]; |
} |
i2c_pdata->buflen = length; |
i2c_pdata->master_dest_addr = address; |
i2c_pdata->bufind = 0; |
// Change status to 'next' operation |
i2c_pdata->status = I2C_SEND_ADDR; |
i2c_pdata->master_state = I2C_MASTER_SEND; |
// Generate start condition |
SSPCON2bits.SEN = 1; |
} |
// Reads length number of bytes from address (no R/W bit) |
void i2c_master_recv(unsigned char address, unsigned char length) { |
if (length == 0) |
return; |
// Save length and address to get data from |
i2c_pdata->buflen = length; |
i2c_pdata->master_dest_addr = address; |
i2c_pdata->bufind = 0; |
// Change status to 'next' operation |
i2c_pdata->status = I2C_SEND_ADDR; |
i2c_pdata->master_state = I2C_MASTER_RECV; |
// Generate start condition |
SSPCON2bits.SEN = 1; |
} |
// Setup the PIC to operate as a slave. The address must not include the R/W bit |
void i2c_configure_slave(unsigned char addr) { |
i2c_pdata->mode = I2C_MODE_SLAVE; |
// Ensure the two lines are set for input (we are a slave) |
TRISCbits.TRISC3 = 1; |
TRISCbits.TRISC4 = 1; |
SSPADD = addr << 1; // Set the slave address |
SSPSTAT = 0x0; |
SSPCON1 = 0x0; |
SSPCON2 = 0x0; |
SSPCON1bits.SSPM = 0xE; // Enable Slave 7-bit w/ start/stop interrupts |
SSPSTATbits.SMP = 1; // Slew Off |
SSPCON2bits.SEN = 1; // Enable clock-stretching |
SSPCON1bits.SSPEN = 1; // Enable MSSP Module |
} |
void i2c_interrupt_handler() { |
// Call interrupt depending on which mode we are operating in |
if (i2c_pdata->mode == I2C_MODE_MASTER) { |
i2c_interrupt_master(); |
} else if (i2c_pdata->mode == I2C_MODE_SLAVE) { |
i2c_interrupt_slave(); |
} |
} |
// An internal subroutine used in the master version of the i2c_interrupt_handler |
void i2c_interrupt_master() { |
// If we are in the middle of sending data |
if (i2c_pdata->master_state == I2C_MASTER_SEND) { |
switch (i2c_pdata->status) { |
case I2C_IDLE: |
break; |
case I2C_SEND_ADDR: |
// Send the address with read bit set |
i2c_pdata->status = I2C_CHECK_ACK; |
SSPBUF = (i2c_pdata->master_dest_addr << 1) | 0x0; |
break; |
case I2C_CHECK_ACK: |
// Check if ACK is received or not |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, send next byte of data |
if (i2c_pdata->bufind < i2c_pdata->buflen) { |
SSPBUF = i2c_pdata->buffer[i2c_pdata->bufind]; |
i2c_pdata->bufind++; |
} else { |
// If no more data is to be sent, send stop bit |
i2c_pdata->status = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_pdata->master_state = I2C_MASTER_IDLE; |
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_COMPLETE, (void *) 0); |
} |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_pdata->status = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_pdata->master_state = I2C_MASTER_IDLE; |
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_FAILED, (void *) 0); |
} |
break; |
} |
// If we are in the middle of receiving data |
} else if (i2c_pdata->master_state == I2C_MASTER_RECV) { |
switch (i2c_pdata->status) { |
case I2C_IDLE: |
break; |
case I2C_SEND_ADDR: |
// Send address with write bit set |
i2c_pdata->status = I2C_CHECK_ACK; |
SSPBUF = (i2c_pdata->master_dest_addr << 1) | 0x1; |
break; |
case I2C_CHECK_ACK: |
// Check if ACK is received |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, set module to receive 1 byte of data |
i2c_pdata->status = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_pdata->status = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_pdata->master_state = I2C_MASTER_IDLE; |
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_RECV_FAILED, (void *) 0); |
} |
break; |
case I2C_RCV_DATA: |
// On receive, save byte into buffer |
i2c_pdata->buffer[i2c_pdata->bufind] = SSPBUF; |
i2c_pdata->bufind++; |
if (i2c_pdata->bufind < i2c_pdata->buflen) { |
// If we still need to read, send an ACK to the slave |
i2c_pdata->status = I2C_REQ_DATA; |
SSPCON2bits.ACKDT = 0; // ACK |
SSPCON2bits.ACKEN = 1; |
} else { |
// If we are done reading, send an NACK to the slave |
i2c_pdata->status = I2C_SEND_STOP; |
SSPCON2bits.ACKDT = 1; // NACK |
SSPCON2bits.ACKEN = 1; |
} |
break; |
case I2C_REQ_DATA: |
// Set module to receive one byte of data |
i2c_pdata->status = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
break; |
case I2C_SEND_STOP: |
// Send the stop bit and copy message to send to Main() |
i2c_pdata->status = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_pdata->master_state = I2C_MASTER_IDLE; |
MQ_sendmsg_ToMainFromHigh(i2c_pdata->buflen, MSGTYPE_I2C_MASTER_RECV_COMPLETE, (void *) i2c_pdata->buffer); |
break; |
} |
} |
} |
// An internal subroutine used in the slave version of the i2c_interrupt_handler |
void i2c_handle_start(unsigned char data_read) { |
i2c_pdata->slave_event_count = 1; |
i2c_pdata->buflen = 0; |
// Check to see if we also got the address |
if (data_read) { |
if (SSPSTATbits.D_A == 1) { |
DBG_PRINT_I2C("I2C Start: (ERROR) no address recieved\r\n"); |
// This is bad because we got data and we wanted an address |
i2c_pdata->status = I2C_IDLE; |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_NOADDR; |
} else { |
if (SSPSTATbits.R_W == 1) { |
i2c_pdata->status = I2C_SEND_DATA; |
} else { |
i2c_pdata->status = I2C_RCV_DATA; |
} |
} |
} else { |
i2c_pdata->status = I2C_STARTED; |
} |
} |
void i2c_interrupt_slave() { |
unsigned char i2c_data; |
unsigned char data_read_from_buffer = 0; |
unsigned char data_written_to_buffer = 0; |
unsigned char msg_send_data_to_main = 0; |
unsigned char overrun_error = 0; |
unsigned char error_buf[3]; |
unsigned char msgtype = 0; |
// Clear SSPOV (overflow bit) |
if (SSPCON1bits.SSPOV == 1) { |
DBG_PRINT_I2C("I2C: overflow detected\r\n"); |
SSPCON1bits.SSPOV = 0; |
// We failed to read the buffer in time, so we know we |
// can't properly receive this message, just put us in the |
// a state where we are looking for a new message |
i2c_pdata->status = I2C_IDLE; |
overrun_error = 1; |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_OVERRUN; |
} |
// Read SPPxBUF if it is full |
if (SSPSTATbits.BF == 1) { |
i2c_data = SSPBUF; |
DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSPBUF); |
data_read_from_buffer = 1; |
} |
if (!overrun_error) { |
switch (i2c_pdata->status) { |
case I2C_IDLE: |
{ |
// Ignore anything except a start |
if (SSPSTATbits.S == 1) { |
i2c_handle_start(data_read_from_buffer); |
// If we see a slave read, then we need to handle it here |
if (i2c_pdata->status == I2C_SEND_DATA) { |
// Return the first byte (message id) |
SSPBUF = 0x3; |
} |
} |
break; |
} |
case I2C_STARTED: |
{ |
// In this case, we expect either an address or a stop bit |
if (SSPSTATbits.P == 1) { |
// We need to check to see if we also read an address (a message of length 0) |
i2c_pdata->slave_event_count++; |
if (data_read_from_buffer) { |
if (SSPSTATbits.D_A == 0) { |
msg_send_data_to_main = 1; |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_NODATA; |
} |
} |
// Return to idle mode |
i2c_pdata->status = I2C_IDLE; |
} else if (data_read_from_buffer) { |
i2c_pdata->slave_event_count++; |
if (SSPSTATbits.D_A == 0) { |
if (SSPSTATbits.R_W == 0) { // Slave write |
i2c_pdata->status = I2C_RCV_DATA; |
} else { // Slave read |
i2c_pdata->status = I2C_SEND_DATA; |
// Return the first byte (message id) |
SSPBUF = 0x3; |
} |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_pdata->slave_error_count++; |
i2c_pdata->status = I2C_IDLE; |
i2c_pdata->slave_error_code = I2C_ERR_NODATA; |
} |
} |
break; |
} |
case I2C_SEND_DATA: |
{ |
// If we arnt current in the middle of sending data, check to see |
// if there is a message in the queue to send |
if (!i2c_pdata->slave_sending_data) { |
// Check the message type of the next message in queue |
msgtype = MQ_peek_FromMainToHigh(); |
if (msgtype != MSGTYPE_I2C_REPLY || msgtype == 0) { |
// If the message queue is empty or to another interrupt processor, return 0xFF |
DBG_PRINT_I2C("I2C: Returning 0xFF [%d:%d]\r\n", 0, i2c_pdata->slave_in_last_byte-1); |
SSPBUF = 0xFF; |
i2c_pdata->bufind = 1; |
i2c_pdata->slave_sending_data = 1; |
i2c_pdata->slave_sending_blank_data = 1; |
data_written_to_buffer = 1; |
} else { |
i2c_pdata->buflen = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *)i2c_pdata->slave_outbufmsgtype, (void *) i2c_pdata->buffer); |
// DBG_PRINT_I2C("%x\r\n",i2c_ptr->buffer[0]); |
// DBG_PRINT_I2C("I2C: buffer Message Length: %d\r\n",i2c_ptr->outbuflen); |
if (i2c_pdata->buflen > 0) { |
// Otherwise return the first byte of data |
DBG_PRINT_I2C("I2C: Returning %x [%d,%d]\r\n", i2c_pdata->buffer[0], 0, i2c_pdata->buflen-1); |
SSPBUF = i2c_pdata->buffer[0]; |
i2c_pdata->bufind = 1; |
i2c_pdata->slave_sending_data = 1; |
data_written_to_buffer = 1; |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) Unexpected msg in queue, type = %x\r\n", i2c_pdata->slave_outbufmsgtype); |
} |
} |
} else if (i2c_pdata->slave_sending_blank_data) { |
// If we are currently sending 0xFFs back, keep sending for the requested number of bytes |
if (i2c_pdata->bufind < i2c_pdata->slave_in_last_byte) { |
DBG_PRINT_I2C("I2C: Returning 0xFF [%d:%d]\r\n", i2c_pdata->bufind, i2c_pdata->slave_in_last_byte-1); |
SSPBUF = 0xFF; |
i2c_pdata->bufind++; |
data_written_to_buffer = 1; |
} else { |
// We have nothing left to send |
i2c_pdata->slave_sending_data = 0; |
i2c_pdata->slave_sending_blank_data = 0; |
i2c_pdata->status = I2C_IDLE; |
} |
} else { |
// Otherwise keep sending back the requested data |
if (i2c_pdata->bufind < i2c_pdata->buflen) { |
DBG_PRINT_I2C("I2C: Returning %x [%d,%d]\r\n", i2c_pdata->buffer[i2c_pdata->bufind], i2c_pdata->bufind, i2c_pdata->buflen-1); |
SSPBUF = i2c_pdata->buffer[i2c_pdata->bufind]; |
i2c_pdata->bufind++; |
data_written_to_buffer = 1; |
} else { |
// We have nothing left to send |
i2c_pdata->slave_sending_data = 0; |
i2c_pdata->status = I2C_IDLE; |
} |
} |
break; |
} |
case I2C_RCV_DATA: |
{ |
// We expect either data or a stop bit or a (if a restart, an addr) |
if (SSPSTATbits.P == 1) { |
// We need to check to see if we also read data |
i2c_pdata->slave_event_count++; |
if (data_read_from_buffer) { |
if (SSPSTATbits.D_A == 1) { |
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_data; |
i2c_pdata->buflen++; |
msg_send_data_to_main = 1; |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_NODATA; |
i2c_pdata->status = I2C_IDLE; |
} |
} else { |
msg_send_data_to_main = 1; |
} |
i2c_pdata->status = I2C_IDLE; |
} else if (data_read_from_buffer) { |
i2c_pdata->slave_event_count++; |
if (SSPSTATbits.D_A == 1) { |
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_data; |
i2c_pdata->buflen++; |
} else /* a restart */ { |
if (SSPSTATbits.R_W == 1) { |
i2c_pdata->status = I2C_SEND_DATA; |
msg_send_data_to_main = 1; |
// Return the first byte (message id) |
SSPBUF = 0x3; |
} else { // Bad to recv an address again, we aren't ready |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_NODATA; |
i2c_pdata->status = I2C_IDLE; |
} |
} |
} |
break; |
} |
} |
} |
// Release the clock stretching bit (if we should) |
if (data_read_from_buffer || data_written_to_buffer) { |
// Release the clock |
if (SSPCON1bits.CKP == 0) { |
SSPCON1bits.CKP = 1; |
} |
} |
// Must check if the message is too long |
if ((i2c_pdata->buflen > MAXI2CBUF - 2) && (!msg_send_data_to_main)) { |
DBG_PRINT_I2C("I2C: (ERROR) message too long\r\n"); |
i2c_pdata->status = I2C_IDLE; |
i2c_pdata->slave_error_count++; |
i2c_pdata->slave_error_code = I2C_ERR_MSGTOOLONG; |
} |
if (msg_send_data_to_main) { |
DBG_PRINT_I2C("I2C: sending message to main()\r\n"); |
i2c_pdata->slave_in_last_byte = i2c_pdata->buffer[i2c_pdata->buflen-1]; |
i2c_pdata->buffer[i2c_pdata->buflen] = i2c_pdata->slave_event_count; |
MQ_sendmsg_ToMainFromHigh(i2c_pdata->buflen + 1, MSGTYPE_I2C_DATA, (void *) i2c_pdata->buffer); |
i2c_pdata->buflen = 0; |
} else if (i2c_pdata->slave_error_count >= I2C_ERR_THRESHOLD) { |
DBG_PRINT_I2C("I2C: (ERROR) error threshold passed\r\n"); |
error_buf[0] = i2c_pdata->slave_error_count; |
error_buf[1] = i2c_pdata->slave_error_code; |
error_buf[2] = i2c_pdata->slave_event_count; |
MQ_sendmsg_ToMainFromHigh(sizeof (unsigned char) *3, MSGTYPE_I2C_DBG, (void *) error_buf); |
i2c_pdata->slave_error_count = 0; |
} |
} |
unsigned char i2c_master_busy() { |
if (i2c_pdata->master_state == I2C_MASTER_IDLE) { |
return 0; |
} else { |
return 1; |
} |
} |
/PIC Stuff/PIC_27J13/i2c.h |
---|
0,0 → 1,57 |
#ifndef __i2c_h |
#define __i2c_h |
#define MAXI2CBUF MSGLEN |
#define I2C_IDLE 0x5 |
#define I2C_STARTED 0x6 |
#define I2C_RCV_DATA 0x7 |
#define I2C_SEND_DATA 0x8 |
#define I2C_SEND_ADDR 0x9 |
#define I2C_CHECK_ACK 0xB |
#define I2C_REQ_DATA 0xC |
#define I2C_SEND_STOP 0xD |
#define I2C_MODE_SLAVE 0x10 |
#define I2C_MODE_MASTER 0x11 |
#define I2C_MASTER_SEND 0x20 |
#define I2C_MASTER_RECV 0x21 |
#define I2C_MASTER_IDLE 0x22 |
#define I2C_ERR_THRESHOLD 1 |
#define I2C_ERR_OVERRUN 0x4 |
#define I2C_ERR_NOADDR 0x5 |
#define I2C_ERR_NODATA 0x6 |
#define I2C_ERR_MSGTOOLONG 0x7 |
#define I2C_ERR_MSG_TRUNC 0x8 |
typedef struct __I2C_DATA { |
unsigned char buffer[MAXI2CBUF]; |
int buflen; |
unsigned char status; |
unsigned char bufind; |
unsigned char slave_event_count; |
unsigned char slave_error_code; |
unsigned char slave_error_count; |
unsigned char slave_in_last_byte; |
unsigned char slave_outbufmsgtype; |
unsigned char slave_sending_data; |
unsigned char slave_sending_blank_data; |
unsigned char master_dest_addr; |
unsigned char master_state; |
unsigned char mode; |
} I2C_DATA; |
void i2c_init(I2C_DATA *); |
void i2c_interrupt_handler(void); |
void i2c_interrupt_slave(void); |
void i2c_interrupt_master(void); |
void i2c_configure_slave(unsigned char); |
void i2c_configure_master(void); |
void i2c_master_send(unsigned char address, unsigned char length,unsigned char *msg); |
void i2c_master_recv(unsigned char address, unsigned char length); |
unsigned char i2c_master_busy(void); |
#endif |
/PIC Stuff/PIC_27J13/interrupts.c |
---|
0,0 → 1,208 |
#include "maindefs.h" |
#include "uart.h" |
#include "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 |
IPR1bits.RC1IP = 1; // USART1 RX interrupt |
IPR1bits.TX1IP = 1; // USART1 TX interrupt |
// IPR3bits.RC2IP = 1; // USART2 RX interrupt |
// IPR1bits.SSPIP = 1; // I2C interrupt |
// Low priority interrupts |
// INTCON2bits.TMR0IP = 0; // Timer0 interrupt |
// IPR1bits.TMR1IP = 0; // Timer1 interrupt |
// IPR2bits.TMR3IP = 0; // Timer 3 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 USART1 RX |
if (PIR1bits.RC1IF) { |
// Call the interrupt handler |
UART1_Recv_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.RC1IF = 0; |
return; |
} |
// Check to see if we have an interrupt on USART1 TX |
if (PIR1bits.TX1IF) { |
// Call the interrupt handler |
UART1_Send_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.TX1IF = 0; |
return; |
} |
// // 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_2_recv_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR3bits.RC2IF = 0; |
// } |
// // 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; |
// } |
} |
//---------------------------------------------------------------------------- |
// 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 ADC |
// if (PIR1bits.ADIF) { |
// // Call the interrupt handler |
// adc_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR1bits.ADIF = 0; |
// } |
} |
/PIC Stuff/PIC_27J13/interrupts.h |
---|
0,0 → 1,29 |
#ifndef __interrupts_h |
#define __interrupts_h |
// Note: As the interrupt system is currently setup, at the end |
// of each high-priority interrupt, the system will check to |
// see if the processor may be put to sleep. This is done |
// with the call sleep_high_interrupt_if_okay() which is defined |
// in msg_queues.h -- init_queues() MUST be called prior to |
// enabling interrupts if sleep_high_interrupt_if_okay() is called! |
// Initialize the interrupts |
void interrupt_init(void); |
// enable the interrupts (high and low priority) |
void interrupt_enable(void); |
// Are we calling from a high-priority interrupt? |
int interrupt_in_high_interrupt_routine(void); |
// Is a low-priority interrupt active? |
int interrupt_low_int_active(void); |
// Are we calling from a low-priority interrupt? |
int interrupt_in_low_interrupt_routine(void); |
// Are we calling this from the "main" routine (i.e., not an interrrupt handler?) |
int interrupt_in_main_routine(void); |
#endif |
/PIC Stuff/PIC_27J13/led_driver.c |
---|
0,0 → 1,152 |
#include "maindefs.h" |
#include "led_driver.h" |
#include "delays.h" |
/* Output Pins: |
* RA0 - LED Display Latch Enable (PPS) |
* RA1 - LED Display CLK (PPS) |
* RA2 - LED Display DIN (PPS) |
* RA3 - LED Display Output Enable (PPS) |
*/ |
void led_driver_init() { |
TRISAbits.TRISA0 = 0; // LE |
TRISAbits.TRISA1 = 0; // CLK |
TRISAbits.TRISA2 = 0; // DAT |
TRISAbits.TRISA3 = 0; // OE |
LATAbits.LATA0 = 0; // LE |
LATAbits.LATA1 = 0; // CLK |
LATAbits.LATA2 = 0; // DAT |
LATAbits.LATA3 = 0; // OE |
led_driver_data(0,0); |
} |
void led_driver_clock() { |
LATAbits.LATA1 = 0x1; // Simple clock output toggle |
Nop(); |
LATAbits.LATA1 = 0x0; |
Nop(); |
} |
void led_driver_data(char left, char right) { |
int i; |
LATAbits.LATA0 = 0x0; // Set latch low to pause display |
for (i = 0; i < 8; i++) { |
LATAbits.LATA2 = right & 0x1; // Shift out right character first |
led_driver_clock(); |
right >>= 1; |
} |
for (i = 0; i < 8; i++) { |
LATAbits.LATA2 = left & 0x1; // Then shift out left character |
led_driver_clock(); |
left >>= 1; |
} |
LATAbits.LATA0 = 0x1; // Set latch high to resume display |
} |
void led_driver_num(unsigned char data) { |
unsigned char left = 0; |
unsigned char right = 0; |
unsigned char tmp = 0; |
// if (data > 99) { |
// led_driver_data(0,0); |
// return; |
// } |
// Determine right character (1s digit) |
tmp = data % 10; |
switch (tmp) { |
case 0: |
right = LED_CHAR_0; |
break; |
case 1: |
right = LED_CHAR_1; |
break; |
case 2: |
right = LED_CHAR_2; |
break; |
case 3: |
right = LED_CHAR_3; |
break; |
case 4: |
right = LED_CHAR_4; |
break; |
case 5: |
right = LED_CHAR_5; |
break; |
case 6: |
right = LED_CHAR_6; |
break; |
case 7: |
right = LED_CHAR_7; |
break; |
case 8: |
right = LED_CHAR_8; |
break; |
case 9: |
right = LED_CHAR_9; |
break; |
} |
// Determine left character (10s digit) |
tmp = data / 10; |
switch (tmp) { |
case 0: |
left = LED_CHAR_0; |
break; |
case 1: |
left = LED_CHAR_1; |
break; |
case 2: |
left = LED_CHAR_2; |
break; |
case 3: |
left = LED_CHAR_3; |
break; |
case 4: |
left = LED_CHAR_4; |
break; |
case 5: |
left = LED_CHAR_5; |
break; |
case 6: |
left = LED_CHAR_6; |
break; |
case 7: |
left = LED_CHAR_7; |
break; |
case 8: |
left = LED_CHAR_8; |
break; |
case 9: |
left = LED_CHAR_9; |
break; |
} |
led_driver_data(left, right); |
// if (data <= 25) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_0); |
// } else if (data > 25 && data <= 50) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_1); |
// } else if (data > 50 && data <= 75) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_2); |
// } else if (data > 75 && data <= 100) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_3); |
// } else if (data > 100 && data <= 125) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_4); |
// } else if (data > 125 && data <= 150) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_5); |
// } else if (data > 150 && data <= 175) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_6); |
// } else if (data > 175 && data <= 200) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_7); |
// } else if (data > 200 && data <= 225) { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_8); |
// } else { |
// led_driver_data(LED_CHAR_BLANK,LED_CHAR_9); |
// } |
} |
/PIC Stuff/PIC_27J13/led_driver.h |
---|
0,0 → 1,48 |
#ifndef __led_driver_h |
#define __led_driver_h |
static char LED_CHAR_BLANK = 0b00000000; |
static char LED_CHAR_A = 0b11101110; |
static char LED_CHAR_B = 0b11111110; |
static char LED_CHAR_C = 0b10011100; |
static char LED_CHAR_D = 0b11111100; |
static char LED_CHAR_E = 0b10011110; |
static char LED_CHAR_F = 0b10001110; |
static char LED_CHAR_U = 0b01111100; |
static char LED_CHAR_0 = 0b11111100; |
static char LED_CHAR_1 = 0b01100000; |
static char LED_CHAR_2 = 0b11011010; |
static char LED_CHAR_3 = 0b11110010; |
static char LED_CHAR_4 = 0b01100110; |
static char LED_CHAR_5 = 0b10110110; |
static char LED_CHAR_6 = 0b10111110; |
static char LED_CHAR_7 = 0b11100100; |
static char LED_CHAR_8 = 0b11111110; |
static char LED_CHAR_9 = 0b11110110; |
//#define LED_CHAR_BLANK (char)0b00000000; |
//#define LED_CHAR_A (char)0b11101110; |
//#define LED_CHAR_B (char)0b11111110; |
//#define LED_CHAR_C (char)0b10011100; |
//#define LED_CHAR_D (char)0b11111100; |
//#define LED_CHAR_E (char)0b10011110; |
//#define LED_CHAR_F (char)0b10001110; |
// |
//#define LED_CHAR_0 (char)0b11111100; |
//#define LED_CHAR_1 (char)0b01100000; |
//#define LED_CHAR_2 (char)0b11011010; |
//#define LED_CHAR_3 (char)0b11110010; |
//#define LED_CHAR_4 (char)0b01100110; |
//#define LED_CHAR_5 (char)0b10110110; |
//#define LED_CHAR_6 (char)0b10111110; |
//#define LED_CHAR_7 (char)0b11100100; |
//#define LED_CHAR_8 (char)0b11111110; |
//#define LED_CHAR_9 (char)0b11110110; |
void led_driver_init(void); |
void led_driver_clock(void); |
void led_driver_data(char, char); |
void led_driver_num(unsigned char); |
#endif |
/PIC Stuff/PIC_27J13/main.c |
---|
0,0 → 1,94 |
#include "maindefs.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 <usart.h> |
#include <delays.h> |
#pragma config WDTEN = OFF // Turn off watchdog timer |
#pragma config XINST = OFF // Turn off extended instruction set |
#pragma config OSC = HSPLL // Use external oscillator (101) |
#pragma config PLLDIV = 3 // Set PPL prescaler to 3 (to get 4MHz) |
#pragma config CFGPLLEN = ON // Enable PLL on startup |
#pragma config PLLSEL = PLL96 // Use 96MHz PLL 4MHz -> 96MHz / 2 = 48MHz |
//#pragma config SOSCSEL = HIGH // High Power T1OSC/SOSC circuit selected |
//#pragma config ADCSEL = BIT12 // 12-bit ADrC |
//#pragma config IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed |
/* ----------- IO Pins ----------- |
* RA0 - |
* RA1 - |
* RA2 - |
* RA3 - |
* RA4 - [CANNOT BE USED (VDDCORE/VCAP)] |
* RA5 - |
* RA6 - Oscillator |
* RA7 - Oscillator |
* |
* RC0 - |
* RC1 - |
* RC2 - |
* RC3 - |
* RC4 - |
* RC5 - |
* RC6 - UART Debug Output |
* RC7 - UART Debug Input |
* |
* RB0 - |
* RB1 - |
* RB2 - |
* RB3 - |
* RB4 - |
* RB5 - |
* RB6 - |
* RB7 - |
* ---------------------------- */ |
//static I2C_DATA i2c_data; |
//static XBEE_DATA xbee_data; |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char buffer[100]; |
/* --------------------- 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; |
UART1_Init(); // Initialize the UART handler code |
// xbee_init(&xbee_data); // Initialize the XBee handler code |
// i2c_init(&i2c_data); // Initialize the I2C handler code |
// adc_init(); // Initialize the ADC |
// timers_init(); // Initialize timers |
// port_b_int_init(); // Initialze Port B interrupt handler |
// pwm_init(); // Initialize the PWM output driver |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
// Loop and process recieved messages from interrupts; |
while (1) { |
length = UART1_Read((char *)buffer); |
if (length != 0) { |
UART1_WriteB((char *)buffer, length) ; |
} |
Delay10KTCYx(255); |
} |
} |
/PIC Stuff/PIC_27J13/maindefs.h |
---|
0,0 → 1,85 |
#ifndef __maindefs_h |
#define __maindefs_h |
#include <p18f27j13.h> |
#include <stdio.h> |
#define _DEBUG |
// Enable or disable debug prints depending on project preprocessor (_DEBUG) |
#ifdef _DEBUG |
#define DBG_PRINT_MAIN(x) UART1_WriteS(x) |
#define DBG_PRINT_UART(x) UART1_WriteS(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) |
#else |
#define DBG_PRINT_MAIN(x) |
#define DBG_PRINT_UART(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 |
// 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_WAIT_WRITE_LENGTH_ACK, |
I2C_WAIT_WRITE_DATA_ACK, |
I2C_WAIT_REPLY_LENGTH, |
I2C_WAIT_REPLY_DATA |
}; |
#endif |
/PIC Stuff/PIC_27J13/nbproject/Makefile-default.mk |
---|
0,0 → 1,149 |
# |
# 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 |
# Include makefile containing local settings |
ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" |
include nbproject/Makefile-local-default.mk |
endif |
# Environment |
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_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
else |
IMAGE_TYPE=production |
OUTPUT_SUFFIX=hex |
DEBUGGABLE_SUFFIX=cof |
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${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}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o |
POSSIBLE_DEPFILES=${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/uart.o.d |
# Object Files |
OBJECTFILES=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o |
CFLAGS= |
ASFLAGS= |
LDLIBSOPTIONS= |
############# 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. # |
####################################################################### |
# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build |
FIXDEPS=fixDeps |
.build-conf: ${BUILD_SUBPROJECTS} |
${MAKE} -f nbproject/Makefile-default.mk dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
MP_PROCESSOR_OPTION=18F27J13 |
MP_PROCESSOR_OPTION_LD=18f27j13 |
MP_LINKER_DEBUG_OPTION= |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: assemble |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
else |
endif |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: compile |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
${OBJECTDIR}/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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c |
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c |
@${DEP_GEN} -d ${OBJECTDIR}/main.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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c |
@${DEP_GEN} -d ${OBJECTDIR}/uart.o |
else |
${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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c |
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c |
@${DEP_GEN} -d ${OBJECTDIR}/main.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) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c |
@${DEP_GEN} -d ${OBJECTDIR}/uart.o |
endif |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: link |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -x -u_DEBUG -z__MPLAB_BUILD=1 -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_PK3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} |
else |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} |
endif |
# Subprojects |
.build-subprojects: |
# Subprojects |
.clean-subprojects: |
# Clean Targets |
.clean-conf: ${CLEAN_SUBPROJECTS} |
${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 |
/PIC Stuff/PIC_27J13/nbproject/Makefile-genesis.properties |
---|
0,0 → 1,8 |
# |
#Thu Jun 28 12:38:48 EDT 2012 |
default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=fd3c294f650afc344cfb0579847b1618 |
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.40\\bin |
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=39edbdd4b2849b7912992109f4b86781 |
default.languagetoolchain.version=3.40 |
host.platform=windows |
conf.ids=default |
/PIC Stuff/PIC_27J13/nbproject/Makefile-impl.mk |
---|
0,0 → 1,69 |
# |
# 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_27J13 |
# 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 |
# clobber |
.clobber-impl: .clobber-pre .depcheck-impl |
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean |
# all |
.all-impl: .all-pre .depcheck-impl |
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build |
# 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 |
/PIC Stuff/PIC_27J13/nbproject/Makefile-local-default.mk |
---|
0,0 → 1,35 |
# |
# Generated Makefile - do not edit! |
# |
# |
# This file contains information about the location of compilers and other tools. |
# If you commmit this file into your revision control server, you will be able to |
# to checkout the project and build it from the command line with make. However, |
# if more than one person works on the same project, then this file might show |
# conflicts since different users are bound to have compilers in different places. |
# In that case you might choose to not commit this file and let MPLAB X recreate this file |
# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at |
# least once so the file gets created and the project can be built. Finally, you can also |
# avoid using this file at all if you are only building from the command line with make. |
# You can invoke make with the values of the macros: |
# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... |
# |
SHELL=cmd.exe |
PATH_TO_IDE_BIN=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/ |
# Adding MPLAB X bin directory to path. |
PATH:=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/:$(PATH) |
# Path to java used to run MPLAB X when this makefile was created |
MP_JAVA_PATH="C:\Program Files (x86)\Microchip\MPLABX\sys\java\jre1.6.0_32-windows-x64\java-windows/bin/" |
OS_CURRENT="$(shell uname -s)" |
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" |
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 |
/PIC Stuff/PIC_27J13/nbproject/Makefile-variables.mk |
---|
0,0 → 1,13 |
# |
# Generated - do not edit! |
# |
# NOCDDL |
# |
CND_BASEDIR=`pwd` |
# default configuration |
CND_ARTIFACT_DIR_default=dist/default/production |
CND_ARTIFACT_NAME_default=PIC_27J13.production.hex |
CND_ARTIFACT_PATH_default=dist/default/production/PIC_27J13.production.hex |
CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package |
CND_PACKAGE_NAME_default=pic27j13.tar |
CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/pic27j13.tar |
/PIC Stuff/PIC_27J13/nbproject/Package-default.bash |
---|
0,0 → 1,73 |
#!/bin/bash -x |
# |
# Generated - do not edit! |
# |
# Macros |
TOP=`pwd` |
CND_CONF=default |
CND_DISTDIR=dist |
TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging |
TMPDIRNAME=tmp-packaging |
OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
OUTPUT_BASENAME=PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
PACKAGE_TOP_DIR=pic27j13/ |
# 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}/pic27j13/bin |
copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 |
# Generate tar file |
cd "${TOP}" |
rm -f ${CND_DISTDIR}/${CND_CONF}/package/pic27j13.tar |
cd ${TMPDIR} |
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/pic27j13.tar * |
checkReturnCode |
# Cleanup |
cd "${TOP}" |
rm -rf ${TMPDIR} |
/PIC Stuff/PIC_27J13/nbproject/configurations.xml |
---|
0,0 → 1,145 |
<?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>interrupts.h</itemPath> |
<itemPath>maindefs.h</itemPath> |
<itemPath>uart.h</itemPath> |
</logicalFolder> |
<logicalFolder name="LibraryFiles" |
displayName="Library Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="LinkerScript" |
displayName="Linker Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="ObjectFiles" |
displayName="Object Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="SourceFiles" |
displayName="Source Files" |
projectFiles="true"> |
<itemPath>interrupts.c</itemPath> |
<itemPath>main.c</itemPath> |
<itemPath>uart.c</itemPath> |
</logicalFolder> |
<logicalFolder name="ExternalFiles" |
displayName="Important Files" |
projectFiles="false"> |
<itemPath>Makefile</itemPath> |
</logicalFolder> |
</logicalFolder> |
<projectmakefile>Makefile</projectmakefile> |
<confs> |
<conf name="default" type="2"> |
<toolsSet> |
<developmentServer>localhost</developmentServer> |
<targetDevice>PIC18F27J13</targetDevice> |
<targetHeader></targetHeader> |
<platformTool>PICkit3PlatformTool</platformTool> |
<languageToolchain>C18</languageToolchain> |
<languageToolchainVersion>3.42</languageToolchainVersion> |
<platform>3</platform> |
</toolsSet> |
<compileType> |
<linkerTool> |
<linkerLibItems> |
</linkerLibItems> |
</linkerTool> |
<loading> |
<useAlternateLoadableFile>false</useAlternateLoadableFile> |
<alternateLoadableFile></alternateLoadableFile> |
</loading> |
</compileType> |
<makeCustomizationType> |
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled> |
<makeCustomizationPreStep></makeCustomizationPreStep> |
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled> |
<makeCustomizationPostStep></makeCustomizationPostStep> |
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID> |
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines> |
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile> |
</makeCustomizationType> |
<C18> |
<property key="code-model" value="mL"/> |
<property key="data-model" value="Oa-"/> |
<property key="default-char-unsigned" value="false"/> |
<property key="enable-all-optimizations" value="true"/> |
<property key="enable-int-promotion" value="true"/> |
<property key="enable-multi-bank-stack-model" value="false"/> |
<property key="enable-ob" value="true"/> |
<property key="enable-od" value="true"/> |
<property key="enable-om" value="true"/> |
<property key="enable-on" value="true"/> |
<property key="enable-op" value="true"/> |
<property key="enable-opa" value="true"/> |
<property key="enable-or" value="true"/> |
<property key="enable-os" value="true"/> |
<property key="enable-ot" value="true"/> |
<property key="enable-ou" value="true"/> |
<property key="enable-ow" value="true"/> |
<property key="extra-include-directories" value=""/> |
<property key="optimization-master" value="Enable all"/> |
<property key="preprocessor-macros" value=""/> |
<property key="procedural-abstraction-passes" value="0"/> |
<property key="storage-class" value="sca"/> |
<property key="verbose" value="false"/> |
<property key="warning-level" value="2"/> |
</C18> |
<C18-AS> |
<property key="cross.reference.file" value=""/> |
<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"/> |
</C18-AS> |
<C18-LD> |
<property key="cod-file" value="false"/> |
<property key="extra-lib-directories" value=""/> |
<property key="hex-output-format" value="INHX32"/> |
<property key="map-file" value=""/> |
</C18-LD> |
<C18LanguageToolchain> |
<property key="extended-mode" value="false"/> |
<property key="extended-mode-mcc18" value="false"/> |
<property key="extended-mode-mpasm" value="false"/> |
<property key="extended-mode-mplink" value="false"/> |
<property key="stack-analysis" value="false"/> |
<property key="stack-analysis-mcc18" value="false"/> |
<property key="stack-analysis-mplink" value="false"/> |
</C18LanguageToolchain> |
<PICkit3PlatformTool> |
<property key="AutoSelectMemRanges" value="auto"/> |
<property key="Freeze Peripherals" value="true"/> |
<property key="SecureSegment.SegmentProgramming" value="FullChipProgramming"/> |
<property key="ToolFirmwareFilePath" |
value="Press to browse for a specific firmware version"/> |
<property key="ToolFirmwareOption.UseLatestFirmware" value="true"/> |
<property key="hwtoolclock.frcindebug" value="false"/> |
<property key="memories.aux" value="false"/> |
<property key="memories.eeprom" value="false"/> |
<property key="memories.flashdata" value="true"/> |
<property key="memories.id" value="false"/> |
<property key="memories.programmemory" value="true"/> |
<property key="memories.programmemory.end" value="0x1fff7"/> |
<property key="memories.programmemory.start" value="0x0"/> |
<property key="poweroptions.powerenable" value="true"/> |
<property key="programmertogo.imagename" value=""/> |
<property key="programoptions.eraseb4program" value="true"/> |
<property key="programoptions.preserveeeprom" value="false"/> |
<property key="programoptions.preserveprogramrange" value="false"/> |
<property key="programoptions.preserveprogramrange.end" value="0x3f"/> |
<property key="programoptions.preserveprogramrange.start" value="0x0"/> |
<property key="programoptions.preserveuserid" value="false"/> |
<property key="programoptions.usehighvoltageonmclr" value="false"/> |
<property key="programoptions.uselvpprogramming" value="false"/> |
<property key="voltagevalue" value="3.25"/> |
</PICkit3PlatformTool> |
</conf> |
</confs> |
</configurationDescriptor> |
/PIC Stuff/PIC_27J13/nbproject/private/configurations.xml |
---|
0,0 → 1,25 |
<?xml version="1.0" encoding="UTF-8"?> |
<configurationDescriptor version="62"> |
<projectmakefile>Makefile</projectmakefile> |
<defaultConf>0</defaultConf> |
<confs> |
<conf name="default" type="2"> |
<platformToolSN>:=MPLABCommUSB:=04D8:=900A:=0002:=Microchip Technology Inc.:=PICkit 3:=BUR114189291:=x:=en</platformToolSN> |
<languageToolchainDir>C:\Program Files (x86)\Microchip\mplabc18\v3.42\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> |
/PIC Stuff/PIC_27J13/nbproject/private/private.properties |
---|
--- PIC_27J13/nbproject/private/private.xml (nonexistent) |
+++ PIC_27J13/nbproject/private/private.xml (revision 119) |
@@ -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> |
/PIC Stuff/PIC_27J13/nbproject/project.properties |
---|
--- PIC_27J13/nbproject/project.xml (nonexistent) |
+++ PIC_27J13/nbproject/project.xml (revision 119) |
@@ -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_27J13</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> |
/PIC Stuff/PIC_27J13/pin_interrupts.c |
---|
0,0 → 1,101 |
#include "maindefs.h" |
#include "pin_interrupts.h" |
#include "pwm.h" |
#include "msg_queues.h" |
#include <delays.h> |
static unsigned char port_b_prev_state; |
void intx_init() { |
TRISAbits.TRISA5 = 1; |
TRISCbits.TRISC2 = 0; |
LATCbits.LATC2 = 0; |
RPINR1 = 2; // Bind INT1 interrupt to RP2 |
INTCON2bits.INTEDG1 = 0; // Trigger on falling edge |
} |
void int1_interrupt_handler() { |
LATCbits.LATC2 = 1; |
Delay10TCYx(255); |
LATCbits.LATC2 = 0; |
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; |
} |
/PIC Stuff/PIC_27J13/pin_interrupts.h |
---|
0,0 → 1,10 |
#ifndef __pin_interrupts_h |
#define __pin_interrupts_h |
void intx_init(void); |
void int1_interrupt_handler(void); |
void port_b_int_init(void); |
void port_b_int_interrupt_handler(void); |
#endif |
/PIC Stuff/PIC_27J13/pwm.c |
---|
0,0 → 1,31 |
#include "maindefs.h" |
#include "pwm.h" |
#include <pwm.h> |
void pwm_init() { |
// Configure pins RC5 and RC7 as outputs |
TRISCbits.TRISC0 = 0; |
TRISCbits.TRISC1 = 0; |
LATCbits.LATC0 = 0; |
LATCbits.LATC1 = 0; |
RPOR11 = 14; // Set RP11 to ECCP1 PWM Output Channel A |
RPOR12 = 15; // Set RP12 to ECCP1 PWM Output Channel B |
} |
void pwm_start() { |
OpenEPWM1(0xFF, ECCP_1_SEL_TMR12); // 38kHz Frequency |
SetDCEPWM1(512); // 50% Duty Cycle |
// Wait for completion of a full PWM cycle before enabling output mode |
while(!PIR1bits.TMR2IF); |
SetOutputEPWM1(SINGLE_OUT, PWM_MODE_1); |
// Enable ECCP1 output channels A and B |
PSTR1CONbits.STRA = 1; |
PSTR1CONbits.STRB = 1; |
} |
void pwm_stop() { |
CloseEPWM1(); |
} |
/PIC Stuff/PIC_27J13/pwm.h |
---|
0,0 → 1,10 |
#ifndef __pwm_h |
#define __pwm_h |
void pwm_init(void); |
void pwm_start(void); |
void pwm_stop(void); |
static char pwm_on = 0; |
#endif |
/PIC Stuff/PIC_27J13/timers.c |
---|
0,0 → 1,84 |
/* 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" |
void timers_init() { |
/*--------------------Timer Delay Formulas-------------------- */ |
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */ |
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */ |
/* ----------------------------------------------------------- */ |
#ifdef _BASE_STATION |
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16); |
T0CONbits.TMR0ON = 0; // Timer 0 initially off |
#endif |
// // Set timer 1 to overflow every two seconds |
// OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & |
// T1_SOURCE_PINOSC & T1_PS_1_1 & |
// T1_OSC1EN_ON & T1_SYNC_EXT_OFF, |
// TIMER_GATE_OFF & TIMER_GATE_INT_OFF); |
#ifdef _REMOTE |
// 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 |
#endif |
} |
// Interrupt handler for timer 0 |
void timer0_interrupt_handler() { |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER0, (void *) 0); |
} |
void timer0_enable() { |
T0CONbits.TMR0ON = 1; |
} |
void timer0_disable() { |
T0CONbits.TMR0ON = 0; |
} |
// Interrupt handler for timer 1 |
void timer1_interrupt_handler() { |
// Set timer to overflow every 10ms |
WriteTimer1(62259); |
} |
void timer3_interrupt_handler() { |
if (!pwm_on) { |
// Turn on PWM |
pwm_start(); |
pwm_on = 1; |
WriteTimer3(0xE500); // Send 38kHz pulses for 600us |
} else { |
// Turn off PWM |
pwm_stop(); |
pwm_on = 0; |
WriteTimer3(0xE500); // Send low for 0.6ms |
// WriteTimer3(0xD000); // Send low for 1ms |
// WriteTimer3(0xA000); // Send low for 2ms |
// WriteTimer3(0x1000); // Send low for 5ms |
} |
} |
void timer3_enable() { |
// Enable timer and start PWM |
T3CONbits.TMR3ON = 1; |
pwm_start(); |
pwm_on = 1; |
} |
void timer3_disable() { |
// Disable timer and stop PWM |
T3CONbits.TMR3ON = 0; |
pwm_stop(); |
pwm_on = 0; |
} |
/PIC Stuff/PIC_27J13/timers.h |
---|
0,0 → 1,14 |
#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 timer2_interrupt_handler(void); |
void timer3_interrupt_handler(void); |
void timer3_enable(void); |
void timer3_disable(void); |
#endif |
/PIC Stuff/PIC_27J13/uart.c |
---|
0,0 → 1,141 |
#include "maindefs.h" |
#include "uart.h" |
#include <string.h> |
static UART_DATA uart_1_data; |
void UART1_Init() { |
// Configure the hardware USART device |
// UART1 TX RC6 |
// UART1 RX RC7 |
TRISCbits.TRISC6 = 0; // Tx pin set to output |
TRISCbits.TRISC7 = 1; // Rx pin set to input |
BAUDCON1bits.BRG16 = 0; // 8-bit baud rate generator |
SPBRG1 = 25; // Set UART speed to 115200 baud |
TXSTA1bits.BRGH = 1; // High speed mode |
TXSTA1bits.SYNC = 0; // Async mode |
RCSTA1bits.SPEN = 1; // Serial port enable |
TXSTA1bits.TX9 = 0; // 8 bit transmission |
RCSTA1bits.RX9 = 0; // 8 bit reception |
TXSTA1bits.TXEN = 0; // Enable transmission |
RCSTA1bits.CREN = 1; // Continuous receive mode |
PIE1bits.TX1IE = 1; // Enable TX interrupt |
PIE1bits.RC1IE = 1; // Enable RX interrupt |
// Initialize the buffer that holds UART messages |
uart_1_data.buffer_in_read_ind = 0; |
uart_1_data.buffer_in_write_ind = 0; |
uart_1_data.buffer_in_len = 0; |
} |
//void uart_2_init() { |
// // Configure the PPS USART ports |
// |
// // UART2 RX Pin RP5 |
// RPINR16 = 5; // 5 is PPS RP5 |
// // UART2 TX Pin RP6 |
// RPOR6 = 6; // 6 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output) |
// |
// Open2USART(USART_TX_INT_OFF & // Interrupt on TX off |
// USART_RX_INT_ON & // Interrupt on RX on |
// USART_ASYNCH_MODE & // Operate in async mode |
// USART_EIGHT_BIT & // Operate in 8-bit mode |
// USART_CONT_RX & // Continuously recieve messages |
// USART_BRGH_HIGH, 25); // Set UART speed to 115200 baud |
//} |
void UART1_Recv_Interrupt_Handler() { |
unsigned char c; |
if (PIR1bits.RC1IF) { // Check if data receive flag is set |
if (uart_1_data.buffer_in_len == MAXUARTBUF-1) { |
TXSTA1bits.TXEN = 0; // Kill anything currently sending |
DBG_PRINT_UART("UART1 Buffer Overflow!\r\n"); |
c = RCREG1; // Read RCREG to clear it |
} else { |
// Save received data into buffer |
uart_1_data.buffer_in[uart_1_data.buffer_in_write_ind] = RCREG1; |
if (uart_1_data.buffer_in_write_ind == MAXUARTBUF-1) { |
uart_1_data.buffer_in_write_ind = 0; |
} else { |
uart_1_data.buffer_in_write_ind++; |
} |
uart_1_data.buffer_in_len++; |
} |
} |
if (RCSTAbits.OERR == 1) { |
// We've overrun the USART and must reset |
RCSTA1bits.CREN = 0; // Reset UART1 |
RCSTA1bits.CREN = 1; |
TXSTA1bits.TXEN = 0; // Kill anything currently sending |
DBG_PRINT_UART("UART1 Overrun!\r\n"); |
} |
} |
//void uart_2_recv_interrupt_handler() { |
// if (DataRdy2USART()) { |
//// xbee_read_serial(Read2USART()); |
// } |
// |
// if (USART2_Status.OVERRUN_ERROR == 1) { |
// // We've overrun the USART and must reset |
// RCSTA2bits.CREN = 0; // Reset UART2 |
// RCSTA2bits.CREN = 1; |
// } |
//} |
void UART1_Send_Interrupt_Handler() { |
// Put remaining data in TSR for transmit |
if (uart_1_data.buffer_out_ind != uart_1_data.buffer_out_len) { |
TXREG1 = uart_1_data.buffer_out[uart_1_data.buffer_out_ind]; |
uart_1_data.buffer_out_ind++; |
} else { |
while (!TXSTA1bits.TRMT); // Wait for last byte to finish sending |
TXSTA1bits.TXEN = 0; // End transmission and disable TX interrupt |
uart_1_data.buffer_out_ind = 0; |
uart_1_data.buffer_out_len = 0; |
} |
} |
void UART1_WriteS(const rom char *fmt, ...) { |
va_list args; |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
va_start(args, fmt); |
vsprintf((char *)uart_1_data.buffer_out, fmt, args); |
va_end(args); |
uart_1_data.buffer_out_len = strlen((char *)uart_1_data.buffer_out); |
uart_1_data.buffer_out_ind = 1; |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
} |
void UART1_WriteB(const char *msg, unsigned char length) { |
unsigned char i; |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
uart_1_data.buffer_out_len = length; |
uart_1_data.buffer_out_ind = 1; |
for (i = 0; i < length; i++) { |
uart_1_data.buffer_out[i] = msg[i]; |
} |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
} |
/* Reader interface to the UART buffer, returns the number of bytes read */ |
unsigned char UART1_Read(char *buffer) { |
unsigned char i = 0; |
while (uart_1_data.buffer_in_len != 0) { |
buffer[i] = uart_1_data.buffer_in[uart_1_data.buffer_in_read_ind]; |
i++; |
if (uart_1_data.buffer_in_read_ind == MAXUARTBUF-1) { |
uart_1_data.buffer_in_read_ind = 0; |
} else { |
uart_1_data.buffer_in_read_ind++; |
} |
uart_1_data.buffer_in_len--; |
} |
return i; |
} |
/PIC Stuff/PIC_27J13/uart.h |
---|
0,0 → 1,27 |
#ifndef __uart_h |
#define __uart_h |
#define MAXUARTBUF 64 |
// FIFO circular buffer |
typedef struct __UART_DATA { |
unsigned char buffer_in[MAXUARTBUF]; |
unsigned char buffer_in_read_ind; |
unsigned char buffer_in_write_ind; |
unsigned char buffer_in_len; |
unsigned char buffer_out[MAXUARTBUF]; |
unsigned char buffer_out_ind; |
unsigned char buffer_out_len; |
} UART_DATA; |
void UART1_Init(void); |
//void uart_2_init(void); |
void UART1_Recv_Interrupt_Handler(void); |
//void uart_2_recv_interrupt_handler(void); |
void UART1_Send_Interrupt_Handler(void); |
void UART1_WriteS(const rom char *fmt, ...); |
void UART1_WriteB(const char *msg, unsigned char length); |
unsigned char UART1_Read(char *buffer); |
#endif |
/PIC Stuff/PIC_27J13/xbee.c |
---|
0,0 → 1,211 |
#include "maindefs.h" |
#include "msg_queues.h" |
#include "xbee.h" |
#include <usart.h> |
#include <delays.h> |
static XBEE_DATA *xbee_data_ptr; |
static void *xbee_data_array_ptr; |
/* Initialize variables used by this library */ |
void xbee_init(XBEE_DATA *xd) { |
TRISBbits.TRISB0 = 1; // RB0 is CTS, set by XBee chip |
TRISBbits.TRISB1 = 0; // RB1 is RTS, set by PIC |
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 |
xbee_data_ptr = xd; |
xbee_data_ptr->dataind = 0; |
xbee_data_ptr->checksum_sum = 0; |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
// Grab a pointer to where the unique frame array starts |
xbee_data_array_ptr = &(xbee_data_ptr->rcv_frame.FRAME); |
} |
/* Here we handle the serial input from the UART interrupt */ |
void xbee_read_serial(unsigned char c) { |
// Reset on start bit and start saving data |
if (c == XBEE_START_DELIMITER) { |
// On detect start delimiter, clear out initial array |
xbee_data_ptr->dataind = 0; |
xbee_data_ptr->checksum_sum = 0; |
xbee_data_ptr->rcv_frame.start_delimiter = XBEE_START_DELIMITER; |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_HIGH; |
} else { |
switch(xbee_data_ptr->read_state) { |
case XBEE_STATE_READ_START: |
// Do nothing and wait till start bit is read |
break; |
case XBEE_STATE_READ_LENGTH_HIGH: |
// Read length (MSB) |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[1] = c; |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_LOW; |
break; |
case XBEE_STATE_READ_LENGTH_LOW: |
// Read length (LSB) |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[0] = c; |
xbee_data_ptr->read_state = XBEE_STATE_READ_FRAME_DATA; |
break; |
case XBEE_STATE_READ_FRAME_DATA: |
// Read unique frame data |
if (xbee_data_ptr->dataind < xbee_data_ptr->rcv_frame.length.INT_16.int_value) { |
*((char*)xbee_data_array_ptr + xbee_data_ptr->dataind) = c; |
xbee_data_ptr->checksum_sum += c; |
xbee_data_ptr->dataind++; |
} |
// If total length is read, the next byte is the expected checksum |
if (xbee_data_ptr->dataind == xbee_data_ptr->rcv_frame.length.INT_16.int_value) { |
xbee_data_ptr->read_state = XBEE_STATE_READ_CHECKSUM; |
} |
break; |
case XBEE_STATE_READ_CHECKSUM: |
// Calculate and compare checksum |
if (0xFF - xbee_data_ptr->checksum_sum == c) { |
// Frame was recieved successfully |
xbee_process_recieved_frame(); |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
} else { |
// If checksum does not match, drop frame |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n"); |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
} |
break; |
} |
} |
} |
/* This is called when a full frame arrives to process the frame data */ |
void xbee_process_recieved_frame() { |
char ret_status; |
// Here we want to process each frame and send the data to Main() |
// Send the frame to main() with the message type depending on the frame type |
switch(*((unsigned char *) xbee_data_array_ptr)) { |
case XBEE_RX_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_DATA_PACKET: |
DBG_PRINT_XBEE("XBEE: parsing recieved data recieved frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_PACKET, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_DATA_TX_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_TX_STATUS, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_IO_DATA_SAMPLE: |
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_IO_DATA_SAMPLE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_EXPLICIT_COMMAND: |
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_EXPLICIT_COMMAND, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_ROUTE_RECORD: |
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_ROUTE_RECORD, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_NODE_IDENTIFICATION: |
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_NODE_IDENTIFICATION, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_FRAME_MODEM_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
default: |
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n"); |
} |
} |
//void xbee_process_transmit_frame_interrupt(void) { |
// unsigned char i; |
// char length; |
// |
// if (MQ_peek_FromMainToHigh() == MSGTYPE_XBEE_TX_FRAME) { |
// length = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *) xbee_data_ptr->msgtype, (void *) xbee_data_array_ptr); |
// xbee_data_ptr->checksum_sum = 0; |
// Write2USART(XBEE_START_DELIMITER); |
// while (Busy2USART()); |
// Write2USART(0x00); |
// while (Busy2USART()); |
// Write2USART(length); |
// while (Busy2USART()); |
// for (i = 0; i < length; i++) { |
// Write2USART(*((unsigned char *) xbee_data_array_ptr + i)); |
// xbee_data_ptr->checksum_sum += *((unsigned char *) xbee_data_array_ptr + i); |
// while (Busy2USART()); |
// } |
// Write2USART(0xFF - xbee_data_ptr->checksum_sum); |
// while (Busy2USART()); |
// } |
//} |
void xbee_process_transmit_frame(void *data, unsigned char length) { |
unsigned char i; |
unsigned char checksum = 0; |
Write2USART(XBEE_START_DELIMITER); |
while (Busy2USART() || xbee_read_CTS()); |
Write2USART(0x00); |
while (Busy2USART() || xbee_read_CTS()); |
Write2USART(length); |
while (Busy2USART() || xbee_read_CTS()); |
for (i = 0; i < length; i++) { |
Write2USART(*((unsigned char *) data + i)); |
checksum += *((unsigned char *) data + i); |
while (Busy2USART() || xbee_read_CTS()); |
} |
Write2USART(0xFF - checksum); |
while (Busy2USART()); |
} |
void xbee_set_RTS(unsigned char c) { |
if (c) { |
LATBbits.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 |
} |
} |
/PIC Stuff/PIC_27J13/xbee.h |
---|
0,0 → 1,256 |
#ifndef __xbee_h |
#define __xbee_h |
#define XBEE_BUFFER_SIZE MSGLEN |
#define XBEE_START_DELIMITER 0x7E |
// Expected 'next' state |
#define XBEE_STATE_READ_START 10 |
#define XBEE_STATE_READ_LENGTH_HIGH 11 |
#define XBEE_STATE_READ_LENGTH_LOW 12 |
#define XBEE_STATE_READ_FRAME_DATA 14 |
#define XBEE_STATE_READ_CHECKSUM 15 |
// Command Frame Type |
#define XBEE_TX_AT_COMMAND 0x08 |
#define XBEE_TX_AT_COMMAND_QUEUE 0x09 |
#define XBEE_RX_AT_COMMAND_RESPONSE 0x88 |
#define XBEE_TX_DATA_PACKET 0x10 |
#define XBEE_RX_DATA_PACKET 0x90 |
#define XBEE_RX_DATA_TX_STATUS 0x8B |
#define XBEE_RX_IO_DATA_SAMPLE 0x92 |
#define XBEE_TX_EXPLICIT_COMMAND 0x11 |
#define XBEE_RX_EXPLICIT_COMMAND 0x91 |
#define XBEE_TX_REMOTE_AT_COMMAND 0x17 |
#define XBEE_RX_REMOTE_AT_COMMAND_RESPONSE 0x97 |
#define XBEE_TX_CREATE_SOURCE_ROUTE 0x21 |
#define XBEE_RX_ROUTE_RECORD 0xA1 |
#define XBEE_RX_NODE_IDENTIFICATION 0x95 |
#define XBEE_RX_FRAME_MODEM_STATUS 0x8A |
typedef struct { |
union { |
unsigned long long_value; |
unsigned char char_value[4]; // Little Endian!! |
} UPPER_32; |
union { |
unsigned long long_value; |
unsigned char char_value[4]; // Little Endian!! |
} LOWER_32; |
} XBEE_ADDRESS_64; |
typedef struct { |
union { |
unsigned int int_value; |
unsigned char char_value[2]; // Little Endian!! |
} INT_16; |
} XBEE_ADDRESS_16; |
// Unique Frame Components |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_AT_COMMAND_FRAME; |
#define XBEE_TX_AT_COMMAND_FRAME_SIZE 4 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_AT_COMMAND_QUEUE_FRAME; |
#define XBEE_TX_AT_COMMAND_QUEUE_FRAME_SIZE 4 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char command_status; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_AT_COMMAND_RESPONSE_FRAME; |
#define XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE 5 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char broadcast_radius; |
unsigned char options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_DATA_PACKET_FRAME; |
#define XBEE_TX_DATA_PACKET_FRAME_SIZE 14 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_DATA_PACKET_FRAME; |
#define XBEE_RX_DATA_PACKET_FRAME_SIZE 12 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_16 destination_16; |
unsigned char transmit_retry_count; |
unsigned char delivery_status; |
unsigned char discovery_status; |
} XBEE_RX_DATA_TX_STATUS_FRAME; |
#define XBEE_RX_DATA_TX_STATUS_FRAME_SIZE 7 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char number_of_samples; |
unsigned char digital_ch_mask[2]; |
unsigned char analog_ch_mask; |
unsigned char digital_samples[2]; |
unsigned char analog_samples[8]; |
} XBEE_RX_IO_DATA_SAMPLE_FRAME; |
#define XBEE_RX_IO_DATA_SAMPLE_FRAME_SIZE 26 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char source_endpoint; |
unsigned char destination_endpoint; |
unsigned char cluster_id[2]; |
unsigned char profile_id[2]; |
unsigned char broadcast_radius; |
unsigned char transmit_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_EXPLICIT_COMMAND_FRAME; |
#define XBEE_TX_EXPLICIT_COMMAND_FRAME_SIZE 20 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char source_endpoint; |
unsigned char destination_endpoint; |
unsigned char cluster_id[2]; |
unsigned char profile_id[2]; |
unsigned char recieve_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_EXPLICIT_COMMAND_FRAME; |
#define XBEE_RX_EXPLICIT_COMMAND_FRAME_SIZE 18 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char remote_options; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_REMOTE_AT_COMMAND_FRAME; |
#define XBEE_TX_REMOTE_AT_COMMAND_FRAME_SIZE 15 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char command[2]; |
unsigned char command_status; |
unsigned char command_data[4]; |
} XBEE_RX_REMOTE_AT_COMMAND_FRAME; |
#define XBEE_RX_REMOTE_AT_COMMAND_FRAME_SIZE 19 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char route_options; |
unsigned char num_of_addresses; |
unsigned char addresses[XBEE_BUFFER_SIZE]; |
} XBEE_TX_CREATE_SOURCE_ROUTE_FRAME; |
#define XBEE_TX_CREATE_SOURCE_ROUTE_FRAME_SIZE 14 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char num_of_addresses; |
unsigned char addresses[XBEE_BUFFER_SIZE]; |
} XBEE_RX_ROUTE_RECORD_FRAME; |
#define XBEE_RX_ROUTE_RECORD_FRAME_SIZE 13 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
XBEE_ADDRESS_16 remote_16; |
XBEE_ADDRESS_64 remote_64; |
unsigned char NI_string[2]; |
XBEE_ADDRESS_16 parent_16; |
unsigned char device_type; |
unsigned char source_event; |
unsigned char profile_id[2]; |
unsigned char manufacturer_id[2]; |
} XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME; |
#define XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME_SIZE 32 |
typedef struct { |
unsigned char frame_type; |
unsigned char status; |
} XBEE_RX_MODEM_STATUS_FRAME; |
#define XBEE_RX_MODEM_STATUS_FRAME_SIZE 2 |
// Common Frame Components |
typedef struct __XBEE_FRAME { |
unsigned char start_delimiter; |
XBEE_ADDRESS_16 length; |
union { |
XBEE_TX_AT_COMMAND_FRAME TX_AT_COMMAND; |
XBEE_TX_AT_COMMAND_QUEUE_FRAME TX_AT_COMMAND_QUEUE; |
XBEE_RX_AT_COMMAND_RESPONSE_FRAME RX_AT_COMMAND_RESPONSE; |
XBEE_TX_DATA_PACKET_FRAME TX_DATA_PACKET; |
XBEE_RX_DATA_PACKET_FRAME RX_DATA_PACKET; |
XBEE_RX_DATA_TX_STATUS_FRAME RX_DATA_TX_STATUS; |
XBEE_RX_IO_DATA_SAMPLE_FRAME RX_IO_DATA_SAMPLE; |
XBEE_TX_EXPLICIT_COMMAND_FRAME TX_EXPLICIT_COMMAND; |
XBEE_RX_EXPLICIT_COMMAND_FRAME RX_EXPLICIT_COMMAND; |
XBEE_TX_REMOTE_AT_COMMAND_FRAME TX_REMOTE_AT_COMMAND; |
XBEE_RX_REMOTE_AT_COMMAND_FRAME RX_REMOTE_AT_COMMAND; |
XBEE_TX_CREATE_SOURCE_ROUTE_FRAME TX_CREATE_SOURCE_ROUTE; |
XBEE_RX_ROUTE_RECORD_FRAME RX_ROUTE_RECORD; |
XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME RX_NODE_IDENTIFICATION; |
XBEE_RX_MODEM_STATUS_FRAME RX_MODEM_STATUS; |
} FRAME; |
} XBEE_FRAME; |
// Overall Data Structure |
typedef struct __xbee_data { |
XBEE_FRAME rcv_frame; |
unsigned char dataind; |
unsigned char checksum_sum; |
unsigned char read_state; |
unsigned char msgtype; |
} XBEE_DATA; |
void xbee_init(XBEE_DATA *); |
void xbee_read_serial(unsigned char); |
void xbee_process_recieved_frame(void); |
//void xbee_process_transmit_frame_interrupt(void); |
void xbee_process_transmit_frame(void *data, unsigned char length); |
void xbee_set_RTS(unsigned char); |
unsigned char xbee_read_CTS(void); |
#endif |