/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"); |
} |
} |