Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 119 → Rev 120

/PIC Stuff/PIC_27J13/build/default/production/interrupts.o.d
2,6 → 2,7
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/i2c.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 \
/PIC Stuff/PIC_27J13/build/default/production/main.o.d
2,6 → 2,7
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:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.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 \
/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.hex
1,10 → 1,10
:020000040000FA
:0600000078EF0AF0120087
:0600000056EF0FF01200A4
:020006000000F8
:06000800C9EF07F0120031
:060008003DEF0CF01200B8
:02000E001200DE
:020010001200DC
:0600180033EF08F01200B6
:06001800B4EF0CF0120031
:02001E004BECA9
:1000200005F0FB0EDBCFF3FFDB06F35000090AE01F
:1000300099EC05F0FA0E04EC06F0F3E1151CF1E181
21,7 → 21,7
:1000E000DB82DED7030EDB84DBD7030EDB86D8D7BB
:1000F000030EDB88D5D72A0EDF5C1BE1AFEC04F0E2
:10010000FDEC04F010E0030EDB8008680968130EB4
:10011000DBCF0DF0140EDBCF0EF0D0EC09F0040EA7
:10011000DBCF0DF0140EDBCF0EF0BFEC0EF0040EB3
:1001200006C0DBFF03D0130EE6EC04F0B3EC04F0E2
:100130000BD0090EDB6A54EC05F003E0C8EC05F0C7
:10014000FAD7090EE6EC04F0030EDBB0DB982E0EB6
54,8 → 54,8
:1002F000F70E17C0DBFFF80E18C0DBFF17C0E9FFD1
:1003000018C0EAFF90EC05F0166A0E0E14C0DBFF71
:100310000F0E15C0DBFF100E16C0DBFF0E0EDBCF7D
:10032000E6FF0F0EDBCFE6FF100EDBCFE6FFABECF8
:1003300009F0E552E552E552130E07C0DBFF140E3B
:10032000E6FF0F0EDBCFE6FF100EDBCFE6FF9AEC09
:100330000EF0E552E552E552130E07C0DBFF140E36
:1003400008C0DBFF060EDB5005E0130ED4EC05F011
:1003500001E26ADBF8EC05F002E2130E37DBBBECDE
:1003600005F006E0040ED4EC05F002E2050E2EDBEB
66,7 → 66,7
:1003B000BCD2BBDB01E3DB2A090EDB2AD9500E0FCE
:1003C000E96E000ECBDBE7D7D3DA01E1B4D2ADD2D0
:1003D000C6DA110EEECFDBFF120EEDCFDBFF110EF2
:1003E000DBCFE6FF120EDBCFE6FF9DEC09F0E55216
:1003E000DBCFE6FF120EDBCFE6FF8CEC0EF0E55222
:1003F000E552130EF3CFDBFF140EF4CFDBFF060E36
:10040000DB5004E0130ED0DB01E20EDBF8EC05F06C
:1004100002E2130EDBDAAFDB05E0040EC5DB02E21D
102,14 → 102,14
:1005F000DB94DB50800B24E08ADAD890030EEB50BA
:10060000000A08E6000EEE5C000EEE58000EEE58F2
:10061000000EEE5815E213DA0B680C680D680E68D0
:1006200065EC09F00A0E02C0DBFF0B0E03C0DBFF16
:1006200054EC0EF00A0E02C0DBFF0B0E03C0DBFF22
:100630000C0E04C0DBFF0D0E05C0DBFF2D0E08D035
:10064000030EDBA202D02B0E03D0DBA408D0200EB9
:10065000F36E170EF3CFDBFF150EDB2A02D0170E59
:10066000DB6A050EDB5003E1B7D901E189D0280E22
:10067000146E150E156E000E166E070EDBCF17F0FA
:10066000DB6A050EDB5003E1B7D901E189D0E40E66
:10067000146E1E0E156E000E166E070EDBCF17F0F1
:10068000186A196A1A6A17C00BF018C00CF019C062
:100690000DF01AC00EF0D3D9FDEC09F0145002246D
:100690000DF01AC00EF0D3D9ECEC0EF01450022479
:1006A000F36E15500320F46E16500420F86EF4CF4C
:1006B000F7FFF3CFF6FF0800090EF5CFDBFF580E6A
:1006C000DF5C0FE1610EF36E090E7BD90AE3200EA9
117,7 → 117,7
:1006E000DBFF070EDBCF14F0156A166A176A0FDA04
:1006F00014C00BF015C00CF016C00DF017C00EF0B2
:10070000EECF06F0EECF07F0EECF08F0EFCF09F016
:10071000FDEC09F009C0EDFF08C0EDFF07C0EDFFDB
:10071000ECEC0EF009C0EDFF08C0EDFF07C0EDFFE7
:1007200006C0EFFF390EDBCFE9FFDB063A0EDBCF69
:10073000EAFF01E2DB06090EDBCFEFFF150EDB2A35
:100740004BD995E1030EDBA61DD06F0EDF5C06E1F1
136,7 → 136,7
:10081000080EDB50BED8080EDB6A170EDB5007E06F
:1008200088D9170EF1D903E1151C01E17ED0160E0F
:10083000DB5016E07ED9300EE66E9FD802E1151C23
:1008400074E077D9DFCFE6FF23EC09F0E552E552FB
:1008400074E077D9DFCFE6FF12EC0EF0E552E55207
:10085000E552F4CF15F00001F31C02E1151C65E030
:10086000050EDBCF14F0160EDB50D880145409E2CD
:10087000050EDBCFE7FF160EDB50E75E050EE7CF78
155,7 → 155,7
:1009400014F0020EDBCF15F014C0F3FF15C0F4FF56
:100950003B0EE15C02E2E16AE552E16ECBD029D9BF
:10096000020EA0EF05F061D90800F550DF6E12000D
:10097000200EE66E080E10EF06F023EC09F0E552AB
:10097000200EE66E080E10EF06F012EC0EF0E552B7
:10098000E552E552F3CF14F0F4CF15F00001F31C5B
:100990001200146E156AD950010F4DD91450EE266D
:1009A0001550ED221200185E000E195AF70E18C0ED
174,8 → 174,8
:100A7000DB50CED8010EF36E060EF3CFDBFF120073
:100A8000EE50EFCFEAFFE96E16C0EEFF17C0EEFFA3
:100A900018C0EEFF1200D9CFE6FFDACFE6FFE1CFB4
:100AA000D9FFE2CFDAFF1200DFCFE6FFE66A56ECAD
:100AB0000AF0E552E552F3501200E76E080EE7CF58
:100AA000D9FFE2CFDAFF1200DFCFE6FFE66A34ECCF
:100AB0000FF0E552E552F3501200E76E080EE7CF53
:100AC000DBFF1200EECF14F0EECF15F0EFCF16F0F3
:100AD000176A1200050EDBCF14F0150EDB50D8801C
:100AE00014541200010EDBCF16F0020EDBCF17F00C
200,163 → 200,321
: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
:100C40000001A06BA16BA26BA36BE56BE46BE66B81
:100C5000010EE76FE86BEB6BEC6BE96B230EEA6F51
:100C60009D8612000001110EE66F94869488C76A73
:100C7000C66AC56AF00EC6140809C66E770EC86E3D
:100C8000C78EC68A1200D9CFE6FFE1CFD9FFE65260
:100C9000FD0EDB50156AE850151035E0DF6ADF50B5
:100CA000146E156AFD0EDB50000115AE02D0D8900F
:100CB00003D0145C000E155819E2DF50E76EFB0EEE
:100CC000DBCFE9FFFC0EDBCFEAFFE750E926000EA1
:100CD000EA22EF50E66EDF50EA6A600FE96E000E1E
:100CE000EA22E552E750EF6EDF2AD9D7FD0EDB503E
:100CF0000001A06FFE0EDB50E96FA26B050EE76FDF
:100D0000200EEA6FC580E552E552E7CFD9FF120009
:100D1000D9CFE6FFE1CFD9FFFD0EDB50156AE850D1
:100D200015100DE0FD0EDB500001A06FFE0EDB5034
:100D3000E96FA26B050EE76F210EEA6FC580E552E1
:100D4000E7CFD9FF1200D9CFE6FFE1CFD9FFE652B6
:100D5000FC0EDB50146E156AE850151012E1FD0E02
:100D6000DB50DF6ED9CFE6FFDACFE6FF010EE66E8D
:100D7000FE0EDB50E66E87DFE552E552E552E552A6
:100D800010D0FD0EDB500001606FFC0EDB50A06F39
:100D9000FE0EDB50E96FA26B050EE76F220EEA6FC5
:100DA000C580E552E552E7CFD9FF1200D9CFE6FF63
:100DB000E1CFD9FF0001100EE66F94869488FE0EF5
:100DC000DB50146E156AD890143615361450C86E60
:100DD000C76AC66AC56AF00EC6140E09C66EC78E0B
:100DE000C580C68AE552E7CFD9FF12000001E6515F
:100DF000146E156A110E141804E1155002E10BEF80
:100E000007F0E651146E156A100E141803E1155020
:100E100001E188D912000001EA51146E156A200E12
:100E2000141853E1155051E1E751146E156A070E7D
:100E3000141801E1155017E0050E141801E11550C2
:100E400006E0010E141801E115503EE01200070EF5
:100E5000E76FE951146E156AD89014361536000EF6
:100E60001410C96E1200C550400B01E0010E146E43
:100E7000156AE850151021E1A251146E156AA051AF
:100E8000000115AE02D0D89003D0145C000E1558A6
:100E90000BE20001A251EA6A600FE96E000EEA223D
:100EA000EF50C96EA22B12000001010EE76FC5843E
:100EB000230EEA6F300EE86F1200010EE76FC58453
:100EC000230EEA6F310EE86F1200EA51146E156AB4
:100ED000210E141871E115506FE1E751146E156A77
:100EE0000B0E141801E115505FE00A0E141801E111
:100EF000155056E0030E141801E115502DE0080EB0
:100F0000141801E1155017E0050E141801E11550F1
:100F100006E0010E141801E115504DE01200080E14
:100F2000E76FE951146E156AD89014361536010E24
:100F30001410C96E1200C550400B01E0010E146E72
:100F4000156AE85015102CE0010EE76FC584230EDA
:100F5000EA6F330EE86F1200C950E66EA251EA6ADA
:100F6000600FE96E000EEA22E552E750EF6EA22B09
:100F7000A251146E156AA051000115AE02D0D8908E
:100F800003D0145C000E155805E200010A0EE76F4D
:100F9000C59A04D000010B0EE76FC58AC588120000
:100FA000030EE76FC5861200010EE76FC584230E9E
:100FB000EA6F320EE86F1200EA51146E156A220EC3
:100FC000141801E0AED0155001E0ABD0E751146E1B
:100FD000156A0B0E141801E1155001E19BD00A0EA1
:100FE000141801E1155001E191D0030E141801E12C
:100FF000155068E0080E141801E1155052E0060E75
:10100000141801E1155041E0090E141801E11550C2
:1010100028E0070E141801E1155016E0050E14180B
:1010200001E1155007E0010E141801E1155001E12E
:1010300078D01200070EE76FE951146E156AD89048
:1010400014361536000E2AD0C550400B01E0010EB3
:10105000146E156AE850151011E16051C96E090E41
:101060000BD0C550400B01E0010E146E156AE8501C
:10107000151004E1C582060EE76F1200010EE76F3E
:10108000C584230EEA6F310E1BD0080EE76FE951BD
:10109000146E156AD89014361536010E1410C96EE8
:1010A0001200C550400B01E0010E146E156AE850A5
:1010B00015102CE0010EE76FC584230EEA6F330E86
:1010C000E86F1200C950E66EA251EA6A600FE96E3D
:1010D000000EEA22E552E750EF6EA22BA251146EE9
:1010E000156AA051000115AE02D0D89003D0145C4F
:1010F000000E155805E200010A0EE76FC59A04D0EC
:1011000000010B0EE76FC58AC5881200030EE76F5A
:10111000C5861200010EE76FC584230EEA6F320EFA
:10112000E86F1200D9CFE6FFE1CFD9FF040EE12628
:10113000010EDB6A020EDB6A030EDB6AC650400B4F
:1011400001E0010E146E156A010E14180CE1155021
:101150000AE1C69C0001010EE76FF36E030EF3CFA8
:10116000DBFF360EE86FC750010B146E156A010ED7
:10117000141807E1155005E1C950DF6EDE52010E6B
:10118000DD6E030EDB50156AE850151001E005D145
:101190000001E751146E156A030E141801E1155091
:1011A00001E17CD0040E141801E1155044E0020E58
:1011B000141801E1155017E0010E141801E0EDD0EC
:1011C000155001E0EAD0C750080B01E0010E146E83
:1011D000156A010E141801E0E0D0155001E0DDD0D1
:1011E000A16B020E98D0C750100B01E0010E146ED7
:1011F000156A010E141804E1155002E1010E8BD09E
:10120000010EDB50156AE850151001E1C6D0C75039
:10121000200B01E0010E156AE850151001E0B9D06D
:10122000C750040B01E0010E156AE850151001E0EB
:10123000ADD0030E70D0EC51146E156A1450151019
:101240000DE1EB51E66E46D9E552000924E00001BC
:10125000A451C96E010EE56FEC6F18D0E551146E04
:10126000156AE451000115AE02D0D89003D0145C89
:10127000000E155810E20001E551EA6AA40FE96E6C
:10128000000EEA22EF50C96EE52B010EF36E020E3E
:10129000F3CFDBFF82D00001EC6B3CD0C750100BCA
:1012A00001E0010E146E156A010E141836E1155096
:1012B00034E1010EDB50156AE850151029E0C750E3
:1012C000200B01E0010E146E156A010E14181DE1C9
:1012D00015501BE1DF50E66EA351EA6A600FE96E1C
:1012E000000EEA22E552E750EF6EA351146E156A24
:1012F0003F0E141804E1155002E1A36B01D0A32B9B
:10130000A12BDF50EB6F340E02D0010E370EE86FC9
:10131000A151A027010EE76F40D0010EDB50156AE6
:10132000E85015103AE0C750200B01E0010E146E92
:10133000156A010E14181DE115501BE1DF50E66E11
:10134000A351EA6A600FE96E000EEA22E552E75007
:10135000EF6EA351146E156A3F0E141804E1155078
:1013600002E1A36B01D0A32BA12BDF50EB6F340E56
:1013700013D0C750040B01E0010E146E156A010E64
:10138000141807E1155005E1A151A027040EE76FDD
:1013900052D7010EE76F370EE86F010EDB50176A68
:1013A000E850171008E1020EDB50196AE8501910D6
:1013B00002E1000E01D0010E156AE850151009E097
:1013C000C650100B01E0010E156AE850151001E13E
:1013D000C688040EE15C02E2E16AE552E16EE55284
:1013E000E7CFD9FF12000001E651146E156A110E05
:1013F00014181BE1155019E1EA51166E176A230EF5
:1014000016180AE1175008E1A051186E196A185011
:10141000191002E0000E01D0010E146E156AE8509A
:10142000151001E0000CE8511200100EE66FE850B4
:1014300018E0E751166E176A010E16180AE11750E8
:1014400008E1A051186E196A1850191002E0000E38
:1014500001D0010E146E156AE850151001E0000C61
:10146000E8511200D9CFE6FFE1CFD9FFE652DF6A9B
:101470000001A051146E156A1450151025E0A251F8
:10148000EA6A600FE96E000EEA22EF50E66EDF5066
:10149000E76EFD0EDBCFE9FFFE0EDBCFEAFFE75084
:1014A000E926000EEA22E552E750EF6EDF2AA2514C
:1014B000146E156A3F0E141804E1155002E1A26B78
:1014C00001D0A22BA007D4D7DF50E552E552E7CFD9
:1014D000D9FF1200D9CFE6FFE1CFD9FFE652DF6A8C
:1014E000FE0EDB50146E156ABB0E141801E1155088
:1014F0000BE0AA0E141811E115500FE10001410E86
:10150000A46F010EE46F08D00001310EA46F320EFB
:10151000A56F020EE46F010EDF6EDF50E552E5525B
:06152000E7CFD9FF120025
:0A152600949C948E7E96190EB06E10
:10153000AD84AD98AC8EAD9CAC9CAD9AAC889D88CA
:101540009D8A0E01406B416B426B1200D9CFE6FFC2
:10155000E1CFD9FFE6529E50200B01E0010E156A43
:10156000E85015102EE00E014251146E156A3F0E20
:10157000141810E115500EE1AD9A4E0EE66E1E0ED7
:10158000E66E000EE66E5FD8E552E552E552AF50CA
:10159000DF6E17D0AF50E66E4151EA6A000FE96E78
:1015A0000E0EEA22E552E750EF6E4151146E156AB5
:1015B0003F0E141804E1155002E1416B01D0412B9C
:1015C000422BAC50020B01E0010E146E156A010EA5
:1015D00014180FE115500DE1AC98AC88AD9A3D0E92
:1015E000E66E1E0EE66E000EE66E2DD8E552E55252
:1015F000E552E552E552E7CFD9FF12000E018351C3
:10160000146E156A8451166E176A1650141802E18A
:10161000175015180AE08351EA6A430FE96E0E0E5F
:10162000EA22EF50AE6E832B1200AD50020B01E0A8
:10163000010E146E156AE8501510F7E0AD9A0E0110
:10164000836B846B1200D9CFE6FFE1CFD9FF020E86
:10165000E126AD50200B01E0010E156AE85015108F
:10166000F8E1D950FC0F146EFF0EDA20156E14C08D
:10167000DEFFDD6EDECFE6FFDDCFE6FFFC0EDBCF6B
:10168000E6FFFD0EDBCFE6FFFE0EDBCFE6FF430EEF
:10169000E66E0E0EE66ECEEC0DF0146E070EE15EF9
:1016A0001450430EE66E0E0EE66E8CEC0EF0E55214
:1016B000E552F3CF84FE0E01010E836F4351AE6EEF
:1016C000AD8A020EE15C02E2E16AE552E16EE552AA
:1016D000E7CFD9FF1200D9CFE6FFE1CFD9FFE6521D
:1016E000AD50200B01E0010E156AE8501510F8E12D
:1016F000FC0EDB500E01846F010E836FDF6ADF503A
:10170000146E156AFC0EDB50000115AE02D0D890A5
:1017100003D0145C000E155819E2DF50E76EFD0E81
:10172000DBCFE9FFFE0EDBCFEAFFE750E926000E34
:10173000EA22EFCF14F0156ADF50EA6A430FE96E30
:101740000E0EEA2214C0EFFFDF2AD9D70E01435153
:10175000AE6EAD8AE552E552E7CFD9FF1200D9CF80
:10176000E6FFE1CFD9FFE652DF6A0E014251146E67
:10177000156A1450151025E04051EA6A000FE96E11
:101780000E0EEA22EF50E66EDF50E76EFD0EDBCF65
:10179000E9FFFE0EDBCFEAFFE750E926000EEA2262
:1017A000E552E750EF6EDF2A4051146E156A3F0E86
:1017B000141804E1155002E1406B01D0402B4207A0
:0E17C000D4D7DF50E552E552E7CFD9FF120033
:0217CE009F8AF0
:1017D0009F889F861200D08EF28EF28C1200F250FB
:1017E000800B01E0010E176AE850171002E0000EAE
:1017F00001D0010E156AF36E15C0F4FF1200F2500D
:10180000400B01E0010E176AE850171002E0000ECD
:1018100001D0010E156AF36E15C0F4FF1200F250EC
:10182000400B01E0010E146E156A010E141802E15E
:10183000155004E0D4DFF350F41002E0F36A02D054
:10184000010EF36EF46A1200EADFF3CF16F0F4CF64
:1018500017F0F350F41004E1C2DFF350F41002E08B
:10186000000E01D0010E156AE850151003E0010EBC
:10187000F36E01D0F36AF46A1200DACFE4FFE2CF2C
:10188000DAFFE9CFE4FFEACFE4FFF6CFE4FFF7CFDA
:10189000E4FFF8CFE4FFF5CFE4FFF3CFE4FFF4CFAC
:1018A000E4FFFACFE4FFFBCFE4FF00EE00F0140EFC
:1018B000E80403E3EECFE4FFFBD700EE14F0070EDD
:1018C000E80403E3EECFE4FFFBD7E6529E50200B83
:1018D00001E0010E1B6E1C6AE8501C1004E0A6EC2F
:1018E0000AF09E9A19D09E50100B01E0010E1B6E5B
:1018F0001C6AE8501C1004E0FEEC0AF09E980CD024
:101900009E50080B01E0010E1B6E1C6AE8501C1073
:1019100003E0F6EC06F09E96E55200EE1AF0070E94
:10192000E80403E3E5CFEDFFFBD700EE13F0140E60
:10193000E80403E3E5CFEDFFFBD7E5CFFBFFE5CF01
:10194000FAFFE5CFF4FFE5CFF3FFE5CFF5FFE5CFF5
:10195000F8FFE5CFF7FFE5CFF6FFE5CFEAFFE5CFEC
:10196000E9FFE5CFDAFF1100D8CFE4FFE0CFE4FFD5
:10197000E46EDACFE4FFE652E552E5CFDAFFE55058
:0A198000E5CFE0FFE5CFD8FF10002F
:06198A00D9CFE6FFE1CF1A
:10199000D9FF6F0EE126DF6A010EDB6A020EDB6AF9
:1019A000D950030FE96EDACFEAFF410EEE6E530E07
:1019B000EE6E440EEE6E460EEE6E310EEE6E320E92
:1019C000EE6E330EEE6EEE6A8F0ED3147009D36E88
:1019D000FC0ED3140009D36E0F0148691F0E496F26
:1019E00093EC0AF020EC06F0EBEC0BF0E7EC0BF0DC
:1019F0002B0EE66E1E0EE66E000EE66E23EC0BF06E
:101A0000E552E552E552300EE66ED6EC06F0E552B0
:101A10009490949294948B908B928B94F3EC09F025
:101A2000E76E020EE7CFDBFFDB50146E156AE8505D
:101A30001510F4E0020EDBCFE6FFE66A270EE66E35
:101A40001E0EE66E000EE66E23EC0BF0146E050E15
:101A5000E15E1450D9500B0FE66E000EDA20E66EF0
:101A600032EC0AF0E552E552E76E010EE7CFDBFFFC
:101A7000DBCFE6FFE66A230EE66E1E0EE66E000E74
:101A8000E66E23EC0BF0146E050EE15E1450DF6A77
:101A9000DF50146E156A010EDB50000115AE02D046
:101AA000D89003D0145C000E15581DE2D9500B0FCE
:101AB000146EDACF15F0DF500F011424E96E000E1A
:101AC000DA20EA6EEF50E66EE66A270EE66E1E0E2C
:101AD000E66E000EE66E23EC0BF0166E050EE15E70
:101AE0001650DF2AD5D7200EE66E1E0EE66E000ECB
:0E1AF000E66E23EC0BF0E552E552E5528FD77F
:021AFE00060ED2
:101B0000F66E000EF76E000EF86E00010900F5503B
:101B1000F26F0900F550F36F03E1F26701D03DD099
:101B20000900F550ED6F0900F550EE6F0900F55012
:101B3000EF6F09000900F550E96E0900F550EA6EF3
:101B4000090009000900F550F06F0900F550F16F28
:101B500009000900F6CFF4F0F7CFF5F0F8CFF6F072
:101B6000EDC0F6FFEEC0F7FFEFC0F8FF0001F05345
:101B700002E1F15307E00900F550EE6EF007F8E2DC
:101B8000F107F9D7F4C0F6FFF5C0F7FFF6C0F8FF8C
:0C1B90000001F207000EF35BBFD712004B
:041B9C00D9CFE6FFB8
:101BA000DACFE6FFE1CFD9FFE2CFDAFFE652E65225
:101BB000F70EDBCFE6FFF80EDBCFE6FFF90EDBCF4B
:101BC000E6FFFA0EDBCFE6FFFB0EDBCFE6FFD950D8
:101BD000FC0FE66EFF0EDA20E66E25EC00F0146EC8
:101BE000070EE15C02E2E16AE552E16E1450F3CFC8
:101BF000DEFFF4CFDDFFFC0EDBCFE9FFFD0EDBCF18
:101C0000EAFFEF6ADECF14F0DDCF15F014C0F3FF6A
:101C100015C0F4FFE552E552E552E5CFDAFFE7CF14
:041C2000D9FF1200D6
:0C1C2400D9CFE6FFDACFE6FFE1CFD9FF11
:101C3000E2CFDAFFFB0EDBCF14F0FC0EDBCF15F0AA
:101C40000001800E15141AE1FB0EDBCFE9FFFC0E3C
:101C5000DBCFEAFFEECFF3FFEDCFF4FFEE2A000E6D
:101C6000EF22F3CFE9FFF4CFEAFFFD0EDBCFEFFF6A
:101C7000EF50156AF36E15C0F4FF10D0FB0EDB5069
:101C8000FE0806E1FD0EDBCFE6FF64EC0FF005D0A9
:101C9000FD0EDBCFE6FF07EC00F0E552E552E5CFA5
:081CA000DAFFE7CFD9FF1200C3
:081CA80006500B02F3CF02F01D
:101CB000F4CF03F00C02F3500326000EF420046E60
:101CC00006500D02F3500426000EF420056E065057
:101CD0000E02F350052607500B02F3500326F45072
:101CE0000422000E052207500C02F3500426F45083
:101CF000052207500D02F350052608500B02F35041
:101D00000426F450052208500C02F3500526095011
:081D10000B02F350052612003E
:081D1800FE0EE3CFE9FFFF0E10
:101D2000E3CFEAFFF36AF46AEE5203E0F34AF42ADF
:101D3000FBD71200FF0EE3CFF8FFE552FF0EE3CF13
:101D4000F7FFE552FF0EE3CFF6FFE552E66AE66ADB
:101D5000E66A0900F55209E0FD0EE32A05E1FE0EF0
:101D6000E32A02E1FF0EE32AF4D7FD0EE3CF07F0EA
:0E1D7000FE0EE3CF08F0FF0EE3CF09F01200E5
:021D7E0009C09A
:101D800013F008C012F008500D02F4CF07F0F3CFA3
:101D900006F009500E02F4CF09F0F3CF08F00D025F
:101DA000F3500726F4500822E86A092212500E0266
:101DB000F3500726F4500822E86A09220EAEE5EF38
:101DC0000EF01250085E1350095A13AE000C0D505D
:081DD000085E0E50095A000CD8
:081DD800056A046A036A026A4D
:101DE000200EE76ED89006360736083609360236DA
:101DF0000336043605360B50025C0C5003580D5068
:101E000004580E50055809E30B50025E0C50035A5B
:101E10000D50045A0E50055A062AE72EE4D7120038
:101E20000D0A0025642000255820000D0A42656730
:101E3000696E2050726F6772616D0D0A00554152D4
:101E400054313A206F76657272756E0D0A005541F5
:101E50005254313A20627566666572206F766572FB
:071E6000666C6F770D0A00AC
:081E6800F36AF46AFF0EE124A5
:101E7000E96EFF0EE220EA6EED6607D02F0EEF64EA
:0C1E800004D03A0EEF6001D0F32A1200EB
:041E8C00B00EF36E33
:101E900000EE00F00E0E01D81200EA6002D0EE6AE9
:0C1EA000FCD7F350E9601200EE6AFCD79A
:041EAC001DEE00F037
:101EB0002DEE00F0F86A019C7FEC0DF008EC00F0CC
:081EC000C5EC0CF0FBD7120089
:081EC800FF0EE350ADBA04D097
:101ED000B06AAC8EAD8A949CADA2FED7AE6EF36EA6
:041EE000F46A12008E
:0C1EE40030313233343536373839616222
:051EF00063646566005B
:020000040001F9
:01FFF800AA5E
:01FFFA00FD09
/PIC Stuff/PIC_27J13/i2c.c
1,31 → 1,36
#include "msg_queues.h"
#include "maindefs.h"
//#include <i2c.h>
#include "i2c.h"
 
static I2C_DATA *i2c_pdata;
static I2C_DATA i2c_data;
 
// 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;
void I2C_Init() {
i2c_data.buffer_in_len = 0;
i2c_data.buffer_in_len_tmp = 0;
i2c_data.buffer_in_read_ind = 0;
i2c_data.buffer_in_write_ind = 0;
 
i2c_data.buffer_out_ind = 0;
i2c_data.buffer_out_len = 0;
i2c_data.operating_mode = 0;
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = 0;
 
i2c_data.slave_in_last_byte = 0;
i2c_data.slave_sending_data = 0;
 
i2c_data.master_dest_addr = 0;
i2c_data.master_status = I2C_MASTER_IDLE;
// Enable I2C interrupt
PIE1bits.SSPIE = 1;
}
 
// Setup the PIC to operate as a master.
void i2c_configure_master() {
i2c_pdata->mode = I2C_MODE_MASTER;
void I2C_Configure_Master() {
i2c_data.operating_mode = I2C_MODE_MASTER;
 
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
40,22 → 45,22
}
 
// 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;
void I2C_Master_Send(unsigned char address, unsigned char length, unsigned char *msg) {
unsigned char 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_data.buffer_in[i] = msg[i];
}
i2c_pdata->buflen = length;
i2c_pdata->master_dest_addr = address;
i2c_pdata->bufind = 0;
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
 
// Change status to 'next' operation
i2c_pdata->status = I2C_SEND_ADDR;
i2c_pdata->master_state = I2C_MASTER_SEND;
i2c_data.operating_state = I2C_SEND_ADDR;
i2c_data.master_status = I2C_MASTER_SEND;
// Generate start condition
SSPCON2bits.SEN = 1;
62,27 → 67,50
}
 
// Reads length number of bytes from address (no R/W bit)
void i2c_master_recv(unsigned char address, unsigned char length) {
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;
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
 
// Change status to 'next' operation
i2c_pdata->status = I2C_SEND_ADDR;
i2c_pdata->master_state = I2C_MASTER_RECV;
i2c_data.operating_state = I2C_SEND_ADDR;
i2c_data.master_status = I2C_MASTER_RECV;
// Generate start condition
SSPCON2bits.SEN = 1;
}
 
// Writes msg to address then reads length number of bytes from address
void I2C_Master_Restart(unsigned char address, unsigned char msg, unsigned char length) {
unsigned char c;
if (length == 0) {
c = msg;
I2C_Master_Send(address, 1, &c);
return;
}
 
// Save length and address to get data from
i2c_data.buffer_in[0] = msg;
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
 
// Change status to 'next' operation
i2c_data.operating_state = I2C_SEND_ADDR;
i2c_data.master_status = I2C_MASTER_RESTART;
 
// 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;
void I2C_Configure_Slave(unsigned char addr) {
i2c_data.operating_mode = I2C_MODE_SLAVE;
 
// Ensure the two lines are set for input (we are a slave)
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
98,86 → 126,86
SSPCON1bits.SSPEN = 1; // Enable MSSP Module
}
 
void i2c_interrupt_handler() {
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();
if (i2c_data.operating_mode == I2C_MODE_MASTER) {
I2C_Interrupt_Master();
} else if (i2c_data.operating_mode == I2C_MODE_SLAVE) {
I2C_Interrupt_Slave();
}
}
 
// An internal subroutine used in the master version of the i2c_interrupt_handler
void i2c_interrupt_master() {
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) {
if (i2c_data.master_status == I2C_MASTER_SEND) {
switch (i2c_data.operating_state) {
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;
i2c_data.operating_state = I2C_CHECK_ACK_SEND;
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK:
case I2C_CHECK_ACK_SEND:
// 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++;
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) {
SSPBUF = i2c_data.buffer_in[i2c_data.buffer_in_read_ind];
i2c_data.buffer_in_read_ind++;
} else {
// If no more data is to be sent, send stop bit
i2c_pdata->status = I2C_IDLE;
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_COMPLETE, (void *) 0);
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_SEND_OK;
}
} else {
// If a NACK is received, stop transmission and send error
i2c_pdata->status = I2C_IDLE;
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_SEND_FAILED, (void *) 0);
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_SEND_FAIL;
}
break;
}
// If we are in the middle of receiving data
} else if (i2c_pdata->master_state == I2C_MASTER_RECV) {
switch (i2c_pdata->status) {
} else if (i2c_data.master_status == I2C_MASTER_RECV) {
switch (i2c_data.operating_state) {
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;
i2c_data.operating_state = I2C_CHECK_ACK_RECV;
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x1;
break;
case I2C_CHECK_ACK:
case I2C_CHECK_ACK_RECV:
// 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;
i2c_data.operating_state = I2C_RCV_DATA;
SSPCON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_pdata->status = I2C_IDLE;
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_pdata->master_state = I2C_MASTER_IDLE;
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_I2C_MASTER_RECV_FAILED, (void *) 0);
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_RECV_FAIL;
}
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) {
i2c_data.buffer_in[i2c_data.buffer_in_read_ind] = SSPBUF;
i2c_data.buffer_in_read_ind++;
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_pdata->status = I2C_REQ_DATA;
i2c_data.operating_state = 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;
i2c_data.operating_state = I2C_SEND_STOP;
SSPCON2bits.ACKDT = 1; // NACK
SSPCON2bits.ACKEN = 1;
}
184,86 → 212,153
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_pdata->status = I2C_RCV_DATA;
i2c_data.operating_state = 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;
i2c_data.operating_state = 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);
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_RECV_OK;
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 if (i2c_data.master_status == I2C_MASTER_RESTART) {
switch (i2c_data.operating_state) {
case I2C_IDLE:
break;
case I2C_SEND_ADDR:
// Send the address with read bit set
i2c_data.operating_state = I2C_CHECK_ACK_SEND;
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x0;
break;
case I2C_CHECK_ACK_SEND:
// Check if ACK is received or not
if (!SSPCON2bits.ACKSTAT) {
// If an ACK is received, send first byte of data
SSPBUF = i2c_data.buffer_in[0];
i2c_data.operating_state = I2C_CHECK_ACK_RESTART;
} else {
// If a NACK is received, stop transmission and send error
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_SEND_FAIL;
}
break;
case I2C_CHECK_ACK_RESTART:
if (!SSPCON2bits.ACKSTAT) {
SSPCON2bits.RSEN = 1;
i2c_data.operating_state = I2C_SEND_ADDR_2;
} else {
// If a NACK is received, stop transmission and send error
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_SEND_FAIL;
}
break;
case I2C_SEND_ADDR_2:
// Send the address with read bit set
i2c_data.operating_state = I2C_CHECK_ACK_RECV;
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x1;
break;
case I2C_CHECK_ACK_RECV:
// Check if ACK is received
if (!SSPCON2bits.ACKSTAT) {
// If an ACK is received, set module to receive 1 byte of data
i2c_data.operating_state = I2C_RCV_DATA;
SSPCON2bits.RCEN = 1;
} else {
// If a NACK is received, stop transmission and send error
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_RECV_FAIL;
}
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
i2c_data.buffer_in[i2c_data.buffer_in_read_ind] = SSPBUF;
i2c_data.buffer_in_read_ind++;
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data.operating_state = I2C_REQ_DATA;
SSPCON2bits.ACKDT = 0; // ACK
SSPCON2bits.ACKEN = 1;
} else {
// If we are done reading, send an NACK to the slave
i2c_data.operating_state = I2C_SEND_STOP;
SSPCON2bits.ACKDT = 1; // NACK
SSPCON2bits.ACKEN = 1;
}
break;
case I2C_REQ_DATA:
// Set module to receive one byte of data
i2c_data.operating_state = I2C_RCV_DATA;
SSPCON2bits.RCEN = 1;
break;
case I2C_SEND_STOP:
// Send the stop bit and copy message to send to Main()
i2c_data.operating_state = I2C_IDLE;
SSPCON2bits.PEN = 1;
i2c_data.master_status = I2C_MASTER_IDLE;
i2c_data.return_status = I2C_RECV_OK;
break;
}
} else {
i2c_pdata->status = I2C_STARTED;
}
}
 
void i2c_interrupt_slave() {
unsigned char i2c_data;
void I2C_Interrupt_Slave() {
unsigned char received_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");
// 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;
i2c_data.operating_state = I2C_IDLE;
overrun_error = 1;
i2c_pdata->slave_error_count++;
i2c_pdata->slave_error_code = I2C_ERR_OVERRUN;
i2c_data.return_status = 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);
received_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) {
switch (i2c_data.operating_state) {
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;
}
i2c_data.buffer_in_len_tmp = 0;
i2c_data.operating_state = I2C_STARTED;
// if (data_read_from_buffer) {
// 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_data.operating_state = I2C_IDLE;
// i2c_data.return_status = I2C_ERR_NOADDR;
// } else {
// // Determine if we are sending or receiving data
// if (SSPSTATbits.R_W == 1) {
// i2c_data.operating_state = I2C_SEND_DATA;
// } else {
// i2c_data.operating_state = I2C_RCV_DATA;
// }
// }
// } else {
// i2c_data.operating_state = I2C_STARTED;
// }
}
break;
}
271,92 → 366,54
{
// 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;
i2c_data.operating_state = 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;
// Address received
if (SSPSTATbits.R_W == 0) {
// Slave write mode
i2c_data.operating_state = I2C_RCV_DATA;
} else {
// Slave read mode
i2c_data.operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
}
} 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;
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
}
break;
}
send:
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;
if (!i2c_data.slave_sending_data) {
// If we are not currently sending data, figure out what to reply with
if (I2C_Process_Send(i2c_data.slave_in_last_byte)) {
// Data exists to be returned, send first byte
SSPBUF = i2c_data.buffer_out[0];
i2c_data.buffer_out_ind = 1;
i2c_data.slave_sending_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);
}
// Unknown request
i2c_data.slave_sending_data = 0;
i2c_data.operating_state = I2C_IDLE;
}
} 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++;
// Sending remaining data back to master
if (i2c_data.buffer_out_ind < i2c_data.buffer_out_len) {
SSPBUF = i2c_data.buffer_out[i2c_data.buffer_out_ind];
i2c_data.buffer_out_ind++;
data_written_to_buffer = 1;
} else {
// We have nothing left to send
i2c_pdata->slave_sending_data = 0;
i2c_pdata->status = I2C_IDLE;
// Nothing left to send
i2c_data.slave_sending_data = 0;
i2c_data.operating_state = I2C_IDLE;
}
}
break;
365,40 → 422,53
{
// 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++;
// Stop bit detected, we need to check to see if we also read data
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;
// Data received with stop bit
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = received_data;
if (i2c_data.buffer_in_write_ind == MAXI2CBUF-1) {
i2c_data.buffer_in_write_ind = 0;
} else {
i2c_data.buffer_in_write_ind++;
}
i2c_data.buffer_in_len_tmp++;
// Save the last byte received
i2c_data.slave_in_last_byte = received_data;
i2c_data.return_status = I2C_DATA_AVAL;
} 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;
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
} else {
msg_send_data_to_main = 1;
}
i2c_pdata->status = I2C_IDLE;
i2c_data.buffer_in_len += i2c_data.buffer_in_len_tmp;
i2c_data.operating_state = 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 */ {
// Data received
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = received_data;
if (i2c_data.buffer_in_write_ind == MAXI2CBUF-1) {
i2c_data.buffer_in_write_ind = 0;
} else {
i2c_data.buffer_in_write_ind++;
}
i2c_data.buffer_in_len_tmp++;
// Save the last byte received
i2c_data.slave_in_last_byte = received_data;
i2c_data.return_status = I2C_DATA_AVAL;
} else {
// Restart bit detected
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;
i2c_data.buffer_in_len += i2c_data.buffer_in_len_tmp;
i2c_data.operating_state = I2C_SEND_DATA;
// Process the first byte immediatly if sending data
goto send;
} else {
// Bad to recv an address again, we aren't ready
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
}
}
414,35 → 484,56
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;
/* Returns 0 if I2C module is currently busy, otherwise returns status code */
unsigned char I2C_Get_Status() {
if (i2c_data.operating_mode == I2C_MODE_MASTER) {
if (i2c_data.master_status != I2C_MASTER_IDLE || i2c_data.buffer_in_len == 0) {
return 0;
} else {
return i2c_data.return_status;
}
} else if (i2c_data.operating_mode = I2C_MODE_SLAVE) {
if (i2c_data.operating_state != I2C_IDLE || i2c_data.buffer_in_len == 0) {
return 0;
} else {
return i2c_data.return_status;
}
}
}
 
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;
/* Returns 0 if I2C module is currently busy, otherwise returns buffer length */
unsigned char I2C_Read_Buffer(char *buffer) {
unsigned char i = 0;
while (i2c_data.buffer_in_len != 0) {
buffer[i] = i2c_data.buffer_in[i2c_data.buffer_in_read_ind];
i++;
if (i2c_data.buffer_in_read_ind == MAXI2CBUF-1) {
i2c_data.buffer_in_read_ind = 0;
} else {
i2c_data.buffer_in_read_ind++;
}
i2c_data.buffer_in_len--;
}
return i;
}
 
unsigned char i2c_master_busy() {
if (i2c_pdata->master_state == I2C_MASTER_IDLE) {
return 0;
} else {
return 1;
/* Put data to be returned here */
unsigned char I2C_Process_Send(unsigned char c) {
unsigned char ret = 0;
switch (c) {
case 0xAA:
i2c_data.buffer_out[0] = 'A';
i2c_data.buffer_out_len = 1;
ret = 1;
break;
case 0xBB:
i2c_data.buffer_out[0] = '1';
i2c_data.buffer_out[1] = '2';
i2c_data.buffer_out_len = 2;
ret = 1;
break;
}
}
return ret;
}
/PIC Stuff/PIC_27J13/i2c.h
1,57 → 1,76
#ifndef __i2c_h
#define __i2c_h
 
#define MAXI2CBUF MSGLEN
#define MAXI2CBUF 64
 
#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
// Operating State
#define I2C_IDLE 0x1
#define I2C_STARTED 0x2
#define I2C_RCV_DATA 0x3
#define I2C_SEND_DATA 0x4
#define I2C_SEND_ADDR 0x5
#define I2C_SEND_ADDR_2 0x6
#define I2C_CHECK_ACK_SEND 0x7
#define I2C_CHECK_ACK_RECV 0x8
#define I2C_CHECK_ACK_RESTART 0x9
#define I2C_REQ_DATA 0xA
#define I2C_SEND_STOP 0xB
#define I2C_SEND_START 0xC
 
#define I2C_MODE_SLAVE 0x10
#define I2C_MODE_MASTER 0x11
// Operating Mode
#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
// Master Status
#define I2C_MASTER_SEND 0x20
#define I2C_MASTER_RECV 0x21
#define I2C_MASTER_RESTART 0x22
#define I2C_MASTER_IDLE 0x23
 
#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
// Return Status
#define I2C_SEND_OK 0x30
#define I2C_SEND_FAIL 0x31
#define I2C_RECV_OK 0x32
#define I2C_RECV_FAIL 0x33
#define I2C_DATA_AVAL 0x34
#define I2C_ERR_NOADDR 0x35
#define I2C_ERR_OVERRUN 0x36
#define I2C_ERR_NODATA 0x37
#define I2C_ERR_BUFFER_OVERRUN 0x38
 
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 buffer_in[MAXI2CBUF];
unsigned char buffer_in_len;
unsigned char buffer_in_len_tmp;
unsigned char buffer_in_read_ind;
unsigned char buffer_in_write_ind;
unsigned char buffer_out[MAXI2CBUF];
unsigned char buffer_out_len;
unsigned char buffer_out_ind;
 
unsigned char operating_mode;
unsigned char operating_state;
unsigned char return_status;
 
unsigned char master_dest_addr;
unsigned char master_status;
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);
void I2C_Init(void);
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);
void I2C_Master_Restart(unsigned char address, unsigned char msg, unsigned char length);
unsigned char I2C_Get_Status(void);
unsigned char I2C_Read_Buffer(char *buffer);
unsigned char I2C_Process_Send(unsigned char);
 
#endif
/PIC Stuff/PIC_27J13/interrupts.c
1,5 → 1,6
#include "maindefs.h"
#include "uart.h"
#include "i2c.h"
#include "interrupts.h"
 
//----------------------------------------------------------------------------
18,7 → 19,7
IPR1bits.RC1IP = 1; // USART1 RX interrupt
IPR1bits.TX1IP = 1; // USART1 TX interrupt
// IPR3bits.RC2IP = 1; // USART2 RX interrupt
// IPR1bits.SSPIP = 1; // I2C interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
 
// Low priority interrupts
29,8 → 30,6
// 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
134,15 → 133,16
// 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;
// }
// Check to see if we have an I2C interrupt
if (PIR1bits.SSPIF) {
// Call the handler
I2C_Interrupt_Handler();
 
// Clear the interrupt flag
PIR1bits.SSPIF = 0;
 
return;
}
}
 
//----------------------------------------------------------------------------
/PIC Stuff/PIC_27J13/main.c
1,7 → 1,7
#include "maindefs.h"
#include "interrupts.h"
#include "uart.h"
//#include "i2c.h"
#include "i2c.h"
//#include "adc.h"
//#include "timers.h"
//#include "xbee.h"
57,6 → 57,8
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
unsigned char test[8] = "ASDF123";
unsigned char buffer[100];
/* --------------------- Oscillator Configuration --------------------- */
70,8 → 72,8
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C 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
84,11 → 86,67
// Loop and process recieved messages from interrupts;
 
// I2C_Configure_Master();
I2C_Configure_Slave(0x30);
 
TRISCbits.TRISC0 = 0;
TRISCbits.TRISC1 = 0;
TRISCbits.TRISC2 = 0;
LATCbits.LATC0 = 0;
LATCbits.LATC1 = 0;
LATCbits.LATC2 = 0;
while (1) {
length = UART1_Read((char *)buffer);
if (length != 0) {
UART1_WriteB((char *)buffer, length) ;
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
/* UART Test */
// length = UART1_Read((char *)buffer);
// if (length != 0) {
// UART1_WriteB((char *)buffer, length) ;
// }
/* UART Test*/
 
/* I2C Master Test */
// buffer[0] = 0xBB;
// I2C_Master_Send(0x30, 1, buffer);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x ", result);
//
// I2C_Master_Recv(0x30, 2);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x ", result);
//
// I2C_Master_Restart(0x30, 0xBB, 2);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x\r\n", result);
/* I2C Master Test */
 
/* I2C Slave Receive Test */
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
Delay10KTCYx(255);
DBG_PRINT_MAIN("%X ", result);
length = I2C_Read_Buffer(buffer);
DBG_PRINT_MAIN("%d ", length);
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", buffer[i]);
}
DBG_PRINT_MAIN("\r\n");
/* I2C Slave Receive Test */
}
}
/PIC Stuff/PIC_27J13/maindefs.h
3,6 → 3,7
 
#include <p18f27j13.h>
#include <stdio.h>
#include "uart.h"
 
#define _DEBUG
 
/PIC Stuff/PIC_27J13/nbproject/Makefile-default.mk
41,11 → 41,11
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
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/i2c.o
POSSIBLE_DEPFILES=${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/i2c.o.d
 
# Object Files
OBJECTFILES=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o
OBJECTFILES=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/i2c.o
 
 
CFLAGS=
94,6 → 94,12
${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
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
else
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
113,6 → 119,12
${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
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
endif
 
# ------------------------------------------------------------------------------------
/PIC Stuff/PIC_27J13/nbproject/Makefile-genesis.properties
1,5 → 1,5
#
#Thu Jun 28 12:38:48 EDT 2012
#Thu Jun 28 14:34:26 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
/PIC Stuff/PIC_27J13/nbproject/configurations.xml
7,6 → 7,7
<itemPath>interrupts.h</itemPath>
<itemPath>maindefs.h</itemPath>
<itemPath>uart.h</itemPath>
<itemPath>i2c.h</itemPath>
</logicalFolder>
<logicalFolder name="LibraryFiles"
displayName="Library Files"
26,6 → 27,7
<itemPath>interrupts.c</itemPath>
<itemPath>main.c</itemPath>
<itemPath>uart.c</itemPath>
<itemPath>i2c.c</itemPath>
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
42,7 → 44,7
<targetHeader></targetHeader>
<platformTool>PICkit3PlatformTool</platformTool>
<languageToolchain>C18</languageToolchain>
<languageToolchainVersion>3.42</languageToolchainVersion>
<languageToolchainVersion>3.40</languageToolchainVersion>
<platform>3</platform>
</toolsSet>
<compileType>
/PIC Stuff/PIC_27J13/nbproject/private/configurations.xml
5,7 → 5,7
<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>
<languageToolchainDir>C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin</languageToolchainDir>
<mdbdebugger version="1">
<placeholder1>place holder 1</placeholder1>
<placeholder2>place holder 2</placeholder2>
/PIC Stuff/PIC_27J13/uart.c
52,7 → 52,7
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");
DBG_PRINT_UART("UART1: buffer overflow\r\n");
c = RCREG1; // Read RCREG to clear it
} else {
// Save received data into buffer
71,7 → 71,7
RCSTA1bits.CREN = 0; // Reset UART1
RCSTA1bits.CREN = 1;
TXSTA1bits.TXEN = 0; // Kill anything currently sending
DBG_PRINT_UART("UART1 Overrun!\r\n");
DBG_PRINT_UART("UART1: overrun\r\n");
}
}