Browse Source

first commit

wott 7 years ago
commit
1c5a3933fa
71 changed files with 17338 additions and 0 deletions
  1. 1094 0
      HEX_ELF/BMS_Slave.RCT.v217.hex
  2. 694 0
      ProjectSource/BMS_Slave_RCT/BMS_CAN.c
  3. 98 0
      ProjectSource/BMS_Slave_RCT/BMS_CAN.h
  4. 1245 0
      ProjectSource/BMS_Slave_RCT/BMS_ECAN.c
  5. 376 0
      ProjectSource/BMS_Slave_RCT/BMS_ECAN.def
  6. 1714 0
      ProjectSource/BMS_Slave_RCT/BMS_ECAN.h
  7. 192 0
      ProjectSource/BMS_Slave_RCT/BMS_EEPROM.c
  8. 40 0
      ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h
  9. 1219 0
      ProjectSource/BMS_Slave_RCT/BMS_LTC.c
  10. 270 0
      ProjectSource/BMS_Slave_RCT/BMS_LTC.h
  11. 38 0
      ProjectSource/BMS_Slave_RCT/BMS_MISRA.h
  12. 78 0
      ProjectSource/BMS_Slave_RCT/BMS_NTC28.c
  13. 25 0
      ProjectSource/BMS_Slave_RCT/BMS_NTC28.h
  14. 2091 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/BMS_Slave.map
  15. 108 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/Makefile
  16. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_CAN.o
  17. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_CAN.o.d
  18. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_ECAN.o
  19. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_ECAN.o.d
  20. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_EEPROM.o
  21. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_EEPROM.o.d
  22. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_LTC.o
  23. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_LTC.o.d
  24. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_NTC28.o
  25. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_NTC28.o.d
  26. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_Slave.o
  27. 11 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_Slave.o.d
  28. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/dist/default/production/BMS_Slave.X.production.cof
  29. 1094 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/dist/default/production/BMS_Slave.X.production.hex
  30. 201 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-default.mk
  31. 8 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-genesis.properties
  32. 69 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-impl.mk
  33. 37 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-local-default.mk
  34. 13 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-variables.mk
  35. 73 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Package-default.bash
  36. 113 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/configurations.xml
  37. 4 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/SuppressibleMessageMemo.properties
  38. 25 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/configurations.xml
  39. 0 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/private.properties
  40. 9 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/private.xml
  41. 0 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/project.properties
  42. 16 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/project.xml
  43. 360 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.c
  44. 118 0
      ProjectSource/BMS_Slave_RCT/BMS_Slave.h
  45. BIN
      ProjectSource/BMS_Slave_RCT/BMS_Slave.rar
  46. 1246 0
      ProjectSource/BMS_Slave_RCT/ECAN.c
  47. 376 0
      ProjectSource/BMS_Slave_RCT/ECAN.def
  48. 1714 0
      ProjectSource/BMS_Slave_RCT/ECAN.h
  49. 194 0
      ProjectSource/BMS_Slave_RCT/SSL_CheckerBoardTest.c
  50. 57 0
      ProjectSource/BMS_Slave_RCT/SSL_CheckerBoardTest.h
  51. 38 0
      ProjectSource/BMS_Slave_RCT/SSL_Class_B_Demo.c
  52. 132 0
      ProjectSource/BMS_Slave_RCT/SSL_Class_B_Tests.c
  53. 85 0
      ProjectSource/BMS_Slave_RCT/SSL_Class_B_Tests.h
  54. 117 0
      ProjectSource/BMS_Slave_RCT/SSL_CpuRegisterTest.c
  55. 50 0
      ProjectSource/BMS_Slave_RCT/SSL_CpuRegisterTest.h
  56. 253 0
      ProjectSource/BMS_Slave_RCT/SSL_Demo.c
  57. 79 0
      ProjectSource/BMS_Slave_RCT/SSL_Demo.h
  58. 130 0
      ProjectSource/BMS_Slave_RCT/SSL_Demo2.c
  59. 112 0
      ProjectSource/BMS_Slave_RCT/SSL_FLASH_CRC.c
  60. 50 0
      ProjectSource/BMS_Slave_RCT/SSL_FLASH_CRC.h
  61. 221 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest.c
  62. 56 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest.h
  63. 221 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest2.c
  64. 92 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest2.h
  65. 114 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchCMinusRamTest.c
  66. 52 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchCMinusRamTest.h
  67. 221 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchCRamTest.c
  68. 55 0
      ProjectSource/BMS_Slave_RCT/SSL_MarchCRamTest.h
  69. 83 0
      ProjectSource/BMS_Slave_RCT/SSL_ProgCounterTest.c
  70. 51 0
      ProjectSource/BMS_Slave_RCT/SSL_ProgCounterTest.h
  71. 51 0
      Release_Notes/Release_History.txt

+ 1094 - 0
HEX_ELF/BMS_Slave.RCT.v217.hex

@@ -0,0 +1,1094 @@
+:020000040000FA
+:060000002CEF21F01200BC
+:020006001200E6
+:080008000000000000000000F0
+:0700100000000000000000E9
+:060018004CEF1AF012008B
+:02001E000300DD
+:1000200010000000080E000007000000080000009B
+:10003000000E000008000000AC420000CF010000EC
+:0400400015000000A7
+:0C004400D9CFE6FFE1CFD9FF0B0EE1267B
+:10005000DF6A010EDB6A040EF36E020EF3CFDBFFE4
+:10006000010EF36E030EF3CFDBFF080EF36E040EEA
+:10007000F3CFDBFF060EF36E050EF3CFDBFF010EB1
+:10008000F36E060EF3CFDBFF010EF36E070EF3CF18
+:10009000DBFF010EF36E080EF3CFDBFF090EDB6A08
+:1000A0000A0EDB6AD398D38AD38C9B9CC26A300E2B
+:1000B000C16E920EC06E0F010B0E5D6F5C6BC28045
+:1000C000928092829286898A929AFB0E936E949085
+:1000D000949294948C6A956A96909692030E8D12DF
+:1000E000F80E8B148B6E8B802EEC0CF052EC0DF016
+:1000F000010EF1C1DBFFD950010FE66E000EDA20D0
+:10010000E66E89EC0DF0E552E552DF6ADFCF14F0C0
+:10011000180EE76E1418E8AE02D0E73402D0E750AC
+:10012000145C1BE2DFCFE9FFEA6AE9BEEA68D89017
+:10013000E936EA36520EE926020EEA22EE68ED684A
+:10014000DFCFE9FFEA6AE9BEEA68900EE926020E0F
+:10015000EA22CD0EEF6EDF2AD9D7E668E668E668B8
+:10016000E66AE66AE66AE66AE66A010EE66EE3ECCD
+:1001700005F0146E090EE15E14500201BC6BF28EA4
+:10018000F28C0B0EE15C02E2E16AE552E16EE552AF
+:10019000E7CFD9FF1200D9CFE6FFE1CFD9FFE65272
+:1001A000DF6AFD0EDBCFE9FFFE0EDBCFEAFFEECF0D
+:1001B00008F0EDCF09F00850100B23E082A821D001
+:1001C000100EE66EE66AB00EE66E100EE66EFEECFF
+:1001D00008F0E552E552E552E552000902E002015D
+:1001E000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE9866
+:1001F000ED52FD0EDBCFE9FFFE0EDBCFEAFFEE8A0C
+:10020000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECFB6
+:1002100008F0EDCF09F00850200B1BE082A819D0A0
+:10022000200EE66EE66AB00EE66E100EE66EFEEC8E
+:1002300008F0E552E552E552E552000902E00201FC
+:10024000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE9A03
+:10025000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECF66
+:1002600008F0EDCF09F00850400B23E082A821D020
+:10027000400EE66EE66A500EE66E300EE66E20EC3C
+:100280000AF0E552E552E552E552000902E00201AA
+:10029000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE8EBF
+:1002A000ED52FD0EDBCFE9FFFE0EDBCFEAFFEE9C49
+:1002B000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECF06
+:1002C00008F0EDCF09F00850800B33E082A831D060
+:1002D000800EE66EE66A500EE66E300EE66E20EC9C
+:1002E0000AF0E552E552E552E552000902E002014A
+:1002F000BC2B070E8B14DF6EF80E8B148B6EDFCFCA
+:1003000014F0060EE76E1418E8AE02D0E73402D0FF
+:10031000E750145C04E2DF508B10010F01D0010E96
+:100320008B6EFD0EDBCFE9FFFE0EDBCFEAFFEE9E0C
+:10033000ED6AE552E552E7CFD9FF1200D9CFE6FFCB
+:10034000E1CFD9FF040EE126010EDE6EDE6ADE6A21
+:10035000DD6ADD52DD52DECF14F0DECF15F0DECFE8
+:1003600016F0DDCF17F0DD52DD52FE0EDB5008E057
+:100370000001D8901436153616361736E804F9E120
+:1003800014C0DFFF010E15C0DBFF020E16C0DBFF3D
+:10039000030E17C0DBFFE66AE66AE66AE66AD9CFB3
+:1003A000E9FFDACFEAFFEECFE6FFEECFE6FFEECFD2
+:1003B000E6FFEFCFE6FF010EE66EE3EC05F0146E0C
+:1003C000090EE15E1450040EE15C02E2E16AE552BE
+:1003D000E16EE552E7CFD9FF1200D9CFE6FFE1CFBA
+:1003E000D9FF040EE126010EDE6EDE6ADE6ADD6AEA
+:1003F000DD52DD52DECF14F0DECF15F0DECF16F089
+:10040000DDCF17F0DD52DD52FE0EDB5008E00001BB
+:10041000D8901436153616361736E804F9E114C0AC
+:10042000DFFF010E15C0DBFF020E16C0DBFF030E5F
+:1004300017C0DBFFD9CFE9FFDACFEAFFEECFE6FF47
+:10044000EECFE6FFEECFE6FFEFCFE6FFE66AE66A25
+:10045000E66AE66A010EE66EB6DB146E090EE15E30
+:100460001450040EE15C02E2E16AE552E16EE552ED
+:10047000E7CFD9FF1200E6680F0EE66EE66AE66A7D
+:10048000E66AE66AE66AE66AE66A9DDB146E090ECB
+:10049000E15E14501200D9CFE6FFE1CFD9FF020E82
+:1004A000E126FE0EEA6ADB34FE0BEA36E96E520EF6
+:1004B000E926020EEA22EECFDEFFEDCFDDFF0E01D0
+:1004C0000E5125E1DECF14F0DDCF15F0D890155098
+:1004D00004E6030E145C000E155819E3DECF14F089
+:1004E000DDCF15F0153411E21450F0080A0E155442
+:1004F0000CE2DECF16F0DDCF17F0D890175004E6EF
+:10050000100E165C0E0E175802E3010E0E6FFE0E53
+:10051000EA6ADB34FE0BEA36E96E520EE926020E79
+:10052000EA22EE68ED68DECF14F0DDCF15F014C0DE
+:10053000F3FF15C0F4FF020EE15C02E2E16AE5524E
+:10054000E16EE552E7CFD9FF1200D9CFE6FFE1CF48
+:10055000D9FFE652FE0EDB50EA6A900FE96E020EFA
+:10056000EA22EFCFDFFF0E010D5127E1DFCF14F0BC
+:10057000D30EE76E1418E8AE02D0E73402D0E7508D
+:10058000145C1BE3DFCF14F00A0EE76E1418E8AE1C
+:1005900002D0143403D0E750D88014540CE2DFCFDB
+:1005A00015F0320EE76E1518E8AE02D0E73402D02F
+:1005B000E750155C02E3010E0D6FFE0EDB50EA6A98
+:1005C000900FE96E020EEA22CD0EEF6EDFCF14F02F
+:1005D000156A14BE156814C0F3FF15C0F4FFE55288
+:1005E000E552E7CFD9FF1200D9CFE6FFE1CFD9FF1F
+:1005F000FD0EDBCFE9FFFE0EDBCFEAFFEE6AED6A10
+:10060000D80E0201E76EA819E8AE02D0E73402D096
+:10061000E750A85D08E2FD0EDBCFE9FFFE0EDBCF61
+:10062000EAFFEE80ED52D80EE76EA919E8AE02D0CF
+:10063000E73402D0E750A95D08E2FD0EDBCFE9FF09
+:10064000FE0EDBCFEAFFEE82ED52500EE76EA819E8
+:10065000E8AE02D0A83503D0E750D880A85508E20C
+:10066000FD0EDBCFE9FFFE0EDBCFEAFFEE84ED529D
+:10067000500EE76EA919E8AE02D0A93503D0E750B5
+:10068000D880A95508E2FD0EDBCFE9FFFE0EDBCFD7
+:10069000EAFFEE86ED52AA5108E0FD0EDBCFE9FF3E
+:1006A000FE0EDBCFEAFFEE88ED52AB5108E0FD0E07
+:1006B000DBCFE9FFFE0EDBCFEAFFEE8AED520E0143
+:1006C0000251031108E0FD0EDBCFE9FFFE0EDBCF88
+:1006D000EAFFEE8CED52026B036B0201BC5108E0A5
+:1006E000FD0EDBCFE9FFFE0EDBCFEAFFEE8EED5213
+:1006F00080B408D0FD0EDBCFE9FFFE0EDBCFEAFFB2
+:10070000EE52ED80FD0EDBCFE9FFFE0EDBCFEAFF00
+:10071000020EE926000EEA22BCC2EFFFBC6BFD0E02
+:10072000DBCFE9FFFE0EDBCFEAFF040EE926000E69
+:10073000EA2200CEEEFF01CEEDFFE552E7CFD9FF72
+:100740001200D9CFE6FFE1CFD9FF020EE126DE6A23
+:10075000DD6A830EC2140C09C26EC282C2B2FED719
+:10076000C450176E166AC35000011624146E000E92
+:100770001720156E14C0DEFFDD6ED9CFE9FFDACF8A
+:10078000EAFFF40EEE5E010EED5AD9CFE9FFDACFA3
+:10079000EAFF0A0E0D6E0E6AEECF08F0EDCF09F0FB
+:1007A00019EC1FF008C0EEFF09C0EDFFFD0EDBCF16
+:1007B000E9FFFE0EDBCFEAFF030EE926000EEA2278
+:1007C000DFCFEFFF020EE15C02E2E16AE552E16E8B
+:1007D000E552E7CFD9FF1200D9CFE6FFE1CFD9FF2D
+:1007E000E652DF6A0E01006B016B600EE66EDFEC15
+:1007F00020F0E552100EE66EE66A9A0EE66E1E0EC8
+:10080000E66EFEEC08F0E552E552E552E552600E68
+:10081000E66EDFEC20F0E552200EE66EE66A9A0EF8
+:10082000E66E1E0EE66EFEEC08F0E552E552E5526D
+:10083000E552000903E00E01008F2BD0020EDF6E9F
+:10084000DFCF14F0140EE76E1418E8AE02D0E734D0
+:1008500002D0E750145C1DE2DFCFE9FFEA6AE9BE8F
+:10086000EA682A0EE926020EEA22EF0402E10E01EE
+:100870000081130EDF24E96EEA6AE9BEEA682A0EF7
+:10088000E926020EEA22EF0402E10E010181DF2ACD
+:10089000D7D7100EE66EE66A9D0EE66E1F0EE66E68
+:1008A000FEEC08F0E552E552E552E552600EE66EC8
+:1008B000DFEC20F0E552200EE66EE66A9D0EE66E55
+:1008C0001F0EE66EFEEC08F0E552E552E552E552E9
+:1008D000000903E00E01008F2BD0020EDF6EDFCF88
+:1008E00014F0140EE76E1418E8AE02D0E73402D00C
+:1008F000E750145C1DE2DFCFE9FFEA6AE9BEEA686F
+:100900002A0EE926020EEA22EF0402E10E0100831C
+:10091000130EDF24E96EEA6AE9BEEA682A0EE926C8
+:10092000020EEA22EF0402E10E010183DF2AD7D78B
+:10093000100EE66EE66AB00EE66E100EE66EFEEC87
+:1009400008F0E552E552E552E552600EE66EDFEC46
+:1009500020F0E552200EE66EE66AB00EE66E100E4E
+:10096000E66EFEEC08F0E552E552E552E55200096C
+:1009700002E00E01008F400EE66EE66A7A0EE66E29
+:100980003E0EE66E20EC0AF0E552E552E552E552E5
+:10099000140EE66EDFEC20F0E552800EE66EE66A9D
+:1009A0007A0EE66E3E0EE66E20EC0AF0E552E55257
+:1009B000E552E552000903E00E01008F35D0020E2A
+:1009C000DF6EDFCF14F0060EE76E1418E8AE02D02B
+:1009D000E73402D0E750145C1DE2DFCFE9FFEA6A9A
+:1009E000E9BEEA68820EE926020EEA22EF0402E17D
+:1009F0000E010085060EDF24E96EEA6AE9BEEA68A8
+:100A0000820EE926020EEA22EF0402E10E010185C0
+:100A1000DF2AD7D70201880502E10E010085020115
+:100A20008E0502E10E010185400EE66EE66A7D0E3E
+:100A3000E66E3F0EE66E20EC0AF0E552E552E55216
+:100A4000E552140EE66EDFEC20F0E552800EE66E05
+:100A5000E66A7D0EE66E3F0EE66E20EC0AF0E55289
+:100A6000E552E552E552000903E00E01008F35D052
+:100A7000020EDF6EDFCF14F0060EE76E1418E8AE3C
+:100A800002D0E73402D0E750145C1DE2DFCFE9FF6B
+:100A9000EA6AE9BEEA68820EE926020EEA22EF045B
+:100AA00002E10E010087060EDF24E96EEA6AE9BE64
+:100AB000EA68820EE926020EEA22EF0402E10E0144
+:100AC0000187DF2AD7D70201880502E10E010087DE
+:100AD00002018E0502E10E010187400EE66EE66A14
+:100AE000500EE66E300EE66E20EC0AF0E552E5524E
+:100AF000E552E552140EE66EDFEC20F0E552800E72
+:100B0000E66EE66A500EE66E300EE66E20EC0AF0F7
+:100B1000E552E552E552E552000902E00E01008F70
+:100B2000100EE66EE66AD6DAE552E5526E0EE66E15
+:100B3000DFEC20F0E552200EE66EE66ACBDAE552F5
+:100B4000E552000903E00E01008F34D00201D89075
+:100B5000B55104E6340EB45D080EB55902E20E013B
+:100B600000890201B53507E2B45154080B0EB555A2
+:100B700002E20E01008B0201B85102E00E01008D6D
+:100B80000201D890B75104E6340EB65D080EB7598D
+:100B900002E20E0101890201B73507E2B65154089D
+:100BA0000B0EB75502E20E01018B0201B95102E0B2
+:100BB0000E01018D00CEF3FF01CEF4FFE552E552A8
+:100BC000E7CFD9FF1200D9CFE6FFE1CFD9FF180E4A
+:100BD000E126140EDB6A150EDB6A160EDB6A170EB1
+:100BE000DB6AD950FA0FE96EFF0EDA20EA6E0E01C9
+:100BF0000451EE10046F0551EE10056F0651EE1012
+:100C0000066F0751EE10076FF60EDBCF14F0F70EEC
+:100C1000DBCF15F0F80EDBCF16F0F90EDBCF17F0B7
+:100C2000141E151E161E171E040EE96E0E0EEA6E19
+:100C3000EE501414046FEE501514056FEE50161498
+:100C4000066FEE501714076F140E04CEDBFF150E5F
+:100C500005CEDBFF160E06CEDBFF170E07CEDBFF41
+:100C6000140EDBCF14F0150EDBCF15F0160EDBCF14
+:100C700016F0170EDBCF17F01450E76E020EE7CF19
+:100C8000DBFF140EDBCF14F0150EDBCF15F0160EC4
+:100C9000DBCF16F0170EDBCF17F0080ED890173207
+:100CA000163215321432E806F9E1140E14C0DBFFD7
+:100CB000150E15C0DBFF160E16C0DBFF170E17C092
+:100CC000DBFF0F0E146E156A166A176AD950140FDF
+:100CD000E96EDACFEAFFEE501416EE501516EE501C
+:100CE0001616EE501716030E14C0DBFF140EDBCFE2
+:100CF00014F0150EDBCF15F0160EDBCF16F0170E25
+:100D0000DBCF17F0040ED89017321632153214329A
+:100D1000E806F9E1140E14C0DBFF150E15C0DBFF69
+:100D2000160E16C0DBFF170E17C0DBFF140EDBCF4D
+:100D300014F0150EDBCF15F0160EDBCF16F0170EE4
+:100D4000DBCF17F01450DF6E140EDBCF14F0150E4E
+:100D5000DBCF15F0160EDBCF16F0170EDBCF17F03A
+:100D6000080ED8901732163215321432E806F9E11F
+:100D7000140E14C0DBFF150E15C0DBFF160E16C0D7
+:100D8000DBFF170E17C0DBFF0F0E146E156A166A15
+:100D9000176AD950140FE96EDACFEAFFEE50141635
+:100DA000EE501516EE501616EE501716010E14C022
+:100DB000DBFFFE0EDB50100FE76E060EE7CFDBFF0A
+:100DC000070EDFCFDBFF010EDB50E76E080EE7CF2B
+:100DD000DBFF090EDB6A770EF36E0A0EF3CFDBFF43
+:100DE000AA0EF36E0B0EF3CFDBFF060EE66ED950A4
+:100DF000060FE66E000EDA20E66E7AEC0BF0E55296
+:100E0000E552E552E76E0C0EE7CFDBFFFE0EDB503E
+:100E1000100FE76E0D0EE7CFDBFF020EDB50E76E23
+:100E20000E0EE7CFDBFF030EDB50E76E0F0EE7CFB2
+:100E3000DBFF100EDB6A770EF36E110EF3CFDBFFD4
+:100E4000AA0EF36E120EF3CFDBFF060EE66ED9503C
+:100E50000D0FE66E000EDA20E66E7AEC0BF0E5522E
+:100E6000E552E552E76E130EE7CFDBFFD950040FD2
+:100E7000E66E000EDA20E66E100EE66EC70EE66E27
+:100E8000010EE66E08EC0DF0146E050EE15E1450D6
+:100E9000180EE15C02E2E16AE552E16EE552E7CF4D
+:100EA000D9FF1200D9CFE6FFE1CFD9FFE652DF6AC2
+:100EB000000EE66E020EE66E100EE66ECE0EE66ECA
+:100EC000020EE66E08EC0DF0146E050EE15E145095
+:100ED000060EE66E020EE66E020EE66E7AEC0BF081
+:100EE000E552E552E5520201085D0EE1060EE66E9E
+:100EF000090EE66E020EE66E7AEC0BF0E552E55254
+:100F0000E55202010F5D02E0DF6ADED0070E09152F
+:100F1000116F070E0215106F0951E840E840E840D4
+:100F20001F0B010B136F0251E840E840E8401F0B14
+:100F3000010B126F09390F0B010B156F02390F0BE3
+:100F4000010B146F0951E00BE838E840030B176FF1
+:100F50000251E00BE838E840030B166F0945010B1E
+:100F6000010B196F0245010B010B186F0F0E0B15CA
+:100F70001C6F1D6B156E146A0A5114241C6F000E31
+:100F800015201D6F0F0E04151A6F1B6B156E146A5A
+:100F9000035114241A6F000E15201B6F0C51206F83
+:100FA000216B0CC214F021C215F0040ED890143637
+:100FB0001536E804FBE102010B390F0B1424206FF6
+:100FC000000E1520216F05511E6F1F6B05C214F016
+:100FD0001FC215F0040ED89014361536E804FBE154
+:100FE000020104390F0B14241E6F000E15201F6F11
+:100FF0001F0E0D5D246F256B040E000A06E0020132
+:10100000D89024372537E804FBE124C214F025C228
+:1010100015F0D89015321432020124511424246F93
+:1010200025511520256F1F0E065D226F236B040EC0
+:10103000000A06E00201D89022372337E804FBE1DA
+:1010400022C214F023C215F0D890153214320201D6
+:1010500022511424226F23511520236F200E0E5D80
+:10106000286F296B040E000A06E00201D890283789
+:101070002937E804FBE128C214F029C215F0D89002
+:1010800015321432020128511424286F29511520D9
+:10109000296F200E075D266F276B040E000A06E0FD
+:1010A0000201D89026372737E804FBE126C214F066
+:1010B00027C215F0D890153214320201265114249B
+:1010C000266F27511520276FDF50E552E552E7CFF5
+:1010D000D9FF1200D9CFE6FFE1CFD9FFE652DF6A90
+:1010E000D950FD0FE96EFF0EDA20EA6E100EEE18F1
+:1010F0000AE1ED5008E1790EE66E520EE66EF3EC71
+:101100000CF0E552E552D950FD0FE96EFF0EDA20E2
+:10111000EA6E200EEE186CE1ED506AE182A868D00C
+:10112000898AAC0EE66E020EE66E080EE66E6B0E57
+:10113000E66E540EE66E08EC0DF0146E050EE15EE0
+:101140001450020EE66EAE0EE66E020EE66ED2DAB7
+:10115000E552E552E5520201B05D0DE1020EE66E88
+:10116000B10EE66E020EE66EC5DAE552E552E552C4
+:101170000201B35D02E0DF6A3BD0AFC2E6FFAEC260
+:10118000E6FF73DBE552E552F3CFB4F2F4CFB5F2EC
+:10119000B2C2E6FFB1C2E6FF68DBE552E552F3CF2B
+:1011A000B6F2F4CFB7F20201AF51E00BE838E840F5
+:1011B000010BB86FB251E00BE838E840010BB96F92
+:1011C000060EAFC2E7FF070B04E0E742E79EE80622
+:1011D000FCE1E7500201BA6F060EB2C2E7FF070B4F
+:1011E00004E0E742E79EE806FCE1E7500201BB6F3E
+:1011F000DF50E552E552E7CFD9FF1200D9CFE6FF25
+:10120000E1CFD9FF030EE126020EDB6AD950FB0FB6
+:10121000E96EFF0EDA20EA6E100EEE181AE1ED50BC
+:1012200018E1E668E668E668E66AE66AE66AE66A9B
+:10123000E66A010EE66EC7DC146E090EE15E14501C
+:10124000FD0EDBCFE6FFFE0EDBCFE6FFCCDBE5528B
+:10125000E552D950FB0FE96EFF0EDA20EA6E200E40
+:10126000EE1801E0DFD0ED5001E0DCD082A8DAD04A
+:10127000898ACFC114F0D0C115F0D1C116F0D2C106
+:1012800017F0141E151E161E171E14C0E6FF15C0FB
+:10129000E6FF16C0E6FF17C0E6FFCFC1E6FFD0C1EC
+:1012A000E6FFD1C1E6FFD2C1E6FF010EE66E8BDCA0
+:1012B000186E090EE15E18502A0EE66E020EE66EFA
+:1012C000280EE66EDC0EE66E040EE66EA1DB146EF2
+:1012D000050EE15E1450120EE66E2C0EE66E020E46
+:1012E000E66E08DAE552E552E55202013E5D0DE197
+:1012F000120EE66E3F0EE66E020EE66EFBD9E5526A
+:10130000E552E5520201515D03E0020EDB6A8AD02C
+:10131000DF6ADFCF14F0180EE76E1418E8AE02D0C3
+:10132000E73402D0E750145C01E37CD0DF407F0B50
+:10133000DF24E76E010EE7CFDBFFDFCF14F00B0EEB
+:10134000E76E1418E8AE02D0143403D0E750D8800A
+:10135000145402E2010EDB2A010EDB50030FE96E8A
+:10136000EA6AE9BEEA682A0EE926020EEA22EF508E
+:10137000E66E010EDB50020FE96EEA6AE9BEEA682A
+:101380002A0EE926020EEA22EF50E66E6EDAE552E8
+:10139000E552F3CF14F0F4CF15F0DFCFE9FFEA6A9E
+:1013A000E9BEEA68D890E936EA36520EE926020E1E
+:1013B000EA2214C0EEFF15C0EDFF010EDB50040F52
+:1013C000E96EEA6AE9BEEA682A0EE926020EEA2216
+:1013D000EF50E66E010EDB50030FE96EEA6AE9BEDC
+:1013E000EA682A0EE926020EEA22EF50E66E9BDA40
+:1013F000E552E552F3CF14F0F4CF15F0DF28E96E93
+:10140000EA6AE9BEEA68D890E936EA36520EE92679
+:10141000020EEA2214C0EEFF15C0EDFF020EDF241B
+:10142000DF6E77D7020EDB50146E030EE15C02E232
+:10143000E16AE552E16E1450E552E7CFD9FF1200A0
+:10144000D9CFE6FFE1CFD9FF070EE126040EDB6A14
+:10145000050EDB6A060EDB6AD950FB0FE96EFF0E44
+:10146000DA20EA6E400EEE180BE1ED5009E1FD0EB8
+:10147000DBCFE6FFFE0EDBCFE6FFB5DAE552E55245
+:10148000D950FB0FE96EFF0EDA20EA6E800EEE18DF
+:1014900001E022D1ED5001E01FD182A81DD1898A3F
+:1014A000820EE66E020EE66E0E0EE66EEA0EE66E38
+:1014B0000E0EE66EADDA146E050EE15E1450050EEA
+:1014C000E66E840EE66E020EE66E14D9E552E55223
+:1014D000E5520201895D0DE1050EE66E8A0EE66EAB
+:1014E000020EE66E07D9E552E552E55202018F5D24
+:1014F00003E0060EDB6AF0D0DE52020EDD6E070E50
+:101500008B14E76E040EE7CFDBFFDB06DBCFE6FFD5
+:10151000050EE552D880E754E76E050EE7CFDBFFF6
+:10152000DF6ADFCF14F0180EE76E1418E8AE02D0B1
+:10153000E73402D0E750145C01E3C5D0010EDB288C
+:10154000E96EEA6AE9BEEA68820EE926020EEA223C
+:10155000EF50E66E010EDBCFE9FFEA6AE9BEEA680A
+:10156000820EE926020EEA22EF50E66E7ED9E5529F
+:10157000E552020EF3CFDBFF030EF4CFDBFF020ECA
+:10158000DBCFE6FF030EDBCFE6FF6EEC20F0E5528B
+:10159000E552E66E040EDB50E824DF24EA6A900F81
+:1015A000E96E020EEA22E552E750EF6E010EDB2AE9
+:1015B000DB28E96EEA6AE9BEEA68820EE926020ED5
+:1015C000EA22EF50E66E010EDBCFE9FFEA6AE9BEE0
+:1015D000EA68820EE926020EEA22EF50E66EA3D9EF
+:1015E000E552E552020EF3CFDBFF030EF4CFDBFF33
+:1015F000020EDBCFE6FF030EDBCFE6FF6EEC20F042
+:10160000E552E552E66E050EDB50E824DF24010FBB
+:10161000EA6A900FE96E020EEA22E552E750EF6E99
+:10162000010EDB50020FE76E010EE7CFDBFFDB2878
+:10163000E96EEA6AE9BEEA68820EE926020EEA224B
+:10164000EF50E66E010EDBCFE9FFEA6AE9BEEA6819
+:10165000820EE926020EEA22EF50E66E06D9E55226
+:10166000E552020EF3CFDBFF030EF4CFDBFF020ED9
+:10167000DBCF15F0030EDBCF16F0D8901632153203
+:10168000E804FBE1110E155E010E165A0C0E146EE5
+:101690000E6EDFCF09F0FFEC1EF009C0E9FFEA6A29
+:1016A000E9BEEA68A80EE926020EEA2215C0EFFF9D
+:1016B000010EDB50030FE76E010EE7CFDBFF0C0ED0
+:1016C000DF24DF6E2ED7020188390F0B010BAA6FC2
+:1016D0008E390F0B010BAB6F060EDB50146E070E2D
+:1016E000E15C02E2E16AE552E16E1450E552E7CFB7
+:1016F000D9FF1200D9CFE6FFE1CFD9FF070EE126CF
+:10170000410EF36E020EF3CFDBFF030EDB6A040E15
+:10171000DB6A050EDB6A060EDB6ADF6AFC0EDB5055
+:10172000DF5C01E38DD0010EDB6ADBCF14F0080E25
+:10173000E76E1418E8AE02D0E73402D0E750145C2C
+:1017400001E37CD0800E156E010EDB5015C0E7FF63
+:10175000070B04E0E742E79EE806FCE1E750146E61
+:10176000DF50E76EFD0EDBCFE9FFFE0EDBCFEAFFB9
+:10177000E750E926000EEA22EF501414E76E030E3C
+:10178000E7CFDBFF010EDBCFE6FF070EE552D88087
+:10179000E754146E030EDB5014C0E7FFE75204E079
+:1017A000E8427F0BE706FCE1E76E030EE7CFDBFFC5
+:1017B000DBCFE6FF020EDB50800BE844010BE55265
+:1017C000E718E76E040EE7CFDBFFDBCFE6FF020E84
+:1017D000DB50010BE552E718E76E050EE7CFDBFFA4
+:1017E000040EDBCFE6FF020EDB50020BE8407F0B5E
+:1017F000E552E718E76E060EE7CFDBFF020EDB507F
+:10180000020D020EF3CFDBFF040EDBCFE6FF050E69
+:10181000DB50E824156E060EDB50040DF350151056
+:10182000E552E710146E020EDB50F80B1410E76E51
+:10183000020EE7CFDBFF010EDB2A77D7DF2A6ED758
+:10184000020EDB50146E070EE15C02E2E16AE55223
+:10185000E16E1450E552E7CFD9FF12009496949AA6
+:10186000320EC66EC79C9E961200D9CFE6FFE1CF1E
+:10187000D9FF020EE126DE6ADD6AFD0EDB500F0B9A
+:10188000DE6EDD6ADECF16F0DDCF17F016C017F082
+:10189000166AFE0EDB501624146E000E172014C0BC
+:1018A000DEFFDD6EDECF14F0DDCF15F0000E145E2E
+:1018B000020E155A14C0DEFF15C0DDFFDECF14F096
+:1018C000DDCF15F0800E151408E1DECF16F0DDCF68
+:1018D00017F0D890173216320BD0DECF16F0DDCFCE
+:1018E00017F0D89017321632000E1626800E1722E7
+:1018F000DE501624146EDD501720156E14C0DEFF66
+:10190000DD6EDECF14F0DDCF15F014C0F3FF15C08F
+:10191000F4FF020EE15C02E2E16AE552E16EE5529B
+:10192000E7CFD9FF1200D9CFE6FFE1CFD9FF020EF2
+:10193000E126DE6ADD6AFD0EDB50DE6EDD6ADECF9B
+:1019400016F0DDCF17F0040ED89016361736E804DF
+:10195000FBE1FE0EDB380F0B1624146E000E172071
+:1019600014C0DEFFDD6EDECF14F0DDCF15F0000E0B
+:10197000145E020E155A14C0DEFF15C0DDFFDECF67
+:1019800014F0DDCF15F0800E151408E1DECF16F04F
+:10199000DDCF17F0D890173216320BD0DECF16F00D
+:1019A000DDCF17F0D89017321632000E1626800EB3
+:1019B0001722DE501624146EDD50172014C0DEFFEF
+:1019C000DD6EDECF14F0DDCF15F014C0F3FF15C0CF
+:1019D000F4FF020EE15C02E2E16AE552E16EE552DB
+:1019E000E7CFD9FF1200D9CFE6FFE1CFD9FF899A1F
+:1019F000FE0EDB50C96E9EA6FED79E96FD0EDB50F6
+:101A0000C96E9EA6FED79E96E552E7CFD9FF12007B
+:101A1000D9CFE6FFE1CFD9FFE652FA0EDBCFE9FFDF
+:101A2000FB0EDBCFEAFFFE0EDBCFEFFF010EE76E12
+:101A3000FA0EDBCFE9FFFB0EDBCFEAFFE750E9262A
+:101A4000000EEA22FD0EDBCFEFFF899ADF6AFC0E63
+:101A5000DB50DF5C21E2DF50E76EFA0EDBCFE9FFFF
+:101A6000FB0EDBCFEAFFE750E926000EEA22EF503B
+:101A7000C96E9EA6FED79E96DF50E76EFA0EDBCFAC
+:101A8000E9FFFB0EDBCFEAFFE750E926000EEA2272
+:101A9000C9CFEFFFDF2ADBD7898AE552E552E7CFCE
+:101AA000D9FF1200CD88CD8A9F909D809E90CD82D7
+:101AB000CD8012000E01028D1200D9CFE6FFE1CFDA
+:101AC000D9FF020EE126DE6ADD6A830EC214000928
+:101AD000C26EC282C2B2FED7C450176E166AC3501D
+:101AE0001624146E000E172014C0DEFFDD6EDECF4C
+:101AF00014F0DDCF15F014C0F3FF15C0F4FF020E93
+:101B0000E15C02E2E16AE552E16EE552E7CFD9FF1E
+:021B10001200C1
+:0E1B1200D9CFE6FFE1CFD9FF800EE66E75EC6D
+:101B200018F0E552729E728CFD0EDBCFE9FFFE0EBF
+:101B3000DBCFEAFFEE52EF04146EFD0EDBCFE9FFC0
+:101B4000FE0EDBCFEAFF050EE926000EEA22EF04C7
+:101B5000400DF35014100E01436FFD0EDBCFE9FF73
+:101B6000FE0EDBCFEAFF020EE926000EEA22EF04AA
+:101B7000166EFD0EDBCFE9FFFE0EDBCFEAFF030E94
+:101B8000E926000EEA22EF04080DF3CF15F0FD0E52
+:101B9000DBCFE9FFFE0EDBCFEAFF070EE926000EE2
+:101BA000EA22EF50400DF3CF14F0FD0EDBCFE9FF3A
+:101BB000FE0EDBCFEAFF060EE926000EEA22EF500A
+:101BC000800DF350141015101610446FFD0EDBCF6E
+:101BD000E9FFFE0EDBCFEAFF040EE926000EEA2243
+:101BE000EF04156EFD0EDBCFE9FFFE0EDBCFEAFF43
+:101BF000090EE926000EEA22EF50400DF3CF14F053
+:101C0000FD0EDBCFE9FFFE0EDBCFEAFF080EE92673
+:101C1000000EEA22EF50800DF35014101510456F9E
+:101C20007D95E66AE668070EE66EE66AE66AF80EF5
+:101C3000E66E0E0EE66E89EC18F0146E070EE15E8D
+:101C400014500E01466B476B4681E66AFD0EDBCFF2
+:101C5000E9FFFE0EDBCFEAFFEF50156A000F146EAE
+:101C6000010E1522166A176A15AE02D0166817689B
+:101C700014C0E6FF15C0E6FF16C0E6FF17C0E6FF7A
+:101C8000E00EE66E0E0EE66E89EC18F0186E070E8A
+:101C9000E15E18500E01FC0E796FF00E716F7269E3
+:101CA000200E706EE66A75EC18F0E552606A0F015E
+:101CB000306B0E01806BFD0EDBCFE9FFFE0EDBCF3C
+:101CC000EAFFEF50E66EC5EC14F0E552010EE55266
+:101CD000E7CFD9FF1200D9CFE6FFE1CFD9FFE65217
+:101CE000FD0EDBCFE9FFFE0EDBCFEAFFEFCFDFFF1C
+:101CF000DF50120DF3CFE9FFF4CFEAFF000EE92623
+:101D0000010EEA22DFCFEFFFFD0EDBCFE9FFFE0E73
+:101D1000DBCFEAFFEE52EECF14F0EECF15F0EECFB0
+:101D200016F0EFCF17F0DF50120DF3CFE9FFF4CF2D
+:101D3000EAFF000EE926010EEA22EE5214C0EEFF81
+:101D400015C0EEFF16C0EEFF17C0EEFFFD0EDBCF95
+:101D5000E9FFFE0EDBCFEAFF050EE926000EEA22C0
+:101D6000EF50E66EDF50120DF3CFE9FFF4CFEAFF3C
+:101D7000000EE926010EEA22050EE926000EEA22EF
+:101D8000E552E750EF6EFD0EDBCFE9FFFE0EDBCF35
+:101D9000EAFF060EE926000EEA22EECF14F0EECF9F
+:101DA00015F0EECF16F0EFCF17F0DF50120DF3CF96
+:101DB000E9FFF4CFEAFF000EE926010EEA22060E43
+:101DC000E926000EEA2214C0EEFF15C0EEFF16C091
+:101DD000EEFF17C0EEFF010EE552E552E7CFD9FF47
+:101DE0001200D9CFE6FFE1CFD9FF020EE126DF6A6C
+:101DF000010EDB6ADB6A320EF36E010EDBCFF4FFFD
+:101E0000F350F45C33E2E66AFD0EDBCFE9FFFE0E31
+:101E1000DBCFEAFF050EE926000EEA22EF50E66E60
+:101E2000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCFCC
+:101E3000E9FFFE0EDBCFEAFFEE52EECFE6FFEECF7C
+:101E4000E6FFEECFE6FFEFCFE6FFF2EC15F0146E03
+:101E5000080EE15E1450DF6EDF5008E10B0EE66EF7
+:101E60003AEC21F0E552010EDB2AC5D7DF50146EA3
+:101E7000020EE15C02E2E16AE552E16E1450E552C5
+:101E8000E7CFD9FF1200D9CFE6FFE1CFD9FF020E8D
+:101E9000E126010EDB6AD9CFE6FFDACFE6FFFD0EC1
+:101EA000DBCFE9FFFE0EDBCFEAFF050EE926000ED1
+:101EB000EA22E9CF14F0EACF15F0E9CFE6FFEACF46
+:101EC000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EF1
+:101ED000DBCFE9FFFE0EDBCFEAFFEE52E9CF16F0D3
+:101EE000EACF17F0E9CFE6FFEACFE6FF45EC17F0BF
+:101EF000186E080EE15E1850E76E010EE7CFDBFFAB
+:101F0000080EDF140101CE6F010EDB50146E020EBD
+:101F1000E15C02E2E16AE552E16E1450E552E7CF7E
+:101F2000D9FF1200D9CFE6FFE1CFD9FF040EE12699
+:101F3000DF6A010EDB6A020EDB6A030EDB6ADF6A10
+:101F4000DFCF14F0060EE76E1418E8AE02D0E734C7
+:101F500002D0E750145C01E3B5D0040EDF02F35069
+:101F6000E66E4BEC02F0E552020EF3CFDBFF030E00
+:101F7000F4CFDBFF0101D551200DF350E00B01013F
+:101F8000C66F020E030EDBCF17F017C016F0176AEC
+:101F9000C65100011610E8CFC6F1FF0EE76E020E23
+:101FA000DBCF14F0030EE7501416156A14C0C7F106
+:101FB000040EDF02F328E66E4BEC02F0E552020E4F
+:101FC000F3CFDBFF030EF4CFDBFF020E030EDBCFFC
+:101FD00015F015C014F0156A14C0C8F1FF0EE76EB5
+:101FE000020EDBCF14F0030EE7501416156A14C06E
+:101FF000C9F1040EDF02F350020FE66E4BEC02F063
+:10200000E552020EF3CFDBFF030EF4CFDBFF020E2F
+:10201000030EDBCF15F015C014F0156A14C0CAF119
+:10202000FF0EE76E020EDBCF14F0030EE75014161E
+:10203000156A14C0CBF1040EDF02F350030FE66EF5
+:102040004BEC02F0E552020EF3CFDBFF030EF4CFB0
+:10205000DBFF020E030EDBCF15F015C014F0156A7E
+:1020600014C0CCF1FF0EE76E020EDBCF14F0030EAE
+:10207000E7501416156A14C0CDF1C60EE66E010EB7
+:10208000E66EDF28146E156A14BE1568120E15026E
+:10209000F3CF15F01402F3CF14F0F4501526000E10
+:1020A0001426010E152214C0E6FF15C0E6FF99DEC6
+:1020B000E552E552E552E552E76E010EE7CFDBFF50
+:1020C000DF2A3ED7010EDB50146E040EE15C02E203
+:1020D000E16AE552E16E1450E552E7CFD9FF1200F4
+:1020E000D9CFE6FFE1CFD9FF080EE126060EDB6A65
+:1020F000D9CFE6FFDACFE6FFA1EC03F0E552E552D7
+:10210000030EDB50E76E070EE7CFDBFFDBCF14F0EB
+:10211000000EE76E1418E8AE02D0143403D0E75076
+:10212000D88014540DE2070EDBCF15F0460EE76E93
+:102130001518E8AE02D0E73402D0E750155C03E38F
+:102140000E01010E0C6F0101D651040DF3CF14F0F6
+:102150000101D551200DF35014240101C66F070E63
+:10216000DBCFC7F1040E0101D603F350E66EA5ECF8
+:1021700002F0E552F3CFC8F1040E0101D603F328B3
+:10218000E66EA5EC02F0E552F3CFC9F1040E0101B1
+:10219000D603F350020FE66EA5EC02F0E552F3CF42
+:1021A000CAF1040E0101D603F350030FE66EA5EC4D
+:1021B00002F0E552F3CFCBF10101CC6BCD6BC60E33
+:1021C000E66E010EE66E900EE66E010EE66E09DE1C
+:1021D000E552E552E552E552E76E060EE7CFDBFF2A
+:1021E000DB50146E080EE15C02E2E16AE552E16E3A
+:1021F0001450E552E7CFD9FF1200D9CFE6FFE1CF67
+:10220000D9FF090EE126080EDB6AD9CFE6FFDACF47
+:10221000E6FF000EE66E010EE66E35DEE552E55293
+:10222000E552E552000919E0010EF36E080EF3CFF6
+:10223000DBFF8D70E00EDF14E00BE838E8400101B1
+:10224000D86F1F0EDF140101D76FD8C1DAF1010179
+:10225000DA2B080EDA5D01E3DA6B080EDB50146E40
+:10226000090EE15C02E2E16AE552E16E1450E552CA
+:10227000E7CFD9FF1200D9CFE6FFE1CFD9FF090E92
+:10228000E126080EDB6AD9CFE6FFDACFE6FF000EC3
+:10229000E66E010EE66EF7DDE552E552E552E552D7
+:1022A000000976E0010EF36E080EF3CFDBFF7792A4
+:1022B0008D70E00EDF14E00BE838E8400101D86FC4
+:1022C0001F0EDF140101D76F0101DA510101D85D42
+:1022D00003E10101DA2B06D0D8C1DAF10101DA2BD2
+:1022E0000101DB2B080E0101DA5D01E3DA6B030E5D
+:1022F000DBCFCFF10101D06BD16BD26B080E1F0B7E
+:10230000CFC114F0D0C115F0D1C116F0D2C117F071
+:1023100007E0D8901436153616361736E806F9E178
+:10232000020EDBCF18F0196A1A6A1B6A14501824BF
+:102330000101CF6F15501920D06F16501A20D16FA0
+:1023400017501B20D26F080E1F0BCFC114F0D0C145
+:1023500015F0D1C116F0D2C117F007E0D8901436AD
+:10236000153616361736E806F9E1010EDBCF18F000
+:10237000196A1A6A1B6A145018240101CF6F15508C
+:102380001920D06F16501A20D16F17501B20D26F12
+:10239000080EDB50146E090EE15C02E2E16AE552C0
+:1023A000E16E1450E552E7CFD9FF1200D9CFE6FF16
+:1023B000E1CFD9FF1C0EE126030EF36E080EF3CF1A
+:1023C000DBFF090EDB6A0E0EF36E0A0EF3CFDBFFA6
+:1023D0000B0EDB6A0C0EDB6A080EF36E0D0EF3CFEC
+:1023E000DBFF0E0EDB6A0F0EDB6A100EDB6A110ECE
+:1023F000DB6AD950120FE66E000EDA20E66ED95075
+:102400000D0FE66E000EDA20E66ED9CFE6FFDACFCA
+:10241000E6FFD9500E0FE66E000EDA20E66E45ECB0
+:1024200017F0146E080EE15E1450E76E0C0EE7CF45
+:10243000DBFF120EDB50080B0101CE6FD9500E0FDF
+:10244000E96EDACFEAFFEE5065E1030EEE1862E1C5
+:10245000EE5060E1EE505EE1070EDBCFE6FF060EC8
+:10246000DBCFE6FF050EDBCFE6FF040EDBCFE6FF9A
+:10247000030EDBCFE6FF020EDBCFE6FF010EDB50E3
+:10248000DF18E552E718E552E718E552E718E5527C
+:10249000E718E552E718E552E718E76E0B0EE7CFAD
+:1024A000DBFF080EDB50F36E0B0EDB50F35C0CE130
+:1024B0000101400EDD6F0101F16BF1C1E6FF65DA4C
+:1024C000E552E66AF50E0CD0090EDB50F36E0B0EEA
+:1024D000DB50F35C15E10101800EDD6FE66AF60E5C
+:1024E000E66E0D0EE66EE66AE66AF80EE66E0E0E13
+:1024F000E66E89EC18F0146E070EE15E14500AD0F7
+:102500000A0EDB50F36E0B0EDB50F35C03E10101AE
+:102510000A0EDD6F0101DD510A0A01E111D18A0ABB
+:1025200001E183D0C00A01E012D1D9500E0FE96E4B
+:10253000DACFEAFF0A0EEE1808E1010EEE1805E107
+:10254000EE5003E1EE5001E110D9D9500E0FE96EC3
+:10255000DACFEAFF0A0EEE1801E0F9D0030EEE180A
+:1025600001E0F5D0EE5001E0F2D0EE5001E0EFD006
+:10257000130EDB6A0D0EDB50F36E130EDBCFF4FF90
+:10258000F350F45C20E2D9CF16F0DACF17F0130E37
+:10259000DB500F01D924E96E000EDA20EA6EEF500D
+:1025A000E66ED950140F146EDACF15F0130EDB500F
+:1025B0001424E96E000EDA20EA6EE552E750EF6E61
+:1025C000130EDB2AD7D7140EDB500101F25D01E0B8
+:1025D000BED0150EDB50F35D01E0B9D0160EDB5016
+:1025E000E95D01E0B4D0180EDB50EC5D01E0AFD046
+:1025F0001B0EDBCFE6FFC9D9E552E66AE6680D0E91
+:10260000E66EE66AE66AF80EE66E0E0EE66E89EC97
+:1026100018F0146E070EE15E14501B0EDBCFE6FFC0
+:102620000D0EE66EDEEC1EF088D0D9500E0FE96E6E
+:10263000DACFEAFF090EEE1806E1030EEE1803E109
+:10264000EE5001E1EE5002E0000E01D0010E146EDA
+:10265000D9500E0FE96EDACFEAFF080EEE1806E148
+:10266000030EEE1803E1EE5001E1EE5002E0000E21
+:1026700001D0010E14106BE0130EDB6A0D0EDB505F
+:10268000F36E130EDBCFF4FFF350F45C20E2D9CFEE
+:1026900016F0DACF17F0130EDB500F01D924E96ED4
+:1026A000000EDA20EA6EEF50E66ED950140F146E69
+:1026B000DACF15F0130EDB501424E96E000EDA2089
+:1026C000EA6EE552E750EF6E130EDB2AD7D7D950EA
+:1026D0000E0FE96EDACFEAFF080EEE1814E1030ED2
+:1026E000EE1811E1EE500FE1EE500DE1D950140F4C
+:1026F000E66E000EDA20E66EE66A82EC1DF0E55228
+:10270000E552E55224D0D9500E0FE96EDACFEAFF38
+:10271000090EEE181CE1030EEE1819E1EE5017E158
+:10272000EE5015E1D950140FE66E000EDA20E66E79
+:10273000080EE66E82EC1DF0E552E552E55201D03E
+:1027400014D80101200ED76F0101010EDD6F0C0EB0
+:10275000DB50146E1C0EE15C02E2E16AE552E16EB0
+:102760001450E552E7CFD9FF1200D9CFE6FFE1CFF1
+:10277000D9FF060EE126DF6A010EDB6A020EDB6A74
+:10278000030EDB6A040EDB6AF36E050EF3CFDBFF8C
+:10279000F2C1C6F1F3C1C7F1E9C1C8F1F4C1C9F191
+:1027A000ECC1CAF1F5C1CBF1EFC1CCF1F0C1CDF173
+:1027B0000101F351E66ED950010FE96EDACFEAFF5D
+:1027C000E552E750EE6EED6A010EDBCF14F0020E1B
+:1027D00014C015F0146A010E14C0DBFF020E15C000
+:1027E000DBFFF251E76E010EDBCF14F0020EDBCF00
+:1027F00015F0E7501412010E14C0DBFF020E15C0D5
+:10280000DBFF010EDB2A020E01E3DB2A030EDBCF26
+:1028100014F0040EDBCF15F0010EDBCF16F0020E24
+:10282000DBCF17F01450165C155017580CE3050E4B
+:10283000DBCFE6FF0CEC21F0E552030EDB2A040EA1
+:10284000E5E3DB2AE3D7C60EE66E010EE66EA20EC6
+:10285000E66E010EE66EF1EC0EF0E552E552E55241
+:10286000E552DF6EDF50146E060EE15C02E2E16AB3
+:10287000E552E16E1450E552E7CFD9FF1200D9CFEF
+:10288000E6FFE1CFD9FF070EE126060EDB6A0E0157
+:10289000096B0A6B0B6BD9CFE6FFDACFE6FFF4ECDE
+:1028A00002F0E552E552DECF14F0DDCF15F0400E18
+:1028B0001416000E1516060ED89015321432E804C0
+:1028C000FBE114C00AFE040EDBCF14F0050EDBCFD3
+:1028D00015F0010E145C000E155803E30E01010EF5
+:1028E0000B6F0101C66B0101D551200DF3500101A1
+:1028F000D7250101C66FC76B0E010851400DF3CFFC
+:10290000C7F10951200DF3500101C7130E010A3917
+:10291000F00B0101C7130E010B51080DF35001011B
+:10292000C7130E010C51040DF3500101C7130E0122
+:102930000D51E8240101C7130E010E510101C71307
+:10294000C86BC96BCA6BCB6BCC6BCD6BC60EE66E1E
+:10295000010EE66E7E0EE66E010EE66EF1EC0EF0F6
+:10296000E552E552E552E552E76E060EE7CFDBFF92
+:10297000DB50146E070EE15C02E2E16AE552E16EA3
+:102980001450E552E7CFD9FF1200D9CFE6FFE1CFCF
+:10299000D9FF0101006BFE0EDB50016F026B000ED0
+:1029A0000127010E0223036B046B02AF02D00369FF
+:1029B0000469050E056FFE0EDB50066F076B000EF7
+:1029C0000627010E0723086B096B07AF02D00869C1
+:1029D0000969126FFE0EDB50136F146B000E132784
+:1029E000020E1423156B166B14AF02D0156916690D
+:1029F000080E176F186B196B1A6B1B6B020E246F86
+:102A0000FE0EDB50256F266B010E2527020E2623B6
+:102A1000276B286B26AF02D027692869080E296F1B
+:102A20002A6B2B6B2C6B2D6B030E366FFE0EDB505F
+:102A3000376F386B020E37273823396B3A6B38AF54
+:102A400002D039693A69080E3B6F3C6B3D6B3E6BB7
+:102A50003F6B040E486FFE0EDB50496F4A6B030E4E
+:102A60004927020E4A234B6B4C6B4AAF02D04B698D
+:102A70004C69080E4D6F4E6B4F6B506B516B050ED2
+:102A80005A6FFE0EDB505B6F5C6B040E5B27020E11
+:102A90005C235D6B5E6B5CAF02D05D695E69080EA6
+:102AA0005F6F606B616B626B636B060E6C6FFE0E2B
+:102AB000DB506D6F6E6B050E6D27020E6E236F6B14
+:102AC000706B6EAF02D06F697069080E716F726BB8
+:102AD000736B746B756B070E7E6FFE0EDB507F6F32
+:102AE000806B060E7F27020E8023816B826B80AF86
+:102AF00002D081698269080E836F846B856B866B57
+:102B0000876B906FFE0EDB50916F926B070E9127D3
+:102B1000020E9223936B946B92AF02D093699469E7
+:102B2000080E956F966B976B986B996BA26FFE0E64
+:102B3000DB50A36FA46B0A0EA327020EA423A56B80
+:102B4000A66BA4AF02D0A569A669080EA76FA86BF3
+:102B5000A96BAA6BAB6B010EE552E7CFD9FF120050
+:102B6000800EE66EC2DAE5520E01010E436FF80EDA
+:102B7000446F440E456F200E706E729E728C606AB8
+:102B80000F01306B0E01806B906BA06BB06BC06B54
+:102B9000D06BF80E7D6F880EE06F220EE16FE46F50
+:102BA000080EE56F140EE86F050EE96F070E466F0D
+:102BB000476B716B110E726F736F746B756B766B05
+:102BC000776B786B500E796F050E7A6F7B6B7B6B32
+:102BD000F869F969F997FC6BFD6BFD97E66A85DA90
+:102BE000E5521200D9CFE6FFE1CFD9FF1A0EE12658
+:102BF000D950060FE96EDACFEAFF200EEE6E0F0E07
+:102C0000ED6ED950080FE96EDACFEAFF100EEE6EC6
+:102C10000F0EED6ED9500A0FE96EDACFEAFF000E03
+:102C2000EE6E0F0EED6ED9500C0FE96EDACFEAFFA3
+:102C3000800EEE6E0E0EED6ED9500E0FE96EDACFED
+:102C4000EAFF900EEE6E0E0EED6ED950100FE96E8B
+:102C5000DACFEAFFA00EEE6E0E0EED6ED950120F17
+:102C6000E96EDACFEAFFB00EEE6E0E0EED6ED950C1
+:102C7000140FE96EDACFEAFFC00EEE6E0E0EED6EA7
+:102C8000D950160FE96EDACFEAFFD00EEE6E0E0EB7
+:102C9000ED6E0E017D417F0BE76E190EE7CFDBFF76
+:102CA000DF6ADF50146E156A080E145C000E1558AA
+:102CB00001E3DED0D950060F146EDF50020D145020
+:102CC000F324E96EDA50F420EA6E020EEECFDBFF59
+:102CD000030EEDCFDBFF020EDBCF08F0030EDBCFE0
+:102CE00009F0040E08C0DBFF050E09C0DBFFDF5052
+:102CF000020810E2190EDBCFF3FFF390F342F3CF9B
+:102D0000DBFFD950190FE96EDACFEAFFEF50010B64
+:102D100001E1ACD0020EDBCFE9FF030EDBCFEAFF0F
+:102D2000EF50080B01E0A2D0FC0E146E020EDBCFB8
+:102D3000E9FF030EDBCFEAFF1450EF16F70EDB506E
+:102D4000030B146E020EDBCFE9FF030EDBCFEAFFAD
+:102D50001450EF12F70EDBAC04D0F80EDB50400934
+:102D600002D0F80EDB50E76E180EE7CFDBFF050E42
+:102D7000E76E020EDBCFE9FF030EDBCFEAFFE75081
+:102D8000E926000EEA22180EDBCFEFFFF70EDBAAD2
+:102D900006D0010EF36E180EF3CFDBFF02D0180E33
+:102DA000DB6ADBCFE6FFD950FB0FE96EFF0EDA20BE
+:102DB000EA6EEECFE6FFEECFE6FFEECFE6FFEFCF17
+:102DC000E6FF010EE76E020EDBCF14F0030EDBCF41
+:102DD00015F0E7501426000E152214C0E6FF15C0AA
+:102DE000E6FF97D9166E070EE15E1650D950020F16
+:102DF000E96EDACFEAFF060EEE26000EED22010E96
+:102E0000DB6AF80EDB50F36E010EDBCFF4FFF350FC
+:102E1000F45C1AE2F90EDBCFE9FFDB2AFA0EDBCF16
+:102E2000EAFF01E3DB2AEF50E66E020EDBCFE9FF9B
+:102E3000DB2A030EDBCFEAFF01E3DB2AE552E75092
+:102E4000EF6E010EDB2ADDD7040EDBCFE9FF050EA6
+:102E5000DBCFEAFFEF50040B07E1040EDBCFE9FF05
+:102E6000050EDBCFEAFFEF86010E03D0DF2A19D76C
+:102E7000000E146E1A0EE15C02E2E16AE552E16EA8
+:102E80001450E552E7CFD9FF1200D9CFE6FFE1CFCA
+:102E9000D9FF060EE1260E010F6B60AE04D0600E66
+:102EA000DE6E0F0E43D00F0130AF04D0300EDE6E59
+:102EB0000F0E3CD00E017D51040B07E18051800BB9
+:102EC00004E0800EDE6E0E0E31D07D51080B07E15E
+:102ED0009051800B04E0900EDE6E0E0E27D07D51D7
+:102EE000100B07E1A051800B04E0A00EDE6E0E0E69
+:102EF0001DD07D51200B07E1B051800B04E0B00ED6
+:102F0000DE6E0E0E13D07D51400B07E1C051800BD9
+:102F100004E0C00EDE6E0E0E09D07D51800B13E171
+:102F2000D051800B10E0D00EDE6E0E0EDD6EDECFC7
+:102F3000E9FFDDCFEAFFEF501F0B0E010F6F779215
+:102F400071AC0BD002D0000EC4D0F70EDBCFE9FF7E
+:102F5000F80EDBCFEAFFEF86719CD9CFE9FFDACF1D
+:102F6000EAFF020EEECFDBFF030EEDCFDBFFF70E25
+:102F7000DBCFE9FFF80EDBCFEAFFEF6ADECFE9FF38
+:102F8000DDCFEAFF050EE926000EEA22050EEFCF9F
+:102F9000DBFFDB500F0BE66EF90EDBCFE9FFFA0E1D
+:102FA000DBCFEAFFE552E750EF6ED950050FE96E2F
+:102FB000DACFEAFFEF50400B07E0F70EDBCFE9FF77
+:102FC000F80EDBCFEAFFEF8CDECFE9FFDDCFEAFFC3
+:102FD000020EE926000EEA22050EEFCFDBFFD950E4
+:102FE000050FE96EDACFEAFFEF50080B0DE0F70EA0
+:102FF000DBCFE9FFF80EDBCFEAFFEF8A010EF36EBD
+:10300000050EF3CFDBFF02D0050EDB6ADBCFE6FF58
+:10301000FD0EDBCFE6FFFE0EDBCFE6FFDECF14F0CA
+:10302000DDCF15F0010E1426000E152214C0E6FFA8
+:1030300015C0E6FF46D9166E050EE15E1650060E67
+:10304000DE26000EDD22F90EDBCFE9FFFA0EDBCF24
+:10305000EAFF050EEFCFDBFF040EDB6ADBCF14F0D7
+:10306000156A14BE1568050EDB50000115AE02D0BE
+:10307000D89003D0145C000E155819E2DFCFE9FF99
+:10308000DF2A010EDBCFEAFF01E3DB2AEF50E66E19
+:10309000FB0EDBCFE9FFDB2AFC0EDBCFEAFF01E30F
+:1030A000DB2AE552E750EF6E040EDB2AD7D777AE66
+:1030B00008D0F70EDBCFE9FFF80EDBCFEAFFEF8891
+:1030C000779E020EDBCFE9FF030EDBCFEAFFEF9E18
+:1030D000010E146E060EE15C02E2E16AE552E16E59
+:1030E0001450E552E7CFD9FF1200D9CFE6FFE1CF68
+:1030F000D9FF1F0E6F16FE0EDB506F12E00E6F141D
+:10310000146EFE0EDB50145CF9E1E552E7CFD9FFF7
+:103110001200D9CFE6FFE1CFD9FF020EE126D95048
+:10312000F90F146EFF0EDA2014C0DEFFDD6EF80E0C
+:10313000DB50146E156AE850151031E1DECFE9FF5F
+:10314000DDCFEAFFEF50E840E840E8401F0BE66EB5
+:10315000FD0EDBCFE9FFFE0EDBCFEAFFE552E750C5
+:10316000EF6EDECFE9FFDDCFEAFFEE52EF50200D2C
+:10317000F3CF14F0FD0EDBCFE9FFFE0EDBCFEAFF4D
+:10318000F350EF12FD0EDB2AFE0E01E3DB2ADECF49
+:10319000E9FFDDCFEAFFEF50200DF3507ED0DECF08
+:1031A000E9FFDDCFEAFF020EE926000EEA22EF502A
+:1031B000E00BE838E840E66EFD0EDBCFE9FFFE0EDF
+:1031C000DBCFEAFFE552E750EF6EDECFE9FFDDCF60
+:1031D000EAFF030EE926000EEA22EF50080DF3CFB6
+:1031E00014F0FD0EDBCFE9FFFE0EDBCFEAFFF3505C
+:1031F000EF12FD0EDB2AFE0E01E3DB2ADECFE9FF34
+:10320000DDCFEAFF020EE926000EEA22EF50080D9C
+:10321000F350E00BE66EFD0EDBCFE9FFFE0EDBCFD9
+:10322000EAFFE552E750EF6EFD0EDBCFE9FFFE0E41
+:10323000DBCFEAFFEF86DECFE9FFDDCFEAFF020E4C
+:10324000E926000EEA22EF50030B146EFD0EDBCFD1
+:10325000E9FFFE0EDBCFEAFF1450EF12FD0EDB2A72
+:10326000FE0E01E3DB2ADECFE9FFDDCFEAFFEE52FF
+:10327000EF50E66EFD0EDBCFE9FFFE0EDBCFEAFF7F
+:10328000E552E750EF6EFD0EDB2AFE0E01E3DB2A6E
+:10329000DECFE9FFDDCFEAFFEF50E66EFD0EDBCFBC
+:1032A000E9FFFE0EDBCFEAFFE552E750EF6E020EBC
+:1032B000E15C02E2E16AE552E16EE552E7CFD9FF57
+:1032C0001200D9CFE6FFE1CFD9FF020EE126FB0EB7
+:1032D000DBCFDEFFDBCFDDFFFA0EDB50156AE850F7
+:1032E00015104CE1FD0EDBCFE9FFFE0EDBCFEAFF50
+:1032F000EF50080DF350E66EDECFE9FFDDCFEAFFB9
+:10330000E552E750EF6EFD0EDBCFE9FFFE0EDBCF9F
+:10331000EAFFEF50E00BE838E840E66EDECFE9FF69
+:10332000DDCFEAFFEE52E552E750EF6EFD0EDB2AED
+:10333000FE0E01E3DB2AFD0EDBCFE9FFFE0EDBCF45
+:10334000EAFFEF50E00BE838E840DECFE9FFDDCFE1
+:10335000EAFFE850EF12DECFE9FFDDCFEAFF020E11
+:10336000E926000EEA22EF6ADECFE9FFDDCFEAFFB1
+:10337000030EE926000EEA22EF6A84D0FD0EDBCFB1
+:10338000E9FFFE0EDBCFEAFFEF50200DF350E66EB3
+:10339000DECFE9FFDDCFEAFF020EE926000EEA22CA
+:1033A000E552E750EF6EFD0EDBCFE9FFFE0EDBCFFF
+:1033B000EAFFEF50E840E840E8401F0BE66EDECF42
+:1033C000E9FFDDCFEAFF030EE926000EEA22E5520F
+:1033D000E750EF6EFD0EDB2AFE0E01E3DB2AFD0E49
+:1033E000DBCFE9FFFE0EDBCFEAFFEF50030B146EDD
+:1033F000DECFE9FFDDCFEAFF020EE926000EEA226A
+:103400001450EF12FD0EDBCFE9FFFE0EDBCFEAFF1B
+:10341000EF50E00BE840E840E8401F0B146EDECFB1
+:10342000E9FFDDCFEAFF020EE926000EEA22145082
+:10343000EF12FD0EDB2AFE0E01E3DB2AFD0EDBCFD1
+:10344000E9FFFE0EDBCFEAFFEF50E66EDECFE9FFCD
+:10345000DDCFEAFFEE52E552E750EF6EFD0EDB2ABC
+:10346000FE0E01E3DB2AFD0EDBCFE9FFFE0EDBCF14
+:10347000EAFFEF50E66EDECFE9FFDDCFEAFFE5526F
+:10348000E750EF6E020EE15C02E2E16AE552E16EA6
+:08349000E552E7CFD9FF12005D
+:08349800DACFE4FFE2CFDAFF16
+:1034A000E9CFE4FFEACFE4FFF6CFE4FFF7CFE4FF94
+:1034B000F5CFE4FFF3CFE4FFF4CFE4FFFACFE4FF6E
+:1034C00000EE00F0140EE80403E3EECFE4FFFBD7B8
+:1034D00000EE14F00E0EE80403E3EECFE4FFFBD79A
+:1034E000E6529D50010B01E1B8D09E50010B01E165
+:1034F000B4D0B20ECF6ECE6A9E90E0C122F0E1C190
+:1035000023F0E2C124F0E3C125F0030E0B6E0C6A38
+:103510000D6A0E6AE0C106F0E1C107F0E2C108F0F1
+:10352000E3C109F03FEC1FF0025003100410051036
+:1035300002E10101D381E0C122F0E1C123F0E2C147
+:1035400024F0E3C125F00A0E0B6E0C6A0D6A0E6AB8
+:10355000E0C106F0E1C107F0E2C108F0E3C109F003
+:103560003FEC1FF0025003100410051009E10101A7
+:10357000D3838D72040ED75D03E1DE2B000EDF23B3
+:10358000050E0101E01907E1E15105E1E25103E116
+:10359000E35101E1D385080EE01907E1E15105E1AE
+:1035A000E25103E1E35101E1D3850B0EE01907E19C
+:1035B000E15105E1E25103E1E35101E1D3850E0E52
+:1035C000E01907E1E15105E1E25103E1E35101E1D5
+:1035D000D385110EE01907E1E15105E1E25103E164
+:1035E000E35101E1D385140EE01907E1E15105E152
+:1035F000E25103E1E35101E1D385E0C122F0E1C1F1
+:1036000023F0E2C124F0E3C125F0640E0B6E0C6AD6
+:103610000D6A0E6AE0C106F0E1C107F0E2C108F0F0
+:10362000E3C109F03FEC1FF002C022F003C023F019
+:1036300004C024F005C025F002500310041005104A
+:1036400006E10101D387E06BE16BE26BE36B010103
+:10365000E02B000EE123E223E3237750020B1CE072
+:103660007650020B19E00101100EDC6F779292EC9C
+:103670000FF070EC10F03FEC14F03BEC11F0010196
+:10368000DE6BDF6BD52BD62B080ED55D01E3D56B3A
+:10369000060ED65D01E3D66BE55200EE21F00E0E6C
+:1036A000E80403E3E5CFEDFFFBD700EE13F0140EC3
+:1036B000E80403E3E5CFEDFFFBD7E5CFFAFFE5CF65
+:1036C000F4FFE5CFF3FFE5CFF5FFE5CFF7FFE5CF5B
+:1036D000F6FFE5CFEAFFE5CFE9FFE5CFDAFF11001E
+:1036E000D9CFE6FFE1CFD9FFE652D050DF6E000E12
+:1036F000DB94DB9CDB9EDF501B0A0EE0300A0BE004
+:10370000110A08E0020A05E00B0A01E006D00400F5
+:1037100005D004D003D002D001D000D03F0ED0128B
+:1037200022EC00F0FE0EDBCFD7F1E552E552E7CFF9
+:10373000D9FF1200D9CFE6FFE1CFD9FF070EE1266E
+:10374000DE6ADD6A020EDB6A030EDB6A040EDB6AE8
+:10375000050EDB6A060EDB6A0101D751100A01E192
+:1037600063D1180A01E156D10C0A01E187D0060A9B
+:1037700001E17AD0220A10E0210A01E085D1FDECB6
+:1037800010F0040E0101D75D06E1789276827792FF
+:103790000E010F0E7E6F79D1E66A50EC1DF0E552F6
+:1037A000E76E020EE7CFDBFF0101020ED76F020EBC
+:1037B000DB50AA0803E00101100ED76FD7C1E6FF66
+:1037C0008FDFE5525DEC0DF0F3CF14F0F4CF15F080
+:1037D000166A176A15AE02D016681768030E14C071
+:1037E000DBFF040E15C0DBFF050E16C0DBFF060E67
+:1037F00017C0DBFFD950030FE96EDACFEAFFD8908C
+:10380000030EEB50000A08E6440EEE5C090EEE587B
+:10381000000EEE58000EEE5802E3000E01D0010E2D
+:10382000146E030EDBCF07F0040EDBCF08F0050E9D
+:10383000DBCF09F0060EDBCF0AF00A34000E0A18BF
+:1038400009E6D8803E0E07540A0E0854000E0954AB
+:10385000000E0A5402E3000E01D0010E141003E022
+:103860000E01010E086F11D1ECEC03F0F3CFDEFF77
+:10387000F4CFDDFF0101010ED76F07D10101D35154
+:10388000010B0BE00101D3910101D351100B03E0B7
+:103890005AEC0DF002D00101D3890101D351020B82
+:1038A00002E00101D3930101D351040B0BE00101AC
+:1038B000D3950101D351400B03E05AEC0DF002D037
+:1038C0000101D38D0101D351080B5EE00101D397B3
+:1038D000040E0101DB5D03E30101080ED76F0E0149
+:1038E000086B5DEC0DF0F3CF14F0F4CF15F0166A11
+:1038F000176A15AE02D016681768030E14C0DBFFF6
+:10390000040E15C0DBFF050E16C0DBFF060E17C048
+:10391000DBFFD950030FE96EDACFEAFFD890030E30
+:10392000EB50000A08E6440EEE5C090EEE58000E5D
+:10393000EE58000EEE5802E3000E01D0010E146E98
+:10394000030EDBCF07F0040EDBCF08F0050EDBCF54
+:1039500009F0060EDBCF0AF00A34000E0A1809E659
+:10396000D8803E0E07540A0E0854000E0954000E6B
+:103970000A5402E3000E01D0010E141003E00E0100
+:10398000010E086F0101DB6B0101D351A00B39E17E
+:1039900001010A0ED880DE55000EDF5507E2010155
+:1039A000CF6BD06BD16BD26B3BEC02F0100E0101F0
+:1039B000DC5D27E10101200EDC6FCFC114F0D0C126
+:1039C00015F0D1C116F0D2C117F0141E151E161E27
+:1039D000171E14C0E6FF15C0E6FF16C0E6FF17C0AD
+:1039E000E6FFCFC1E6FFD0C1E6FFD1C1E6FFD2C1FD
+:1039F000E6FF010EE66EE3EC05F0186E090EE15EDF
+:103A00001850D30EE66E010EE66ECBEC00F0E552D8
+:103A1000E5523BD0FC0E8D148D6E0101010EDD6F61
+:103A20000101040ED76F31D00101DD052AE1030E3B
+:103A30008D12F29EF29C76920101040EDD6FE66A11
+:103A4000E6680D0EE66EE66AE66AF80EE66E0E0EA3
+:103A5000E66E89EC18F0146E070EE15E14500E014C
+:103A60004681E66AE66A010EE66EE66AE66AE00EFE
+:103A7000E66E0E0EE66E89EC18F0146E070EE15E2F
+:103A80001450D6EC11F001D000D00400070EE15C18
+:103A900002E2E16AE552E16EE552E7CFD9FF12009A
+:103AA000D9CFE6FFE1CFD9FF020EE126010EDB6A96
+:103AB000DE52120EDD6EFE0EDB50DF6EDF6A010E8F
+:103AC000DB50DF5C10E2DF50746E7F9E7F9C7F8056
+:103AD0000000DF50EA6AE40FE96E010EEA2273CFBC
+:103AE000EFFFDF2AECD70101E45100D0146E020E83
+:103AF000E15C02E2E16AE552E16E1450E552E7CF83
+:103B0000D9FF1200D9CFE6FFE1CFD9FF090EE12698
+:103B1000010EDB6A020EDB6A030EDB6A040EDB6A4F
+:103B2000050EDB6A060EDB6A070EDB6A080EDB6A2F
+:103B3000FE0EDB5027E1010EDB6A080EF36E010E6C
+:103B4000DBCFF4FFF350F45C01E32ED1010EDB5028
+:103B5000E76EFC0EDBCFE9FFFD0EDBCFEAFFE7509F
+:103B6000E926000EEA22EF50E66E010EDB28EA6A33
+:103B7000E40FE96E010EEA22E552E750EF6E010E06
+:103B8000DB2ADBD7FE0EDB50080801E00DD1010E69
+:103B9000DB6A040EF36E010EDBCFF4FFF350F45C2E
+:103BA0001DE2010EDB50E76EFC0EDBCFE9FFFD0EE0
+:103BB000DBCFEAFFE750E926000EEA22EF50E66E7F
+:103BC000010EDB50090FEA6AE40FE96E010EEA22EA
+:103BD000E552E750EF6E010EDB2ADBD70101AA0E9A
+:103BE000E46FF16B300EE55D1A6E1B6A300EE65D18
+:103BF0001C6E1D6A0A0E086E096A1CC00DF01DC0FD
+:103C00000EF073EC1FF01A500624186E1B5007209C
+:103C1000196E300E0101E75D1E6E1F6A640E086E9C
+:103C2000096A1EC00DF01FC00EF073EC1FF0185093
+:103C30000624166E19500720176E300E0101E85D3C
+:103C4000206E216AE80E086E030E096E20C00DF08A
+:103C500021C00EF073EC1FF016500624146E17509E
+:103C60000720156EFF0E1416000E1516030E14C055
+:103C7000DBFF040E15C0DBFF300E0101E55D1A6E9F
+:103C80001B6A300EE65D1C6E1D6A0A0E086E096A1C
+:103C90001CC00DF01DC00EF073EC1FF01A5006246E
+:103CA000186E1B500720196E300E0101E75D1E6E65
+:103CB0001F6A640E086E096A1EC00DF01FC00EF068
+:103CC00073EC1FF018500624166E19500720176E5B
+:103CD000300E0101E85D206E216AE80E086E030EC9
+:103CE000096E20C00DF021C00EF073EC1FF01650CD
+:103CF000062417500720146E156A050E14C0DBFF4A
+:103D0000060E15C0DBFF300E0101EB5D0A0D300E13
+:103D1000EA5DF324E76E070EE7CFDBFF300EEE5DC2
+:103D20000A0D300EED5DF324E76E080EE7CFDBFFE2
+:103D3000030EDBCFF2F1050EDBCFF3F1070EDBCF85
+:103D4000F4F1080EDBCFF5F1120EF36E020EF3CF95
+:103D5000DBFF010EDB6A020EDB50F36E010EDBCFE0
+:103D6000F4FFF350F45C20E2010EDB50746E010EA0
+:103D7000DB50EA6AE40FE96E010EEA22EF50736E3F
+:103D80007F9E7F9C7F84F250DF6EF26A550E7E6EBE
+:103D9000AA0E7E6E7F82DF50F26E7F94B7ACFED7A4
+:103DA000B79C010EDB2AD7D7090EE15C02E2E16A7B
+:103DB000E552E16EE552E7CFD9FF1200D9CFE6FF19
+:103DC000E1CFD9FFE652FE0EDB50746EFD0EDB50E4
+:103DD000736E7F9E7F9C7F84F250DF6EF26A550E79
+:103DE0007E6EAA0E7E6E7F82DF50F26E7F94B7AC3D
+:0E3DF000FED7B79CE552E552E7CFD9FF12008F
+:023DFE00006A59
+:103E00000EAE05EF1FF00E6C001E09AE0AEF1FF09C
+:103E1000096C001E48EC21F009BE14EF1FF000AE43
+:103E2000000C096C056C000C00BE11EF1FF001883E
+:103E3000FF0C006A0EAE22EF1FF00D6C0E1EE86A3A
+:103E40000E22001E09AE2AEF1FF0086C091EE86A58
+:103E50000922001EF6EC20F009BE3AEF1FF000AE7A
+:103E6000000C086C091EE86A0922046C051EE86A49
+:103E70000522000C00BE31EF1FF00188FF0C006A24
+:103E8000E86A0EAE4CEF1FF00B6C0C1E0D1E0E1EE2
+:103E90000C220D220E22001E09AE57EF1FF0066CF9
+:103EA000071E081E091E072208220922001EBBEC5D
+:103EB00020F009BE6EEF1FF000AE000C066C071E6E
+:103EC000081E091EE86A072208220922026C031E46
+:103ED000041E051E032204220522000C00BE5EEF14
+:103EE0001FF00188FF0C08C012F008500D02F4CF3B
+:103EF00007F0F3CF06F009500E02F4CF09F0F3CF2C
+:103F000008F00D02F3500726F4500822E86A09224F
+:103F100012500E02F3500726F4500822E86A0922D4
+:023F2000000C93
+:0E3F22009F119711901188117F1176116D116A
+:103F3000641159114F11441138112C111F11121114
+:103F40000411F610E710D710C710B610A510921084
+:103F50007F106C10571042102C101610FF0FE70F37
+:103F6000CE0FB40F990F7D0F610F440F260F070F6F
+:103F7000E80EC80EA70E850E620E3F0E1B0EF60D44
+:103F8000D10DAB0D850D5E0D360D0D0DE40CBB0C8A
+:103F9000910C670C3C0C120CE60BBA0B8F0B620BEE
+:103FA000360B090BDD0AB00A830A570A2B0AFE09F1
+:103FB000D109A50979094D092109F508CA089E0802
+:103FC000740849081F08F507CC07A3077A075307A9
+:103FD0002B070407DE06B80693066E064A06260679
+:103FE0000306E105BF059E057D055D053E051F0530
+:103FF0000005E204C504A9048D04710456043C04C0
+:1040000023040A04F103D903C203AB0394037F031F
+:104010006903550340032C0319030603F402E2026B
+:10402000D002BF02AE029E028E027E026F026002CA
+:0E40300052024402360229021B020F02030252
+:02403E001E0E54
+:10404000F66E000EF76E000EF86E01010900F550D5
+:10405000FB6F0900F550FC6F03E1FB6701D03DD019
+:104060000900F550F66F0900F550F76F0900F5509B
+:10407000F86F09000900F550E96E0900F550EA6E85
+:10408000090009000900F550F96F0900F550FA6FB1
+:1040900009000900F6CFFDF1F7CFFEF1F8CFFFF1EF
+:1040A000F6C1F6FFF7C1F7FFF8C1F8FF0101F953B8
+:1040B00002E1FA5307E00900F550EE6EF907F8E265
+:1040C000FA07F9D7FDC1F6FFFEC1F7FFFFC1F8FF00
+:0C40D0000101FB07000EFC5BBFD71200D3
+:0440DC00D9CFE6FF53
+:1040E000E1CFD9FF020EE126CD0EDF6E010EDB6AB5
+:1040F000FD0EDBCF14F0FE0EDBCF15F0D89015507F
+:1041000004E6040E145C020E155803E25B0EDF6E2B
+:1041100025D0010EF76ADB34FE0BF736F66E220E61
+:10412000F6263F0EF7220900F5CF14F00800F5CF70
+:1041300015F0FD0EDBCF16F0FE0EDBCF17F015509D
+:104140001718E8AE02D0173404D01650145C17507C
+:10415000155804E3010EDB2ADF2ADBD7DF50146E8B
+:10416000020EE15C02E2E16AE552E16E1450E552B2
+:06417000E7CFD9FF1200A9
+:0A417600056A046A036A026A200E5B
+:10418000E76ED8900636073608360936023603360B
+:10419000043605360B50025C0C5003580D50045881
+:1041A0000E50055809E30B50025E0C50035A0D5097
+:0E41B000045A0E50055A062AE72EE4D71200D4
+:0241BE00FF0EF2
+:1041C000E350276EEF0E01D0F30EE76EE72EE6EF19
+:1041D00020F00C0E266EE76AE72EECEF20F0262E7C
+:0C41E000EBEF20F0272EE4EF20F012009F
+:0441EC00056A046AF2
+:1041F000100EE76ED89008360936043605360D5095
+:10420000045C0E50055805E30D50045E0E50055A2F
+:08421000082AE72EF0D7120086
+:08421800FF0EE350276E480E73
+:1042200001D04C0EE76EE72EFED7E76AE72EFED7E9
+:08423000272EF7D70000120051
+:08423800410EF36E00EE00F0F0
+:104240000E0E01D81200EA6002D0EE6AFCD7F350DD
+:08425000E9601200EE6AFCD7E0
+:084258001DEE00F02DEE00F058
+:10426000F86A019C1FEC20F003EC00F09AEC1BF0C4
+:04427000FBD7120066
+:0C427400FF0EE350276E1B0E00D001D09F
+:10428000200EE76EE72EFED7272EFAD700D01200B9
+:10429000056A080EE76ED890093605360E50055CA3
+:0C42A00002E3056E092AE72EF7D7120092
+:0442AC00000000000E
+:1042B00000000000200000000020010000000000BD
+:0142C00000FD
+:020000040030CA
+:0100000015EA
+:0100010013EB
+:0100030020DC
+:00000001FF

+ 694 - 0
ProjectSource/BMS_Slave_RCT/BMS_CAN.c

@@ -0,0 +1,694 @@
+/*********************************************************************
+ *
+ *                  BMS_CAN File
+ *
+ *********************************************************************
+ * FileName:        BMS_CAN.c
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       04.04.2012   Release
+ * Reiling V.       24.05.2012   Change CAN_Init() Input Parameter
+ *                               Add CAN_Rx_Overrun, CAN_Rx_Passiv,
+ *                               CAN_Rx_Warning, CAN_Tx_Passiv,
+ *                               CAN_Tx_Warning;
+ * Reiling V.       30.05.2012   TimeOut for Tx and Rx implemented
+ * Reiling V.       07.11.2012   All Temp. transmit CAN_ID 0x402 add
+ *
+ *********************************************************************/
+
+#include "BMS_Slave.h"
+
+
+/*********************************************************************
+*
+*                             Globals
+*
+*********************************************************************/
+static CAN_MAILBOX gCAN_MAILBOX[11];
+static uint8_t     gCAN_Data[8];
+static uint8_t     gCAN_Rx_Overrun;
+extern SERIAL_NR_t  gSerial;
+extern uint8_t  STATE_STATUS;
+extern uint16_t gEvent;
+ERROR_flags gERROR = {0,0,0,0,0,0,0};
+
+
+
+
+/*********************************************************************
+ * Function:        void CAN_Init( CAN_CONFIG *config )
+ *
+ * Overview:        API Function
+ *                  Use this function to initialize ECAN module
+ *
+ * PreCondition:    None
+ *
+ * Input:           config
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change CAN_Mailbox
+ **********************************************************************/
+int8_t CAN_Init( CAN_CONFIG *config )
+{
+    // Enter CAN module into config mode
+    ECANSetOperationMode(ECAN_OP_MODE_CONFIG);
+
+    // Enter CAN module into Mode 1
+    ECANSetFunctionalMode(ECAN_MODE_1);
+
+    // Initialize CAN Timing
+    // 1 Mbps @ 64Mhz
+    // BRP = 2, Propagation Delay =1, Phase Segment 1 = 8, Phase Segment 2 = 6
+    // SJW = 1, Multiple bit sampling is on
+
+
+    BRGCON1 = ((config->SJW-1) << 6) | (config->BRP-1);
+    BRGCON2 = (config->PHSEG2_MODE << 7)      | \
+              (config->BUS_SAMPLE_MODE << 6)  | \
+              ((config->PHSEG1-1) << 3)       | \
+              (config->PROPSEG-1);
+    BRGCON3 = (config->WAKEUP_MODE << 7)      |
+              (config->FILTER_MODE << 6)      |
+              (config->PHSEG2-1);
+   
+    // Setup Programmable buffers
+    //  B0 is a receive buffer AND B2,B3,B4,B5 are Transmit buffers
+    ECANSetBnTxRxMode(B0, ECAN_BUFFER_RX);
+
+    // Initialize Receive Masks
+    //  The first mask is used to accepts 0x100 Master Frame
+    ECANSetRXM0Value(0x07FF, ECAN_MSG_STD);
+
+    // Enable Filters
+    // Only using first three filters, so the rest can be disabled.
+    RXFCON0 = 0;           //First disable all Filters
+    RXFCON1 = 0;           //First disable all Filters
+    ECANSetRXF0Value(0x100 + config->SlaveNo, ECAN_MSG_STD);        // Master --> SlaveID Frame
+
+    // Assign Filters to Masks
+    //  Only two mask are used
+    ECANLinkRXF0Thru3ToMask(ECAN_RXM0, 0xFF, 0xFF, 0xFF);
+
+
+    // Assign Filters to Buffers
+    //  Have the first buffer only accept the first filter, the second buffer accept
+    //  the second filter, and the third buffer accept the third filter.
+    ECANLinkRXF0F1ToBuffer(RXB0, 0xFF);     //Assign Filter 0 to RXB0, and Filter 1 to RXB1
+    ECANLinkRXF2F3ToBuffer(0xFF, 0xFF);     //Assign Filter 2 to B0
+
+    // Enable Port C Pin 2 for CAN capture
+    CIOCON = 0x20;           //CANCAP on
+
+    // Enter CAN module into normal mode
+    ECANSetOperationMode(ECAN_OP_MODE_NORMAL);
+
+    // Set Receive Mode for buffers
+    RXB0CON = 0x00;
+    RXB1CON = 0x00;
+    B0CON   = 0x00;
+
+    Load_Mailbox( config->SlaveNo );
+
+    return CAN_OK;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Init_Mailbox( CAN_MAILBOX *mbox)
+ *
+ * Overview:        API Function
+ *                  Use this function to initialize CAN Mailbox
+ *
+ * PreCondition:    None
+ *
+ * Input:           *mbox
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change CAN_Mailbox
+ **********************************************************************/
+int8_t CAN_Init_Mailbox( CAN_MAILBOX *mbox)
+{
+  uint8_t   i = mbox->BOX_No;
+
+  gCAN_MAILBOX[i].BOX_No            = i;
+  gCAN_MAILBOX[i].CAN_Id            = mbox->CAN_Id;
+  gCAN_MAILBOX[i].DLC               = mbox->DLC;
+  gCAN_MAILBOX[i].ACCEPTANCE_FILTER = mbox->ACCEPTANCE_FILTER;
+
+  return CAN_OK;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Write( CAN_MAILBOX *mbox, uint8_t *data )
+ *
+ * Overview:        API Function
+ *                  Use this function to write Data to CAN Bus
+ *
+ * PreCondition:    None
+ *
+ * Input:           *mbox, *data
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Write( CAN_MAILBOX *mbox, uint8_t *data )
+{
+  int8_t  CAN_Status_Tx = CAN_NOK;
+  uint8_t i=0;
+
+  // 50 Fehlversuche entspricht 5,5ms oder CAN_Tx_Voltage von 8 Slaves
+  for(i=0;i<CAN_Tx_TimeOut;i++)
+  {
+    CAN_Status_Tx = ECANSendMessage( mbox->CAN_Id, data, mbox->DLC, ECAN_TX_STD_FRAME);
+    if(CAN_Status_Tx)   // wenn Tx complete
+      break;            // break loop
+
+    Delay100TCYx(11);   // loop time ca 0,1ms => 1 CAN Telegramm bei 1MBaud
+  }
+  return CAN_Status_Tx;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Read( uint8_t MailBoxNo, uint8_t *data )
+ *
+ * Overview:        API Function
+ *                  Use this function to read Data from CAN Bus
+ *
+ * PreCondition:    None
+ *
+ * Input:           *mbox, *data
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change Data
+ **********************************************************************/
+int8_t CAN_Read( CAN_MAILBOX *mbox, uint8_t *data )
+{
+  ECAN_RX_MSG_FLAGS flags;
+  int8_t            CAN_Status_Rx = CAN_NOK;
+
+  CAN_Status_Rx = ECANReceiveMessage( &mbox->CAN_Id, data, &mbox->DLC, &flags);
+  gCAN_Rx_Overrun = (flags & ECAN_RX_OVERFLOW);
+      
+  return CAN_Status_Rx;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Write_Voltage( void )
+ *
+ * Overview:        Use this function to write Voltage Frames to CAN
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Write_Voltage( void )
+{
+  int8_t   i=0;
+  int8_t   CAN_Status_Voltage = CAN_NOK;
+  int16_t  copyVoltage = 0;
+
+  for(i=0; i<6; i++)                            // loop all 6 Voltage Frame
+  {
+    copyVoltage = LTC_GetVoltage(4*i+0);
+    gCAN_Data[0] = ( (gCounter << 5)& 0xE0 );
+    gCAN_Data[0] = ( (gCAN_Data[0]) | (copyVoltage >> 8) );
+    gCAN_Data[1] = (copyVoltage & 0xFF);
+    copyVoltage  = LTC_GetVoltage(4*i+1);
+    gCAN_Data[2] = (copyVoltage >> 8);
+    gCAN_Data[3] = (copyVoltage & 0xFF);
+    copyVoltage  = LTC_GetVoltage(4*i+2);
+    gCAN_Data[4] = (copyVoltage >> 8);
+    gCAN_Data[5] = (copyVoltage & 0xFF);
+    copyVoltage  = LTC_GetVoltage(4*i+3);
+    gCAN_Data[6] = (copyVoltage >> 8);
+    gCAN_Data[7] = (copyVoltage & 0xFF);
+
+    // Send one Frame
+    CAN_Status_Voltage = CAN_Write( &gCAN_MAILBOX[1+i], &gCAN_Data[0] );
+  }
+
+  return CAN_Status_Voltage;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Write_Temperature( void )
+ *
+ * Overview:        Use this function to write Temperature Frames to CAN
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Write_Temperature( void )
+{
+  LTC_STATUS    LTC_Status;
+  int8_t        CAN_Status_Temperature = CAN_NOK;
+  int8_t        BoardTemp;
+
+  LTC_GetHeatSink( &LTC_Status );
+
+  BoardTemp = LTC_Status.HeatSinkTemperature;
+
+  if( !((BoardTemp > BAL_TEMP_MIN) && (BoardTemp < BAL_TEMP_MAX)) )
+  {
+      gERROR.LIMITBOARDTEMP = 1;
+  }
+
+  gCAN_Data[0] = (( gCounter << 5 ) + (MuxCounter << 2) );      // formating dataC
+  gCAN_Data[1] = BoardTemp;
+  gCAN_Data[2] = LTC_GetTemperature(0 + 4 * MuxCounter);
+  gCAN_Data[3] = LTC_GetTemperature(1 + 4 * MuxCounter);
+  gCAN_Data[4] = LTC_GetTemperature(2 + 4 * MuxCounter);
+  gCAN_Data[5] = LTC_GetTemperature(3 + 4 * MuxCounter);
+  gCAN_Data[6] = 0;
+  gCAN_Data[7] = 0;
+ 
+  // Send first Frame
+  CAN_Status_Temperature = CAN_Write( &gCAN_MAILBOX[8], &gCAN_Data[0] );
+
+  return CAN_Status_Temperature;
+}
+
+/*********************************************************************
+ * Function:        int8_t CAN_Read_Master( void )
+ *
+ * Overview:        Use this function to read Data from Master
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Read_Master( void )
+{
+  uint8_t   data[8];                        // Datenpuffer & Pufferlaenge
+  int8_t    CAN_Status = CAN_NOK;
+
+  if(CAN_Read(&gCAN_MAILBOX[0], &data[0]))  // lese CAN aus
+  {
+      CAN_Status = CAN_OK;
+      LATE ^= 1;                              // wenn CAN RX toggle LED_0
+
+      Alive_Master = ( (data[0] & 0xE0) >> 5 );
+      SlaveMode = ( data[0] & 0x1F );
+
+      Check_Alive_Master =  Alive_Master;
+      Check_Alive_Master++;
+
+      if(Check_Alive_Master >= MAX_ALIVE)
+      {
+          Check_Alive_Master = 0;
+      }
+  }
+
+  return CAN_Status;
+}
+/*********************************************************************
+ * Function:        int8_t CAN_Read_Balancing( void )
+ *
+ * Overview:        Use this function to read Balancing Frames from CAN
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change Data
+ **********************************************************************/
+int8_t CAN_Read_Balancing( void )
+{
+  uint8_t   data[8];                        // Datenpuffer & Pufferlaenge
+  int8_t    CAN_Status_Balancing = CAN_NOK;
+
+  if(CAN_Read(&gCAN_MAILBOX[0], &data[0]))  // lese CAN aus
+  {
+    CAN_Status_Balancing = CAN_OK;
+    PIR5bits.RXBnIF = 0;
+
+    LATE ^= 1;                              // wenn CAN RX toggle LED_0
+
+    Alive_Master = ( (data[0] & 0xE0) >> 5 );
+    SlaveMode = ( data[0] & 0x1F );
+
+    if( Alive_Master == Check_Alive_Master)
+    {
+        Check_Alive_Master++;
+
+    }
+    else
+    {
+        Check_Alive_Master =  Alive_Master;
+        Check_Alive_Master++;
+
+        Count_Error_Master++;               // Set Count Error
+    }
+
+    if(Check_Alive_Master >= MAX_ALIVE)
+    {
+        Check_Alive_Master = 0;
+    }
+
+    // Balancing
+    CAN_BAL = data[3];                      // Build 24 Bit Balancing Flag
+    CAN_BAL = (CAN_BAL << 8) + data[2];
+    CAN_BAL = (CAN_BAL << 8) + data[1];
+  }
+  
+  return CAN_Status_Balancing;
+}
+
+/*********************************************************************
+ * Function:        int8_t CAN_Read_System( void )
+ *
+ * Overview:        Use this function to system initialization
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change ID, readout seriescode
+ **********************************************************************/
+int8_t CAN_Read_System( void )
+{
+  uint8_t               data[8];                    // Datenpuffer & Pufferlaenge
+  uint8_t               IDSEARCH_check = 0x03;      // XOR Checksum for IDSEARCH
+  uint8_t               SERNRPRG_check = 0x00;      // XOR Checksum for SERNRPRG
+  uint8_t               GETSERNR_check = 0x0E;      // XOR Checksum for GETSERNR
+  uint8_t               CHECK_temp = 0;
+  int8_t                CAN_Status_System = CAN_NOK;
+  uint8_t               DLC = 8;
+  uint32_t              id=0;
+  ECAN_RX_MSG_FLAGS     flags;
+  uint8_t               i;
+  uint8_t               DATA_temp[8];
+
+  CAN_Status_System = ECANReceiveMessage( &id, data, &DLC, &flags);
+  gCAN_Rx_Overrun = (flags & ECAN_RX_OVERFLOW);
+
+  // Request with ID 0x300 from Master for IDsearch or to programm new Serialcode
+  if(id == 0x300)
+  {
+     // XOR Checksum calculation
+     // 'IDSEARCH' => 0x49 ^ 0x44 ^ 0x53 ^ 0x45 ^ 0x41 ^ 0x52 ^ 0x43 ^ 0x48 = 0x03
+     // 'SERNRPRG' => 0x53 ^ 0x45 ^ 0x52 ^ 0x4E ^ 0x52 ^ 0x50 ^ 0x4F ^ 0x47 = 0x00
+     // 'GETSERNR' => 0x47 ^ 0x45 ^ 0x54 ^ 0x53 ^ 0x45 ^ 0x52 ^ 0x4E ^ 0x52 = 0x0E
+     CHECK_temp = data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7];
+
+     if(CHECK_temp == IDSEARCH_check)
+      {
+          STATE_STATUS = SYSTEM_IDSEARCH;
+          gSerial.EE_BYTE.SLAVE_ID = 0x00;              // Clear Canid
+          Load_Mailbox( gSerial.EE_BYTE.SLAVE_ID );     // new slave ID canbox initialization
+          ECANSetRXM0Value(0xDF5, ECAN_MSG_STD);        // activate 0x10A and 0x30A Frame
+      }
+     else if(CHECK_temp == SERNRPRG_check)
+     {
+         STATE_STATUS = SYSTEM_SERNRPRG;
+         ECANSetRXM0Value(0xDF6, ECAN_MSG_STD);        // activate 0x308 and 0x309 Frame
+     }
+     else if(CHECK_temp == GETSERNR_check)
+     {
+         STATE_STATUS = SYSTEM_GETSERNR;
+     }
+  }
+
+switch(STATE_STATUS)
+        {
+            case SYSTEM_IDSEARCH:
+                    // Request with ID 0x10A from Master to reply with ID 0x20A from Slave
+                    if(id == 0x10A)
+                    {
+                        CAN_Write_System();
+                    }
+
+                    // Request with ID 0x30A from Master to save the new serialcode and deactivate
+                    // the IDs 0x10A and 0x30A
+                    if(id == 0x30A)
+                    {
+                        //Get Data from Master and save to DATA_temp
+                        for(i = 0; i < DLC; i++)
+                        {
+                            DATA_temp[i] = data[i];
+                        }
+
+                        if( (gSerial.EE_BYTE.LFT_1  == DATA_temp[0]) &&
+                            (gSerial.EE_BYTE.LFT_2  == DATA_temp[1]) &&
+                            (gSerial.EE_BYTE.LIEF   == DATA_temp[2]) &&
+                            (gSerial.EE_BYTE.EE_REV == DATA_temp[4]) )
+                        {
+                            Load_Mailbox( DATA_temp[7] );                 // new slave ID canbox initialization
+                            ECANSetRXM0Value(0xDFF, ECAN_MSG_STD);        // deactivate 0x10A and 0x30A Frame
+
+                            EEwrite_new(0x0D, DATA_temp[7]);              // write new data to EEPROM
+
+                            // Restart main programm
+                            SlaveMode = INITIALISATION_MODE;
+                            STATE_STATUS = RUN_SLAVE;
+                        }
+                    }
+            break;
+            case SYSTEM_SERNRPRG:
+                   // Request with ID 0x308 and 0x309 from System to save the new Serialcode
+                    if( (id == 0x308) | (id == 0x309))
+                    {
+                        //Get Data from Master and save to DATA_temp
+                        for(i = 0; i < DLC; i++)
+                        {
+                            DATA_temp[i] = data[i];
+                        }
+                        if(id == 0x308)
+                        {
+                             EEwrite(EE_308_a, &DATA_temp[0] );      // Write initialization data to EEPROM
+                        }
+                        else if(id == 0x309)
+                        {
+                            EEwrite(EE_309_a, &DATA_temp[0] );      // Write initialization data to EEPROM
+
+                            // Restart main programm
+                            SlaveMode = INITIALISATION_MODE;
+                            STATE_STATUS = RUN_SLAVE;
+                        }
+                    }
+            break;
+            case SYSTEM_GETSERNR:
+                 // Reply with ID 0x2XA from Slave to Master
+                CAN_Write_System();
+
+                // Restart main programm
+                SlaveMode = INITIALISATION_MODE;
+                STATE_STATUS = RUN_SLAVE;
+
+                break;
+            default:
+            break;
+        }
+
+  return CAN_Status_System;
+}
+
+/*********************************************************************
+ * Function:        int8_t CAN_Write_System( void )
+ *
+ * Overview:        Use this function to write Serialframe to Master
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Write_System( void )
+{
+  int8_t    CAN_Status_System = CAN_NOK;
+  uint16_t  DELAY_t = 0;
+  uint16_t  i_time = 0;
+  uint8_t   Delay_256us = 4;
+
+    gCAN_Data[0]= gSerial.EE_BYTE.LFT_1;
+    gCAN_Data[1]= gSerial.EE_BYTE.LFT_2;
+    gCAN_Data[2]= gSerial.EE_BYTE.LIEF;
+    gCAN_Data[3]= gSerial.EE_BYTE.BAU_1;
+    gCAN_Data[4]= gSerial.EE_BYTE.EE_REV;
+    gCAN_Data[5]= gSerial.EE_BYTE.FAM_1;
+    gCAN_Data[6]= gSerial.EE_BYTE.GERAET;
+    gCAN_Data[7]= gSerial.EE_BYTE.LAEN;
+
+    // LFT1(LSB) and LFT2(MSB) to 16 Bit DELAY_t value
+    DELAY_t = gSerial.EE_BYTE.LFT_2;
+    DELAY_t = DELAY_t << 8;
+    DELAY_t = DELAY_t | gSerial.EE_BYTE.LFT_1;
+    // Delay_t 0 - 9999 --> 1 - 10000
+    DELAY_t++;
+
+    // Generate delay time with 8 Bit Delay1KTCYx(Delay_256us) function
+    while(i_time <= DELAY_t )
+    {
+        Delay1KTCYx(Delay_256us);
+        i_time++;
+    }
+    
+    CAN_Status_System = CAN_Write( &gCAN_MAILBOX[9], &gCAN_Data[0] );
+  
+  return CAN_Status_System;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t CAN_Write_Status( void )
+ *
+ * Overview:        Use this function to write Status Frames to CAN
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t CAN_Write_Status( void )
+{
+  LTC_STATUS  LTC_Status;
+  int8_t      CAN_Status_Status = CAN_NOK;
+
+  gERROR.SLAVE_SPI = 0;
+  gERROR.SLAVE_TIMING = 0;
+  gERROR.SLAVE_HARDWARE = 0;
+
+  LTC_GetStatus( &LTC_Status );                         // read LTC Status
+
+  gERROR.SLAVE_TIMING = (LTC_Status.LTC_StatusSlave & 0x40) >> 6;
+
+  if (LTC_Status.LTC_SelfTest >= 0x0001)
+  {
+      gERROR.SLAVE_HARDWARE = 1;
+  }
+
+  gCAN_Data[0] = 0x00;
+  gCAN_Data[0] = (( gCounter << 5 ) + SlaveMode );
+  gCAN_Data[1] = 0x00;
+  gCAN_Data[1] =  (gERROR.LIMITVOLTAGE << 6);
+  gCAN_Data[1] |= (gERROR.SLAVE_SPI << 5);              // Onboard comunication Fail
+  gCAN_Data[1] |= (gERROR.SLAVE_TIMING << 4);           // Measure Timing Error
+  gCAN_Data[1] |= (gERROR.SLAVE_HARDWARE << 3);         // ADC / MUX / REF Error
+  gCAN_Data[1] |= (gERROR.LIMITBOARDTEMP << 2);
+  gCAN_Data[1] |= (gERROR.LIMITCELLTEMP << 1);
+  gCAN_Data[1] |= (gERROR.LIMITCELLVOLTAGE);
+  gCAN_Data[2] = 0;
+  gCAN_Data[3] = 0;
+  gCAN_Data[4] = 0;
+  gCAN_Data[5] = 0;
+  gCAN_Data[6] = 0;
+  gCAN_Data[7] = 0;
+
+  // send one Status Frame
+  CAN_Status_Status = CAN_Write( &gCAN_MAILBOX[7], &gCAN_Data[0] );
+
+  return CAN_Status_Status;
+}
+
+
+
+/*********************************************************************
+ * Function:        int8_t Load_Mailbox( uint8_t SlaveNo )
+ *
+ * Overview:        Use this function to initialize all CAN Mailboxes
+ *
+ * PreCondition:    None
+ *
+ * Input:           SlaveNo
+ *
+ * Output:          return: CAN_OK / CAN_NOK
+ *
+ * Side Effects:    change CAN_Mailbox
+ **********************************************************************/
+int8_t Load_Mailbox( uint8_t SlaveNo )
+{
+  gCAN_MAILBOX[0].BOX_No = 0;              // Balancing Frame 1
+  gCAN_MAILBOX[0].CAN_Id = 0x100+SlaveNo;
+  gCAN_MAILBOX[0].DLC    = 5;
+  gCAN_MAILBOX[0].ACCEPTANCE_FILTER = 0x100+SlaveNo;
+
+  gCAN_MAILBOX[1].BOX_No = 1;              // Voltage Frame 1
+  gCAN_MAILBOX[1].CAN_Id = 0x200+SlaveNo;
+  gCAN_MAILBOX[1].DLC    = 8;
+  gCAN_MAILBOX[1].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[2].BOX_No = 2;              // Voltage Frame 2
+  gCAN_MAILBOX[2].CAN_Id = 0x201+SlaveNo;
+  gCAN_MAILBOX[2].DLC    = 8;
+  gCAN_MAILBOX[2].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[3].BOX_No = 3;              // Voltage Frame 3
+  gCAN_MAILBOX[3].CAN_Id = 0x202+SlaveNo;
+  gCAN_MAILBOX[3].DLC    = 8;
+  gCAN_MAILBOX[3].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[4].BOX_No = 4;              // Voltage Frame 4
+  gCAN_MAILBOX[4].CAN_Id = 0x203+SlaveNo;
+  gCAN_MAILBOX[4].DLC    = 8;
+  gCAN_MAILBOX[4].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[5].BOX_No = 5;              // Voltage Frame 5
+  gCAN_MAILBOX[5].CAN_Id = 0x204+SlaveNo;
+  gCAN_MAILBOX[5].DLC    = 8;
+  gCAN_MAILBOX[5].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[6].BOX_No = 6;              // Voltage Frame 6
+  gCAN_MAILBOX[6].CAN_Id = 0x205+SlaveNo;
+  gCAN_MAILBOX[6].DLC    = 8;
+  gCAN_MAILBOX[6].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[7].BOX_No = 7;              // Status Frame
+  gCAN_MAILBOX[7].CAN_Id = 0x206+SlaveNo;
+  gCAN_MAILBOX[7].DLC    = 8;
+  gCAN_MAILBOX[7].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[8].BOX_No = 8;              // Temperature Frame
+  gCAN_MAILBOX[8].CAN_Id = 0x207+SlaveNo;
+  gCAN_MAILBOX[8].DLC    = 8;
+  gCAN_MAILBOX[8].ACCEPTANCE_FILTER = 0;
+
+  gCAN_MAILBOX[9].BOX_No = 8;              // Serialcode Frame
+  gCAN_MAILBOX[9].CAN_Id = 0x20A+SlaveNo;
+  gCAN_MAILBOX[9].DLC    = 8;
+  gCAN_MAILBOX[9].ACCEPTANCE_FILTER = 0;
+
+
+
+  return CAN_OK;
+}

+ 98 - 0
ProjectSource/BMS_Slave_RCT/BMS_CAN.h

@@ -0,0 +1,98 @@
+/*********************************************************************
+ *
+ *                  BMS_CAN Header
+ *
+ *********************************************************************
+ * FileName:        BMS_CAN.h
+ * Processor:       PIC18F45K80
+ * Complier:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       23.04.2012   Release
+ *********************************************************************/
+
+//#ifndef BMS_CAN_H          // To avoid duplicate inclusion
+#define BMS_CAN_H
+
+
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+#define CAN_OK              1
+#define CAN_NOK             0
+
+// 50 Fehlversuche entspricht 5,5ms oder CAN_Tx_Voltage von 8 Slaves
+#define CAN_Tx_TimeOut    50u
+
+
+
+/*********************************************************************
+ *
+ * General purpose typedef's
+ *
+ ********************************************************************/
+typedef union _CAN_MAILBOX
+{
+  struct
+  {
+    uint8_t   BOX_No;
+    uint32_t  CAN_Id;
+    uint8_t   DLC;
+    uint32_t  ACCEPTANCE_FILTER;
+    int8_t    Data[8];
+  };
+} CAN_MAILBOX;
+
+typedef struct
+{
+    uint8_t LIMITVOLTAGE;
+    uint8_t SLAVE_SPI;
+    uint8_t SLAVE_TIMING;
+    uint8_t SLAVE_HARDWARE;
+    uint8_t LIMITBOARDTEMP;
+    uint8_t LIMITCELLTEMP;
+    uint8_t LIMITCELLVOLTAGE;
+} ERROR_flags;
+
+/*********************************************************************
+ *
+ * external Globals
+ *
+ ********************************************************************/
+extern uint32_t     CAN_BAL;
+extern uint8_t      SlaveMode;
+extern uint8_t      gCounter;
+extern uint8_t      Alive_Slave;
+extern uint8_t      Alive_Master;
+extern uint8_t      Check_Alive_Master;
+extern uint8_t      Count_Error_Master;
+extern uint8_t      MuxCounter;
+
+
+
+
+
+/*********************************************************************
+ *
+ * Funktions Prototypen
+ *
+ ********************************************************************/
+int8_t CAN_Init              ( CAN_CONFIG  *config );
+int8_t CAN_Init_Mailbox      ( CAN_MAILBOX *mbox);
+int8_t CAN_Write             ( CAN_MAILBOX *mbox, uint8_t *data );
+int8_t CAN_Read              ( CAN_MAILBOX *mbox, uint8_t *data );
+
+int8_t CAN_Write_Voltage     ( void );
+int8_t CAN_Write_Temperature ( void );
+int8_t CAN_Write_Status      ( void );
+int8_t CAN_Read_Master       ( void );
+int8_t CAN_Read_Balancing    ( void );
+int8_t CAN_Read_System       ( void );
+int8_t CAN_Write_System      ( void );
+
+int8_t Load_Mailbox          ( uint8_t SlaveNo );

+ 1245 - 0
ProjectSource/BMS_Slave_RCT/BMS_ECAN.c

@@ -0,0 +1,1245 @@
+/*********************************************************************
+ *
+ *              ECAN C Library Source Code
+ *
+ *********************************************************************
+ * FileName:        ECAN.C
+ * Dependencies:    p18cxxx.h/pic18.h, ECAN.h
+ * Processor:       PIC18CXX8X
+ * Compiler:        Microchip C 2.10.06 or higher
+ * Company:         Microchip Technology, Inc.
+ *
+ * Software License Agreement
+ *
+ * The software supplied herewith by Microchip Technology Incorporated
+ * (the “Company”) for its PICmicro® Microcontroller is intended and
+ * supplied to you, the Company’s customer, for use solely and
+ * exclusively on Microchip PICmicro Microcontroller products. The
+ * software is owned by the Company and/or its supplier, and is
+ * protected under applicable copyright laws. All rights are reserved.
+ * Any use in violation of the foregoing restrictions may subject the
+ * user to criminal sanctions under applicable laws, as well as to
+ * civil liability for the breach of the terms and conditions of this
+ * license.
+ *
+ * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
+ * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
+ * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * Author               Date    Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Caio Gubel           5/5/03  ECAN Version 1.0 - Initial Release
+ * Nilesh R.            7/22/03 Improved.
+ ********************************************************************/
+
+#include "BMS_Slave.h"
+
+
+void _CANIDToRegs(BYTE* ptr,
+                 unsigned long val,
+                 BYTE type);
+void _RegsToCANID(BYTE* ptr,
+                 unsigned long *val,
+                 BYTE type);
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+    static BYTE* _ECANPointBuffer(BYTE b);
+#endif
+
+BYTE_VAL _ECANRxFilterHitInfo;
+
+#define _SetStdRXFnValue(f, val)                                \
+    ##f##SIDH = (long)ECAN_##f##_VAL >> 3L;                     \
+    ##f##SIDL = (long)ECAN_##f##_VAL >> 5L
+
+#define _SetXtdRXFnValue(f, val)                                \
+    ##f##SIDH = (long)ECAN_##f##_VAL >> 21L;                    \
+    ##f##SIDL = (((long)ECAN_##f##_VAL >> 13L) & 0xe0) |        \
+                    ((long)(ECAN_##f##_VAL) & 0x03L)   |        \
+                    0x08;                                       \
+    ##f##EIDH = (long)ECAN_##f##_VAL >> 8L;                     \
+    ##f##EIDL = ECAN_##f##_VAL;
+
+
+#define _SetStdRXMnValue(m, val)                                \
+    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 3L;               \
+    RXM##m##SIDL = (long)ECAN_RXM##m##_VAL >> 5L
+
+#define _SetXtdRXMnValue(m, val)                                \
+    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 21L;              \
+    RXM##m##SIDL = (((long)ECAN_RXM##m##_VAL >> 13L) & 0xe0) |  \
+                    ((long)(ECAN_RXM##m##_VAL) & 0x03L);\
+    RXM##m##EIDH = (long)ECAN_RXM##m##_VAL >> 8L;\
+    RXM##m##EIDL = ECAN_RXM##m##_VAL;
+
+#define RXF0            0
+#define RXF1            1
+#define RXF2            2
+#define RXF3            3
+#define RXF4            4
+#define RXF5            5
+#define RXF6            6
+#define RXF7            7
+#define RXF8            8
+#define RXF9            9
+#define RXF10           10
+#define RXF11           11
+#define RXF12           12
+#define RXF13           13
+#define RXF14           14
+#define RXF15           15
+
+
+/*
+ * Compile-time validation ECAN options as per ECAN and ECAN rules.
+ */
+#if ( ECAN_SJW_VAL > 4 )
+#error Invalid SJW value received.
+#endif
+
+#if ( ECAN_BRP_VAL > 64 )
+#error Invalid BRP value received.
+#endif
+
+#if ( ECAN_PHSEG1_VAL > 8 )
+#error Invalid PHSEG1 value received.
+#endif
+
+#if ( ECAN_PHSEG2_VAL > 8 )
+#error Invalid PHSEG2 value received.
+#endif
+
+#if ( ECAN_PROPSEG_VAL > 8 )
+#error Invalid PROPSEG value received.
+#endif
+
+// In Mode 1 & 2, double buffering on RXB0 is not available.
+
+
+/*
+ * In Mode 0, RXF0-RXF5 are always enabled.
+ */
+#if ( ECAN_FUNC_MODE_VAL == ECAN_MODE_0 )
+    #undef ECAN_RXF0_MODE_VAL
+    #define ECAN_RXF0_MODE_VAL      ECAN_RXF0_ENABLE
+
+    #undef ECAN_RXF1_MODE_VAL
+    #define ECAN_RXF1_MODE_VAL      ECAN_RXF1_ENABLE
+
+    #undef ECAN_RXF2_MODE_VAL
+    #define ECAN_RXF2_MODE_VAL      ECAN_RXF2_ENABLE
+
+    #undef ECAN_RXF3_MODE_VAL
+    #define ECAN_RXF3_MODE_VAL      ECAN_RXF3_ENABLE
+
+    #undef ECAN_RXF4_MODE_VAL
+    #define ECAN_RXF4_MODE_VAL      ECAN_RXF4_ENABLE
+
+    #undef ECAN_RXF5_MODE_VAL
+    #define ECAN_RXF5_MODE_VAL      ECAN_RXF5_ENABLE
+#endif
+
+
+/*********************************************************************
+ * Function:        void ECANInitialize(void)
+ *
+ * Overview:        Use this function to initialize ECAN module with
+ *                  options defined in ECAN.def file.
+ *                  You may manually edit ECAN.def file as per your
+ *                  requirements, or use Microchip Application
+ *                  Maestro tool.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    All pending transmissions are aborted.
+ ********************************************************************/
+void ECANInitialize(void)
+{
+
+    // Put module into Configuration mode.
+    ECANSetOperationMode(ECAN_OP_MODE_CONFIG);
+
+
+    // Set Bit rate values as per defines.
+    BRGCON1 = ((ECAN_SJW_VAL-1) << 6) | (ECAN_BRP_VAL-1);
+    BRGCON2 = (ECAN_PHSEG2_MODE_VAL << 7)      | \
+              (ECAN_BUS_SAMPLE_MODE_VAL << 6)  | \
+              ((ECAN_PHSEG1_VAL-1) << 3)       | \
+              (ECAN_PROPSEG_VAL-1);
+    BRGCON3 = (ECAN_WAKEUP_MODE_VAL << 7)      |
+              (ECAN_FILTER_MODE_VAL << 6)      |
+              (ECAN_PHSEG2_VAL-1);
+
+    // Set CANTX2, TXDRIVE and CAN Capture modes.
+    CIOCON = ECAN_TX2_SOURCE_VAL << 7           | \
+             ECAN_TX2_MODE_VAL << 6         | \
+             ECAN_TXDRIVE_MODE_VAL << 5        | \
+             ECAN_CAPTURE_MODE_VAL;
+
+
+    // Set WCAN functional mode.
+    ECANCON_MDSEL1 = ECAN_FUNC_MODE_VAL >> 7;
+    ECANCON_MDSEL0 = ECAN_FUNC_MODE_VAL >> 6;
+
+
+    // Set RXB0 and RXB1 buffer modes.
+#if ( ECAN_FUNC_MODE_VAL == ECAN_MODE_0 )
+    RXB0CON = (ECAN_RXB0_MODE_VAL << 5) | (ECAN_RXB0_DBL_BUFFER_MODE_VAL << 2);
+    RXB1CON = ECAN_RXB1_MODE_VAL << 5;
+#else
+    // In Mode1 & 2, Map 2-bit RXM bits into 1 RXM1 bit.
+    #if ( ECAN_RXB0_MODE_VAL == ECAN_RECEIVE_ALL )
+        RXB0CON = 0x40;
+    #else
+        RXB0CON = 0;
+    #endif
+
+    #if ( ECAN_RXB1_MODE_VAL == ECAN_RECEIVE_ALL )
+        RXB1CON = 0x40;
+    #else
+        RXB1CON = 0;
+    #endif
+#endif
+
+    // B0-B5 are available in Mode 1 and 2 only.
+#if (ECAN_FUNC_MODE_VAL != ECAN_MODE_0)
+    #if (ECAN_B0_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B0_MODE_VAL == ECAN_RECEIVE_ALL )
+            B0CON = 0x40;
+        #else
+            B0CON = 0;
+        #endif
+    #else
+        B0CON = ECAN_B0_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B1_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B1_MODE_VAL == ECAN_RECEIVE_ALL )
+            B1CON = 0x40;
+        #else
+            B1CON = 0;
+        #endif
+    #else
+        B1CON = ECAN_B1_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B2_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B2_MODE_VAL == ECAN_RECEIVE_ALL )
+            B2CON = 0x40;
+        #else
+            B2CON = 0;
+        #endif
+    #else
+        B2CON = ECAN_B2_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B3_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B3_MODE_VAL == ECAN_RECEIVE_ALL )
+            B3CON = 0x40;
+        #else
+            B3CON = 0;
+        #endif
+    #else
+        B3CON = ECAN_B3_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B4_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B4_MODE_VAL == ECAN_RECEIVE_ALL )
+            B4CON = 0x40;
+        #else
+            B4CON = 0;
+        #endif
+    #else
+        B4CON = ECAN_B4_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B5_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B5_MODE_VAL == ECAN_RECEIVE_ALL )
+            B5CON = 0x40;
+        #else
+            B5CON = 0;
+        #endif
+    #else
+        B5CON = ECAN_B5_AUTORTR_MODE << 2;
+    #endif
+
+    // Enable/disable buffers B0-B5.
+    BSEL0 = ECAN_B5_TXRX_MODE_VAL << 7 | \
+            ECAN_B4_TXRX_MODE_VAL << 6 | \
+            ECAN_B3_TXRX_MODE_VAL << 5 | \
+            ECAN_B2_TXRX_MODE_VAL << 4 | \
+            ECAN_B1_TXRX_MODE_VAL << 3 | \
+            ECAN_B0_TXRX_MODE_VAL << 2;
+#endif
+
+
+
+
+    // Assign value to RXF0 only if Mode0 is used or RXF0 itself is enabled.
+#if ( (ECAN_RXF0_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    // Set Standard or Extended value.
+    #if ( ECAN_RXF0_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF0, ECAN_RXF0_VAL);
+        RXF0SIDH = (long)ECAN_RXF0_VAL >> 3L;
+        RXF0SIDL = (long)ECAN_RXF0_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF0, ECAN_RXF0_VAL);
+    #endif
+#endif
+
+#if ( (ECAN_RXF1_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF1_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF1, ECAN_RXF1_VAL);
+        RXF1SIDH = (long)ECAN_RXF1_VAL >> 3L;
+        RXF1SIDL = (long)ECAN_RXF1_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF1, ECAN_RXF1_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF2_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF2_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF2, ECAN_RXF2_VAL);
+        RXF2SIDH = (long)ECAN_RXF2_VAL >> 3L;
+        RXF2SIDL = (long)ECAN_RXF2_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF3_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF3_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #else
+        _SetXtdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF4_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF4_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF4, ECAN_RXF4_VAL);
+    #else
+        _SetXtdRXFnValue(RXF4, ECAN_RXF4_VAL);
+    #endif
+#endif
+
+#if ( (ECAN_RXF5_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF5_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF5, ECAN_RXF4_VAL);
+    #else
+        _SetXtdRXFnValue(RXF5, ECAN_RXF5_VAL);
+    #endif
+#endif
+
+
+    // Filters 6-15 are available in Modes 1 and 2 only.
+#if (ECAN_FUNC_MODE_VAL != ECAN_MODE_0)
+    #if ( ECAN_RXF6_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF6_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF6, ECAN_RXF6_VAL);
+        #else
+            _SetXtdRXFnValue(RXF6, ECAN_RXF6_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF7_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF7_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF7, ECAN_RXF7_VAL);
+        #else
+            _SetXtdRXFnValue(RXF7, ECAN_RXF7_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF8_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF8_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF8, ECAN_RXF9_VAL);
+        #else
+            _SetXtdRXFnValue(RXF8, ECAN_RXF9_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF9_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF9_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF9, ECAN_RXF9_VAL);
+        #else
+            _SetXtdRXFnValue(RXF9, ECAN_RXF9_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF10_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF10_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF10, ECAN_RXF10_VAL);
+        #else
+            _SetXtdRXFnValue(RXF10, ECAN_RXF10_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF11_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF11_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF11, ECAN_RXF11_VAL);
+        #else
+            _SetXtdRXFnValue(RXF11, ECAN_RXF11_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF12_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF12_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF12, ECAN_RXF12_VAL);
+        #else
+            _SetXtdRXFnValue(RXF12, ECAN_RXF12_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF13_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF13_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF13, ECAN_RXF13_VAL);
+        #else
+            _SetXtdRXFnValue(RXF13, ECAN_RXF13_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF14_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF14_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF14, ECAN_RXF14_VAL);
+        #else
+            _SetXtdRXFnValue(RXF14, ECAN_RXF14_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF15_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF15_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF15, ECAN_RXF15_VAL);
+        #else
+            _SetXtdRXFnValue(RXF15, ECAN_RXF15_VAL);
+        #endif
+    #endif
+#endif
+
+    // Enable/Disable filters in Modes 1 and 2 only.
+#if ( ECAN_FUNC_MODE_VAL != ECAN_MODE_0 )
+    RXFCON0 = (ECAN_RXF7_MODE_VAL << 7) | \
+              (ECAN_RXF6_MODE_VAL << 6) | \
+              (ECAN_RXF5_MODE_VAL << 5) | \
+              (ECAN_RXF4_MODE_VAL << 4) | \
+              (ECAN_RXF3_MODE_VAL << 3) | \
+              (ECAN_RXF2_MODE_VAL << 2) | \
+              (ECAN_RXF1_MODE_VAL << 1) | \
+              (ECAN_RXF0_MODE_VAL);
+    RXFCON1 = (ECAN_RXF15_MODE_VAL << 7) | \
+              (ECAN_RXF14_MODE_VAL << 6) | \
+              (ECAN_RXF13_MODE_VAL << 5) | \
+              (ECAN_RXF12_MODE_VAL << 4) | \
+              (ECAN_RXF11_MODE_VAL << 3) | \
+              (ECAN_RXF10_MODE_VAL << 2) | \
+              (ECAN_RXF9_MODE_VAL << 1)  | \
+              (ECAN_RXF8_MODE_VAL);
+#endif
+
+
+    // Link each filter to corresponding buffer only if we are in Mode 1 or 2.
+#if ( ECAN_FUNC_MODE_VAL != ECAN_MODE_0 )
+    ECANLinkRXF0F1ToBuffer(ECAN_RXF0_BUFFER_VAL,     ECAN_RXF1_BUFFER_VAL);
+    ECANLinkRXF2F3ToBuffer(ECAN_RXF2_BUFFER_VAL,     ECAN_RXF3_BUFFER_VAL);
+    ECANLinkRXF4F5ToBuffer(ECAN_RXF4_BUFFER_VAL,     ECAN_RXF5_BUFFER_VAL);
+    ECANLinkRXF6F7ToBuffer(ECAN_RXF6_BUFFER_VAL,     ECAN_RXF7_BUFFER_VAL);
+    ECANLinkRXF8F9ToBuffer(ECAN_RXF8_BUFFER_VAL,     ECAN_RXF9_BUFFER_VAL);
+    ECANLinkRXF10F11ToBuffer(ECAN_RXF10_BUFFER_VAL,  ECAN_RXF11_BUFFER_VAL);
+    ECANLinkRXF12F13ToBuffer(ECAN_RXF12_BUFFER_VAL,  ECAN_RXF13_BUFFER_VAL);
+    ECANLinkRXF14F15ToBuffer(ECAN_RXF14_BUFFER_VAL,  ECAN_RXF15_BUFFER_VAL);
+
+    ECANLinkRXF0Thru3ToMask(ECAN_RXF0_MASK_VAL, \
+                           ECAN_RXF1_MASK_VAL, \
+                           ECAN_RXF2_MASK_VAL, \
+                           ECAN_RXF3_MASK_VAL);
+    ECANLinkRXF4Thru7ToMask(ECAN_RXF4_MASK_VAL, \
+                           ECAN_RXF5_MASK_VAL, \
+                           ECAN_RXF6_MASK_VAL, \
+                           ECAN_RXF7_MASK_VAL);
+    ECANLinkRXF8Thru11ToMask(ECAN_RXF8_MASK_VAL, \
+                           ECAN_RXF9_MASK_VAL, \
+                           ECAN_RXF10_MASK_VAL, \
+                           ECAN_RXF11_MASK_VAL);
+    ECANLinkRXF12Thru15ToMask(ECAN_RXF12_MASK_VAL, \
+                           ECAN_RXF13_MASK_VAL, \
+                           ECAN_RXF14_MASK_VAL, \
+                           ECAN_RXF15_MASK_VAL);
+#endif
+
+
+#if ( ECAN_RXM0_MSG_TYPE == ECAN_MSG_STD )
+    _SetStdRXMnValue(0, ECAN_RXM0_VAL);
+    RXM0SIDL_EXIDEN = 0;
+#else
+    _SetXtdRXMnValue(0, ECAN_RXM0_VAL);
+    RXM0SIDL_EXIDEN = 1;
+#endif
+
+#if ECAN_RXM1_MSG_TYPE == ECAN_MSG_STD
+    _SetStdRXMnValue(1, ECAN_RXM1_VAL);
+    RXM1SIDL_EXIDEN = 0;
+#else
+    _SetXtdRXMnValue(1, ECAN_RXM1_VAL);
+    RXM1SIDL_EXIDEN = 1;
+#endif
+
+    // SDFLC value
+
+    // Exit with speicfied mode.  If selected mode is Configuration,
+    // we do not need to do anything.
+#if ( ECAN_INIT_MODE != ECAN_INIT_CONFIGURATION )
+    ECANSetOperationMode(ECAN_INIT_MODE);
+#endif
+}
+
+
+
+/*********************************************************************
+ * Function:        BOOL ECANLoadRTRBuffer(BYTE buffer,
+ *                                         unsigned long id,
+ *                                         BYTE *data,
+ *                                         BYTE dataLen,
+ *                                         BYTE type)
+ *
+ * Overview:        Use this function to update automatic RTR buffer.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer number that is to be loaded
+ *                  id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                type parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  type        - Buffer type
+ *                                Must be ECAN_MSG_STD for Standard
+ *                                        ECAN_MSG_XTD for Extended
+ *
+ * Output:          TRUE, if given data was successfully loaded
+ *                  FALSE, if RTR buffer was in process of transmitting
+ *                          automated response.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#if ( defined(ECAN_ENABLE_AUTO_RTR) )
+BOOL ECANLoadRTRBuffer(BYTE buffer,
+                       unsigned long id,
+                       BYTE *data,
+                       BYTE dataLen,
+                       BYTE type)
+{
+    BYTE *pBuffer;
+    BYTE *pSavedBuffer;
+    BYTE i;
+
+    pSavedBuffer = pBuffer;
+
+#if defined(ECAN_CHECKED_BUILD)
+    // Make sure that this buffer is configured for RTR handling.
+    if ( !((BYTE_VAL*)pBuffer)->bits.b2 )
+        return FALSE;
+#endif
+
+    /*
+     * Make sure that RTR response is not currently being transmitted.
+     */
+    if ( ((BYTE_VAL*)pBuffer)->bits.b4 )
+        return FALSE;
+
+    // Start with zero length.
+    *(pBuffer+5) = 0;
+
+    // Save given id into ID registers..
+    _CANIDToRegs((BYTE*)(pBuffer+1), id, type);
+
+    // Prepare for data byte access.
+    pBuffer += 6;
+
+    // Copy given number of data bytes.
+    for ( i = 0; i < dataLen; i++ )
+        *pBuffer++ = *data++;
+
+    // At last, update DLC value.
+    *(pSavedBuffer + 5) = dataLen;
+
+    return TRUE;
+}
+#endif
+
+
+/*********************************************************************
+ * Function:        BOOL ECANSendMessage(unsigned long id,
+ *                                      BYTE *data,
+ *                                      BYTE dataLen,
+ *                                      ECAN_TX_MSG_FLAGS msgFlags)
+ *
+ * Overview:        Use this function to transmit a CAN message.
+ *                  This function searches for empty transmit buffer
+ *                  and loads it with given messages. Buffer is then
+ *                  marked for ready to transmit.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                msgFlags parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  msgFlags    - One or ECAN_TX_MSG_FLAGS values ORed
+ *                                together
+ *
+ * Output:          TRUE, if an empty buffer was found and loaded with
+ *                  given data
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+BOOL ECANSendMessage( unsigned long id,
+                     BYTE* data,
+                     BYTE dataLen,
+                     ECAN_TX_MSG_FLAGS msgFlags)
+{
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    BYTE mode;
+    BYTE buffers;
+#elif ( ECAN_FUNC_MODE_VAL == ECAN_MODE_0 )
+    #define buffers 2
+#else
+    #define buffers 8
+
+#endif
+
+    BYTE i,j;
+    BYTE *ptr, *tempPtr;
+    BYTE* pb[9];
+    BYTE temp;
+
+//#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE != ECAN_MODE_0) )
+    BYTE_VAL tempBSEL0;
+//#endif
+
+    /*
+     * Since there are more than one transmit buffers and they are scattered in
+     * SFR map, prepare table of all transmit buffers.
+     */
+    pb[0]=(BYTE*)&TXB0CON;
+    pb[1]=(BYTE*)&TXB1CON;
+    pb[2]=(BYTE*)&TXB2CON;
+
+    /*
+     * Include programmable buffers only if mode 1 or 2 is used.
+     */
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    pb[3]=(BYTE*)&B0CON;
+    pb[4]=(BYTE*)&B1CON;
+    pb[5]=(BYTE*)&B2CON;
+    pb[6]=(BYTE*)&B3CON;
+    pb[7]=(BYTE*)&B4CON;
+    pb[8]=(BYTE*)&B5CON;
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    mode = ECANCON&0xC0;
+    if ( mode == ECAN_MODE_0 )
+        buffers = 2;
+    else
+        buffers = 8;
+#endif
+
+
+    /*
+     * Depending on whether only mode 0 is used or not, we would only need to check
+     * either 3 or all buffers.
+     */
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    for ( i = 0; i < buffers; i++ )
+#else
+
+
+
+    /*
+     * In Mode 1 & 2, programmable buffers must be checked for buffer mode.
+     * By remembering BSEL0 (programmable buffer mode type info), we can
+     * reduce code required to check invidual buffer type as we scan through
+     * all buffers.
+     */
+    tempBSEL0.Val = BSEL0 >> 1;
+
+    for ( i = 0; i < (unsigned)buffers; i++ )
+#endif
+    {
+        /*
+         * Use local poiter to reduce overall code.
+         * It will be more efficient to access using pointer instead of index.
+         */
+        ptr = pb[i];
+        tempPtr = ptr;
+
+
+        /*
+         * In Mode 1 & 2, if buffer number is above TXB2, we must also check to
+         * see if this buffer is configured for transmit mode.
+         */
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+        if ( i > 2u )
+        {
+            /*
+             * Use previously saved BSEL0 value.
+             */
+            tempBSEL0.Val >>= 1;
+
+            /*
+             * If this is not transmit buffer, continue with next buffer.
+             */
+            if ( !tempBSEL0.bits.b0 )
+                continue;
+        }
+#endif
+
+        /*
+         * Check to see if this buffer is empty by looking at BnCON.TXREQ bit (bit3).
+         */
+        if ( !(*ptr & 0x08) )
+        {
+            // Set transmit priority in BnCON register.
+            *ptr &= ~ECAN_TX_PRIORITY_BITS;
+            *ptr |= msgFlags & ECAN_TX_PRIORITY_BITS;
+
+            // Also save DLC value.
+            if ( msgFlags & ECAN_TX_RTR_BIT )
+                temp = 0x40 | dataLen;
+            else
+                temp = dataLen;
+            // Use temp to reduce evaluation of *(ptr+5) to only once.
+            *(ptr+5) = temp;
+
+            // Set standard or extended message type.
+            if ( msgFlags & ECAN_TX_FRAME_BIT )
+                temp = ECAN_MSG_XTD;
+
+            else
+                temp = ECAN_MSG_STD;
+
+            // And rearrange given id accordingly.
+            _CANIDToRegs((BYTE*)(ptr+1), id, temp);
+
+            // Prepare for data byte access.
+            ptr += 6;
+            // Copy given number of data bytes.
+            for ( j = 0 ; j < dataLen; j++ )
+                *ptr++ = *data++;
+
+            // If this buffer is configured to automatically handle RTR messages,
+            // do not set TXREQ bit.  TXREQ bit will be set whenever matching RTR is received.
+            if ( !(*tempPtr & 0x04) )
+                *tempPtr |= 0x08;
+
+            return TRUE;
+        }
+    }
+
+    // There were no empty buffers.
+    return FALSE;
+}
+
+
+
+/*********************************************************************
+ * Function:        BOOL ECANReceiveMessage(unsigned long *id,
+ *                                  BYTE *data,
+ *                                  BYTE *dataLen,
+ *                                  ECAN_RX_MSG_FLAGS *msgFlags)
+ *
+ * Overview:        Use this function to check for full receive buffer
+ *                  and extract received data into local buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - Pointer to buffer that will be
+ *                                populated with receive ID.
+ *                  data        - Pointer to buffer that will be
+ *                                populated with data if there is any
+ *                  dataLen     - Pointer to buffer that will be
+ *                                populated with count of bytes
+ *                                copied in data buffer.
+ *                  msgFlags    - Pointer to buffer that will be
+ *                                copied with information about
+ *                                received message. More than
+ *                                one information is ORed together.
+ *
+ * Output:          TRUE, if a full receive buffer was found and
+ *                  given parameters were populated.
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ * Note:            If you need to know the filter number that caused
+ *                  this message to get accepted, call
+ *                  ECANGetFilterHitInfo().
+ *
+ ********************************************************************/
+BOOL ECANReceiveMessage(unsigned long *id,
+                       BYTE *data,
+                       BYTE *dataLen,
+                       ECAN_RX_MSG_FLAGS *msgFlags)
+{
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    BYTE mode;
+#endif
+
+    BYTE *ptr, *savedPtr;
+    char i;
+    BYTE_VAL temp;
+
+    _ECANRxFilterHitInfo.Val = 0;
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    mode = ECANCON&0xC0;
+    if ( mode == ECAN_MODE_0 )
+#endif
+
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    {
+        // Find which buffer is ready.
+        if ( RXB0CON_RXFUL )
+        {
+            // Clear the received flag.
+            PIR3_RXB0IF = 0;
+
+            // Record and forget any previous overflow
+            if ( COMSTAT_RXB0OVFL )
+            {
+                *msgFlags |= ECAN_RX_OVERFLOW;
+                COMSTAT_RXB0OVFL = 0;
+            }
+
+            _ECANRxFilterHitInfo.bits.b0 = RXB0CON_FILHIT0;
+
+            ptr = (BYTE*)&RXB0CON;
+
+        }
+        else if ( RXB1CON_RXFUL )
+        {
+            // Clear the received flag.
+            PIR3_RXB1IF = 0;
+
+            // Record and forget any previous overflow
+            if ( COMSTAT_RXB1OVFL )
+            {
+                *msgFlags |= ECAN_RX_OVERFLOW;
+                COMSTAT_RXB1OVFL = 0;
+            }
+
+            _ECANRxFilterHitInfo.Val = RXB1CON & 0x07;
+
+            if ( _ECANRxFilterHitInfo.Val < 0x02 )
+                *msgFlags |= ECAN_RX_DBL_BUFFERED;
+
+
+            ptr = (BYTE*)&RXB1CON;
+        }
+        else
+            return FALSE;
+
+        goto _SaveMessage;
+    }
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    else if ( mode == ECAN_MODE_1 )
+#endif
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_1) )
+
+    {
+        if ( RXB0CON_RXFUL )
+            ptr = (BYTE*)&RXB0CON;
+
+        else if (RXB1CON_RXFUL)
+            ptr = (BYTE*)&RXB1CON;
+
+        else if ( (BSEL0_B0TXEN==0u) && B0CON_RXFUL )
+            ptr = (BYTE*)&B0CON;
+
+        else if ( (BSEL0_B1TXEN==0u) && B1CON_RXFUL )
+            ptr = (BYTE*)&B1CON;
+
+        else if ( (BSEL0_B2TXEN==0u) && B2CON_RXFUL )
+            ptr = (BYTE*)&B2CON;
+
+        else if ( (BSEL0_B3TXEN==0u) && B3CON_RXFUL )
+            ptr = (BYTE*)&B3CON;
+
+        else if ( (BSEL0_B4TXEN==0u) && B4CON_RXFUL )
+            ptr = (BYTE*)&B4CON;
+
+        else if ( (BSEL0_B5TXEN==0u) && B5CON_RXFUL )
+            ptr = (BYTE*)&B5CON;
+
+        else
+            return FALSE;
+
+        goto _SaveMode12Message;
+
+
+    }
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    else
+#endif
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+    {
+        if ( COMSTAT_FIFOEMPTY == 1 )      //if FIFO is NOT empty --> meaning there is a message to be read waiting in Bn or RXBn Buffer
+        {
+            ptr = (BYTE*)_ECANPointBuffer(CANCON&0x07);          // get the pointer to the proper buffer
+
+            goto _SaveMode12Message;
+        }
+
+        return FALSE;
+    }
+#endif
+
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+_SaveMode12Message:
+    _ECANRxFilterHitInfo.Val = *ptr & 0x1f;
+
+    PIR5bits.RXB1IF = 0;
+
+    if ( COMSTAT_RXBnOVFL )
+    {
+        *msgFlags |= ECAN_RX_OVERFLOW;
+        COMSTAT_RXBnOVFL = 0;
+    }
+#endif
+
+_SaveMessage:
+    savedPtr = ptr;
+    *msgFlags = 0;
+
+    // Retrieve message length.
+    temp.Val = *(ptr+5);
+    *dataLen = temp.Val & 0b00001111;
+
+    // Determine whether this was RTR or not.
+    if ( temp.bits.b6 )
+        *msgFlags |= ECAN_RX_RTR_FRAME;
+
+    // Retrieve EIDX bytes only if this is extended message
+    temp.Val = *(ptr+2);
+    if ( temp.bits.b3 )
+    {
+        *msgFlags |= ECAN_RX_XTD_FRAME;
+        temp.Val = ECAN_MSG_XTD;
+    }
+    else
+        temp.Val = ECAN_MSG_STD;
+
+    _RegsToCANID(ptr+1, id, temp.Val);
+
+    // Get message data itself
+    ptr += 6;
+    temp.Val = *dataLen;
+    for ( i = 0; i < (signed)temp.Val; i++ )
+        *data++ = *ptr++;
+
+    // Record and Clear any previous invalid message bit flag.
+    if ( PIR5bits.IRXIF )
+    {
+        *msgFlags |= ECAN_RX_INVALID_MSG;
+        PIR5bits.IRXIF = 0;
+    }
+
+    // Mark that this buffer is read and empty.
+    *savedPtr &= 0x7f;
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    // Workaround for Rev A1 silicon
+    if ( mode == ECAN_MODE_2 )
+        COMSTAT_FIFOEMPTY = 0;
+
+#elif ( ECAN_FUNC_MODE_VAL == ECAN_MODE_2 )
+    COMSTAT_FIFOEMPTY = 0;
+#endif
+
+    return TRUE;
+}
+
+/*********************************************************************
+ * Function:        void ECANSetOperationMode(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this function to switch ECAN module into
+ *                  given operational mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a blocking call.  It will not return until
+ *                  requested mode is set.
+ ********************************************************************/
+void ECANSetOperationMode(ECAN_OP_MODE mode)
+{
+    CANCON &= 0x1F;                         // clear previous mode
+    CANCON |= mode;                         // set new mode
+
+    while( ECANGetOperationMode() != mode ); // Wait till desired mode is set.
+}
+
+
+/*********************************************************************
+ * Function:        void _CANIDToRegs(BYTE* ptr,
+ *                                    unsigned long val,
+ *                                    ECAN_MSG_TYPE type)
+ *
+ * PreCondition:    None
+ *
+ * Input:           ptr     - Starting address of a buffer to be updated
+ *                  val     - 32-bit value to be converted
+ *                  type    - Type of message - either
+ *                            CAN_CONFIG_XTD_MSG or CAN_CONFIG_STD_MSG
+ *
+ * Output:          Given CAN id value 'val' is bit adjusted and copied
+ *                  into corresponding PIC18CXX8 CAN registers
+ *
+ * Side Effects:    None
+ *
+ * Overview:        If given id is of type standard identifier,
+ *                  only SIDH and SIDL are updated
+ *                  If given id is of type extended identifier,
+ *                  bits val<17:0> is copied to EIDH, EIDL and SIDH<1:0>
+ *                  bits val<28:18> is copied to SIDH and SIDL
+ *
+ ********************************************************************/
+//////////////////////////////////////////////////////////////////////
+
+/*********************************************************************
+ *
+ * union CAN_MESSAGE_ID
+ *
+ * This union provides abstract data type for CAN message id.
+ * It is used for both 11-bit and 29-bit message identifiers.
+ * There are multiple union members to be able to access individual
+ * parts of it.
+ *
+ ********************************************************************/
+ // Parse-out 29-bit or 11-bit (saved in 32-bit number)
+typedef union _CAN_MESSAGE_ID
+{
+    unsigned long ID;
+
+    struct
+    {
+        struct
+        {
+            unsigned SIDL:3;        // SIDL<5:7>
+            unsigned SIDH:5;        // SIDH<0:4>
+        } BYTE1;
+        struct
+        {
+            unsigned SIDHU:3;       // SIDH<5:7>
+            unsigned EIDL_LN:5;     // EIDL<0:4>
+        } BYTE2;
+        struct
+        {
+            unsigned EIDL_UN:3;     // EIDL<5:7>
+            unsigned EIDH_LN:5;     // EIDH<0:4>
+        } BYTE3;
+        struct
+        {
+            unsigned EIDH_UN:3;     // EIDH<5:7>
+            unsigned EIDHU:2;       // SIDL<0:1>
+            unsigned :3;
+        } BYTE4;
+    } ID_VALS;
+
+    // This is to allow individual byte access within message id.
+    struct
+    {
+        BYTE BYTE_1;
+        BYTE BYTE_2;
+        BYTE BYTE_3;
+        BYTE BYTE_4;
+    } BYTES;
+} CAN_MESSAGE_ID;
+
+void _CANIDToRegs(BYTE* ptr,
+                  unsigned long val,
+                  BYTE type)
+{
+    CAN_MESSAGE_ID *Value;
+
+    Value =  (CAN_MESSAGE_ID*)&val;
+
+    if ( type == (unsigned)ECAN_MSG_STD )
+    {
+        // Standard Identifier
+        *ptr = Value->BYTES.BYTE_1 >> 3;        // Copy SID<7:3> to SIDH<4:0>
+        *ptr |= (Value->BYTES.BYTE_2 << 5);     // Copy SID<10:8> to SIDH<7:5>
+        ptr++;                                  // Point to SIDL
+        *ptr = Value->BYTES.BYTE_1 << 5;        // Copy SID<2:0> to SIDL<7:5>
+    }
+    else
+    {
+        // Extended Identifier
+        *ptr = Value->BYTES.BYTE_3 >> 5;        // Copy EID<23:21> to SIDH<2:0>
+        *ptr |= Value->BYTES.BYTE_4 << 3;       // Copy EID<28:24> to SIDH<7:3>
+        ptr++;                                  // Point to SIDL
+        *ptr = (Value->BYTES.BYTE_3 << 3) & 0xE0; // Copy EID<20:18> to SIDL<7:5>
+                                                // mask out EID<17:16> bits
+        *ptr |= 0b00001000;                     // Set EXIDEN bit  to SIDL<3>
+        *ptr |= Value->BYTES.BYTE_3 & 0x03;     // Copy EID<17:16> to SIDL<1:0>
+        ptr++;                                  // Point to EIDH
+        *ptr = Value->BYTES.BYTE_2;             // Copy EID<15:8> to EIDH<7:0>
+        ptr++;                                  // Point to EIDL
+        *ptr = Value->BYTES.BYTE_1;             // Copy EID<7:0> to EIDL<7:0>
+    }
+}
+
+/*********************************************************************
+ * Function:        void _RegsToCANID(BYTE *ptr,
+ *                                   unsigned long *val,
+ *                                   BYTE type)
+ *
+ * PreCondition:    None
+ *
+ * Input:           ptr     - Starting address of a buffer to be updated
+ *                  val     - 32-bit buffer to hold value
+ *                  type    - Type of message - either
+ *                            CAN_CONFIG_XTD_MSG or CAN_CONFIG_STD_MSG
+ *
+ * Output:          CAN registers starting at given address are bit
+ *                  adjusted and copied into 'val'
+ *
+ * Side Effects:    None
+ *
+ * Overview:        If given id is of type standard identifier,
+ *                  only SIDH and SIDL are used
+ *                  If given id is of type extended identifier,
+ *                  bits EIDH, EIDL and SIDL<1:0> is copied to val<17:0>
+ *                  bits SIDH and SIDL is copied to val<28:18>
+ *
+ ********************************************************************/
+void _RegsToCANID( BYTE* ptr,
+                   unsigned long *val,
+                   BYTE type )
+{
+    CAN_MESSAGE_ID *Value;
+
+    Value = (CAN_MESSAGE_ID*)val;
+
+    if ( type == (unsigned)ECAN_MSG_STD )
+    {
+        // Standard Identifier
+        Value->BYTES.BYTE_1 = (*ptr << 3);      // Copy SIDH<4:0> to SID<7:3>
+        Value->BYTES.BYTE_2 = *ptr >> 5;        // Copy SIDH<7:5> to SID<10:8>
+        ptr++;                                  // Point to SIDL
+        Value->BYTES.BYTE_1 |= (*ptr >> 5);     // Copy SIDL<7:6> to SID<2:0>
+        Value->BYTES.BYTE_3 = 0x00;
+        Value->BYTES.BYTE_4 = 0x00;
+    }
+    else
+    {
+        // Extended Identifier
+        Value->BYTES.BYTE_3 = (*ptr << 5);      // Copy SIDH<2:0> to EID<23:21>
+        Value->BYTES.BYTE_4 = (*ptr >> 3);      // Copy SIDH<7:3> to EID<29:25>
+        ptr++;                          // Point to SIDL
+        Value->BYTES.BYTE_3 |= (*ptr & 0x03);   // Copy SIDH<1:0> to EID<17:16>
+        // Bug-Fix NKR 11/20/00
+        Value->BYTES.BYTE_3 |= ((*ptr & 0xe0) >> 3);  // Copy SIDL<7:6> to EID<20:18>
+        ptr++;                          // Point to EIDH
+        Value->BYTES.BYTE_2 = *ptr;             // Copy EIDH<15:8> to EID<15:8>
+        ptr++;                                  // Point to EIDL
+        Value->BYTES.BYTE_1 = *ptr;             // Copy EIDH<7:0> to EID<7:0>
+    }
+}
+
+
+/*********************************************************************
+ * Function:        BYTE* _ECANPointBuffer(BYTE b)
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer number
+ *
+ * Output:          RXBnCON or RnCON address
+ *
+ * Side Effects:    None
+ *
+ * Overview:        This functions returns a pointer to the
+ *                  beginning of a reception buffer
+ *
+ * Note:
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+static BYTE* _ECANPointBuffer(BYTE b)
+{
+    BYTE* pt;
+
+    switch(b)
+    {
+    case 0:
+        pt=(BYTE*)&RXB0CON;     // return pointer to correct buffer
+        break;
+    case 1:
+        pt=(BYTE*)&RXB1CON;
+        break;
+    case 2:
+        pt=(BYTE*)&B0CON;
+        break;
+    case 3:
+        pt=(BYTE*)&B1CON;
+        break;
+    case 4:
+        pt=(BYTE*)&B2CON;
+        break;
+    case 5:
+        pt=(BYTE*)&B3CON;
+        break;
+    case 6:
+        pt=(BYTE*)&B4CON;
+        break;
+    default:              //case 7:
+        pt=(BYTE*)&B5CON;
+        break;
+    }
+    return (pt);
+}
+#endif
+
+
+

+ 376 - 0
ProjectSource/BMS_Slave_RCT/BMS_ECAN.def

@@ -0,0 +1,376 @@
+/*###########################################################################
+*This file is generated by Microchip Application Maestro
+*DO NOT MODIFY MANUALLY
+*###########################################################################*/
+#ifndef  _ECAN_DEF
+#define _ECAN_DEF
+// 
+//
+// ECAN Routine Mode:
+// Possible values are ECAN_LIB_MODE_FIXED, ECAN_LIB_MODE_RUN_TIME
+//   Use ECAN_LIB_MODE_FIXED if run-time selection of mode is not required.
+//   Use ECAN_LIB_MODE_RUN_TIME if run-time selection is required.
+#define ECAN_LIB_MODE_VAL ECAN_LIB_MODE_FIXED
+//
+// ECAN Functional Mode to be used in ECANInitialize().
+// Possible values are ECAN_MODE_0, ECAN_MODE_1, ECAN_MODE_2
+#define ECAN_FUNC_MODE_VAL ECAN_MODE_1
+//
+// Mode to leave ECAN after ECANInit. 
+// Possible values are ECAN_INIT_NORMAL, ECAN_INIT_CONFIGURATION, ECAN_INIT_LOOPBACK, ECAN_INIT_DISABLE
+#define ECAN_INIT_MODE ECAN_INIT_NORMAL
+//
+// SJW value - Value must be between 1-4 inclusive.
+#define ECAN_SJW_VAL 1
+//
+// BRP value - Value must be between 1-64 inclusive.
+#define ECAN_BRP_VAL 2
+//
+// PHSEG1 value - Value must be between 1-8 inclusive.
+#define ECAN_PHSEG1_VAL 8
+//
+// PHSEG2 value - Value must be between 1-8 inclusive.
+#define ECAN_PHSEG2_VAL 5
+//
+// PROPSEG value - Value must be between 1-8 inclusive.
+#define ECAN_PROPSEG_VAL 1
+//
+// Use freely progrmable PHSEG2 or calculated value.
+#define ECAN_PHSEG2_MODE_VAL 1
+//
+// Bus Sample Mode
+#define ECAN_BUS_SAMPLE_MODE_VAL ECAN_BUS_SAMPLE_MODE_THRICE
+//
+// Wakeup Mode
+#define ECAN_WAKEUP_MODE_VAL ECAN_WAKEUP_MODE_ENABLE
+//
+// Filter Mode
+#define ECAN_FILTER_MODE_VAL ECAN_FILTER_MODE_ENABLE
+//
+// CANTX1 Drive Mode
+#define ECAN_TXDRIVE_MODE_VAL ECAN_TXDRIVE_MODE_VDD
+//
+// CANTX2 pin mode
+#define ECAN_TX2_MODE_VAL ECAN_TX2_MODE_DISABLE
+//
+// CANTX2 Source
+#define ECAN_TX2_SOURCE_VAL ECAN_TX2_SOURCE_COMP
+//
+// CAN Capture Mode
+#define ECAN_CAPTURE_MODE_VAL ECAN_CAPTURE_MODE_DISABLE
+//
+// RXB0 Recieve Mode
+#define ECAN_RXB0_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// RXB0 Double Buffer Mode
+#define ECAN_RXB0_DBL_BUFFER_MODE_VAL ECAN_DBL_BUFFER_MODE_DISABLE
+//
+// RXB1 Recieve Mode
+#define ECAN_RXB1_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B0 Tx/Rx mode Mode
+#define ECAN_B0_TXRX_MODE_VAL ECAN_BUFFER_RX
+//
+// B0 Recieve Mode
+#define ECAN_B0_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B0 Auto RTR Mode
+#define ECAN_B0_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B1 Tx/Rx mode Mode
+#define ECAN_B1_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B1 Recieve Mode
+#define ECAN_B1_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B1 Auto RTR Mode
+#define ECAN_B1_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B2 Tx/Rx mode Mode
+#define ECAN_B2_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B2 Recieve Mode
+#define ECAN_B2_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B2 Auto RTR Mode
+#define ECAN_B2_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B3 Tx/Rx mode Mode
+#define ECAN_B3_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B3 Recieve Mode
+#define ECAN_B3_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B3 Auto RTR Mode
+#define ECAN_B3_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B4 Tx/Rx mode Mode
+#define ECAN_B4_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B4 Recieve Mode
+#define ECAN_B4_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B4 Auto RTR Mode
+#define ECAN_B4_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B5 Tx/Rx mode Mode
+#define ECAN_B5_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B5 Recieve Mode
+#define ECAN_B5_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B5 Auto RTR Mode
+#define ECAN_B5_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// RXF0 Filter Enable/Disable
+#define ECAN_RXF0_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF0 Filter Type
+#define ECAN_RXF0_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF0 Value
+#define ECAN_RXF0_VAL 0x0444L
+//
+// RXF0 Buffer Link
+#define ECAN_RXF0_BUFFER_VAL RXB0
+//
+// RXF0 Mask Link
+#define ECAN_RXF0_MASK_VAL ECAN_RXM0
+//
+// RXF1 Filter Enable/Disable
+#define ECAN_RXF1_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF1 Filter Type
+#define ECAN_RXF1_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF1 Value
+#define ECAN_RXF1_VAL 0x0111L
+//
+// RXF1 Buffer Link
+#define ECAN_RXF1_BUFFER_VAL RXB0
+//
+// RXF1 Mask Link
+#define ECAN_RXF1_MASK_VAL ECAN_RXM0
+//
+// RXF2 Filter Enable/Disable
+#define ECAN_RXF2_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF2 Filter Type
+#define ECAN_RXF2_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF2 Value
+#define ECAN_RXF2_VAL 0x00A0L
+//
+// RXF2 Buffer Link
+#define ECAN_RXF2_BUFFER_VAL RXB1
+//
+// RXF2 Mask Link
+#define ECAN_RXF2_MASK_VAL ECAN_RXM1
+//
+// RXF3 Filter Enable/Disable
+#define ECAN_RXF3_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF3 Filter Type
+#define ECAN_RXF3_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF3 Value
+#define ECAN_RXF3_VAL 0x0L
+//
+// RXF3 Buffer Link
+#define ECAN_RXF3_BUFFER_VAL RXB1
+//
+// RXF3 Mask Link
+#define ECAN_RXF3_MASK_VAL ECAN_RXM1
+//
+// RXF4 Filter Enable/Disable
+#define ECAN_RXF4_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF4 Filter Type
+#define ECAN_RXF4_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF4 Value
+#define ECAN_RXF4_VAL 0x0L
+//
+// RXF4 Buffer Link
+#define ECAN_RXF4_BUFFER_VAL RXB1
+//
+// RXF4 Mask Link
+#define ECAN_RXF4_MASK_VAL ECAN_RXM1
+//
+// RXF5 Filter Enable/Disable
+#define ECAN_RXF5_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF5 Filter Type
+#define ECAN_RXF5_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF5 Value
+#define ECAN_RXF5_VAL 0x0L
+//
+// RXF5 Buffer Link
+#define ECAN_RXF5_BUFFER_VAL RXB1
+//
+// RXF5 Mask Link
+#define ECAN_RXF5_MASK_VAL ECAN_RXM1
+//
+// RXF6 Filter Enable/Disable
+#define ECAN_RXF6_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF6 Filter Type
+#define ECAN_RXF6_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF6 Value
+#define ECAN_RXF6_VAL 0x0L
+//
+// RXF6 Buffer Link
+#define ECAN_RXF6_BUFFER_VAL RXB0
+//
+// RXF6 Mask Link
+#define ECAN_RXF6_MASK_VAL ECAN_RXM0
+//
+// RXF7 Filter Enable/Disable
+#define ECAN_RXF7_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF7 Filter Type
+#define ECAN_RXF7_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF7 Value
+#define ECAN_RXF7_VAL 0x0L
+//
+// RXF7 Buffer Link
+#define ECAN_RXF7_BUFFER_VAL RXB0
+//
+// RXF7 Mask Link
+#define ECAN_RXF7_MASK_VAL ECAN_RXM0
+//
+// RXF8 Filter Enable/Disable
+#define ECAN_RXF8_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF8 Filter Type
+#define ECAN_RXF8_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF8 Value
+#define ECAN_RXF8_VAL 0x0L
+//
+// RXF8 Buffer Link
+#define ECAN_RXF8_BUFFER_VAL RXB0
+//
+// RXF8 Mask Link
+#define ECAN_RXF8_MASK_VAL ECAN_RXM0
+//
+// RXF9 Filter Enable/Disable
+#define ECAN_RXF9_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF9 Filter Type
+#define ECAN_RXF9_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF9 Value
+#define ECAN_RXF9_VAL 0x0L
+//
+// RXF9 Buffer Link
+#define ECAN_RXF9_BUFFER_VAL RXB0
+//
+// RXF9 Mask Link
+#define ECAN_RXF9_MASK_VAL ECAN_RXM0
+//
+// RXF10 Filter Enable/Disable
+#define ECAN_RXF10_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF10 Filter Type
+#define ECAN_RXF10_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF10 Value
+#define ECAN_RXF10_VAL 0x0L
+//
+// RXF10 Buffer Link
+#define ECAN_RXF10_BUFFER_VAL RXB0
+//
+// RXF10 Mask Link
+#define ECAN_RXF10_MASK_VAL ECAN_RXM0
+//
+// RXF11 Filter Enable/Disable
+#define ECAN_RXF11_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF11 Filter Type
+#define ECAN_RXF11_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF11 Value
+#define ECAN_RXF11_VAL 0x0L
+//
+// RXF11 Buffer Link
+#define ECAN_RXF11_BUFFER_VAL RXB0
+//
+// RXF11 Mask Link
+#define ECAN_RXF11_MASK_VAL ECAN_RXM0
+//
+// RXF12 Filter Enable/Disable
+#define ECAN_RXF12_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF12 Filter Type
+#define ECAN_RXF12_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF12 Value
+#define ECAN_RXF12_VAL 0x0L
+//
+// RXF12 Buffer Link
+#define ECAN_RXF12_BUFFER_VAL RXB0
+//
+// RXF12 Mask Link
+#define ECAN_RXF12_MASK_VAL ECAN_RXM0
+//
+// RXF13 Filter Enable/Disable
+#define ECAN_RXF13_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF13 Filter Type
+#define ECAN_RXF13_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF13 Value
+#define ECAN_RXF13_VAL 0x0L
+//
+// RXF13 Buffer Link
+#define ECAN_RXF13_BUFFER_VAL RXB0
+//
+// RXF13 Mask Link
+#define ECAN_RXF13_MASK_VAL ECAN_RXM0
+//
+// RXF14 Filter Enable/Disable
+#define ECAN_RXF14_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF14 Filter Type
+#define ECAN_RXF14_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF14 Value
+#define ECAN_RXF14_VAL 0x0L
+//
+// RXF14 Buffer Link
+#define ECAN_RXF14_BUFFER_VAL RXB0
+//
+// RXF14 Mask Link
+#define ECAN_RXF14_MASK_VAL ECAN_RXM0
+//
+// RXF15 Filter Enable/Disable
+#define ECAN_RXF15_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF15 Filter Type
+#define ECAN_RXF15_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF15 Value
+#define ECAN_RXF15_VAL 0x0L
+//
+// RXF15 Buffer Link
+#define ECAN_RXF15_BUFFER_VAL RXB0
+//
+// RXF15 Mask Link
+#define ECAN_RXF15_MASK_VAL ECAN_RXM0
+//
+// RXM0 Type
+#define ECAN_RXM0_MSG_TYPE ECAN_MSG_STD
+//
+// RXM0 Value
+#define ECAN_RXM0_VAL 0xFFFFL
+//
+// RXM1 Type
+#define ECAN_RXM1_MSG_TYPE ECAN_MSG_STD
+//
+// RXM1 Value
+#define ECAN_RXM1_VAL 0x0L
+#endif

+ 1714 - 0
ProjectSource/BMS_Slave_RCT/BMS_ECAN.h

@@ -0,0 +1,1714 @@
+/*********************************************************************
+ *
+ *              ECAN C Library Source Code
+ *
+ *********************************************************************
+ * FileName:        ECAN.h
+ * Dependencies:    ECAN.def
+ * Processor:       Any PIC18 with ECAN module
+ * Complier:        Microchip C 2.10.06 or higher
+ * Company:         Microchip Technology, Inc.
+ *
+ *
+ * Software License Agreement
+ *
+ * The software supplied herewith by Microchip Technology Incorporated
+ * (the “Company”) for its PICmicro® Microcontroller is intended and
+ * supplied to you, the Company’s customer, for use solely and
+ * exclusively on Microchip PICmicro Microcontroller products. The
+ * software is owned by the Company and/or its supplier, and is
+ * protected under applicable copyright laws. All rights are reserved.
+ *  Any use in violation of the foregoing restrictions may subject the
+ * user to criminal sanctions under applicable laws, as well as to
+ * civil liability for the breach of the terms and conditions of this
+ * license.
+ *
+ * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
+ * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
+ * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * Author               Date    Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Caio Gubel           5/5/03  Version 1.0 - Initial Release
+ * Nilesh R.            7/22/03 Improved
+ *********************************************************************/
+
+#ifndef ECAN_H          // To avoid duplicate inclusion
+#define ECAN_H
+
+#include   "BMS_ECAN.def"
+
+#if defined(HI_TECH_C)
+    #define HITECH_C18
+#else
+    #define MCHP_C18
+#endif
+
+#if defined(MCHP_C18) && defined(HITECH_C18)
+#error "Invalid Compiler selection."
+#endif
+
+#if !defined(MCHP_C18) && !defined(HITECH_C18)
+#error "Compiler not supported."
+#endif
+
+#if defined(MCHP_C18)
+    #include <p18cxxx.h>    // p18cxxx.h must have current processor
+                            // defined.
+#endif
+
+#if defined(HITECH_C18)
+    #include <pic18.h>
+#endif
+
+
+
+
+/*********************************************************************
+ *
+ * General purpose typedef's
+ *
+ * Remove these definations if they are already defined in one of your
+ * application files.
+ ********************************************************************/
+typedef enum _BOOL { FALSE = 0, TRUE } BOOL;
+typedef unsigned char BYTE;
+
+typedef union _BYTE_VAL
+{
+    struct
+    {
+        unsigned int b0:1;
+        unsigned int b1:1;
+        unsigned int b2:1;
+        unsigned int b3:1;
+        unsigned int b4:1;
+        unsigned int b5:1;
+        unsigned int b6:1;
+        unsigned int b7:1;
+    } bits;
+    BYTE Val;
+} BYTE_VAL;
+
+
+#define ECAN_LIB_MODE_FIXED     1
+#define ECAN_LIB_MODE_RUN_TIME  0
+
+#define ECAN_TX2_MODE_DISABLE   0
+#define ECAN_TX2_MODE_ENABLE    1
+
+    #define ECAN_INIT_NORMAL            0x00
+    #define ECAN_INIT_LOOPBACK          0x40
+    #define ECAN_INIT_CONFIGURATION     0x80
+    #define ECAN_INIT_DISABLE           0x20
+    #define ECAN_INIT_LISTEN_ONLY       0X60
+
+#define ECAN_RXFn_ENABLE        1
+#define ECAN_RXFn_DISABLE       0
+
+
+// Enable auto RTR code when at least one buffer is configured in
+// auto RTR mode.
+#if (ECAN_FUNC_MODE_VAL != MODE_0 )
+    #if ( (ECAN_B0_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B1_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B2_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B3_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B4_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B5_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) )
+        #define ECAN_ENABLE_AUTO_RTR
+    #endif
+#endif
+
+
+/*********************************************************************
+ * Function:        void ECANInitialize(void)
+ *
+ * Overview:        Use this function to initialize ECAN module with
+ *                  options defined in ECAN.def file.
+ *                  You may manually edit ECAN.def file as per your
+ *                  requirements, or use Microchip Application
+ *                  Maestro tool.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    All pending transmissions are aborted.
+ ********************************************************************/
+void ECANInitialize(void);
+
+
+/*********************************************************************
+ *
+ * ECAN_TX_MSG_FLAGS
+ *
+ * This enumeration values define flags related to transmission of a
+ * CAN message.  There could be more than one this flag
+ * ORed together to form multiple flags.
+ *
+ *********************************************************************/
+typedef enum _ECAN_TX_MSG_FLAGS
+ {
+    ECAN_TX_PRIORITY_BITS    = 0b00000011,
+    ECAN_TX_PRIORITY_0       = 0b00000000,
+    ECAN_TX_PRIORITY_1       = 0b00000001,
+    ECAN_TX_PRIORITY_2       = 0b00000010,
+    ECAN_TX_PRIORITY_3       = 0b00000011,
+
+    ECAN_TX_FRAME_BIT        = 0b00100000,
+    ECAN_TX_STD_FRAME        = 0b00000000,
+    ECAN_TX_XTD_FRAME        = 0b00100000,
+
+    ECAN_TX_RTR_BIT          = 0b01000000,
+    ECAN_TX_NO_RTR_FRAME     = 0b00000000,
+    ECAN_TX_RTR_FRAME        = 0b01000000
+} ECAN_TX_MSG_FLAGS;
+
+
+/*********************************************************************
+ * Function:        BOOL ECANSendMessage(unsigned long id,
+ *                                      BYTE *data,
+ *                                      BYTE dataLen,
+ *                                      ECAN_TX_MSG_FLAGS msgFlags)
+ *
+ * Overview:        Use this function to transmit a CAN message.
+ *                  This function searches for empty transmit buffer
+ *                  and loads it with given messages. Buffer is then
+ *                  marked for ready to transmit.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                msgFlags parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  msgFlags    - One or ECAN_TX_MSG_FLAGS values ORed
+ *                                together
+ *
+ * Output:          TRUE, if an empty buffer was found and loaded with
+ *                  given data
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+BOOL ECANSendMessage( unsigned long id,
+                     BYTE *data,
+                     BYTE dataLen,
+                     ECAN_TX_MSG_FLAGS msgFlags);
+
+/*********************************************************************
+ * Function:        BOOL ECANLoadRTRBuffer(BYTE buffer,
+ *                                         unsigned long id,
+ *                                         BYTE *data,
+ *                                         BYTE dataLen,
+ *                                         BYTE type)
+ *
+ * Overview:        Use this function to update automatic RTR buffer.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer number that is to be loaded
+ *                  id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                type parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  type        - Buffer type
+ *                                Must be ECAN_MSG_STD for Standard
+ *                                        ECAN_MSG_XTD for Extended
+ *
+ * Output:          TRUE, if given data was successfully loaded
+ *                  FALSE, if RTR buffer was in process of transmitting
+ *                          automated response.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#if ( defined(ECAN_ENABLE_AUTO_RTR) )
+    BOOL ECANLoadRTRBuffer(BYTE buffer,
+                           unsigned long id,
+                           BYTE *data,
+                           BYTE dataLen,
+                           BYTE type);
+#endif
+
+
+/*********************************************************************
+ *
+ * ECAN_RX_MSG_FLAGS
+ *
+ * This enumeration values define flags related to reception of a ECAN
+ * message.  There could be more than one this flag
+ * ORed together to form multiple flags.
+ * If a particular bit is set, corresponding meaning is TRUE or else
+ * it will be FALSE.
+ *
+ * e.g.
+ *      if (msgFlag & ECAN_RX_OVERFLOW)
+ *      {
+ *          // Receiver overflow has occured.
+ *          ...
+ *      }
+ *
+ ********************************************************************/
+typedef enum _ECAN_RX_MSG_FLAGS
+{
+    ECAN_RX_OVERFLOW     = 0b00001000,
+    ECAN_RX_INVALID_MSG  = 0b00010000,
+    ECAN_RX_XTD_FRAME    = 0b00100000,
+    ECAN_RX_RTR_FRAME    = 0b01000000,
+    ECAN_RX_DBL_BUFFERED = 0b10000000
+} ECAN_RX_MSG_FLAGS;
+
+/*********************************************************************
+ * Function:        BOOL ECANReceiveMessage(unsigned long *id,
+ *                                  BYTE *data,
+ *                                  BYTE *dataLen,
+ *                                  ECAN_RX_MSG_FLAGS *msgFlags)
+ *
+ * Overview:        Use this function to check for full receive buffer
+ *                  and extract received data into local buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - Pointer to buffer that will be
+ *                                populated with receive ID.
+ *                  data        - Pointer to buffer that will be
+ *                                populated with data if there is any
+ *                  dataLen     - Pointer to buffer that will be
+ *                                populated with count of bytes
+ *                                copied in data buffer.
+ *                  msgFlags    - Pointer to buffer that will be
+ *                                copied with information about
+ *                                received message. More than
+ *                                one information is ORed together.
+ *
+ * Output:          TRUE, if a full receive buffer was found and
+ *                  given parameters were populated.
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ * Note:            If you need to know the filter number that caused
+ *                  this message to get accepted, call
+ *                  ECANGetFilterHitInfo().
+ *
+ ********************************************************************/
+BOOL ECANReceiveMessage( unsigned long* id,
+                        BYTE *Data,
+                        BYTE *DataLen,
+                        ECAN_RX_MSG_FLAGS *MsgFlags);
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetFilterHitInfo(void)
+ *
+ * Overview:        Use this macro to extract filter number that
+ *                  caused a message to get accepted.
+ *                  You must call this macro immediately after calling
+ *                  ECANReceiveMessage function.
+ *
+ * PreCondition:    ECANReceiveMessage is called and returned TRUE
+ *
+ * Input:           None
+ *
+ * Output:          Number of filter that caused acceptance.
+ *                  0 means RXF0, 1 means RXF1 and so on.
+ *
+ * Side Effects:    None
+ *
+ * Note:            This macro will return filter hit information
+ *                  for previously received message only.
+ *
+ ********************************************************************/
+#define ECANGetFilterHitInfo()          (_ECANRxFilterHitInfo.Val)
+    extern BYTE_VAL _ECANRxFilterHitInfo;
+
+
+/*********************************************************************
+ *
+ * ECAN_OP_MODE
+ *
+ * This enumeration values define codes related to ECAN module
+ * operation mode. ECANSetOperationMode() routine requires this code.
+ * These values must be used by itself
+ * i.e. it cannot be ORed to form * multiple values.
+ *
+ ********************************************************************/
+typedef enum _ECAN_OP_MODE
+{
+    ECAN_OP_MODE_BITS    = 0xe0,   // Use this to access opmode bits
+    ECAN_OP_MODE_NORMAL  = 0x00,
+    ECAN_OP_MODE_SLEEP   = 0x20,
+    ECAN_OP_MODE_LOOP    = 0x40,
+    ECAN_OP_MODE_LISTEN  = 0x60,
+    ECAN_OP_MODE_CONFIG  = 0x80
+} ECAN_OP_MODE;
+
+/*********************************************************************
+ * Function:        void ECANSetOperationMode(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this function to switch ECAN module into
+ *                  given operational mode.
+ *                  You may not need to call this function if
+ *                  your application does not require run-time
+ *                  changes in ECAN mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a blocking call.  It will not return until
+ *                  requested mode is set.
+ ********************************************************************/
+void ECANSetOperationMode(ECAN_OP_MODE mode);
+
+/*********************************************************************
+ * Macro:           void ECANSetOperationModeNoWait(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this macro to request operation mode but
+ *                  do not want macro to wait for it get accepted.
+ *                  You must use ECANGetOperationMode() to esnure
+ *                  requested operation mode is accepted before
+ *                  performing operation critical steps.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes
+ *                  in ECAN mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type enum ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a non-blocking call.
+ *                  It does not verify that
+ *                  ECAN module is switched to requested mode or not.
+ *                  Caller must use ECANGetOperationMode() to verify
+ *                  correct operation mode before performing mode
+ *                  specific operation.
+ *
+ ********************************************************************/
+#define ECANSetOperationModeNoWait(mode)     CANCON = mode
+
+/*********************************************************************
+ * Macro:           ECAN_OP_MODE ECANGetOperationMode()
+ *
+ * Overview:        Use this macro to obtain current operation mode
+ *                  ECAN module.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes.
+ * PreCondition:
+ *
+ * Input:
+ *
+ * Output:          Current operational mode of ECAN module is returned
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetOperationMode() (CANCON & ECAN_OP_MODE_BITS)
+
+
+/*********************************************************************
+ * Macro:           ECANSetFunctionalMode(mode)
+ *
+ * Overview:        Use this macro to set functional mode of ECAN.
+ *                  You may not need to call this macro if
+ *                  your application will not change mode at run-time.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *                  and ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME
+ *
+ * Input:           mode        - New mode
+ *                                Allowable values are
+ *                                  ECAN_MODE_0 for Mode 0
+ *                                  ECAN_MODE_1 for Mode 1
+ *                                  ECAN_MODE_2 for Mode 2
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+//if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    #define ECANSetFunctionalMode(mode)      \
+            ECANCON_MDSEL1 = mode >> 7; \
+            ECANCON_MDSEL0 = mode >> 6;
+//#endif
+
+    #define ECAN_MODE_0     0x00
+    #define ECAN_MODE_1     0x40
+    #define ECAN_MODE_2     0x80
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetFunctionalMode()
+ *
+ * Overview:        Use this macro to get functional mode of ECAN.
+ *                  You may not need to call this macro if
+ *                  your application will not change mode at run-time.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          mode    -   ECAN_MODE_0
+ *                              ECAN_MODE_1
+ *                              ECAN_MODE_2
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANGetFunctionalMode()      (ECANCON & 0b11000000)
+
+
+/*********************************************************************
+ * Macro:           ECANSetBusSampleMode(mode)
+ *
+ * Overview:        Use this macro to set CAN bus sample mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change
+ *                  to sampling mode.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - Bus sample mode
+ *                     Allowable values are
+ *                      ECAN_BUS_SAMPLE_MODE_ONCE to sample once
+ *                      ECAN_BUS_SAMPLE_THRICE to sample thrice.
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetBusSampleMode(mode)   BRGCON2_SAM = mode
+
+    #define ECAN_BUS_SAMPLE_MODE_ONCE       0
+    #define ECAN_BUS_SAMPLE_MODE_THRICE     1
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetWakeupMode(mode)
+ *
+ * Overview:        Use this macro to set CAN bus activity bus mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - CAN Bus activity wakeup mode
+ *                     Allowable values are
+ *                      ECAN_WAKEUP_MODE_ENABLE to enable bus wakeup
+ *                      ECAN_WAKEUP_MODE_DISABLE to disable bus wakeup
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetWakeupMode(mode)      BRGCON3_WAKDIS = mode
+
+    #define ECAN_WAKEUP_MODE_ENABLE         0
+    #define ECAN_WAKEUP_MODE_DISABLE        1
+
+
+/*********************************************************************
+ * Macro:           ECANSetFilterMode(mode)
+ *
+ * Overview:        Use this macro to CAN wakeup low pass filter mode.
+ *                  You may not need to call this macro if your application
+ *                  does not require run-time changes.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - CAN wakeup filter mode
+ *                     Allowable values are
+ *                      ECAN_FILTER_MODE_DISABLE to not use wakeup filter
+ *                      ECAN_FILTER_MODE_ENABLE to use wakeup filter
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetFilterMode(mode)      BRGCON3_WAKFIL = mode
+
+    #define ECAN_FILTER_MODE_DISABLE        0
+    #define ECAN_FILTER_MODE_ENABLE         1
+
+/*********************************************************************
+ * Macro:           ECANSetTxDriveMode(mode)
+ *
+ * Overview:        Use this macro to set CANTX pin drive options.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - CANTX drive mode when trnasmitting
+ *                                recessive bit.
+ *                     Allowable values are
+ *                      ECAN_TXDRIVE_MODE_TRISTATE to drive tri-state
+ *                      ECAN_TXDRIVE_MODE_VDD to drive to Vdd
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetTxDriveMode(mode)     CIOCON_ENDRHI = mode
+
+    #define ECAN_TXDRIVE_MODE_TRISTATE  0
+    #define ECAN_TXDRIVE_MODE_VDD       1
+
+
+/*********************************************************************
+ * Macro:           ECANSetCANTX2Source(source)
+ *
+ * Overview:        Use this macro to set CANTX2 pin source.
+ *                  This macro automatically enables CANTX2 pin.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           source      - CANTX2 source
+ *                     Allowable values are
+ *                      ECAN_TX2_CAN_CLOCK to output CAN clock on TX2
+ *                      ECAN_TX2_CAN_DATA to output complete CAN
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetCANTX2Mode(mode)         CIOCON_TX2SRC = mode << 7; \
+                                        CIOCON_TX2EN = 1
+    #define ECAN_TX2_SOURCE_COMP    0
+    #define ECAN_TX2_SOURCE_CLOCK   1
+
+
+/*********************************************************************
+ * Macro:           ECANDisableCANTX2()
+ *
+ * Overview:        Use this macro to disable CANTX2 pin.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANDisableCANTX2()              CIOCON_TX2EN = 0
+
+
+/*********************************************************************
+ * Macro:           ECANSetCaptureMode(mode)
+ *
+ * Overview:        Use this macro to set CAN CAPTURE mode.  This is
+ *                  mainly used to timestamp incoming CAN messages.
+ *                  You would also need to setup and enable CCP module
+ *                  to obtain timeestamp information.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - Capture mode
+ *                                Allowable values are
+ *                                  ECAN_CAPTURE_MODE_DISABLE
+ *                                  ECAN_CAPTURE_MODE_ENABLE
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetCaptureMode(mode)     CIOCON_CANCAP = mode
+
+    #define ECAN_CAPTURE_MODE_DISABLE   0
+    #define ECAN_CAPTURE_MODE_ENABLE    1
+
+/*********************************************************************
+ * Macro:           ECANSetPHSEG2Mode(mode)
+ *
+ * Overview:        Use this macro to set PHSEG2 mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - PHSEG2 Mode
+ *                                Allowable values are
+ *                    ECAN_PHSEG2_MODE_AUTOMATIC
+ *                      - Max. of PHSEG1 of IPT, whichever is greater
+ *                    ECAN_PHSEG2_MODE_PROGRAMMABLE
+ *                      - Freely programmable
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetPHSEG2Mode(mode)      BRGCON2_SEG2PHTS = mode
+
+    #define ECAN_PHSEG2_MODE_AUTOMATIC      0
+    #define ECAN_PHSEG2_MODE_PROGRAMMABLE   1
+
+
+/*********************************************************************
+ * Macro:           ECANSetB0AutoRTRMode(mode)
+ *                  ECANSetB1AutoRTRMode(mode)
+ *                  ECANSetB2AutoRTRMode(mode)
+ *                  ECANSetB3AutoRTRMode(mode)
+ *                  ECANSetB4AutoRTRMode(mode)
+ *                  ECANSetB5AutoRTRMode(mode)
+ *
+ * Overview:        Use these macros to set automatic RTR handling
+ *                  mode for given programmable buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME
+ *                  ECAN_FUNC_MODE_VAL != ECAN_MODE_0
+ *
+ * Input:           mode        - AutoRTR mode
+ *                  Allowable values are
+ *                    ECAN_AUTORTR_MODE_DISABLE
+ *                      - To disable automatic RTR handling
+ *                    ECAN_AUTORTR_MODE_ENABLE
+ *                      - To enable automatic RTR handling
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetB0AutoRTRMode(mode)      B0CON_RTREN = mode;     \
+                                            BSEL0_B0TXEN = 1
+    #define ECANSetB1AutoRTRMode(mode)      B1CON_RTREN = mode;     \
+                                            BSEL0_B1TXEN = 1
+    #define ECANSetB2AutoRTRMode(mode)      B2CON_RTREN = mode;     \
+                                            BSEL0_B2TXEN = 1
+    #define ECANSetB3AutoRTRMode(mode)      B3CON_RTREN = mode;     \
+                                            BSEL0_B3TXEN = 1
+    #define ECANSetB4AutoRTRMode(mode)      B4CON_RTREN = mode;     \
+                                            BSEL0_B4TXEN = 1
+    #define ECANSetB5AutoRTRMode(mode)      B5CON_RTREN = mode;     \
+                                            BSEL0_B5TXEN = 1
+#endif
+
+    #define ECAN_AUTORTR_MODE_DISABLE   0
+    #define ECAN_AUTORTR_MODE_ENABLE    1
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetRXMnValue(val, type)
+ *
+ * Overview:        Use these macros to set specific mask value.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *
+ * Input:           val     - Value to be set
+ *                      Actual value would depend on type.
+ *                      If type is Standard, value will be 11-bit long
+ *                      If type is Extended, value will be 29-bit long
+ *                  type    - Mask type
+ *                      Allowable values are
+ *                          ECAN_MSG_STD for Standard type
+ *                          ECAN_MSG_XTD for Extended type
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Overview:        This function sets mask value for given mask number.
+ *                  Type of mask, whether standard or extended is defined
+ *                  by type parameter.
+ *
+ * Note:            The MASK_RXF15 is only available in enhanced and
+ *                  FIFO modes
+ ********************************************************************/
+#define ECANSetRXM0Value(val, type)       \
+                    _CANIDToRegs((BYTE*)&RXM0SIDH, val, type)
+#define ECANSetRXM1Value(val, type)       \
+                    _CANIDToRegs((BYTE*)&RXM1SIDH, val, type)
+
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetRXFnValue(val, type)
+ *
+ * Overview:        Use these macros to set receive filter values.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *                  To set RXF6-RXF15 values,
+ *                  ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME OR
+ *                  ECAN_FUNC_MODE != ECAN_MODE_0
+ *
+ * Input:           val         - Value to be set
+ *                  type        - Type of filter
+ *                                Allowable values are
+ *                                  ECAN_MSG_STD if this is Standard filter
+ *                                  ECAN_MSG_XTD if this is Extended filter
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ * Overview:        Use this macro to assign value to a receive filter.
+ *
+ * Note:            There are total of sixteen macros - one for each
+ *                  receive filter. e.g. for RXF0 use ECANSetRXF0Value()
+ *                  for RXF2 use ECANSetRXF2Value()
+ ********************************************************************/
+#define ECANSetRXF0Value(val, type)       \
+    RXFCON0_RXF0EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF0SIDH, val, type)
+
+#define ECANSetRXF1Value(val, type)       \
+    RXFCON0_RXF1EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF1SIDH, val, type);
+
+#define ECANSetRXF2Value(val, type)       \
+    RXFCON0_RXF2EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF2SIDH, val, type);
+
+#define ECANSetRXF3Value(val, type)       \
+    RXFCON0_RXF3EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF3SIDH, val, type);
+
+#define ECANSetRXF4Value(val, type)       \
+    RXFCON0_RXF4EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF4SIDH, val, type);
+
+#define ECANSetRXF5Value(val, type)       \
+    RXFCON0_RXF5EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF5SIDH, val, type);
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetRXF6Value(val, type)       \
+        RXFCON0_RXF6EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF6SIDH, val, type);
+
+    #define ECANSetRXF7Value(val, type)       \
+        RXFCON0_RXF7EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF7SIDH, val, type);
+
+    #define ECANSetRXF8Value(val, type)       \
+        RXFCON1_RXF8EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF8SIDH, val, type);
+
+    #define ECANSetRXF9Value(val, type)       \
+        RXFCON1_RXF9EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF9SIDH, val, type);
+
+    #define ECANSetRXF10Value(val, type)       \
+        RXFCON1_RXF10EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF10SIDH, val, type);
+
+    #define ECANSetRXF11Value(val, type)       \
+        RXFCON1_RXF11EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF11SIDH, val, type);
+
+    #define ECANSetRXF12Value(val, type)       \
+        RXFCON1_RXF12EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF12SIDH, val, type);
+
+    #define ECANSetRXF13Value(val, type)       \
+        RXFCON1_RXF13EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF13SIDH, val, type);
+
+    #define ECANSetRXF14Value(val, type)       \
+        RXFCON1_RXF14EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF14SIDH, val, type);
+
+    #define ECANSetRXF15Value(val, type)       \
+        RXFCON1_RXF15EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF15SIDH, val, type);
+#endif
+
+    #define ECAN_MSG_STD    0
+    #define ECAN_MSG_XTD    1
+
+
+/*********************************************************************
+ * Macro:           ECANSetBnTxRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure a programmable buffer (B0-B5)
+ *                  as either transmit or receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN_LIB_MODE = ECAN_LIB_MODE_RUN_TIME OR
+ *                  ECAN_FUNC_MODE_VAL != ECAN_MODE_0
+ *
+ * Input:           buffer      - Buffer that needs to be setup
+ *                                Allowable values are:
+ *                                      B0, B1, B2, B3, B4, B5
+ *                  mode        - Mode to be set.
+ *                                Allowable values are:
+ *                                      ECAN_BUFFER_TX, ECAN_BUFFER_RX
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ * Example:        // Set B0 as Transmit buffer
+ *                  ECANSetBnTxRxMode(B0, ECAN_TX)
+ *
+ *                  // Set B2 as receive buffer
+ *                  ECANSetBnTxRxMode(B2, ECAN_RX)
+ *
+ * Note:            Parameter buffer must be a constant symbol of either
+ *                  B0, B1, B2, B3, B4 or B5.
+ *                  A variable parameter would result in compiler error.
+ *
+ *                  e.g. ECANSetBnTxRxMode(myBuffer, ECAN_BUFFER_TX)
+ *                       would not compile.
+ *
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetBnTxRxMode(buffer, mode)          \
+                            BSEL0_##buffer##TXEN = mode
+#endif
+
+    #define RXB0            0
+    #define RXB1            1
+    #define B0              2
+    #define B1              3
+    #define B2              4
+    #define B3              5
+    #define B4              6
+    #define B5              7
+    #define TXB0            8
+    #define TXB1            9
+    #define TXB2            10
+
+    #define ECAN_BUFFER_RX  0
+    #define ECAN_BUFFER_TX  1
+
+/*********************************************************************
+ * Macro:           ECANSetRXB0DblBuffer(mode)
+ *
+ * Overview:        Use this macro to configure RXB0 in double buffering mode
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - Double buffer mode
+ *                                Allowable values are
+ *                                  ECAN_DBL_BUFFER_ENABLE
+ *                                  ECAN_DBL_BUFFER_DISABLE,
+ *
+ * Output:          None
+ *
+ * Example:         // Enable Double buffering mode
+ *                  ECANSetRXB0DblBuffer(ECAN_DBL_BUFFER_ENABLE)
+ *
+ *
+ * Side Effects:
+ *
+ * Note:            None
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+
+    #define ECANSetRXB0DblBuffer(mode)       RXB0CON_RXB0DBEN = mode
+#endif
+
+    #define ECAN_DBL_BUFFER_MODE_DISABLE    0
+    #define ECAN_DBL_BUFFER_MODE_ENABLE     1
+
+
+/*********************************************************************
+ * Macro:           ECANSetRxBnRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure receive mode of a fixed receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer that needs to be configured
+ *                                Allowable values are
+ *                                  RXB0, RXB1
+ *                  mode        - Mode to be setup.
+ *                                Allowable values are
+ *                                  ECAN_RECEIVE_ALL,
+ *                                  ECAN_RECEIVE_STANDARD,
+ *                                  ECAN_RECEIVE_EXTENDED,
+ *                                  ECAN_RECEIVE_ALL_VALID
+ *
+ * Output:          None
+ *
+ * Example:         // Configure RXB0 buffer to receive all valid messages.
+ *                  ECANSetRxBnRxMode(RXB0, ECAN_RECEIVE_ALL_VALID)
+ *
+ *                  // Configure RXB1 buffer to receive only Standard messages.
+ *                  ECANSetRxBnRxMode(RXB1, ECAN_RECEIVE_STANDARD)
+ *
+ * Side Effects:
+ *
+ * Note:            Parameter buffer must be a constant symbol of either
+ *                  RXB0 or RXB1.
+ *                  A variable paraemter would result in compiler error.
+ *
+ *                  e.g. ECANSetRxBnTxRxMode(myBuffer, ECAN_RECEIVE_ALL_VALID)
+ *                       would not compiler
+ *
+ ********************************************************************/
+#define ECANSetRxBnRxMode(buffer, mode)      \
+        ##buffer##CON_RXM1 = mode >> 1; \
+        ##buffer##CON_RXM0 = mode;
+
+    #define ECAN_RECEIVE_ALL_VALID  0
+    #define ECAN_RECEIVE_STANDARD   1
+    #define ECAN_RECEIVE_EXTENDED   2
+    #define ECAN_RECEIVE_ALL        3
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetBnRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure receive mode of a programmable
+ *                  receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer that needs to be configured
+ *                                Allowable values are
+ *                                  B0, B1, B2, B3, B4, B5
+ *                  mode        - Mode to be setup.
+ *                                Allowable values are
+ *                                  ECAN_RECEIVE_ALL,
+ *                                  ECAN_RECEIVE_ALL_VALID
+ *
+ * Output:          None
+ *
+ * Example:         // Configure B0 buffer to receive all valid messages.
+ *                  ECANSetBnRxMode(B0, ECAN_RECEIVE_ALL_VALID)
+ *
+ *                  // Configure B1 buffer to receive only Standard messages.
+ *                  ECANSetBnRxMode(RXB1, ECAN_RECEIVE_STANDARD)
+ *
+ * Side Effects:
+ *
+ * Note 1:          Parameter buffer must be a constant symbol of either
+ *                  B0, B1, B2, B3, B4 or B5.
+ *                  A variable paraemter would result in compiler error.
+ *
+ *                  e.g. ECANSetBnTxRxMode(myBuffer, ECAN_RECEIVE_ALL_VALID)
+ *                       would not compiler
+ *
+ *      2:          This macro should be used in Mode 1 or 2 only.
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+    #define ECANSetBnRxMode(buffer, mode)      ##buffer##CON_RXM1 = mode
+
+#endif
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetTxErrorCount()
+ *
+ * Overview:        Use this macro to get current TXERRCNT value
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          Current transmit error count as defined by
+ *                  CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetTxErrorCount()            (TXERRCNT)
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetRxErrorCount()
+ *
+ * Overview:        Use this macro to get current RXERRCNT value.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          Current receive error count as defined by
+ *                  CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetRxErrorCount()            (RXERRCNT)
+
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsBusOff()
+ *
+ * Overview:        Use this macro to check if CAN module is in
+ *                  Bus off condition.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN Module is off due to excessive error
+ *                  FALSE is it is not off.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsBusOff()                   (COMSTAT_TXB0)
+
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsTxPassive()
+ *
+ * Overview:        Use this macro to check if CAN module is in
+ *                  Tx passive mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN transmit module is error passive as
+ *                  defined by CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsTxPassive()                (COMSTAT_TXBP)
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANIsRxPassive()
+ *
+ * Overview:        Use this macro to check if CAN is in Rx passive.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN receive module is error active as
+ *                  defined by CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsRxPassive()                (COMSTAT_RXBP)
+
+
+/*********************************************************************
+ * Macro:           void ECANAbortAll()
+ *
+ * Overview:        Use this macro to request abort for all tx buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANAbortAll()                   (CANCON_ABAT = 1)
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsAllAborted()
+ *
+ * Overview:        Use this macro to see if previous ECANAbortAll
+ *                  is complete or not.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE: if there are no pending messages.
+ *                  FALSE: if there abort is still in progress.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsAllAborted()               (CANCON_ABAT)
+
+
+/*********************************************************************
+ * Macro:           ECANLinkRXFnFmToBuffer(RXFnBuffer, RXFmBuffer)
+ *                      n = { 0, 2, 4, 6, 8, 10, 12, 14 }
+ *                      m = ( 1, 3, 5, 7, 9, 11, 13, 15 }
+ *                      m = n + 1
+ *
+ * Overview:        Use this macro to link RXFn and RXFm to
+ *                  any of RXB0, RXB1, B0, B1, B2, B3, B4, B5 buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *                  Given buffer must be configured as receive buffer.
+ *                      (See ECANSetRxBnTxRxMode and ECANSetBnTxRxMode)
+ *
+ *
+ * Input:           RXFnBuffer  - Buffer that is to be linked
+ *                                with RXFn filter
+ *                  RXFmBuffer  - Buffer that is to be linked
+ *                                with RXFm filter
+ *
+ *                                Allowable values for both parameters
+ *                                  RXB0, RXB1, B0, B1, B2, B3, B4, B5
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Note:            If possible, call this macro with constant
+ *                  parameters to reduce generated code.
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANLinkRXF0F1ToBuffer(RXF0Buffer, RXF1Buffer)     \
+                RXFBCON0 = (RXF1Buffer << 4) | RXF0Buffer
+    #define ECANLinkRXF2F3ToBuffer(RXF2Buffer, RXF3Buffer)     \
+                RXFBCON1 = (RXF2Buffer << 4) | RXF3Buffer
+    #define ECANLinkRXF4F5ToBuffer(RXF4Buffer, RXF5Buffer)     \
+                RXFBCON2 = (RXF4Buffer << 4) | RXF5Buffer
+    #define ECANLinkRXF6F7ToBuffer(RXF6Buffer, RXF7Buffer)     \
+                RXFBCON3 = (RXF6Buffer << 4) | RXF7Buffer
+    #define ECANLinkRXF8F9ToBuffer(RXF8Buffer, RXF9Buffer)     \
+                RXFBCON4 = (RXF8Buffer << 4) | RXF9Buffer
+    #define ECANLinkRXF10F11ToBuffer(RXF10Buffer, RXF11Buffer) \
+                RXFBCON5 = (RXF10Buffer << 4) | RXF11Buffer
+    #define ECANLinkRXF12F13ToBuffer(RXF12Buffer, RXF13Buffer) \
+                RXFBCON6 = (RXF12Buffer << 4) | RXF13Buffer
+    #define ECANLinkRXF14F15ToBuffer(RXF14Buffer, RXF15Buffer) \
+                RXFBCON7 = (RXF14Buffer << 4) | RXF15Buffer
+#endif
+
+
+/*********************************************************************
+ * Macro:           ECANLinkRXF0Thru3ToMask(m0, m1, m2, m3)
+ *                  ECANLinkRXF4Thru7ToMask(m4, m5, m6, m7)
+ *                  ECANLinkRXF8Thru11ToMask(m8, m9, m10, m11, m12)
+ *                  ECANLinkRXF12Thru15ToMask(m13, m14, m15, m16)
+ *
+ * Overview:        Use this macro to link receive filters to masks.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *
+ * Input:           mn  - Buffer that is to be linked
+ *                                with Mask
+ *
+ *                                Allowable values for both parameters
+ *                                  ECAN_RXM0, ECAN_RXM1, ECAN_RXMF15
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Note:            If possible, call this macro with constant
+ *                  parameters to reduce generated code.
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANLinkRXF0Thru3ToMask(m0, m1, m2, m3) \
+        MSEL0 = m3 << 6 | m2 << 4 | m1 << 2 | m0;
+    #define ECANLinkRXF4Thru7ToMask(m4, m5, m6, m7) \
+        MSEL1 = m7 << 6 | m6 << 4 | m5 << 2 | m4;
+    #define ECANLinkRXF8Thru11ToMask(m8, m9, m10, m11) \
+        MSEL2 = m11 << 6 | m10 << 4 | m9 << 2 | m8;
+    #define ECANLinkRXF12Thru15ToMask(m12, m13, m14, m15) \
+        MSEL2 = m15 << 6 | m14 << 4 | m13 << 2 | m12;
+#endif
+
+    #define ECAN_RXM0       0
+    #define ECAN_RXM1       1
+    #define ECAN_RXMF15     2
+
+
+/*********************************************************************
+ * Macro:           ECANSetBaudRate(sjw,
+ *                                 brp,
+ *                                 phseg1,
+ *                                 phseg2,
+ *                                 propseg)
+ *
+ * Overview:        Use this macro to change ECAN baud rate. Normally
+ *                  you would call this macro only, if your application
+ *                  needs run-time baud rate changes.
+ *
+ * PreCondition:    ECAN is in Configuration mode
+ *
+ * Input:           sjw     - SJW value of 1-4
+ *                  brp     - BRP value of 1-64
+ *                  phseg1  - PHSEG1 value of 1-8
+ *                  phseg2  - PHSEG2 value of 1-8
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ * Note:            If possible, call this macro with constant values
+ *                  to reduce generated code size.
+ ********************************************************************/
+#define ECANSetBaudRate(sjw, brp, phseg1, phseg2, propseg)           \
+        BRGCON1 = ((sjw-1) << 6) | (brp-1);                         \
+        BRGCON2 |= (((phseg1-1) << 3) | (propseg-1));               \
+        BRGCON3 = phseg2;
+
+/*
+ * This is a helper function used by some macros. Normally, you would
+ * not need to call this function directly.
+ */
+void _CANIDToRegs(BYTE* ptr,
+                  unsigned long val,
+                  BYTE type );
+
+
+/*
+ * Following compile-time logic switches symbols as per compiler
+ * being used.  Currently, it supports Microchip C18 and HiTech
+ * PICC18 compilers only.
+ */
+#if defined(MCHP_C18)
+    #define COMSTAT_TXB0            COMSTATbits.TXB0
+    #define COMSTAT_TXBP            COMSTATbits.TXBP
+    #define COMSTAT_RXBP            COMSTATbits.RXBP
+    #define COMSTAT_RXBnOVFL        COMSTATbits.RXB1OVFL
+    #define COMSTAT_RXB0OVFL        COMSTATbits.RXB0OVFL
+    #define COMSTAT_FIFOEMPTY       COMSTATbits.FIFOEMPTY
+    #define COMSTAT_RXB1OVFL        COMSTATbits.RXB1OVFL
+
+    #define BRGCON2_SEG2PHTS        BRGCON2bits.SEG2PHTS
+    #define BRGCON2_SAM             BRGCON2bits.SAM
+    #define BRGCON3_WAKDIS          BRGCON3bits.WAKDIS
+    #define BRGCON3_WAKFIL          BRGCON3bits.WAKFIL
+
+    #define CIOCON_ENDRHI           CIOCONbits.ENDRHI
+    #define CIOCON_CANCAP           CIOCONbits.CANCAP
+
+    #define PIR3_RXBnIF             PIR3bits.RXB1IF
+    #define PIR3_RXB0IF             PIR3bits.RXB0IF
+    #define PIR3_RXB1IF             PIR3bits.RXB1IF
+
+    #define PIR3_IRXIF              PIR3bits.IRXIF
+
+    #define CANCON_ABAT             CANCONbits.ABAT
+    #define RXB0CON_RXFUL           RXB0CONbits.RXFUL
+    #define RXB1CON_RXFUL           RXB1CONbits.RXFUL
+    #define RXB0CON_RXB0DBEN        RXB0CONbits.RXBODBEN
+    #define TXB0CON_TXREQ           TXB0CONbits.TXREQ
+    #define TXB1CON_TXREQ           TXB1CONbits.TXREQ
+    #define TXB2CON_TXREQ           TXB2CONbits.TXREQ
+    #define RXB0CON_FILHIT0         RXB0CONbits.FILHIT0
+    #define RXB0CON_RXM1            RXB0CONbits.RXM1
+    #define RXB0CON_RXM0            RXB0CONbits.RXM0
+
+
+    #define BSEL0_B0TXEN            BSEL0bits.B0TXEN
+    #define BSEL0_B1TXEN            BSEL0bits.B1TXEN
+    #define BSEL0_B2TXEN            BSEL0bits.B2TXEN
+    #define BSEL0_B3TXEN            BSEL0bits.B3TXEN
+    #define BSEL0_B4TXEN            BSEL0bits.B4TXEN
+    #define BSEL0_B5TXEN            BSEL0bits.B5TXEN
+
+    #define RXFCON0_RXF0EN          RXFCON0bits.RXF0EN
+    #define RXFCON0_RXF1EN          RXFCON0bits.RXF1EN
+    #define RXFCON0_RXF2EN          RXFCON0bits.RXF2EN
+    #define RXFCON0_RXF3EN          RXFCON0bits.RXF3EN
+    #define RXFCON0_RXF4EN          RXFCON0bits.RXF4EN
+    #define RXFCON0_RXF5EN          RXFCON0bits.RXF5EN
+    #define RXFCON0_RXF6EN          RXFCON0bits.RXF6EN
+    #define RXFCON0_RXF7EN          RXFCON0bits.RXF7EN
+
+    #define RXFCON1_RXF8EN          RXFCON1bits.RXF8EN
+    #define RXFCON1_RXF9EN          RXFCON1bits.RXF9EN
+    #define RXFCON1_RXF10EN         RXFCON1bits.RXF10EN
+    #define RXFCON1_RXF11EN         RXFCON1bits.RXF11EN
+    #define RXFCON1_RXF12EN         RXFCON1bits.RXF12EN
+    #define RXFCON1_RXF13EN         RXFCON1bits.RXF13EN
+    #define RXFCON1_RXF14EN         RXFCON1bits.RXF14EN
+    #define RXFCON1_RXF15EN         RXFCON1bits.RXF15EN
+
+
+    #define RXFBCON0_F0BP_0         RXFBCON0bits.F0BP_0
+    #define RXFBCON0_F0BP_1         RXFBCON0bits.F0BP_1
+    #define RXFBCON0_F0BP_2         RXFBCON0bits.F0BP_2
+    #define RXFBCON0_F0BP_3         RXFBCON0bits.F0BP_3
+    #define RXFBCON0_F1BP_0         RXFBCON0bits.F1BP_0
+    #define RXFBCON0_F1BP_1         RXFBCON0bits.F1BP_1
+    #define RXFBCON0_F1BP_2         RXFBCON0bits.F1BP_2
+    #define RXFBCON0_F1BP_3         RXFBCON0bits.F1BP_3
+
+    #define RXFBCON1_F2BP_0         RXFBCON1bits.F2BP_0
+    #define RXFBCON1_F2BP_1         RXFBCON1bits.F2BP_1
+    #define RXFBCON1_F2BP_2         RXFBCON1bits.F2BP_2
+    #define RXFBCON1_F2BP_3         RXFBCON1bits.F2BP_3
+    #define RXFBCON1_F3BP_0         RXFBCON1bits.F3BP_0
+    #define RXFBCON1_F3BP_1         RXFBCON1bits.F3BP_1
+    #define RXFBCON1_F3BP_2         RXFBCON1bits.F3BP_2
+    #define RXFBCON1_F3BP_3         RXFBCON1bits.F3BP_3
+
+    #define RXFBCON2_F4BP_0         RXFBCON2bits.F4BP_0
+    #define RXFBCON2_F4BP_1         RXFBCON2bits.F4BP_1
+    #define RXFBCON2_F4BP_2         RXFBCON2bits.F4BP_2
+    #define RXFBCON2_F4BP_3         RXFBCON2bits.F4BP_3
+    #define RXFBCON2_F5BP_0         RXFBCON2bits.F5BP_0
+    #define RXFBCON2_F5BP_1         RXFBCON2bits.F5BP_1
+    #define RXFBCON2_F5BP_2         RXFBCON2bits.F5BP_2
+    #define RXFBCON2_F5BP_3         RXFBCON2bits.F5BP_3
+
+    #define RXFBCON3_F6BP_0         RXFBCON3BITS.F6BP_0
+    #define RXFBCON3_F6BP_1         RXFBCON3BITS.F6BP_1
+    #define RXFBCON3_F6BP_2         RXFBCON3BITS.F6BP_2
+    #define RXFBCON3_F6BP_3         RXFBCON3BITS.F6BP_3
+    #define RXFBCON3_F7BP_0         RXFBCON3BITS.F7BP_0
+    #define RXFBCON3_F7BP_1         RXFBCON3BITS.F7BP_1
+    #define RXFBCON3_F7BP_2         RXFBCON3BITS.F7BP_2
+    #define RXFBCON3_F7BP_3         RXFBCON3BITS.F7BP_3
+
+    #define RXFBCON4_F8BP_0         RXFBCON4bits.F8BP_0
+    #define RXFBCON4_F8BP_1         RXFBCON4bits.F8BP_1
+    #define RXFBCON4_F8BP_2         RXFBCON4bits.F8BP_2
+    #define RXFBCON4_F8BP_3         RXFBCON4bits.F8BP_3
+    #define RXFBCON4_F9BP_0         RXFBCON4bits.F9BP_0
+    #define RXFBCON4_F9BP_1         RXFBCON4bits.F9BP_1
+    #define RXFBCON4_F9BP_2         RXFBCON4bits.F9BP_2
+    #define RXFBCON4_F9BP_3         RXFBCON4bits.F9BP_3
+
+    #define RXFBCON5_F10BP_0        RXFBCON5bits.F10BP_0
+    #define RXFBCON5_F10BP_1        RXFBCON5bits.F10BP_1
+    #define RXFBCON5_F10BP_2        RXFBCON5bits.F10BP_2
+    #define RXFBCON5_F10BP_3        RXFBCON5bits.F10BP_3
+    #define RXFBCON5_F11BP_0        RXFBCON5bits.F11BP_0
+    #define RXFBCON5_F11BP_1        RXFBCON5bits.F11BP_1
+    #define RXFBCON5_F11BP_2        RXFBCON5bits.F11BP_2
+    #define RXFBCON5_F11BP_3        RXFBCON5bits.F11BP_3
+
+    #define RXFBCON6_F12BP_0        RXFBCON6bits.F12BP_0
+    #define RXFBCON6_F12BP_1        RXFBCON6bits.F12BP_1
+    #define RXFBCON6_F12BP_2        RXFBCON6bits.F12BP_2
+    #define RXFBCON6_F12BP_3        RXFBCON6bits.F12BP_3
+    #define RXFBCON6_F13BP_0        RXFBCON6bits.F13BP_0
+    #define RXFBCON6_F13BP_1        RXFBCON6bits.F13BP_1
+    #define RXFBCON6_F13BP_2        RXFBCON6bits.F13BP_2
+    #define RXFBCON6_F13BP_3        RXFBCON6bits.F13BP_3
+
+    #define RXFBCON7_F14BP_0        RXFBCON7bits.F14BP_0
+    #define RXFBCON7_F14BP_1        RXFBCON7bits.F14BP_1
+    #define RXFBCON7_F14BP_2        RXFBCON7bits.F14BP_2
+    #define RXFBCON7_F14BP_3        RXFBCON7bits.F14BP_3
+    #define RXFBCON7_F15BP_0        RXFBCON7bits.F15BP_0
+    #define RXFBCON7_F15BP_1        RXFBCON7bits.F15BP_1
+    #define RXFBCON7_F15BP_2        RXFBCON7bits.F15BP_2
+    #define RXFBCON7_F15BP_3        RXFBCON7bits.F15BP_3
+
+    #define B0CON_TXREQ             B0CONbits.TXREQ
+    #define B1CON_TXREQ             B1CONbits.TXREQ
+    #define B2CON_TXREQ             B2CONbits.TXREQ
+    #define B3CON_TXREQ             B3CONbits.TXREQ
+    #define B4CON_TXREQ             B4CONbits.TXREQ
+    #define B5CON_TXREQ             B5CONbits.TXREQ
+
+    #define B0CON_RXM1              B0CONbits.RXM1
+    #define B1CON_RXM1              B1CONbits.RXM1
+    #define B2CON_RXM1              B2CONbits.RXM1
+    #define B3CON_RXM1              B3CONbits.RXM1
+    #define B4CON_RXM1              B4CONbits.RXM1
+    #define B5CON_RXM1              B5CONbits.RXM1
+
+    #define B0CON_RXFUL             B0CONbits.RXFUL
+    #define B1CON_RXFUL             B1CONbits.RXFUL
+    #define B2CON_RXFUL             B2CONbits.RXFUL
+    #define B3CON_RXFUL             B3CONbits.RXFUL
+    #define B4CON_RXFUL             B4CONbits.RXFUL
+    #define B5CON_RXFUL             B5CONbits.RXFUL
+
+    #define RXM0SIDL_EXIDEN         RXM0SIDLbits.EXIDEN
+    #define RXM1SIDL_EXIDEN         RXM1SIDLbits.EXIDEN
+
+    #define ECANCON_MDSEL1          ECANCONbits.MDSEL1
+    #define ECANCON_MDSEL0          ECANCONbits.MDSEL0
+
+#endif
+
+#if defined(HITECH_C18)
+    #define COMSTAT_TXB0            TXB0
+    #define COMSTAT_TXBP            TXBP
+    #define COMSTAT_RXBP            RXBP
+    #define CANCON_ABAT             ABAT
+    #define RXB0CON_RXFUL           RXB0FUL
+    #define TXB0CON_TXREQ           TXB0REQ
+    #define RXB0CON_RXM1            RXB0M1
+    #define RXB0CON_RXM0            RXB0M0
+
+    #define BSEL0_B0TXEN            B0TXEN      // configure buffer in Transmit=1 or receive mode=0
+    #define BSEL0_B1TXEN            B1TXEN
+    #define BSEL0_B2TXEN            B2TXEN
+    #define BSEL0_B3TXEN            B3TXEN
+    #define BSEL0_B4TXEN            B4TXEN
+    #define BSEL0_B5TXEN            B5TXEN
+
+
+
+    #define RXFCON0_RXF0EN          RXF0EN
+    #define RXFCON0_RXF1EN          RXF1EN
+    #define RXFCON0_RXF2EN          RXF2EN
+    #define RXFCON0_RXF3EN          RXF3EN
+    #define RXFCON0_RXF4EN          RXF4EN
+    #define RXFCON0_RXF5EN          RXF5EN
+    #define RXFCON0_RXF6EN          RXF6EN
+    #define RXFCON0_RXF7EN          RXF7EN
+
+    #define RXFCON1_RXF8EN          XF8EN
+    #define RXFCON1_RXF9EN          XF9EN
+    #define RXFCON1_RXF10EN         RXF10EN
+    #define RXFCON1_RXF11EN         RXF11EN
+    #define RXFCON1_RXF12EN         RXF12EN
+    #define RXFCON1_RXF13EN         RXF13EN
+    #define RXFCON1_RXF14EN         RXF14EN
+    #define RXFCON1_RXF15EN         RXF15EN
+
+
+    #define RXFBCON0_F0BP_0         F0BP_01
+    #define RXFBCON0_F0BP_1         F0BP_1
+    #define RXFBCON0_F0BP_2         F0BP_2
+    #define RXFBCON0_F0BP_3         F0BP_3
+    #define RXFBCON0_F1BP_0         F1BP_0
+    #define RXFBCON0_F1BP_1         F1BP_1
+    #define RXFBCON0_F1BP_2         F1BP_2
+    #define RXFBCON0_F1BP_3         F1BP_3
+
+    #define RXFBCON1_F2BP_0         F2BP_01
+    #define RXFBCON1_F2BP_1         F2BP_1
+    #define RXFBCON1_F2BP_2         F2BP_2
+    #define RXFBCON1_F2BP_3         F2BP_3
+    #define RXFBCON1_F3BP_0         F3BP_0
+    #define RXFBCON1_F3BP_1         F3BP_1
+    #define RXFBCON1_F3BP_2         F3BP_2
+    #define RXFBCON1_F3BP_3         F3BP_3
+
+    #define RXFBCON2_F4BP_0         F4BP_01
+    #define RXFBCON2_F4BP_1         F4BP_1
+    #define RXFBCON2_F4BP_2         F4BP_2
+    #define RXFBCON2_F4BP_3         F4BP_3
+    #define RXFBCON2_F5BP_0         F5BP_0
+    #define RXFBCON2_F5BP_1         F5BP_1
+    #define RXFBCON2_F5BP_2         F5BP_2
+    #define RXFBCON2_F5BP_3         F5BP_3
+
+    #define RXFBCON3_F6BP_0         F6BP_01
+    #define RXFBCON3_F6BP_1         F6BP_1
+    #define RXFBCON3_F6BP_2         F6BP_2
+    #define RXFBCON3_F6BP_3         F6BP_3
+    #define RXFBCON3_F7BP_0         F7BP_0
+    #define RXFBCON3_F7BP_1         F7BP_1
+    #define RXFBCON3_F7BP_2         F7BP_2
+    #define RXFBCON3_F7BP_3         F7BP_3
+
+    #define RXFBCON4_F8BP_0         F8BP_01
+    #define RXFBCON4_F8BP_1         F8BP_1
+    #define RXFBCON4_F8BP_2         F8BP_2
+    #define RXFBCON4_F8BP_3         F8BP_3
+    #define RXFBCON4_F9BP_0         F9BP_0
+    #define RXFBCON4_F9BP_1         F9BP_1
+    #define RXFBCON4_F9BP_2         F9BP_2
+    #define RXFBCON4_F9BP_3         F9BP_3
+
+    #define RXFBCON5_F10BP_0        F10BP_01
+    #define RXFBCON5_F10BP_1        F10BP_1
+    #define RXFBCON5_F10BP_2        F10BP_2
+    #define RXFBCON5_F10BP_3        F10BP_3
+    #define RXFBCON5_F11BP_0        F11BP_0
+    #define RXFBCON5_F11BP_1        F11BP_1
+    #define RXFBCON5_F11BP_2        F11BP_2
+    #define RXFBCON5_F11BP_3        F11BP_3
+
+    #define RXFBCON6_F12BP_0        F12BP_01
+    #define RXFBCON6_F12BP_1        F12BP_1
+    #define RXFBCON6_F12BP_2        F12BP_2
+    #define RXFBCON6_F12BP_3        F12BP_3
+    #define RXFBCON6_F13BP_0        F13BP_0
+    #define RXFBCON6_F13BP_1        F13BP_1
+    #define RXFBCON6_F13BP_2        F13BP_2
+    #define RXFBCON6_F13BP_3        F13BP_3
+
+    #define RXFBCON7_F14BP_0        F14BP_01
+    #define RXFBCON7_F14BP_1        F14BP_1
+    #define RXFBCON7_F14BP_2        F14BP_2
+    #define RXFBCON7_F14BP_3        F14BP_3
+    #define RXFBCON7_F15BP_0        F15BP_0
+    #define RXFBCON7_F15BP_1        F15BP_1
+    #define RXFBCON7_F15BP_2        F15BP_2
+    #define RXFBCON7_F15BP_3        F15BP_3
+
+    #define B0CON_TXREQ             B0TXREQ
+    #define B1CON_TXREQ             B1TXREQ
+    #define B2CON_TXREQ             B2TXREQ
+    #define B3CON_TXREQ             B3TXREQ
+    #define B4CON_TXREQ             B4TXREQ
+    #define B5CON_TXREQ             B5TXREQ
+
+    #define B0CON_RXFUL             B0RXFUL
+    #define B1CON_RXFUL             B1RXFUL
+    #define B2CON_RXFUL             B2RXFUL
+    #define B3CON_RXFUL             B3RXFUL
+    #define B4CON_RXFUL             B4RXFUL
+    #define B5CON_RXFUL             B5RXFUL
+
+    #define B0CON_RXM1              B0RXM1
+    #define B1CON_RXM1              B1RXM1
+    #define B2CON_RXM1              B2RXM1
+    #define B3CON_RXM1              B3RXM1
+    #define B4CON_RXM1              B4RXM1
+    #define B5CON_RXM1              B5RXM1
+
+    /*
+     * Following are special defs to overcome compiler problem
+     * at the time of this re-write.
+     * Set following line to "#if 0" after verifiying correct
+     * compiler behavior.
+     */
+    #if 1
+        static struct
+        {
+            unsigned : 7;
+            unsigned RXFUL : 1;
+        } RXB1CONbits @ 0xf50;
+        #define RXB1CON_RXFUL       RXB1CONbits.RXFUL
+
+        static struct
+        {
+            unsigned TXPRI0:1;
+            unsigned TXPRI1:1;
+            unsigned :1;
+            unsigned TXREQ:1;
+            unsigned TXERR:1;
+            unsigned TXLARB:1;
+            unsigned TXABT:1;
+        } TXB1CONbits @ 0xf30;
+        #define TXB1CON_TXREQ       TXB1CONbits.TXREQ
+
+        static struct
+        {
+            unsigned TXPRI0:1;
+            unsigned TXPRI1:1;
+            unsigned :1;
+            unsigned TXREQ:1;
+            unsigned TXERR:1;
+            unsigned TXLARB:1;
+            unsigned TXABT:1;
+        } TXB2CONbits @ 0xf20;
+        #define TXB2CON_TXREQ       TXB2CONbits.TXREQ
+    #else
+        #define RXB1CON_RXFUL       RXB1RXFUL
+        #define TXB1CON_TXREQ       TXB1REQ
+        #define TXB2CON_TXREQ       TXB2REQ
+    #endif
+
+    #define RXM0SIDL_EXIDEN         RXM0EXIDM
+    #define RXM1SIDL_EXIDEN         RXM1EXIDEN
+
+    #define ECANCON_MDSEL1          MDSEL1
+    #define ECANCON_MDSEL0          MDSEL0
+
+    #define COMSTAT_FIFOEMPTY       FIFOEMPTY
+    #define COMSTAT_RXBnOVFL        RXB1OVFL
+    #define COMSTAT_RXB0OVFL        RXB0OVFL
+    #define COMSTAT_RXB1OVFL        RXB1OVFL
+
+    #define BRGCON2_SEG2PHTS        SEG2PHT
+    #define BRGCON2_SAM             SAM
+    #define BRGCON3_WAKDIS          WAKDIS
+    #define BRGCON3_WAKFIL          WAKFIL
+
+    #define CIOCON_ENDRHI           ENDRHI
+    #define CIOCON_CANCAP           CANCAP
+
+    #define PIR3_RXBnIF             RXB1IF
+    #define PIR3_IRXIF              IRXIF
+    #define PIR3_RXB0IF             RXB0IF
+    #define PIR3_RXB1IF             RXB1IF
+
+    #define RXB0CON_FILHIT0         RXB0FILHIT0
+
+
+
+    #define RXB0CON_RXB0DBEN        RXBODBEN
+    static volatile near bit        RXBODBEN   @ ((unsigned)&RXB0CON*8)+2;
+
+
+#endif
+
+
+
+
+
+#endif
+

+ 192 - 0
ProjectSource/BMS_Slave_RCT/BMS_EEPROM.c

@@ -0,0 +1,192 @@
+/*********************************************************************
+ *
+ *                  BMS EEPROM File
+ *
+ *********************************************************************
+ * FileName:        BMS_EEPROM.c
+ * Processor:       PIC18F25K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Ott W.           23.03.2016   Release
+ *********************************************************************/
+
+/*********************************************************************
+ *
+ *                          Include Files
+ *
+ ********************************************************************/
+#include "BMS_Slave.h"
+
+/*********************************************************************
+*
+*                             Globals
+*
+*********************************************************************/
+extern SERIAL_NR_t  gSerial;
+
+
+/*********************************************************************
+ * Function:        unsigned char EEread(unsigned char adress)
+ *
+ * Overview:       Use this function to read EEPROM
+ *
+ * PreCondition:    None
+ *
+ * Input:           EEPROM adress
+ *
+ * Output:          return: EEDATA
+ *
+ * Side Effects:    against switch on BMS
+ **********************************************************************/
+uint8_t EEread(uint8_t adress)
+{
+    uint8_t i;
+    uint8_t array_len = 0;
+
+    array_len = sizeof(gSerial.EE_ADRESS);
+    
+    i = adress;
+    for(i = 0; i < array_len;i++)
+    {
+        EEADR = i;                      //Address to be read
+        EECON1bits.EEPGD = 0;           //Selecting EEPROM Data Memory
+        EECON1bits.CFGS = 0;
+        EECON1bits.RD = 1;              //Initialise read cycle
+        Nop();
+        gSerial.EE_ADRESS[i] = EEDATA;
+
+    }
+
+    return gSerial.EE_BYTE.FLASH;
+}
+
+/*********************************************************************
+ * Function:        void EEwrite(unsigned char adress, unsigned char data)
+ *
+ * Overview:        Use this function to write data to EEPROM
+ *
+ * PreCondition:    None
+ *
+ * Input:           EEPROM adress, data
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ **********************************************************************/
+void EEwrite(uint8_t adress, uint8_t *DATA_temp)
+{
+
+  uint8_t   INTCON_SAVE;          //To save INTCON register value
+  uint8_t   i = 0;
+  uint8_t   array_len = 0;
+  uint16_t  LFT1_h = 0;
+  uint16_t  LFT2_h = 0;
+  uint8_t   BAU_h = 0;
+  uint8_t   FAM_h = 0;
+
+  if(adress == EE_308_a)
+  {
+      // Save the first 8 Bytes in gSerial.EE_ADRESS[1..8]
+      for(i = 0; i < 8; i++)
+      {
+          gSerial.EE_ADRESS[i+1] = DATA_temp[i];
+      }
+  }
+  else if(adress == EE_309_a)
+  {
+      // Save the second 4 Bytes in gSerial.EE_ADRESS[9..12]
+      for(i = 0; i < 4; i++)
+      {
+          gSerial.EE_ADRESS[9+i] = DATA_temp[i];
+      }
+
+        gSerial.EE_ADRESS[0] = EE_LOAD; // Set gSerial.EE_ADRESS[0] to EEPROM is written
+        gSerial.EE_ADRESS[13] = 0;      // Set Slave Nr. to 0;
+
+        // 4 CHAR numbers to 1 HEX number
+        // (MSB)LFT4 to (LSB)LFT1
+        // LFT_1 = ((LFT1-48)+10*(LFT2-48)+100*(LFT3-48)+1000*(LFT4-48)) & 255
+        LFT1_h =     ((uint16_t)(gSerial.EE_BYTE.LFT1-48)+10*(uint16_t)(gSerial.EE_BYTE.LFT2-48)
+                +100*(uint16_t)(gSerial.EE_BYTE.LFT3-48)+1000*(uint16_t)(gSerial.EE_BYTE.LFT4-48))& 0xFF;
+
+        // LFT_2 = ((LFT1-48)+10*(LFT2-48)+100*(LFT3-48)+1000*(LFT4-48)) / 256
+        LFT2_h =     ((uint16_t)(gSerial.EE_BYTE.LFT1-48)+10*(uint16_t)(gSerial.EE_BYTE.LFT2-48)
+                +100*(uint16_t)(gSerial.EE_BYTE.LFT3-48)+1000*(uint16_t)(gSerial.EE_BYTE.LFT4-48)) >> 8;
+
+        BAU_h = ( (gSerial.EE_BYTE.BAU1-48)+10*(gSerial.EE_BYTE.BAU2-48) );
+        FAM_h = ( (gSerial.EE_BYTE.FAM1-48)+10*(gSerial.EE_BYTE.FAM2-48) );
+
+        gSerial.EE_BYTE.LFT_1 = (uint8_t)LFT1_h;
+        gSerial.EE_BYTE.LFT_2 = (uint8_t)LFT2_h;
+        gSerial.EE_BYTE.BAU_1 = BAU_h;
+        gSerial.EE_BYTE.FAM_1 = FAM_h;
+
+        array_len = sizeof(gSerial.EE_ADRESS);
+        for(i = 0; i < array_len; i++)
+        {
+
+            EEADR = i;                        //Address to write
+            EEDATA = gSerial.EE_ADRESS[i];    //Data to write
+            EECON1bits.EEPGD = 0;             //Selecting EEPROM Data Memory
+            EECON1bits.CFGS = 0;              // access eeprom //
+            EECON1bits.WREN = 1;              //Enable writing of EEPROM
+            INTCON_SAVE=INTCON;               //Backup INCON interupt register
+            INTCON=0;                         //Diables the interrupt
+            EECON2=0x55;                      //Required sequence for write to internal EEPROM
+            EECON2=0xAA;                      //Required sequence for write to internal EEPROM
+            EECON1bits.WR = 1;                //Initialise write cycle
+            INTCON = INTCON_SAVE;             //Enables Interrupt
+            EECON1bits.WREN = 0;              //To disable write
+
+
+            while(PIR4bits.EEIF == 0)     //Checking for complition of write operation
+            {
+
+            }
+            PIR4bits.EEIF = 0;            //Clearing EEIF bit
+        }
+  }
+
+}
+
+/*********************************************************************
+ * Function:        void EEwrite(unsigned char adress, unsigned char data)
+ *
+ * Overview:        Use this function to write data to EEPROM
+ *
+ * PreCondition:    None
+ *
+ * Input:           EEPROM adress, data
+ *
+ * Output:          None
+ *
+ * Side Effects:    Change data in EEPROM
+ **********************************************************************/
+void EEwrite_new(uint8_t adress, uint8_t data)
+{
+    uint8_t INTCON_SAVE;          //To save INTCON register value
+
+    EEADR = adress;               //Address to write
+    EEDATA = data;                //Data to write
+    EECON1bits.EEPGD = 0;         //Selecting EEPROM Data Memory
+    EECON1bits.CFGS = 0;          /* access eeprom */
+    EECON1bits.WREN = 1;          //Enable writing of EEPROM
+    INTCON_SAVE=INTCON;           //Backup INCON interupt register
+    INTCON=0;                     //Diables the interrupt
+    EECON2=0x55;                  //Required sequence for write to internal EEPROM
+    EECON2=0xAA;                  //Required sequence for write to internal EEPROM
+    EECON1bits.WR = 1;            //Initialise write cycle
+    INTCON = INTCON_SAVE;         //Enables Interrupt
+    EECON1bits.WREN = 0;          //To disable write
+
+
+    while(PIR4bits.EEIF == 0)     //Checking for complition of write operation
+    {
+
+    }
+    PIR4bits.EEIF = 0;            //Clearing EEIF bit
+
+}

+ 40 - 0
ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h

@@ -0,0 +1,40 @@
+/*********************************************************************
+ *
+ *                  BMS_EEPROM Header
+ *
+ *********************************************************************
+ * FileName:        BMS_EEPROM.h
+ * Processor:       PIC18F25K80
+ * Complier:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Ott W.           23.03.2016   Release
+ *********************************************************************/
+
+
+#ifndef BMS_EEPROM_H
+#define	BMS_EEPROM_H
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+
+
+
+/*********************************************************************
+*
+*                        Function Prototypes
+*
+*********************************************************************/
+uint8_t     EEread          (uint8_t adress);
+void        EEwrite         (uint8_t adress, uint8_t *DATA_temp);
+void        EEwrite_new     (uint8_t adress, uint8_t data);
+
+
+
+#endif	/* BMS_EEPROM_H */
+

+ 1219 - 0
ProjectSource/BMS_Slave_RCT/BMS_LTC.c

@@ -0,0 +1,1219 @@
+/*********************************************************************
+ *
+ *                  LTC6803 API File
+ *
+ *********************************************************************
+ * FileName:        MBS_LTC.c
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       17.02.2012   Release
+ * Reiling V.       27.02.2012   Debug: Odd Voltage = 0V
+ * Reiling V.       29.03.2012   Release 2. see change log file
+ *********************************************************************/
+
+#include "BMS_Slave.h"
+
+
+/*********************************************************************
+*
+*                             Globals
+*
+*********************************************************************/
+static LTC_CFG   gCFG;
+static LTC_CVAD  gCVAD;
+static LTC_TMP   gTMP;
+static LTC_DRG   gDRG;
+static uint16_t  gLTC_SelfTest_Result = LTC_OK;
+static uint16_t  gLTC_TimeOut         = LTC_OK;
+extern SERIAL_NR_t  gSerial;
+extern ERROR_flags gERROR;
+extern LTC_STATUS LTC_Status;
+
+/*********************************************************************
+ * Function:        void LTC_Init( void )
+ *
+ * Overview:        API Function
+ *                  Use this function to initialize LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          Return:  LTC_OK,
+ *
+ * Side Effects:    Change gCFG
+ **********************************************************************/
+void LTC_Init( void )
+{
+  int8_t      i           = 0;
+  CAN_CONFIG  gCAN_CONFIG ={ SlaveNo_VAL,
+                             BRP_VAL,
+                             PROPSEG_VAL,
+                             PHSEG1_VAL,
+                             PHSEG2_VAL,
+                             SJW_VAL,
+                             PHSEG2_MODE_VAL,
+                             BUS_SAMPLE_MODE_VAL,
+                             WAKEUP_MODE_VAL,
+                             FILTER_MODE_VAL };
+  
+  OSCCONbits.IRCF0  = 0;     // 2MHz Prescaler für SPI
+  OSCCONbits.IRCF1  = 1;
+  OSCCONbits.IRCF2  = 1;
+  OSCTUNEbits.PLLEN = 0;     // PLL on
+
+  // 12 Bit ADC Settings
+  ADCON0 = 0x00;              // Clear ADCON0 register
+  ADCON1 = 0x30;              // Internal Vref+ = 4,1V, Vreg- = 0V
+  ADCON2 = 0x92;              // right justifield, 4Tad, Fosc/32
+  ANCON0 = 0x0B;              // AN0 and AN1 and AN3 as analog inputs
+  ANCON1 = 0x00;
+  ADCON0bits.ADON = 0x01;     //Enable A/D module
+
+  TRISAbits.TRISA0 = 1;      // PortA.0 =  Analog In
+  TRISAbits.TRISA1 = 1;      // PortA.1 =  Analog In
+  TRISAbits.TRISA3  = 1;     // PortA.3 =  Analog In (Balancing Temperature)
+  LATAbits.LATA5    = 1;     // LTC SPI CS OFF
+  TRISAbits.TRISA5  = 0;     // Output LTC SPI CS
+  TRISB             = 0xFB;  // Port B Input (PB.2 = CAN_1_TX Output)
+  TRISCbits.TRISC0  = 0;     // Output MUX 0,1,2
+  TRISCbits.TRISC1  = 0;
+  TRISCbits.TRISC2  = 0;
+  LATD              = 0;     // Port D alle Latches off
+  TRISD             = 0;     // Port D Output
+  TRISEbits.TRISE0  = 0;     // Out LED0
+  TRISEbits.TRISE1  = 0;     // Out LED1
+  LATE             |= 3;     // LED0 = on; LED1 = on
+  LATC = LATC & 0xF8;        // Clear C0,C1,C2
+  LATC             |= 1;     // Set MUX Counter = 1 to avoid MUX input = 0
+  
+  InitSPI();
+  InitTimer();
+
+  //gCAN_CONFIG.SlaveNo   = ((PORTB >> 2) & 0xC);
+  //gCAN_CONFIG.SlaveNo  += (PORTB & 0x3);
+  //gCAN_CONFIG.SlaveNo <<= 4;
+  //gCAN_CONFIG.SlaveNo  ^= 0xF0;                       //!! entfällt bei eWolf
+  //gSerial.SLAVE_ID = gCAN_CONFIG.SlaveNo;
+
+  gCAN_CONFIG.SlaveNo = gSerial.EE_BYTE.SLAVE_ID;
+  CAN_Init( &gCAN_CONFIG );
+
+  for(i=0;i<24;i++)         // Start Voltage and Temperature with 0xFFFF / 0xFF
+  {
+    gCVAD.CVAD[i] = -1;     // init. value for voltage => not connected
+    gTMP.ETMP[i]  = -51;    // init. value for temperature  => not connected
+  }
+
+  // Config LTC6803, Run Mode, Balancing OFF
+  LTC_SetCFG(CDC_1, 0, 0x0FFFFFF );
+  
+  gDRG.PEC_Counter = 0; // Com Error Counter ini
+
+  INTCONbits.GIE  = 1;
+  INTCONbits.PEIE = 1;
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_Do( uint16_t *gEvent)
+ *
+ * Overview:        API Function
+ *                  Use this function to run LTC6803 module
+ *
+ * PreCondition:    LTC_Init()
+ *
+ * Input:           Pointer to gEvent
+ *
+ * Output:          None
+ *
+ * Side Effects:    Change gCVAD, gTMP, gDRG
+ **********************************************************************/
+void LTC_Do(uint16_t *ptr_gEvent)
+{
+  int8_t  MUXcopy = 0;
+
+
+  if(*ptr_gEvent & EV__LTC_V_Start)
+  {
+    if(PORTC & LTC_ADC_Ready)               // ADC not running
+    {
+      if(LTC_MeasureVoltage( STCVAD_ALL, STCVAD_ALL_PEC, EV__LTC_V_Start ))
+        gDRG.PEC_Counter++;
+      *ptr_gEvent &= (~EV__LTC_V_Start);
+      *ptr_gEvent |= EV__LTC_V_Wait;
+    }
+  }
+
+  if(*ptr_gEvent & EV__LTC_V_Wait)
+  {
+    if(PORTC & LTC_ADC_Ready)               // ADC not running
+    {
+      if(LTC_MeasureVoltage( STCVAD_ALL, STCVAD_ALL_PEC, EV__LTC_V_Wait ))
+        gDRG.PEC_Counter++;
+      *ptr_gEvent &= (~EV__LTC_V_Wait);
+    }
+  }
+
+  if(*ptr_gEvent & EV__LTC_T_Start)
+  {
+    if(PORTC & LTC_ADC_Ready)               // ADC not running
+    {
+      if(LTC_MeasureTemperature( STTMPAD_ALL, STTMPAD_ALL_PEC, EV__LTC_T_Start ))
+        gDRG.PEC_Counter++;
+      *ptr_gEvent |= EV__LTC_T_Wait;
+      *ptr_gEvent &= (~EV__LTC_T_Start);
+    }
+  }
+  
+  if(*ptr_gEvent & EV__LTC_T_Wait)
+  {
+    if(PORTC & LTC_ADC_Ready)               // ADC not running
+    {
+      if(LTC_MeasureTemperature( STTMPAD_ALL, STTMPAD_ALL_PEC, EV__LTC_T_Wait ))
+        gDRG.PEC_Counter++;
+      
+      //IMPORTANT: RCT Power Version to avoid MUX INPUT = 0
+      MUXcopy = LATC & 0x07;                // extract MUX
+      LATC = LATC & 0xF8;                   // clear old MUX
+      if( MUXcopy < 6)
+      {
+          LATC = (LATC | MUXcopy) + 1;      // set new MUX
+      }
+      else
+      {
+         LATC = 0x01;                       // Set Mux Counter = 1
+      }
+     
+      *ptr_gEvent &= (~EV__LTC_T_Wait);
+    }
+  }
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_BalanceOn(uint8_t No)
+ *
+ * Overview:        API Function
+ *                  Use this function to start Balancing Cell No
+ *                  thru LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           Number of Cell to Balance
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ **********************************************************************/
+void LTC_BalanceOn(uint8_t No)
+{
+    uint32_t DCC = 1;                 // Start for Shift
+
+    DCC = DCC << No;                  // Shift Bitmask into Position
+    LTC_SetCFG(CDC_1, DCC, 0);
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_BalanceOff(uint8_t No)
+ *
+ * Overview:        API Function
+ *                  Use this function to stop Balancing Cell(n)
+ *                  thru LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           Number of Cell to Balance
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ **********************************************************************/
+void LTC_BalanceOff(uint8_t No)
+{
+    uint32_t  DCC = 1;                // Start for Shift
+
+    DCC = DCC << No;                  // Shift Bitmask into Position
+    LTC_SetCFG(CDC_1, 0, DCC);
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_Terminate(void)
+ *
+ * Overview:        API Function
+ *                  Use this function to End LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ ********************************************************************/
+void LTC_Terminate(void)
+{
+    LTC_SetCFG(CDC_0, 0, 0x0FFF);     // LTC StandBy, Balance OFF
+}
+
+
+
+/*********************************************************************
+ * Function:        int16_t LTC_GetVoltage(uint8_t No)
+ *
+ * Overview:        API Funktion
+ *                  Use this function to read out one Cell Voltage
+ *                  
+ * PreCondition:    None
+ *
+ * Input:           Number of Cell to read out Voltage
+ *
+ * Output:          Cell Voltage
+ *
+ * Side Effects:    None
+ ********************************************************************/
+int16_t LTC_GetVoltage(uint8_t No)
+{
+    int16_t copyCVAD = gCVAD.CVAD[No];
+
+    if (gERROR.LIMITCELLVOLTAGE == 0)
+    {
+        if(copyCVAD >= CELL_BYPASSED)
+        {
+            if( !((copyCVAD > VOLTAGE_MIN) && (copyCVAD < VOLTAGE_MAX)) )
+            {
+                gERROR.LIMITCELLVOLTAGE = 1;
+            }
+        }
+        
+    }
+  
+    gCVAD.CVAD[No] = -1;
+
+    return copyCVAD;
+}
+
+
+
+/*********************************************************************
+ * Function:        int16_t LTC_GetTemperature(uint8_t No)
+ *
+ * Overview:        API Funktion
+ *                  Use this function to read out one Temperature Sensor
+ *
+ * PreCondition:    None
+ *
+ * Input:           Number of Sensor to read out Temperature
+ *
+ * Output:          Sensor Temperature
+ *
+ * Side Effects:    None
+ ********************************************************************/
+int16_t LTC_GetTemperature(uint8_t No)
+{
+    int8_t copyETMP = gTMP.ETMP[No];
+
+    if (gERROR.LIMITCELLTEMP == 0)
+    {
+        if( (copyETMP >= TEMP_NOT_CON) )
+        {
+            if( !((copyETMP > TEMP_MIN) && (copyETMP < TEMP_MAX)) )
+            {
+                gERROR.LIMITCELLTEMP = 1;
+
+            }
+        }
+
+    }
+
+    gTMP.ETMP[No] = -51;
+
+    return copyETMP;
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_GetStatus( LTC_STATUS *LTC_Status )
+ *
+ * Overview:        API Funktion
+ *                  Show LTC_Status, PEC Counter and LTC_SelfTest
+ *
+ * PreCondition:    None
+ *
+ * Input:           Global gDRG, PEC_Counter, gLTC_SelfTest_Result, gLTC_TimeOut
+ *
+ * Output:          None
+ *
+ *
+ * Side Effects:    Reset gDRG.PEC_Counter, change LTC_Status
+ ********************************************************************/
+void LTC_GetStatus( LTC_STATUS *LTC_Status )
+{
+  // Build LTC_StatusSlave
+  LTC_Status->LTC_StatusSlave     = LTC_OK;
+
+  if(gTMP.ITMP[0] < WarnLowTemp)
+    LTC_Status->LTC_StatusSlave  |= LTC1_LowTemp_NOK;
+  if(gTMP.ITMP[1] < WarnLowTemp)
+    LTC_Status->LTC_StatusSlave  |= LTC2_LowTemp_NOK;
+ 
+  if(gTMP.ITMP[0] > WarnHighTemp)
+    LTC_Status->LTC_StatusSlave  |= LTC1_HighTemp_NOK;
+  if(gTMP.ITMP[1] > WarnHighTemp)
+    LTC_Status->LTC_StatusSlave  |= LTC2_HighTemp_NOK;
+  
+  if(gTMP.THSD[0])
+    LTC_Status->LTC_StatusSlave  |= LTC1_THSD_NOK;
+  if(gTMP.THSD[1])
+   LTC_Status->LTC_StatusSlave   |= LTC2_THSD_NOK;
+
+  if(gLTC_TimeOut)
+    LTC_Status->LTC_StatusSlave  |= LTC_TimeOut;
+  gLTC_TimeOut = LTC_OK;
+
+  if(gDRG.PEC_Counter)
+    LTC_Status->LTC_StatusSlave  |= LTC_PEC_NOK;
+
+  if(!(PORTA & 0x04) )
+    LTC_Status->LTC_StatusSlave  |= RELAIS_ON;
+
+  // Build LTC_PECFailCounter
+  LTC_Status->LTC_PECFailCounter  = gDRG.PEC_Counter;
+  gDRG.PEC_Counter = 0;    // Reset Error Counter after readout
+
+  // Build LTC_SelfTest
+  LTC_Status->LTC_SelfTest = gLTC_SelfTest_Result;
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_GetHeatSink( LTC_STATUS *LTC_Status )
+ *
+ * Overview:        API Funktion
+ *                  Show HeatSinkTemperature
+ *
+ * PreCondition:    None
+ *
+ * Input:           Global gDRG
+ *
+ * Output:          None
+ *
+ *
+ * Side Effects:   change LTC_Status
+ ********************************************************************/
+void LTC_GetHeatSink( LTC_STATUS *LTC_Status )
+{
+  int16_t HeatSinkTemp = 0;
+
+  ADCON0bits.CHS = 3;                  // Set adc channel to read
+  ADCON0bits.GO = 1;                   //Start A/D Conversion
+
+  while(ADCON0bits.GO == 1)
+  {
+      //Loop here until A/D conversion completes
+  };
+
+  HeatSinkTemp = ( (((uint16_t)ADRESH << 8)+ADRESL));        // readout ADC
+  HeatSinkTemp -= 500;          // correct 0°C Offset
+  HeatSinkTemp /= 10;           // correct Slope
+
+
+
+  LTC_Status->HeatSinkTemperature = (int8_t)HeatSinkTemp;
+}
+
+
+
+/*********************************************************************
+ * Function:        uint16_t LTC_SelfTest( void )
+ *
+ * Overview:        API Funktion
+ *                  Use this function to Self Test LTC6803
+ *
+ * PreCondition:    LTC_Init()
+ *
+ * Input:           none
+ *
+ * Output:          LTC_OK, LTC1_VST1_NOK, LTC1_VST2_NOK, LTC1_VST1_NOK, LTC1_VST2_NOK,
+ *                  LTC1_TST1_NOK, LTC1_TST2_NOK, LTC2_TST1_NOK, LTC2_TST2_NOK,
+ *                  LTC1_RefL_NOK, LTC1_RefH_NOK, LTC2_RefL_NOK, LTC2_RefH_NOK,
+ *                  LTC1_MUX_NOK, LTC2_MUX_NOK, LTC_PEC_NOK
+ *
+ * Side Effects:    ~85ms stall
+ ********************************************************************/
+uint16_t LTC_SelfTest( void )
+{
+  int8_t    i = 0;
+
+  gLTC_SelfTest_Result = LTC_OK;
+
+// Spannungsmessung im SelfTest1 dh alle Datenbyte müssen 0x55 sein
+  Delay10KTCYx(96);
+  LTC_MeasureVoltage( STCVAD_ST1, STCVAD_ST1_PEC, EV__LTC_V_Start );
+  Delay10KTCYx(96);
+  
+  if(LTC_MeasureVoltage( STCVAD_ST1, STCVAD_ST1_PEC, EV__LTC_V_Wait ))
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+  else
+  {
+    for(i=2; i<20; i++)
+    {
+      if(gCVAD.LTC_CVAD_RAW[i] == (0x55 || 0xAA ))
+        gLTC_SelfTest_Result |= LTC1_VST1_NOK;
+      if(gCVAD.LTC_CVAD_RAW[i+19] == (0x55 || 0xAA ))
+        gLTC_SelfTest_Result |= LTC2_VST1_NOK;
+    }
+  }
+
+// Spannungsmessung im SelfTest2 dh alle Datenbyte müssen 0xAA sein
+  LTC_MeasureVoltage( STCVAD_ST2, STCVAD_ST2_PEC, EV__LTC_V_Start );
+  Delay10KTCYx(96);
+  
+  if(LTC_MeasureVoltage( STCVAD_ST2, STCVAD_ST2_PEC, EV__LTC_V_Wait ))
+  {
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+  }
+  else
+  {
+    for(i=2; i<20; i++)
+    {
+      if(gCVAD.LTC_CVAD_RAW[i] == (0x55 || 0xAA ))
+        gLTC_SelfTest_Result |= LTC1_VST2_NOK;
+      if(gCVAD.LTC_CVAD_RAW[i+19] == (0x55 || 0xAA ))
+        gLTC_SelfTest_Result |= LTC2_VST2_NOK;
+    }
+  }
+
+// Normale Spannungsmessung um SelfTest zu beenden
+  LTC_MeasureVoltage( STCVAD_ALL, STCVAD_ALL_PEC, EV__LTC_V_Start );
+  Delay10KTCYx(96);
+  
+  if(LTC_MeasureVoltage( STCVAD_ALL, STCVAD_ALL_PEC, EV__LTC_V_Wait ))  //Reset Self Test
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+
+// Temperaturmessung im SelfTest1 dh alle Datenbyte müssen 0x55 sein
+  LTC_MeasureTemperature( STTMPAD_ST1, STTMPAD_ST1_PEC, EV__LTC_T_Start );
+  Delay10KTCYx(20);
+ 
+  if(LTC_MeasureTemperature( STTMPAD_ST1, STTMPAD_ST1_PEC, EV__LTC_T_Wait ))
+  {
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+  }
+  else
+  {
+    for(i=2; i<6; i++)
+    {
+      if(gTMP.LTC_TMP_RAW[i] == (0x55 || 0xAA ))
+         gLTC_SelfTest_Result |= LTC1_TST1_NOK;
+      if(gTMP.LTC_TMP_RAW[i+6] == (0x55 || 0xAA ))
+         gLTC_SelfTest_Result |= LTC2_TST1_NOK;
+    }
+    if(gTMP.LTC_TMP_RAW[6] == (0x05 || 0x0A ))
+       gLTC_SelfTest_Result |= LTC1_TST1_NOK;
+    if(gTMP.LTC_TMP_RAW[12] == (0x05 || 0x0A ))
+       gLTC_SelfTest_Result |= LTC2_TST1_NOK;
+  }
+
+// Temperaturmessung im SelfTest2 dh alle Datenbyte müssen 0xAA sein
+  LTC_MeasureTemperature( STTMPAD_ST2, STTMPAD_ST2_PEC, EV__LTC_T_Start );
+   Delay10KTCYx(20);
+ 
+  if(LTC_MeasureTemperature( STTMPAD_ST2, STTMPAD_ST2_PEC, EV__LTC_T_Wait ))
+  {
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+  }
+  else
+  {
+    for(i=2; i<6; i++)
+    {
+      if(gTMP.LTC_TMP_RAW[i] == (0x55 || 0xAA ))
+         gLTC_SelfTest_Result |= LTC1_TST2_NOK;
+      if(gTMP.LTC_TMP_RAW[i+6] == (0x55 || 0xAA ))
+         gLTC_SelfTest_Result |= LTC2_TST2_NOK;
+    }
+    if(gTMP.LTC_TMP_RAW[6] == (0x05 || 0x0A ))
+       gLTC_SelfTest_Result |= LTC1_TST2_NOK;
+    if(gTMP.LTC_TMP_RAW[12] == (0x05 || 0x0A ))
+       gLTC_SelfTest_Result |= LTC2_TST2_NOK;
+  }
+
+// Normale Temperaturmessung um SelfTest zu beenden
+  LTC_MeasureTemperature( STTMPAD_ALL, STTMPAD_ALL_PEC, EV__LTC_T_Start );  // Reset Self Test
+  Delay10KTCYx(20);
+
+  if(LTC_MeasureTemperature( STTMPAD_ALL, STTMPAD_ALL_PEC, EV__LTC_T_Wait ))
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+
+// Normale StatusAbfrage
+  LTC_MeasureDiag( EV__LTC_S_Start );
+  Delay10KTCYx(110);
+ 
+  if(LTC_MeasureDiag( EV__LTC_S_Wait ))
+  {
+    gLTC_SelfTest_Result |= LTC_PEC_NOK;
+  }
+  else
+  {
+    if(gDRG.REF[0]<2100)
+      gLTC_SelfTest_Result |= LTC1_RefL_NOK;
+    if(gDRG.REF[0]>2900)
+      gLTC_SelfTest_Result |= LTC1_RefH_NOK;
+    if(gDRG.MUXFAIL[0])
+      gLTC_SelfTest_Result |= LTC1_MUX_NOK;
+
+    if(gDRG.REF[1]<2100)
+      gLTC_SelfTest_Result |= LTC2_RefL_NOK;
+    if(gDRG.REF[1]>2900)
+      gLTC_SelfTest_Result |= LTC2_RefH_NOK;
+    if(gDRG.MUXFAIL[1])
+      gLTC_SelfTest_Result |= LTC2_MUX_NOK;
+  }
+
+  return gLTC_SelfTest_Result;
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_SetCFG(uint8_t  CDC,
+ *                                  uint32_t SetDCC,
+ *                                  uint32_t ClearDCC)
+ *
+ * Overview:        Use this function to initialize LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           Variable: CDC (Mode), set/clear DCC (Balancing Mask)
+ *                  Fix:      CELL10 = 0    (12-Cell Mode)
+ *                            LVLPL  = 1    (Level Polling)
+ *                            GPIO   = 0    (Pull-Down ON)
+ *                            WDT    = 0    (WDT pin al logic '0')
+ *                            MC     = 0    (enable interrupts)
+ *                            VUV    = 0x77 (~2,1V)
+ *                            VOV    = 0xAA (~3,3V)
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ ********************************************************************/
+void LTC_SetCFG(uint8_t CDC, uint32_t setDCC, uint32_t clearDCC)
+{
+    static uint32_t gDCC=0;                    // dauerhafter Kopie von Balance
+
+    uint8_t  DCC1L, DCC1H, DCC2L, DCC2H;       // DCC Mask to CFG
+    uint8_t  LTC_CFG_TxBuffer[16];             // Speicher für Command&PEC Data&PEC
+    uint32_t DCC=0;                            // work copy of gDCC
+
+    gDCC = gDCC | setDCC;                      // Backup DCC for SetBalance
+    gDCC = gDCC & ~clearDCC;                   // Backup DCC for ClearBalance
+    DCC  = gDCC;                               // Load new DCC
+
+    DCC2L = (unsigned char)(DCC & 0x000000FF);
+    DCC   = DCC>>8;
+    DCC2H = (unsigned char)(DCC & 0x0000000F);
+    DCC   = DCC>>4;
+    DCC1L = (unsigned char)(DCC & 0x000000FF);
+    DCC   = DCC>>8;
+    DCC1H = (unsigned char)(DCC & 0x0000000F);
+
+    LTC_CFG_TxBuffer[2]  = CDC + LVLPL; // Runmode
+    LTC_CFG_TxBuffer[3]  = DCC1L;       // Balancing
+    LTC_CFG_TxBuffer[4]  = DCC1H;       // 0xX0 = Zellen maskieren; Balancing = 0x0X
+    LTC_CFG_TxBuffer[5]  = 0x00;	// 0xXX Zellen maskieren
+    LTC_CFG_TxBuffer[6]  = 0x77;	// 0xXX = Unterspannung
+    LTC_CFG_TxBuffer[7]  = 0xAA;	// 0xXX = Oberspannung
+    LTC_CFG_TxBuffer[8]  = LTC_CalcPEC(&LTC_CFG_TxBuffer[2], 6);
+
+    LTC_CFG_TxBuffer[9]  = CDC + LVLPL; // Runmode
+    LTC_CFG_TxBuffer[10] = DCC2L;       // Balancing
+    LTC_CFG_TxBuffer[11] = DCC2H;       // 0xX0 = Zellen maskieren; Balancing = 0x0X
+    LTC_CFG_TxBuffer[12] = 0x00;	// 0xXX Zellen maskieren
+    LTC_CFG_TxBuffer[13] = 0x77;	// 0xXX = Unterspannung
+    LTC_CFG_TxBuffer[14] = 0xAA;	// 0xXX = Oberspannung
+    LTC_CFG_TxBuffer[15] = LTC_CalcPEC(&LTC_CFG_TxBuffer[9], 6);
+
+    // Send CFG Buffer to LTC
+    LTC_Read(WRCFG, WRCFG_PEC, 16, &LTC_CFG_TxBuffer[0]);
+}
+
+
+
+/*********************************************************************
+ * Function:        uint8_t LTC_GetCFG( void )
+ *
+ * Overview:        Use this function to read back LTC6803 module CFG
+ *                  Check PEC
+ *
+ * PreCondition:    None
+ *
+ * Input:           Global gCFG
+ *
+ * Output:          OK = PEC OK, NOK = PEC NOK
+ *
+ * Side Effects:    None
+ ********************************************************************/
+uint8_t LTC_GetCFG( void )
+{
+    uint8_t PECStatus = LTC_OK;
+
+
+    // Read CFG
+    LTC_Read(RDCFG, RDCFG_PEC, 16, (unsigned char *)&gCFG.LTC_CFG_RAW[0]);
+    
+    if( LTC_CalcPEC(&gCFG.LTC_CFG_RAW[2], 6) != gCFG.LTC_CFG_RAW[8])
+    {
+      PECStatus = LTC_NOK;
+    }
+    else
+    {
+      if( LTC_CalcPEC(&gCFG.LTC_CFG_RAW[9], 6) != gCFG.LTC_CFG_RAW[15])
+      {
+        PECStatus = LTC_NOK;
+      }
+      else
+      {
+        gCFG.CDC[1]    = gCFG.LTC_CFG_RAW[9] & 0x7;
+        gCFG.CDC[0]    = gCFG.LTC_CFG_RAW[2] & 0x7;
+
+        gCFG.CELL10[1] = (gCFG.LTC_CFG_RAW[9] >> 3) & 0x1;
+        gCFG.CELL10[0] = (gCFG.LTC_CFG_RAW[2] >> 3) & 0x1;
+
+        gCFG.LVL_PL[1] = (gCFG.LTC_CFG_RAW[9] >> 4) & 0x1;
+        gCFG.LVL_PL[0] = (gCFG.LTC_CFG_RAW[2] >> 4) & 0x1;
+
+        gCFG.GPIO[1]   = (gCFG.LTC_CFG_RAW[9] >> 5) & 0x3;
+        gCFG.GPIO[0]   = (gCFG.LTC_CFG_RAW[2] >> 5) & 0x3;
+
+        gCFG.WDT[1]    = (gCFG.LTC_CFG_RAW[9] >> 7) & 0x1;
+        gCFG.WDT[0]    = (gCFG.LTC_CFG_RAW[2] >> 7) & 0x1;
+
+        gCFG.DCC[1]    = gCFG.LTC_CFG_RAW[11] & 0xF;
+        gCFG.DCC[1]    = (gCFG.DCC[1] << 8) + gCFG.LTC_CFG_RAW[10];
+        gCFG.DCC[0]    = gCFG.LTC_CFG_RAW[4] & 0xF;
+        gCFG.DCC[0]    = (gCFG.DCC[0] << 8) + gCFG.LTC_CFG_RAW[3];
+
+        gCFG.MC[1]     = gCFG.LTC_CFG_RAW[12];
+        gCFG.MC[1]     = (gCFG.MC[1] << 4) + (gCFG.LTC_CFG_RAW[11] >> 4);
+        gCFG.MC[0]     = gCFG.LTC_CFG_RAW[5];
+        gCFG.MC[0]     = (gCFG.MC[0] << 4) + (gCFG.LTC_CFG_RAW[4] >> 4);
+
+        gCFG.VUV[1]    = gCFG.LTC_CFG_RAW[13] - 31;
+        gCFG.VUV[1]    = gCFG.VUV[1] << 4;
+        gCFG.VUV[1]    = gCFG.VUV[1] + (gCFG.VUV[1] >> 1);
+        gCFG.VUV[0]    = gCFG.LTC_CFG_RAW[6]  - 31;
+        gCFG.VUV[0]    = gCFG.VUV[0] << 4;
+        gCFG.VUV[0]    = gCFG.VUV[0] + (gCFG.VUV[0] >> 1);
+
+        gCFG.VOV[1]    = gCFG.LTC_CFG_RAW[14] - 32;
+        gCFG.VOV[1]    = gCFG.VOV[1] << 4;
+        gCFG.VOV[1]    = gCFG.VOV[1] + (gCFG.VOV[1] >> 1);
+        gCFG.VOV[0]    = gCFG.LTC_CFG_RAW[7]  - 32;
+        gCFG.VOV[0]    = gCFG.VOV[0] << 4;
+        gCFG.VOV[0]    = gCFG.VOV[0] + (gCFG.VOV[0] >> 1);
+      }
+    }
+    return PECStatus;
+}
+
+
+
+/*********************************************************************
+ * Function:        uint8_t LTC_MeasureDiag( uint16_t Status )
+ *
+ * Overview:        API Funktion
+ *                  Use this function to readout Status of LTC6803
+ *
+ * PreCondition:    None
+ *
+ * Input:           Global gDRG, Status
+ *                  Status = EV__LTC_S_Start, EV__LTC_S_Wait
+ *
+ * Output:          OK = PEC OK, NOK = PEC NOK
+ *
+ * Side Effects:    ~17ms stall of LTC
+ ********************************************************************/
+uint8_t LTC_MeasureDiag( uint16_t Status )
+{
+  uint8_t PECStatus = LTC_OK;
+
+
+  if(Status == (unsigned)EV__LTC_S_Start)
+  {
+    LTC_StartMeasure(DAGN, DAGN_PEC);       // S Start
+  }
+
+  if(Status == (unsigned)EV__LTC_S_Wait)
+  {
+    if(PORTC & LTC_ADC_Ready)               // ADC not running
+    {
+      LATAbits.LATA5 = 1;                   // CS SPI OFF
+
+      // Read Diagnostic Register Group (DRG)
+      LTC_Read(RDDGNR, RDDGNR_PEC, 8, (uint8_t *)&gDRG.LTC_DRG_RAW[0]);
+
+      // Check for Errors
+      if( LTC_CalcPEC(&gDRG.LTC_DRG_RAW[2], 2) != gDRG.LTC_DRG_RAW[4])
+      {
+        PECStatus = LTC_NOK;
+      }
+      else
+      {
+        if( LTC_CalcPEC(&gDRG.LTC_DRG_RAW[5], 2) != gDRG.LTC_DRG_RAW[7])
+        {
+          PECStatus = LTC_NOK;
+        }
+        else
+        {
+          // Extract Data
+          // siehe Applications Note LTC 6803-3 Seite 25
+          gDRG.REF[0] = LTC_Field2IntEven( gDRG.LTC_DRG_RAW[2], gDRG.LTC_DRG_RAW[3] );
+          gDRG.REF[1] = LTC_Field2IntEven( gDRG.LTC_DRG_RAW[5], gDRG.LTC_DRG_RAW[6] );
+
+          gDRG.MUXFAIL[0] = (gDRG.LTC_DRG_RAW[3] >> 5) & 0x1;
+          gDRG.MUXFAIL[1] = (gDRG.LTC_DRG_RAW[6] >> 5) & 0x1;
+
+          gDRG.REV[0] = gDRG.LTC_DRG_RAW[3] >> 6;
+          gDRG.REV[1] = gDRG.LTC_DRG_RAW[6] >> 6;
+        }
+      }
+    }
+  }
+  return PECStatus;
+}
+
+
+
+/*********************************************************************
+ * Function:        uint8_t LTC_MeasureVoltage( uint16_t Status );
+ *
+ * Overview:        Use this function to start measuring cell voltage
+ *                  with LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           Global gCVAD, Status = EV__LTC_V_Start / EV__LTC_V_Wait
+ *                   *
+ * Output:          OK = PEC OK, NOK = PEC NOK
+ *
+ * Side Effects:    ~13ms stall
+// ********************************************************************/
+uint8_t LTC_MeasureVoltage( uint8_t CMD, uint8_t CMD_PEC, uint16_t Status )
+{
+  int8_t  i, j;                        // Laufindex
+  uint8_t PECStatus = LTC_OK;
+
+  
+  if(Status == (unsigned)EV__LTC_V_Start)
+  {
+      LTC_SetCFG(CDC_1, 0x00, 0x00FFFFFF);   // Set Balancing Off
+      LTC_StartMeasure( CMD, CMD_PEC);       // Start Voltage Measure
+  }
+
+  if(Status == (unsigned)EV__LTC_V_Wait)
+  {
+    if(PORTC & LTC_ADC_Ready)           // ADC not running
+    {
+      LATAbits.LATA5 = 1;               // CS SPI OFF
+
+      LTC_SetCFG(CDC_1, CAN_BAL, ~CAN_BAL);   // Set Balancing Outs
+      // Read all cell voltage
+      LTC_Read(RDCV, RDCV_PEC, 40, (unsigned char *)&gCVAD.LTC_CVAD_RAW[0]);
+
+      if( LTC_CalcPEC(&gCVAD.LTC_CVAD_RAW[2], 18) != gCVAD.LTC_CVAD_RAW[20])
+      {
+        PECStatus = LTC_NOK;
+      }
+      else
+      {
+        if( LTC_CalcPEC(&gCVAD.LTC_CVAD_RAW[21], 18) != gCVAD.LTC_CVAD_RAW[39])
+        {
+          PECStatus = LTC_NOK;
+        }
+        else
+        {
+          //reassemble Data and calc Voltage
+          for(i=0; i<24 ; i=i+2)                        // Loop über alle Zellen
+          {
+            j = i + (i>>1);                             // Index j = 1.5 x i
+            if(i>11) j++;                               // jump PEC_L
+
+            // siehe Applications Note LTC 6803-3 Seite 24
+            gCVAD.CVAD[i]   = LTC_Field2IntEven( gCVAD.LTC_CVAD_RAW[j+2], gCVAD.LTC_CVAD_RAW[j+3]);
+            gCVAD.CVAD[i+1] = LTC_Field2IntOdd(  gCVAD.LTC_CVAD_RAW[j+3], gCVAD.LTC_CVAD_RAW[j+4]);
+          }
+        }
+      }
+    }
+  }
+  return PECStatus;
+}
+
+
+
+/*********************************************************************
+ * Function:        uint8_t LTC_runMeasureTemperature( uint8_t  CMD,
+ *                                                     uint8_t  CMD_PEC,
+ *                                                     uint16_t Status );
+ *
+ * Overview:        Use this function to start measuring Temperature
+ *                  with LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           CMD & CMD_PEC, Global gTMP, Status
+ *                  Status = EV__LTC_T_Start, EV__LTC_T_Wait
+ *                  CMD = STTMPAD_ALL, STTMPAD_ST1, STTMPAD_ST
+ *
+ * Output:          OK = PEC OK, NOK = PEC NOK
+ *
+ * Side Effects:    ~4ms stall of LTC
+ ********************************************************************/
+uint8_t LTC_MeasureTemperature( uint8_t CMD, uint8_t CMD_PEC, uint16_t Status )
+{
+  int8_t   i, j;                        // Laufindex
+  int16_t  iBufTMP;                     // Zwischenspeicher
+  uint8_t  Cycle = 0;                   // Temperature MUX Count
+  uint8_t  RCT_Cycle = 0;               // new runindex for MUX2
+  uint8_t  PECStatus = LTC_OK;
+
+
+  // Start Cell Temperature ADC Conversions - poll status
+  if(Status == (unsigned)EV__LTC_T_Start)
+  {
+    LTC_StartMeasure(CMD, CMD_PEC);
+  }
+
+  if(Status == (unsigned)EV__LTC_T_Wait)
+  {
+    if(PORTC & LTC_ADC_Ready)           // ADC not running
+    {
+      LATAbits.LATA5 = 1;               // CS SPI OFF
+
+      // Read all cell temperature
+      LTC_Read(RDTMP, RDTMP_PEC, 14, (unsigned char *)&gTMP.LTC_TMP_RAW[0]);
+
+      // Check for Errors
+      if( LTC_CalcPEC(&gTMP.LTC_TMP_RAW[2], 5) != gTMP.LTC_TMP_RAW[7])
+      {
+        PECStatus = LTC_NOK;
+      }
+      else
+      {
+        if( LTC_CalcPEC(&gTMP.LTC_TMP_RAW[8], 5) != gTMP.LTC_TMP_RAW[13])
+        {
+          PECStatus = LTC_NOK;
+        }
+        else
+        {
+          // Extract Data
+          j=2;                                         // Index in RAW
+          Cycle = LATC & 0x07;                         // Extract MUX
+          Cycle--;
+          RCT_Cycle = 5 - Cycle;                       // set new Cycle
+
+          for(i=0; i<24; i=i+12)                       // Loop over LTC Modules*2*TMP
+          {
+            // siehe Applications Note LTC 6803-3 Seite 25
+            iBufTMP = LTC_Field2IntEven( gTMP.LTC_TMP_RAW[j], gTMP.LTC_TMP_RAW[j+1] );
+            gTMP.ETMP[2*Cycle+i] = LTC_CONV_UMESS_2_TEMP(iBufTMP);
+      
+            j++;
+            iBufTMP = LTC_Field2IntOdd( gTMP.LTC_TMP_RAW[j], gTMP.LTC_TMP_RAW[j+1] );
+            gTMP.ETMP[2*RCT_Cycle+i+1] = LTC_CONV_UMESS_2_TEMP(iBufTMP);
+
+            j = j + 2;
+            iBufTMP = LTC_Field2IntEven( gTMP.LTC_TMP_RAW[j], gTMP.LTC_TMP_RAW[j+1] );
+            gTMP.ITMP[i/12] = (iBufTMP >> 3) - 273;
+    
+            j = j + 3;
+          }
+          gTMP.THSD[0] = (gTMP.LTC_TMP_RAW[6]  >> 4) & 0x1;
+          gTMP.THSD[1] = (gTMP.LTC_TMP_RAW[12] >> 4) & 0x1;
+        }
+      }
+    }
+  }
+  return PECStatus;
+}
+
+
+
+/*********************************************************************
+ * Function:        uint8_t LTC_CalcPEC(uint8_t *Array, uint8_t SizeOf)
+ *
+ * Overview:        Use this function to calculate CRC Checksum (PEC)
+ *                  for LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           *Array, SizeOf - Number of Elements
+ *
+ * Output:          PEC
+ *
+ * Side Effects:    None
+ **********************************************************************/
+uint8_t LTC_CalcPEC(uint8_t *Array, uint8_t Size_Of)
+{
+  uint8_t i;                       // Laufindex
+  int8_t  k;                       // Laufindex
+  uint8_t PEC = 0x41;              // PEC Startwert
+  uint8_t DIN = 0;                 // Input Buffer
+  uint8_t IN0 = 0;                 // Zwischenspeicher
+  uint8_t IN1 = 0;                 // Zwischenspeicher
+  uint8_t IN2 = 0;                 // Zwischenspeicher
+
+  for(i=0;i<Size_Of;i++)           // Loop über alle Elemente
+  {
+    for(k=0;k<8;k++)               // Loop über alle Bits
+    {
+      DIN = Array[i] & (0x0080 >> k);       // Berechnung nach Datenblatt
+      DIN = (DIN >> (7 - k));
+      IN0 = DIN ^ ((PEC & 0x0080) >> 7);
+      IN1 = (PEC & 0x0001) ^ IN0;
+      IN2 = ((PEC & 0x0002) >> 1) ^ IN0;
+      PEC = (PEC << 1);
+      PEC = (PEC & 0x00F8) | ((IN2 << 2) |(IN1 << 1) | IN0);
+    }
+  }
+  return PEC;
+}
+
+
+
+/*********************************************************************
+ * Function:        void InitSPI( void )
+ *
+ * Overview:        Use this function to config SPI for LTC6803 module
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ **********************************************************************/
+void InitSPI( void )
+{
+  // RC3 is connected to SCK: Serial clock input
+  TRISCbits.TRISC3 = 0;
+  // RC5 is connected to SI: Serial data I/O (MCP23017), Serial data input (MCP23S17)
+  TRISCbits.TRISC5 = 0;
+  // SSPxCON1: MSSPx CONTROL REGISTER 1 (I2C? MODE)
+  // SSPEN=1, 1 = Enables the serial port and configures the SDAx and SCLx pins as the serial port pins
+  // SSPM<3:0>=0010, 0010 = SPI Master mode, clock = FOSC/64
+  // CKP=1, 1 = Idle state for clock is a high level
+  SSPCON1 = 0x32;//SSP1CON1 = 0x32; // 00100010
+  // CKE: SPI Clock Select bit
+  // 1 = Transmit occurs on transition from active to Idle clock state
+  // 0 = Transmit occurs on transition from Idle to active clock state
+  SSPSTATbits.CKE = 0;//SSP1STATbits.CKE = 0;
+  // SSP1IF: MSSP1 Interrupt Flag bit
+  //1 = The transmission/reception is complete (must be cleared in software)
+  //0 = Waiting to transmit/receive
+  PIR1bits.SSPIF = 0;
+}
+
+
+
+/*********************************************************************
+ * Function:        int16_t LTC_Field2IntEven( uint8_t ucByteLow,
+ *                                             uint8_t ucByteHigh)
+ *
+ * Overview:        Use this function to extract an int Variable
+ *                  out of LTC-Bitfield at known even Address and calculate
+ *                  Voltage
+ *
+ * PreCondition:    None
+ *
+ * Input:           2 Byte out of LTC_Bitfield
+ *
+ * Output:          Extracted Integer representing Voltage (mV)
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int16_t LTC_Field2IntEven( uint8_t ucByteLow, uint8_t ucByteHigh)
+{
+    int16_t   iBuffer = 0;
+
+    iBuffer = ucByteHigh & 0xF;                        // H Nibble isolieren
+    iBuffer = (iBuffer << 8) + ucByteLow;              // H Nibble in Position + M + L
+    iBuffer = iBuffer - 512;                           // Offset 512 Korrektur
+    if(iBuffer>=0)
+      iBuffer = iBuffer + (iBuffer >> 1);              // ADCinc x 1,5 = X mV
+    else
+      iBuffer = iBuffer + ((iBuffer  >> 1) + 0x8000);  // ADCinc x 1,5 = X mV (bei negativen Zahlen)
+    
+    return iBuffer;
+}
+
+
+
+/*********************************************************************
+ * Function:        int16_t LTC_Field2IntOdd( uint8_t ucByteLow,
+ *                                            uint8_t ucByteHigh)
+ *
+ * Overview:        Use this function to extract an int Variable
+ *                  out of LTC-Bitfield at known odd Address and calculate
+ *                  Voltage
+ *
+ * PreCondition:    None
+ *
+ * Input:           2 Byte out of LTC_Bitfield
+ *
+ * Output:          Extracted Integer representing Voltage (mV)
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int16_t LTC_Field2IntOdd( uint8_t ucByteLow, uint8_t ucByteHigh)
+{
+    int16_t   iBuffer = 0;
+
+    iBuffer = ucByteHigh;                              // H und M Nibble isolieren
+    iBuffer = (iBuffer << 4) + (ucByteLow >> 4);       // H und M Nibble in Position + L Nibble
+    iBuffer = iBuffer - 512;                           // Offset 512 Korrektur
+    if(iBuffer>=0)
+      iBuffer = iBuffer + (iBuffer >> 1);              // ADCinc x 1,5 = X mV
+    else
+      iBuffer = iBuffer + ((iBuffer  >> 1) + 0x8000);  // ADCinc x 1,5 = X mV (bei negativen Zahlen)
+
+    return iBuffer;
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_StartMeasure(uint8_t COMAND, uint8_t COMAND_PEC);
+ *
+ * Overview:        Use this function sends Command Sequence for Measurment
+ *
+ * PreCondition:    None
+ *
+ * Input:           Command Byte & Command PEC
+ *
+ * Output:          none
+ *
+ * Side Effects:    uses SPI
+ **********************************************************************/
+void LTC_StartMeasure(uint8_t COMAND, uint8_t COMAND_PEC)
+{
+  LATAbits.LATA5 = 0;               // CS SPI ON
+  SSPBUF=COMAND;	            // Send Command Byte
+  while(!PIR1bits.SSPIF);	    // Warten bis die Daten gesendet wurden
+  PIR1bits.SSPIF = 0;		    // clear SSPIF Bit
+  SSPBUF=COMAND_PEC;      	    // PEC Byte
+  while(!PIR1bits.SSPIF);	    // Warten bis die Daten gesendet wurden
+  PIR1bits.SSPIF = 0;		    // clear SSPIF Bit
+}
+
+
+
+/*********************************************************************
+ * Function:        void LTC_Read( uint8_t CMD,
+ *                                 uint8_t CMD_PEC,
+ *                                 uint8_t Length,
+ *                                 uint8_t *ptr),
+ *
+ * Overview:        Use this function read Data from LTC
+ *
+ * PreCondition:    None
+ *
+ * Input:           Command Byte & Command PEC & Data Length & Pointer 2 Start Buffer
+ *
+ * Output:          none
+ *
+ * Side Effects:    uses SPI
+ **********************************************************************/
+void LTC_Read(uint8_t CMD, uint8_t CMD_PEC, uint8_t Length, uint8_t *ptr)
+{
+  uint8_t i;                  // Laufindex
+
+  *ptr     = CMD;                   // Load Command to Buffer
+  *(ptr+1) = CMD_PEC;               // Load Command PEC to Buffer
+  
+  LATAbits.LATA5 = 0;               // CS SPI ON
+  for(i=0;i<Length; i++)
+  {
+    SSPBUF = *(ptr+i);	            // Send Byte
+    while(!PIR1bits.SSPIF);	    // wait until Send complete
+    PIR1bits.SSPIF = 0;	            // clear SSPIF Bit
+    *(ptr+i) = SSPBUF;              // store Data to Buffer
+  }
+  LATAbits.LATA5 = 1;               // CS SPI OFF
+}
+
+
+
+/*********************************************************************
+ * Function:        void InitTimer( void );
+ *
+ * Overview:        Use this function to init Timer 1 for 20ms TimeSlot
+ *
+ * PreCondition:    None
+ *
+ * Input:           -
+ *
+ * Output:          -
+ *
+ * Side Effects:    run Timer 1
+ **********************************************************************/
+void InitTimer(void)
+{
+  T1CONbits.T1CKPS0 = 1; 		// Timer 1 prescalar = 0b00
+  T1CONbits.T1CKPS1 = 1;  		// = (Fosc/4) / 8 = 2MHz
+  IPR1bits.TMR1IP   = 0; 		// 1 = make this a low priority interrupt
+  PIE1bits.TMR1IE   = 1;   		// enable Timer interrupt
+  PIR1bits.TMR1IF   = 0;   		// clear any pending events
+  T1CONbits.RD16    = 1;  	        // 16 Bit read-write mode
+  T1CONbits.TMR1ON  = 1;  	        // Timer A run
+}
+
+
+
+/*********************************************************************
+ * Function:        void Set_LTC_TimeOut( void )
+ *
+ * Overview:        Use this function to set LTC_TimeOut Flag
+ *
+ * PreCondition:    None
+ *
+ * Input:           -
+ *
+ * Output:          -
+ *
+ * Side Effects:    change LTC_TimeOut
+ **********************************************************************/
+void Set_LTC_TimeOut( void )
+{
+  gLTC_TimeOut |= LTC_TimeOut;
+}
+
+int16_t ADC_supply_voltage( void )
+{
+    int16_t analog_reading = 0;
+
+    ADCON0bits.CHS = 0;                  // Set adc channel to read
+    ADCON0bits.GO = 1;                   //Start A/D Conversion
+
+    while(ADCON0bits.GO == 1)
+    {
+        //Loop here until A/D conversion completes
+    };
+
+    analog_reading= ( (((uint16_t)ADRESH << 8)+ADRESL));        // readout ADC
+
+    return analog_reading;
+
+}

+ 270 - 0
ProjectSource/BMS_Slave_RCT/BMS_LTC.h

@@ -0,0 +1,270 @@
+/*********************************************************************
+ *
+ *                  LTC6803 API Header
+ *
+ *********************************************************************
+ * FileName:        BMS_LTC.h
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       17.02.2012   Release
+ * Reiling V.       29.03.2012   Release 2. see change log file
+ *********************************************************************/
+
+//#ifndef LTC_H          // To avoid duplicate inclusion
+#define LTC_H
+
+
+/*********************************************************************
+ *
+ * General purpose typedef's
+ *
+ ********************************************************************/
+typedef union _LTC_CFG
+{
+  struct
+  {
+    uint8_t   LTC_CFG_RAW[16];
+    uint8_t   CDC[2];
+    uint8_t   CELL10[2];
+    uint8_t   LVL_PL[2];
+    uint8_t   GPIO[2];
+    uint8_t   WDT[2];
+    uint16_t  DCC[2];
+    uint16_t  MC[2];
+    int16_t   VUV[2];
+    int16_t   VOV[2];
+  };
+} LTC_CFG;
+
+
+typedef union _LTC_CVAD
+{
+  struct
+  {
+    uint8_t  LTC_CVAD_RAW[40];
+    int16_t  CVAD[24];
+  };
+} LTC_CVAD;
+
+
+typedef union _LTC_TMP
+{
+  struct
+  {
+    uint8_t  LTC_TMP_RAW[14];
+    int8_t   ETMP[24];
+    int8_t   ITMP[2];
+    uint8_t  THSD[2];
+  };
+} LTC_TMP;
+
+
+typedef union _LTC_DRG
+{
+  struct
+  {
+    uint8_t  LTC_DRG_RAW[8];
+    int16_t  REF[2];
+    uint8_t  MUXFAIL[2];
+    uint8_t  REV[2];
+    uint8_t  PEC_Counter;
+  };
+} LTC_DRG;
+
+
+typedef union _LTC_STATUS
+{
+  struct
+  {
+    uint16_t LTC_StatusSlave;
+    uint8_t  LTC_PECFailCounter;
+    int8_t   HeatSinkTemperature;
+    uint16_t LTC_SelfTest;
+  };
+}LTC_STATUS;
+
+
+typedef union _CAN_CONFIG
+{
+  struct
+  {
+    uint8_t   SlaveNo;
+    uint8_t   BRP;
+    uint8_t   PROPSEG;
+    uint8_t   PHSEG1;
+    uint8_t   PHSEG2;
+    uint8_t   SJW;
+    uint8_t   PHSEG2_MODE;
+    uint8_t   BUS_SAMPLE_MODE;
+    uint8_t   WAKEUP_MODE;
+    uint8_t   FILTER_MODE;
+  };
+} CAN_CONFIG;
+
+
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+#define LTC_OK                  0
+#define LTC_NOK            0x8000
+
+// LTC6803-3 Self Test Flags
+#define LTC1_VST1_NOK      0x0001   // Fehler im ersten Test des ADCs im Spannungsmodus
+#define LTC1_VST2_NOK      0x0002   // Fehler im zweiten Test des ADCs im Spannungsmodus
+#define LTC1_TST1_NOK      0x0004   // Fehler im ersten Test des ADCs im Temperaturmodus
+#define LTC1_TST2_NOK      0x0008   // Fehler im zweiten Test des ADCs im Temperaturmodus
+#define LTC1_RefL_NOK      0x0010   // Referenzspannung low - Underflow
+#define LTC1_RefH_NOK      0x0020   // Referenzspannung high - Overflow
+#define LTC1_MUX_NOK       0x0040   // Fehler des internen Multiplexers des LTC
+#define LTC_PEC_NOK        0x0080   // PEC Fehler innerhalb der LTC_SelfTest( ) Abarbeitung
+#define LTC2_VST1_NOK      0x0100   // Fehler im ersten Test des ADCs im Spannungsmodus
+#define LTC2_VST2_NOK      0x0200   // Fehler im zweiten Test des ADCs im Spannungsmodus
+#define LTC2_TST1_NOK      0x0400   // Fehler im ersten Test des ADCs im Temperaturmodus
+#define LTC2_TST2_NOK      0x0800   // Fehler im zweiten Test des ADCs im Temperaturmodus
+#define LTC2_RefL_NOK      0x1000   // Referenzspannung low - Underflow
+#define LTC2_RefH_NOK      0x2000   // Referenzspannung high - Overflow
+#define LTC2_MUX_NOK       0x4000   // Fehler des internen Multiplexers des LTC
+
+// LTC6803-3 Status Flags
+#define WarnLowTemp           -40   // Untergrenze bei der eine Warnung generiert wird
+#define WarnHighTemp           80   // Obergrenze bei der eine Warnung generiert wird
+#define LTC1_LowTemp_NOK   0x0001
+#define LTC2_LowTemp_NOK   0x0002
+#define LTC1_HighTemp_NOK  0x0004
+#define LTC2_HighTemp_NOK  0x0008
+#define LTC1_THSD_NOK      0x0010
+#define LTC2_THSD_NOK      0x0020
+#define LTC_TimeOut        0x0040
+#define LTC_PEC_NOK        0x0080
+#define RELAIS_ON          0x0100
+#define CAN_Rx_Overrun     0x0200
+#define CAN_Rx_Warning     0x0400
+#define CAN_Rx_Passiv      0x0800
+#define CAN_Tx_Warning     0x1000
+#define CAN_Tx_Passiv      0x2000
+
+
+
+// LTC6803-3 Command Codes
+#define WRCFG                0x01   // Write config
+#define RDCFG                0x02   // Read config
+#define RDCV                 0x04   // Read cells
+#define RDFLG                0x0C   // Read flags
+#define RDTMP                0x0E   // Read Temps
+#define STCVAD_ALL           0x10   // Start all A/D's - poll status
+#define STCVAD_CLR           0x1D   // Start clear all A/D's - poll status - read 0xFF
+#define STCVAD_ST1           0x1E   // Start Self Test 1 all A/D's - poll status - read 0x55
+#define STCVAD_ST2           0x1F   // Start Self Test 2 all A/D's - poll status - read 0xAA
+#define STOWAD               0x20   // Start testing all open wire - poll status
+#define STTMPAD_ALL          0x30   // Start all temperatures A/D's - poll status
+#define STTMPAD_ST1          0x3E   // Start Self Test 1 all temperatures A/D's - poll status - read 0x55
+#define STTMPAD_ST2          0x3F   // Start Self Test 2 all temperatures A/D's - poll status - read
+#define PLINT 	             0x50   // Poll Interrupt Status
+#define DAGN                 0x52   // Start Diagnose and Poll Status
+#define RDDGNR               0x54   // Read Diagnostic Register
+
+#define WRCFG_PEC            0xC7
+#define RDCFG_PEC            0xCE
+#define STCVAD_ALL_PEC       0xB0
+#define STCVAD_CLEAR_PEC     0x93
+#define STCVAD_ST1_PEC       0x9A
+#define STCVAD_ST2_PEC       0x9D
+#define RDCV_PEC             0xDC
+#define STTMPAD_ALL_PEC      0x50
+#define STTMPAD_ST1_PEC      0x7A
+#define STTMPAD_ST2_PEC      0x7D
+#define RDTMP_PEC            0xEA
+#define DAGN_PEC             0x79
+#define RDDGNR_PEC           0x6B
+
+#define CDC_0                   0   // Comperator OFF,    Measure OFF
+#define CDC_1                   1   // Comperator OFF,    Measure 13ms
+#define CDC_2                   2   // Comperator 13ms,   Measure 13ms
+#define CDC_3                   3   // Comperator 130ms,  Measure 13ms
+#define CDC_4                   4   // Comperator 500ms,  Measure 13ms
+#define CDC_5                   5   // Comperator 130ms,  Measure 21ms
+#define CDC_6                   6   // Comperator 500ms,  Measure 21ms
+#define CDC_7                   7   // Comperator 2000ms, Measure 21ms
+
+#define LVLPL                0x10   // Level Polling
+
+#define On                      1
+#define Off                     0
+
+#define EV__TimeSlot30ms   0x0001
+#define EV__TimeSlot100ms  0x0002
+#define EV__TimeSlot160ms  0x0004
+#define EV__TimeSlot1000ms 0x0008
+#define EV__LTC_V_Start    0x0010
+#define EV__LTC_V_Wait     0x0020
+#define EV__LTC_T_Start    0x0040
+#define EV__LTC_T_Wait     0x0080
+#define EV__LTC_S_Start    0x0010
+#define EV__LTC_S_Wait     0x0020
+
+#define LTC_ADC_Ready        0x10
+
+
+#define SlaveNo_VAL         0
+#define BRP_VAL             4
+#define PROPSEG_VAL         1
+#define PHSEG1_VAL          8
+#define PHSEG2_VAL          6
+#define SJW_VAL             1
+#define PHSEG2_MODE_VAL     1
+#define BUS_SAMPLE_MODE_VAL ECAN_BUS_SAMPLE_MODE_THRICE
+#define WAKEUP_MODE_VAL     ECAN_WAKEUP_MODE_ENABLE
+#define FILTER_MODE_VAL     ECAN_FILTER_MODE_DISABLE
+
+#define MAX_ALIVE           8
+#define MAX_MUX             6
+
+#define VOLTAGE_MIN         2800
+#define VOLTAGE_MAX         3600
+#define CELL_BYPASSED       3
+
+#define TEMP_MIN            10
+#define TEMP_MAX            50
+#define BAL_TEMP_MIN        0
+#define BAL_TEMP_MAX        70
+#define TEMP_NOT_CON        -45
+
+
+
+/*********************************************************************
+*
+*                        Function Prototypes
+*
+*********************************************************************/
+void     LTC_Init                ( void );
+void     LTC_Do                  ( uint16_t *gEvent );
+void     LTC_BalanceOn           ( uint8_t No );
+void     LTC_BalanceOff          ( uint8_t No );
+void     LTC_Terminate           ( void );
+int16_t  LTC_GetVoltage          ( uint8_t No );
+int16_t  LTC_GetTemperature      ( uint8_t No );
+void     LTC_GetStatus           ( LTC_STATUS *LTC_Status );
+void     LTC_GetHeatSink         ( LTC_STATUS *LTC_Status );
+uint16_t LTC_SelfTest            ( void );
+
+void     LTC_SetCFG              ( uint8_t CDC, uint32_t setDCC, uint32_t clearDCC );
+uint8_t  LTC_GetCFG              ( void );
+uint8_t  LTC_MeasureVoltage      ( uint8_t CMD, uint8_t CMD_PEC, uint16_t Status );
+uint8_t  LTC_MeasureTemperature  ( uint8_t CMD, uint8_t CMD_PEC, uint16_t Status );
+uint8_t  LTC_CalcPEC             ( uint8_t *Array, uint8_t Size_Of );
+void     InitSPI                 ( void );
+int16_t  LTC_Field2IntEven       ( uint8_t ucByteLow, uint8_t ucByteHigh );
+int16_t  LTC_Field2IntOdd        ( uint8_t ucByteLow, uint8_t ucByteHigh );
+void     LTC_StartMeasure        ( uint8_t COMAND, uint8_t COMAND_PEC );
+void     LTC_Read                ( uint8_t CMD, uint8_t  CMD_PEC, uint8_t Length, uint8_t *ptr );
+uint8_t  LTC_MeasureDiag         ( uint16_t Status );
+void     InitTimer               ( void );
+void     Set_LTC_TimeOut         ( void );
+int16_t  ADC_supply_voltage      ( void );

+ 38 - 0
ProjectSource/BMS_Slave_RCT/BMS_MISRA.h

@@ -0,0 +1,38 @@
+ /*********************************************************************
+ *
+ *                  BMS_MISRA Header
+ *
+ *********************************************************************
+ * FileName:        BMS_MISRA.h
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       30.03.2012   Release
+ *********************************************************************/
+
+//#ifndef MISRA_H     // To avoid duplicate inclusion
+#define MISRA_H
+
+
+
+/*********************************************************************
+ *
+ * MISRA purpose typedef's
+ *
+ ********************************************************************/
+typedef           char   char_t;
+typedef signed    char   int8_t;
+typedef signed    short  int16_t;
+typedef signed    long   int32_t;
+//typedef signed    long   int64_t;      // Nicht mit PIC Compiler möglich
+typedef unsigned  char   uint8_t;
+typedef unsigned  short  uint16_t;
+typedef unsigned  long   uint32_t;
+//typedef unsigned  long   uint64_t;     // Nicht mit PIC Compiler möglich
+typedef           float  float32_t;
+//typedef           double float64_t;    // Nicht mit PIC Compiler möglich
+//typedef long      double float128_t;   // Nicht mit PIC Compiler möglich
+

+ 78 - 0
ProjectSource/BMS_Slave_RCT/BMS_NTC28.c

@@ -0,0 +1,78 @@
+/*********************************************************************
+ *
+ *                  NTC28 C File
+ *
+ *********************************************************************
+ * FileName:        NTC28.c
+ * Processor:       PIC18F45K80
+ * Complier:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Ott W.           01.06.2016   Release 1.
+ *********************************************************************/
+
+#include "BMS_Slave.h"
+
+
+
+/*********************************************************************
+*
+*                             Globals
+*
+*********************************************************************/
+/* Look Up Table für NTC103JT-025-3P Temperaturbestimmung von -50°C bis +90°C in 1°K Schritten */
+const rom int16_t NTC_LookUp[142]=                         /*!e950*/
+   {4511,4503,4496,4488,4479,4470,4461,4452,4441,4431,
+    4420,4408,4396,4383,4370,4356,4342,4327,4311,4295,
+    4278,4261,4242,4223,4204,4183,4162,4140,4118,4095,
+    4071,4046,4020,3993,3965,3937,3908,3878,3847,3816,
+    3784,3751,3717,3682,3647,3611,3574,3537,3499,3461,
+    3422,3382,3341,3300,3259,3217,3175,3132,3090,3046,
+    3002,2959,2914,2870,2825,2781,2736,2691,2647,2603,
+    2558,2513,2469,2425,2381,2337,2293,2250,2206,2164,
+    2121,2079,2037,1996,1955,1914,1875,1835,1796,1758,
+    1720,1683,1646,1610,1574,1539,1505,1471,1438,1405,
+    1373,1342,1311,1280,1250,1221,1193,1165,1137,1110,
+    1084,1059,1034,1009,985,962,939,916,895,873,
+    853,832,812,793,774,756,738,720,703,686,
+    670,654,638,623,608,594,580,566,553,539,
+    527,515};
+
+
+
+/*********************************************************************
+ * Function:        int8_t LTC_CONV_UMESS_2_TEMP( int16_t Umess )
+ *
+ * Overview:        Use this function to convert Umess 2 Temperature
+ *                  for Temperature Sensor  103JT-025-3P
+ *
+ * PreCondition:    None
+ *
+ * Input:           Voltage [mV]  [0..5000mV]
+ *
+ * Output:          Temperature [°C]   [-50°C..+90°C]
+ *                  -51°C = Underflow; +91°C = Overflow
+ *
+ * Side Effects:    None
+ **********************************************************************/
+int8_t LTC_CONV_UMESS_2_TEMP( int16_t Umess )
+{
+  int8_t  Temp = -51;
+  uint8_t i = 0;
+  
+  if(Umess < 516)                       /* OverFlow (>90°C) */
+  {
+     Temp = 91;                         /* Break Search */
+  }
+  else
+  {
+    while((NTC_LookUp[i] >= Umess))
+    {
+      i++;
+      Temp++;
+    }
+  }
+  return Temp;
+}

+ 25 - 0
ProjectSource/BMS_Slave_RCT/BMS_NTC28.h

@@ -0,0 +1,25 @@
+/*********************************************************************
+ *
+ *                  NTC28 Header
+ *
+ *********************************************************************
+ * FileName:        NTC28.h
+ * Processor:       PIC18F45K80
+ * Complier:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author          Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.      17.02.2012   Release
+ *********************************************************************/
+
+//#ifndef NTC28_H          // To avoid duplicate inclusion
+#define NTC28_H
+
+
+/*********************************************************************
+ *
+ * Funktions Prototypen
+ *
+ ********************************************************************/
+int8_t LTC_CONV_UMESS_2_TEMP(int16_t Umess);

+ 2091 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/BMS_Slave.map

@@ -0,0 +1,2091 @@
+MPLINK 4.42, Linker
+Linker Map File - Created Mon Jun 18 14:14:19 2012
+
+                                 Section Info
+                  Section       Type    Address   Location Size(Bytes)
+                ---------  ---------  ---------  ---------  ---------
+               _entry_scn       code   0x000000    program   0x000006
+           .code___init.o       code   0x000006    program   0x000002
+      .idata_fxd0808u.o_i    romdata   0x000008    program   0x000000
+      .romdata_fxd0808u.o    romdata   0x000008    program   0x000000
+     .romdata_BMS_Slave.o    romdata   0x000008    program   0x000000
+     .idata_BMS_Slave.o_i    romdata   0x000008    program   0x000006
+      .idata_fxd1616u.o_i    romdata   0x000008    program   0x000000
+      .romdata_fxd1616u.o    romdata   0x000008    program   0x000000
+      .idata_fxd3232u.o_i    romdata   0x000008    program   0x000000
+       .romdata_BMS_LTC.o    romdata   0x000008    program   0x000000
+      .romdata_fxd3232u.o    romdata   0x000008    program   0x000000
+      .romdata_BMS_ECAN.o    romdata   0x000008    program   0x000000
+        .idata___init.o_i    romdata   0x000008    program   0x000000
+       .romdata_BMS_CAN.o    romdata   0x000008    program   0x000000
+        .romdata___init.o    romdata   0x000008    program   0x000000
+         .romdata_c018i.o    romdata   0x000008    program   0x000000
+         .idata_c018i.o_i    romdata   0x000008    program   0x000000
+       .idata_BMS_LTC.o_i    romdata   0x00000e    program   0x000008
+     .idata_BMS_NTC28.o_i    romdata   0x00000e    program   0x000000
+      .idata_BMS_ECAN.o_i    romdata   0x000016    program   0x000000
+       .idata_BMS_CAN.o_i    romdata   0x000016    program   0x000000
+            .code_c018i.o       code   0x000016    program   0x000000
+                low_vetor       code   0x000018    program   0x000006
+                   .cinit    romdata   0x00001e    program   0x00001a
+          .code_BMS_LTC.o       code   0x000038    program   0x00197e
+          .code_BMS_CAN.o       code   0x0019b6    program   0x000b78
+         .code_BMS_ECAN.o       code   0x00252e    program   0x000938
+        .code_BMS_Slave.o       code   0x002e66    program   0x000378
+     .romdata_BMS_NTC28.o    romdata   0x0031de    program   0x00011c
+               _cinit_scn       code   0x0032fa    program   0x00009e
+                     PROG       code   0x003398    program   0x00009c
+        .code_BMS_NTC28.o       code   0x003434    program   0x00009a
+         .code_fxd3232u.o       code   0x0034ce    program   0x000048
+             D10KTCYXCODE       code   0x003516    program   0x00002e
+         .code_fxd1616u.o       code   0x003544    program   0x00002c
+                    .code       code   0x003570    program   0x000020
+             _startup_scn       code   0x003590    program   0x00001c
+             D100TCYXCODE       code   0x0035ac    program   0x00001c
+         .code_fxd0808u.o       code   0x0035c8    program   0x00001c
+.config_300000_BMS_Slave.o    romdata   0x300000    program   0x000001
+.config_300001_BMS_Slave.o    romdata   0x300001    program   0x000001
+.config_300003_BMS_Slave.o    romdata   0x300003    program   0x000001
+                MATH_DATA      udata   0x000000       data   0x000010
+                 .tmpdata      udata   0x000010       data   0x000008
+               my_isr_tmp      udata   0x000018       data   0x000004
+                DELAYDAT2      udata   0x00001c       data   0x000001
+                DELAYDAT1      udata   0x00001d       data   0x000001
+         .udata_BMS_CAN.o      udata   0x000100       data   0x0000cf
+           .udata_c018i.o      udata   0x0001cf       data   0x00000a
+         .idata_BMS_LTC.o      idata   0x0001d9       data   0x000008
+       .idata_BMS_Slave.o      idata   0x0001e1       data   0x000006
+        .udata_BMS_ECAN.o      udata   0x0001e7       data   0x000001
+        .udata_fxd3232u.o      udata   0x0001e8       data   0x000000
+        .idata_fxd1616u.o      idata   0x0001e8       data   0x000000
+        .udata_fxd1616u.o      udata   0x0001e8       data   0x000000
+        .idata_fxd0808u.o      idata   0x0001e8       data   0x000000
+        .udata_fxd0808u.o      udata   0x0001e8       data   0x000000
+           .idata_c018i.o      idata   0x0001e8       data   0x000000
+         .idata_BMS_CAN.o      idata   0x0001e8       data   0x000000
+        .idata_fxd3232u.o      idata   0x0001e8       data   0x000000
+          .udata___init.o      udata   0x0001e8       data   0x000000
+          .idata___init.o      idata   0x0001e8       data   0x000000
+        .idata_BMS_ECAN.o      idata   0x0001e8       data   0x000000
+       .udata_BMS_Slave.o      udata   0x0001e8       data   0x000000
+       .idata_BMS_NTC28.o      idata   0x0001e8       data   0x000000
+       .udata_BMS_NTC28.o      udata   0x0001e8       data   0x000000
+         .udata_BMS_LTC.o      udata   0x000200       data   0x0000bd
+                   .stack      udata   0x000d00       data   0x000100
+              SFR_BANKED0      udata   0x000e41       data   0x0000bf
+              SFR_BANKED1      udata   0x000f00       data   0x000040
+              SFR_BANKED2      udata   0x000f46       data   0x00001a
+            SFR_UNBANKED0      udata   0x000f60       data   0x0000a0
+
+
+
+                              Program Memory Usage 
+                               Start         End      
+                           ---------   ---------      
+                            0x000000    0x000015      
+                            0x000018    0x0035e3      
+                            0x300000    0x300001      
+                            0x300003    0x300003      
+            13797 out of 33816 program addresses used, program memory utilization is 40%
+
+
+
+                              Symbols - Sorted by Name
+                     Name    Address   Location    Storage File                     
+                ---------  ---------  ---------  --------- ---------                
+                 CAN_Init   0x0019b6    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+         CAN_Init_Mailbox   0x001b96    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                 CAN_Read   0x001d46    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+       CAN_Read_Balancing   0x00207c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                CAN_Write   0x001ca2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+         CAN_Write_Status   0x002248    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+    CAN_Write_Temperature   0x001f90    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+        CAN_Write_Voltage   0x001de4    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                   D0808S   0x0033ae    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                D0808SNEG   0x0033bc    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                 D0808SOK   0x0033b8    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                  D0808SX   0x0033c2    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                   D100_1   0x0035ba    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+                    D100x   0x0035b8    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+                   D10K_1   0x003522    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                    D10Kl   0x00352e    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                    D10Kx   0x003520    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                   D3232S   0x0033fc    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                D3232SNEG   0x00340a    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                 D3232SOK   0x003406    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                  D3232SX   0x00342a    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                  DA0808S   0x0033a4    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                  DA3232S   0x0033e6    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+             Delay100TCYx   0x0035ac    program     extern C:\MCC18\src\traditional\delays\d100tcyx.asm
+             Delay10KTCYx   0x003516    program     extern C:\MCC18\src\traditional\delays\d10ktcyx.asm
+           ECANInitialize   0x00252e    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+       ECANReceiveMessage   0x002858    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+          ECANSendMessage   0x0025b2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+     ECANSetOperationMode   0x002ab8    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                 FXD0808S   0x003398    program     extern C:\MCC18\src\traditional\math\fxd0808s.asm
+                 FXD0808U   0x0035c8    program     extern C:\MCC18\src\traditional\math\fxd0808u.c
+                 FXD1616U   0x003544    program     extern C:\MCC18\src\traditional\math\fxd1616u.c
+                 FXD3232S   0x0033cc    program     extern C:\MCC18\src\traditional\math\fxd3232s.asm
+                 FXD3232U   0x0034ce    program     extern C:\MCC18\src\traditional\math\fxd3232u.c
+                  InitSPI   0x001758    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                InitTimer   0x0019a0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+           LTC_BalanceOff   0x0003f8    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_BalanceOn   0x00035c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+    LTC_CONV_UMESS_2_TEMP   0x003434    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+              LTC_CalcPEC   0x0015f0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                   LTC_Do   0x0001ba    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+        LTC_Field2IntEven   0x001766    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+         LTC_Field2IntOdd   0x001822    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+               LTC_GetCFG   0x000e20    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_GetStatus   0x000560    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+       LTC_GetTemperature   0x000518    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+           LTC_GetVoltage   0x0004b4    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                 LTC_Init   0x000038    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+          LTC_MeasureDiag   0x00104c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+   LTC_MeasureTemperature   0x001354    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+       LTC_MeasureVoltage   0x001174    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                 LTC_Read   0x00190c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             LTC_SelfTest   0x00073c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+               LTC_SetCFG   0x000b42    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+         LTC_StartMeasure   0x0018e2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_Terminate   0x000494    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             Load_Mailbox   0x00232a    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+               NTC_LookUp   0x0031de    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+          Set_LTC_TimeOut   0x0019b0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             _CANIDToRegs   0x002ae0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+       _D100TCYXCODE_0008   0x0035b4    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D100TCYXCODE_0012   0x0035be    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D100TCYXCODE_0018   0x0035c4    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D10KTCYXCODE_0010   0x003526    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+       _D10KTCYXCODE_001C   0x003532    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+             _RegsToCANID   0x002c90    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+      ___case_27_lbl00019   0x003076    program     static                          
+      ___case_43_lbl00018   0x003074    program     static                          
+      ___case_51_lbl00015   0x00306a    program     static                          
+      ___case_56_lbl00016   0x003070    program     static                          
+      ___case_58_lbl00017   0x003072    program     static                          
+      ___default_lbl00020   0x003078    program     static                          
+       ___return_lbl00000   0x00001c    program     static                          
+       ___return_lbl00000   0x000004    program     static                          
+       ___return_lbl00000   0x003514    program     static                          
+       ___return_lbl00000   0x0035e2    program     static                          
+       ___return_lbl00000   0x00356e    program     static                          
+       ___return_lbl00001   0x0035aa    program     static                          
+       ___return_lbl00002   0x003396    program     static                          
+       ___return_lbl00013   0x003082    program     static                          
+   ___switchexit_lbl00014   0x00307a    program     static                          
+               __config_0   0x300000    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+               __config_1   0x300001    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+               __config_2   0x300003    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                   __init   0x000006    program     extern C:\MCC18\src\traditional\stdclib\__init.c
+            __zero_memory   0x003570    program     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                _do_cinit   0x0032fa    program     extern C:\MCC18\src\traditional\startup\c018i.c
+                   _entry   0x000000    program     extern C:\MCC18\src\traditional\startup\c018i.c
+                   _false   0x003510    program     static                          
+                 _startup   0x003590    program     extern C:\MCC18\src\traditional\startup\c018i.c
+                compare_l   0x003586    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                copy_loop   0x00336c    program     static                          
+            copy_one_byte   0x003372    program     static                          
+                     done   0x003396    program     static                          
+             done_copying   0x003380    program     static                          
+                  endloop   0x0035de    program     static                          
+                  endloop   0x00356a    program     static                          
+                      ini   0x00303c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+  interrupt_at_low_vector   0x000018    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                     loop   0x00354e    program     static                          
+                     loop   0x0035d0    program     static                          
+                     loop   0x0035a0    program     static                          
+                     loop   0x0034dc    program     static                          
+                   loop_h   0x00357e    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   loop_l   0x003588    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     main   0x00308c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                   my_isr   0x002e66    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                     test   0x003314    program     static                          
+               zero_block   0x00357e    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON0   0x000fc2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON0bits   0x000fc2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON1   0x000fc1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON1bits   0x000fc1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON2   0x000fc0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON2bits   0x000fc0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    ADRES   0x000fc3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADRESH   0x000fc4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADRESL   0x000fc3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ANCON0   0x000f5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ANCON0bits   0x000f5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ANCON1   0x000f5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ANCON1bits   0x000f5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B0CON   0x000e80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B0CONbits   0x000e80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D0   0x000e86       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D0bits   0x000e86       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D1   0x000e87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D1bits   0x000e87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D2   0x000e88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D2bits   0x000e88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D3   0x000e89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D3bits   0x000e89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D4   0x000e8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D4bits   0x000e8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D5   0x000e8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D5bits   0x000e8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D6   0x000e8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D6bits   0x000e8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D7   0x000e8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D7bits   0x000e8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B0DLC   0x000e85       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B0DLCbits   0x000e85       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0EIDH   0x000e83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0EIDHbits   0x000e83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0EIDL   0x000e84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0EIDLbits   0x000e84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0SIDH   0x000e81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0SIDHbits   0x000e81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0SIDL   0x000e82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0SIDLbits   0x000e82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B1CON   0x000e90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B1CONbits   0x000e90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D0   0x000e96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D0bits   0x000e96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D1   0x000e97       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D1bits   0x000e97       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D2   0x000e98       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D2bits   0x000e98       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D3   0x000e99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D3bits   0x000e99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D4   0x000e9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D4bits   0x000e9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D5   0x000e9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D5bits   0x000e9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D6   0x000e9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D6bits   0x000e9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D7   0x000e9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D7bits   0x000e9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B1DLC   0x000e95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B1DLCbits   0x000e95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1EIDH   0x000e93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1EIDHbits   0x000e93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1EIDL   0x000e94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1EIDLbits   0x000e94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1SIDH   0x000e91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1SIDHbits   0x000e91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1SIDL   0x000e92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1SIDLbits   0x000e92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B2CON   0x000ea0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B2CONbits   0x000ea0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D0   0x000ea6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D0bits   0x000ea6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D1   0x000ea7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D1bits   0x000ea7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D2   0x000ea8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D2bits   0x000ea8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D3   0x000ea9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D3bits   0x000ea9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D4   0x000eaa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D4bits   0x000eaa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D5   0x000eab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D5bits   0x000eab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D6   0x000eac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D6bits   0x000eac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D7   0x000ead       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D7bits   0x000ead       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B2DLC   0x000ea5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B2DLCbits   0x000ea5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2EIDH   0x000ea3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2EIDHbits   0x000ea3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2EIDL   0x000ea4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2EIDLbits   0x000ea4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2SIDH   0x000ea1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2SIDHbits   0x000ea1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2SIDL   0x000ea2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2SIDLbits   0x000ea2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B3CON   0x000eb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B3CONbits   0x000eb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D0   0x000eb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D0bits   0x000eb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D1   0x000eb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D1bits   0x000eb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D2   0x000eb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D2bits   0x000eb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D3   0x000eb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D3bits   0x000eb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D4   0x000eba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D4bits   0x000eba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D5   0x000ebb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D5bits   0x000ebb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D6   0x000ebc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D6bits   0x000ebc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D7   0x000ebd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D7bits   0x000ebd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B3DLC   0x000eb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B3DLCbits   0x000eb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3EIDH   0x000eb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3EIDHbits   0x000eb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3EIDL   0x000eb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3EIDLbits   0x000eb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3SIDH   0x000eb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3SIDHbits   0x000eb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3SIDL   0x000eb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3SIDLbits   0x000eb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B4CON   0x000ec0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B4CONbits   0x000ec0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D0   0x000ec6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D0bits   0x000ec6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D1   0x000ec7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D1bits   0x000ec7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D2   0x000ec8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D2bits   0x000ec8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D3   0x000ec9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D3bits   0x000ec9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D4   0x000eca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D4bits   0x000eca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D5   0x000ecb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D5bits   0x000ecb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D6   0x000ecc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D6bits   0x000ecc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D7   0x000ecd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D7bits   0x000ecd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B4DLC   0x000ec5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B4DLCbits   0x000ec5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4EIDH   0x000ec3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4EIDHbits   0x000ec3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4EIDL   0x000ec4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4EIDLbits   0x000ec4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4SIDH   0x000ec1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4SIDHbits   0x000ec1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4SIDL   0x000ec2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4SIDLbits   0x000ec2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B5CON   0x000ed0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B5CONbits   0x000ed0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D0   0x000ed6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D0bits   0x000ed6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D1   0x000ed7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D1bits   0x000ed7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D2   0x000ed8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D2bits   0x000ed8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D3   0x000ed9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D3bits   0x000ed9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D4   0x000eda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D4bits   0x000eda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D5   0x000edb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D5bits   0x000edb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D6   0x000edc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D6bits   0x000edc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D7   0x000edd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D7bits   0x000edd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B5DLC   0x000ed5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B5DLCbits   0x000ed5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5EIDH   0x000ed3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5EIDHbits   0x000ed3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5EIDL   0x000ed4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5EIDLbits   0x000ed4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5SIDH   0x000ed1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5SIDHbits   0x000ed1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5SIDL   0x000ed2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5SIDLbits   0x000ed2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BAUDCON1   0x000fa7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             BAUDCON1bits   0x000fa7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BAUDCON2   0x000fb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             BAUDCON2bits   0x000fb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     BIE0   0x000e7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BIE0bits   0x000e7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON1   0x000e43       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON1bits   0x000e43       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON2   0x000e44       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON2bits   0x000e44       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON3   0x000e45       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON3bits   0x000e45       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    BSEL0   0x000e7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                BSEL0bits   0x000e7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      BSR   0x000fe0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BSRbits   0x000fe0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CANCON   0x000f6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO0   0x000f3f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO0bits   0x000f3f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO1   0x000f2f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO1bits   0x000f2f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO2   0x000f1f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO2bits   0x000f1f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO3   0x000f0f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO3bits   0x000f0f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO4   0x000edf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO4bits   0x000edf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO5   0x000ecf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO5bits   0x000ecf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO6   0x000ebf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO6bits   0x000ebf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO7   0x000eaf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO7bits   0x000eaf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO8   0x000e9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO8bits   0x000e9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO9   0x000e8f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO9bits   0x000e8f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCONbits   0x000f6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CANSTAT   0x000f6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO0   0x000f3e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO0bits   0x000f3e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO1   0x000f2e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO1bits   0x000f2e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO2   0x000f1e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO2bits   0x000f1e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO3   0x000f0e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO3bits   0x000f0e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO4   0x000ede       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO4bits   0x000ede       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO5   0x000ece       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO5bits   0x000ece       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO6   0x000ebe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO6bits   0x000ebe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO7   0x000eae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO7bits   0x000eae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO8   0x000e9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO8bits   0x000e9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO9   0x000e8e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO9bits   0x000e8e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTATbits   0x000f6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP1CON   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP1CONbits   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP2CON   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP2CONbits   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP3CON   0x000f4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP3CONbits   0x000f4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP4CON   0x000f4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP4CONbits   0x000f4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP5CON   0x000f47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP5CONbits   0x000f47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR1   0x000fbc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR1H   0x000fbd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR1L   0x000fbc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR2   0x000f51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR2H   0x000f52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR2L   0x000f51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR3   0x000f4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR3H   0x000f4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR3L   0x000f4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR4   0x000f4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR4H   0x000f4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR4L   0x000f4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR5   0x000f48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR5H   0x000f49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR5L   0x000f48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCPTMRS   0x000f99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCPTMRSbits   0x000f99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CIOCON   0x000f70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CIOCONbits   0x000f70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CM1CON   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CM1CON1   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CM1CON1bits   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CM1CONbits   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CM2CON   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CM2CON1   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CM2CON1bits   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CM2CONbits   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CMSTAT   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CMSTATUS   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CMSTATUSbits   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CMSTATbits   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  COMSTAT   0x000f71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              COMSTATbits   0x000f71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUCONH   0x000f55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUCONHbits   0x000f55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUCONL   0x000f54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUCONLbits   0x000f54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUICON   0x000f53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUICONbits   0x000f53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CVRCON   0x000fb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CVRCONbits   0x000fb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            DelayCounter1   0x00001d       data     extern C:\MCC18\src\traditional\delays\delayd1.asm
+            DelayCounter2   0x00001c       data     extern C:\MCC18\src\traditional\delays\delayd2.asm
+                  ECANCON   0x000f72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              ECANCONbits   0x000f72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  ECCP1AS   0x000fbf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              ECCP1ASbits   0x000fbf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP1CON   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP1CONbits   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP1DEL   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP1DELbits   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP2CON   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP2CONbits   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    EEADR   0x000f74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EEADRH   0x000f75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EECON1   0x000f7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               EECON1bits   0x000f7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EECON2   0x000f7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EEDATA   0x000f73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR0   0x000fe9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR0H   0x000fea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR0Hbits   0x000fea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR0L   0x000fe9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR1   0x000fe1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR1H   0x000fe2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR1Hbits   0x000fe2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR1L   0x000fe1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR2   0x000fd9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR2H   0x000fda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR2Hbits   0x000fda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR2L   0x000fd9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  HLVDCON   0x000fa8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              HLVDCONbits   0x000fa8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF0   0x000fef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF1   0x000fe7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF2   0x000fdf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   INTCON   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON1   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON1bits   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON2   0x000ff1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON2bits   0x000ff1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON3   0x000ff0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON3bits   0x000ff0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               INTCONbits   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IOCB   0x000f5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IOCBbits   0x000f5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR1   0x000f9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR1bits   0x000f9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR2   0x000fa2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR2bits   0x000fa2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR3   0x000fa5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR3bits   0x000fa5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR4   0x000fb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR4bits   0x000fb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR5   0x000f78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR5bits   0x000f78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATA   0x000f89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATAbits   0x000f89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATB   0x000f8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATBbits   0x000f8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATC   0x000f8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATCbits   0x000f8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATD   0x000f8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATDbits   0x000f8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATE   0x000f8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATEbits   0x000f8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL0   0x000e79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL0bits   0x000e79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL1   0x000e7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL1bits   0x000e7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL2   0x000e7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL2bits   0x000e7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL3   0x000e7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL3bits   0x000e7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    ODCON   0x000f91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                ODCONbits   0x000f91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   OSCCON   0x000fd3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  OSCCON2   0x000fd2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              OSCCON2bits   0x000fd2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               OSCCONbits   0x000fd3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  OSCTUNE   0x000f9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              OSCTUNEbits   0x000f9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PADCFG1   0x000f56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              PADCFG1bits   0x000f56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                       PC   0x000ff9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PCL   0x000ff9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PCLATH   0x000ffa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PCLATU   0x000ffb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               PCLATUbits   0x000ffb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE1   0x000f9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE1bits   0x000f9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE2   0x000fa0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE2bits   0x000fa0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE3   0x000fa3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE3bits   0x000fa3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE4   0x000fb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE4bits   0x000fb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE5   0x000f76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE5bits   0x000f76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR1   0x000f9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR1bits   0x000f9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR2   0x000fa1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR2bits   0x000fa1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR3   0x000fa4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR3bits   0x000fa4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR4   0x000fb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR4bits   0x000fb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR5   0x000f77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR5bits   0x000f77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW0   0x000feb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW1   0x000fe3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW2   0x000fdb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD0   0x000f59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD0bits   0x000f59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD1   0x000f58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD1bits   0x000f58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD2   0x000f57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD2bits   0x000f57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTA   0x000f80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTAbits   0x000f80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTB   0x000f81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTBbits   0x000f81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTC   0x000f82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTCbits   0x000f82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTD   0x000f83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTDbits   0x000f83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTE   0x000f84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTEbits   0x000f84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC0   0x000fed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC1   0x000fe5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC2   0x000fdd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC0   0x000fee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC1   0x000fe6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC2   0x000fde       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PR2   0x000fcb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PR4   0x000fa9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC0   0x000fec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC1   0x000fe4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC2   0x000fdc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PROD   0x000ff3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PRODH   0x000ff4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PRODL   0x000ff3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PSPCON   0x000f46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               PSPCONbits   0x000f46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PSTR1CON   0x000f9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             PSTR1CONbits   0x000f9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PWM1CON   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              PWM1CONbits   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     RCON   0x000fd0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RCONbits   0x000fd0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    RCREG   0x000fae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCREG1   0x000fae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCREG2   0x000f7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    RCSTA   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCSTA1   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RCSTA1bits   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCSTA2   0x000fa6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RCSTA2bits   0x000fa6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RCSTAbits   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  REFOCON   0x000f9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              REFOCONbits   0x000f9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB0CON   0x000f60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB0CONbits   0x000f60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D0   0x000f66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D0bits   0x000f66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D1   0x000f67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D1bits   0x000f67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D2   0x000f68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D2bits   0x000f68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D3   0x000f69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D3bits   0x000f69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D4   0x000f6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D4bits   0x000f6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D5   0x000f6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D5bits   0x000f6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D6   0x000f6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D6bits   0x000f6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D7   0x000f6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D7bits   0x000f6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB0DLC   0x000f65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB0DLCbits   0x000f65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0EIDH   0x000f63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0EIDHbits   0x000f63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0EIDL   0x000f64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0EIDLbits   0x000f64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0SIDH   0x000f61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0SIDHbits   0x000f61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0SIDL   0x000f62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0SIDLbits   0x000f62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB1CON   0x000f30       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB1CONbits   0x000f30       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D0   0x000f36       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D0bits   0x000f36       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D1   0x000f37       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D1bits   0x000f37       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D2   0x000f38       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D2bits   0x000f38       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D3   0x000f39       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D3bits   0x000f39       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D4   0x000f3a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D4bits   0x000f3a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D5   0x000f3b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D5bits   0x000f3b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D6   0x000f3c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D6bits   0x000f3c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D7   0x000f3d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D7bits   0x000f3d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB1DLC   0x000f35       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB1DLCbits   0x000f35       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1EIDH   0x000f33       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1EIDHbits   0x000f33       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1EIDL   0x000f34       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1EIDLbits   0x000f34       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1SIDH   0x000f31       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1SIDHbits   0x000f31       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1SIDL   0x000f32       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1SIDLbits   0x000f32       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXERRCNT   0x000e41       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXERRCNTbits   0x000e41       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0EIDH   0x000ee2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0EIDHbits   0x000ee2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0EIDL   0x000ee3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0EIDLbits   0x000ee3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0SIDH   0x000ee0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0SIDHbits   0x000ee0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0SIDL   0x000ee1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0SIDLbits   0x000ee1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10EIDH   0x000e5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10EIDHbits   0x000e5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10EIDL   0x000e5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10EIDLbits   0x000e5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10SIDH   0x000e58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10SIDHbits   0x000e58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10SIDL   0x000e59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10SIDLbits   0x000e59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11EIDH   0x000e5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11EIDHbits   0x000e5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11EIDL   0x000e5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11EIDLbits   0x000e5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11SIDH   0x000e5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11SIDHbits   0x000e5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11SIDL   0x000e5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11SIDLbits   0x000e5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12EIDH   0x000e62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12EIDHbits   0x000e62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12EIDL   0x000e63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12EIDLbits   0x000e63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12SIDH   0x000e60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12SIDHbits   0x000e60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12SIDL   0x000e61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12SIDLbits   0x000e61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13EIDH   0x000e66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13EIDHbits   0x000e66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13EIDL   0x000e67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13EIDLbits   0x000e67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13SIDH   0x000e64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13SIDHbits   0x000e64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13SIDL   0x000e65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13SIDLbits   0x000e65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14EIDH   0x000e6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14EIDHbits   0x000e6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14EIDL   0x000e6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14EIDLbits   0x000e6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14SIDH   0x000e68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14SIDHbits   0x000e68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14SIDL   0x000e69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14SIDLbits   0x000e69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15EIDH   0x000e6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15EIDHbits   0x000e6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15EIDL   0x000e6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15EIDLbits   0x000e6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15SIDH   0x000e6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15SIDHbits   0x000e6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15SIDL   0x000e6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15SIDLbits   0x000e6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1EIDH   0x000ee6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1EIDHbits   0x000ee6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1EIDL   0x000ee7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1EIDLbits   0x000ee7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1SIDH   0x000ee4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1SIDHbits   0x000ee4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1SIDL   0x000ee5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1SIDLbits   0x000ee5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2EIDH   0x000eea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2EIDHbits   0x000eea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2EIDL   0x000eeb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2EIDLbits   0x000eeb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2SIDH   0x000ee8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2SIDHbits   0x000ee8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2SIDL   0x000ee9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2SIDLbits   0x000ee9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3EIDH   0x000eee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3EIDHbits   0x000eee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3EIDL   0x000eef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3EIDLbits   0x000eef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3SIDH   0x000eec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3SIDHbits   0x000eec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3SIDL   0x000eed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3SIDLbits   0x000eed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4EIDH   0x000ef2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4EIDHbits   0x000ef2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4EIDL   0x000ef3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4EIDLbits   0x000ef3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4SIDH   0x000ef0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4SIDHbits   0x000ef0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4SIDL   0x000ef1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4SIDLbits   0x000ef1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5EIDH   0x000ef6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5EIDHbits   0x000ef6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5EIDL   0x000ef7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5EIDLbits   0x000ef7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5SIDH   0x000ef4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5SIDHbits   0x000ef4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5SIDL   0x000ef5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5SIDLbits   0x000ef5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6EIDH   0x000e4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6EIDHbits   0x000e4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6EIDL   0x000e4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6EIDLbits   0x000e4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6SIDH   0x000e48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6SIDHbits   0x000e48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6SIDL   0x000e49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6SIDLbits   0x000e49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7EIDH   0x000e4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7EIDHbits   0x000e4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7EIDL   0x000e4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7EIDLbits   0x000e4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7SIDH   0x000e4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7SIDHbits   0x000e4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7SIDL   0x000e4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7SIDLbits   0x000e4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8EIDH   0x000e52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8EIDHbits   0x000e52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8EIDL   0x000e53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8EIDLbits   0x000e53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8SIDH   0x000e50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8SIDHbits   0x000e50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8SIDL   0x000e51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8SIDLbits   0x000e51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9EIDH   0x000e56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9EIDHbits   0x000e56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9EIDL   0x000e57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9EIDLbits   0x000e57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9SIDH   0x000e54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9SIDHbits   0x000e54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9SIDL   0x000e55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9SIDLbits   0x000e55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON0   0x000e71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON0bits   0x000e71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON1   0x000e72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON1bits   0x000e72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON2   0x000e73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON2bits   0x000e73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON3   0x000e74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON3bits   0x000e74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON4   0x000e75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON4bits   0x000e75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON5   0x000e76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON5bits   0x000e76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON6   0x000e77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON6bits   0x000e77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON7   0x000e78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON7bits   0x000e78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXFCON0   0x000e46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXFCON0bits   0x000e46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXFCON1   0x000e47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXFCON1bits   0x000e47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0EIDH   0x000efa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0EIDHbits   0x000efa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0EIDL   0x000efb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0EIDLbits   0x000efb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0SIDH   0x000ef8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0SIDHbits   0x000ef8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0SIDL   0x000ef9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0SIDLbits   0x000ef9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1EIDH   0x000efe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1EIDHbits   0x000efe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1EIDL   0x000eff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1EIDLbits   0x000eff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1SIDH   0x000efc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1SIDHbits   0x000efc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1SIDL   0x000efd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1SIDLbits   0x000efd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    SDFLC   0x000e70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                SDFLCbits   0x000e70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     SIGN   0x000000       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+                   SLRCON   0x000f90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               SLRCONbits   0x000f90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    SPBRG   0x000faf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SPBRG1   0x000faf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SPBRG2   0x000f7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SPBRGH1   0x000f7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SPBRGH2   0x000f7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SSPADD   0x000fc8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               SSPADDbits   0x000fc8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SSPBUF   0x000fc9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPCON1   0x000fc6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPCON1bits   0x000fc6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPCON2   0x000fc5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPCON2bits   0x000fc5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPSTAT   0x000fc7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPSTATbits   0x000fc7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   STATUS   0x000fd8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               STATUSbits   0x000fd8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   STKPTR   0x000ffc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               STKPTRbits   0x000ffc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T0CON   0x000fd5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T0CONbits   0x000fd5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T1CON   0x000fcd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T1CONbits   0x000fcd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   T1GCON   0x000faa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               T1GCONbits   0x000faa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T2CON   0x000fca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T2CONbits   0x000fca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T3CON   0x000fb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T3CONbits   0x000fb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   T3GCON   0x000fb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               T3GCONbits   0x000fb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T4CON   0x000f88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T4CONbits   0x000f88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TABLAT   0x000ff5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TBLPTR   0x000ff6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRH   0x000ff7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRL   0x000ff6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRU   0x000ff8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TBLPTRUbits   0x000ff8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR0H   0x000fd7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR0L   0x000fd6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR1H   0x000fcf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR1L   0x000fce       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TMR2   0x000fcc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR3H   0x000fb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR3L   0x000fb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TMR4   0x000f87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      TOS   0x000ffd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSH   0x000ffe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSL   0x000ffd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSU   0x000fff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TOSUbits   0x000fff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISA   0x000f92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISAbits   0x000f92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISB   0x000f93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISBbits   0x000f93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISC   0x000f94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISCbits   0x000f94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISD   0x000f95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISDbits   0x000f95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISE   0x000f96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISEbits   0x000f96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB0CON   0x000f20       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB0CONbits   0x000f20       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D0   0x000f26       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D0bits   0x000f26       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D1   0x000f27       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D1bits   0x000f27       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D2   0x000f28       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D2bits   0x000f28       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D3   0x000f29       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D3bits   0x000f29       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D4   0x000f2a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D4bits   0x000f2a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D5   0x000f2b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D5bits   0x000f2b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D6   0x000f2c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D6bits   0x000f2c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D7   0x000f2d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D7bits   0x000f2d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB0DLC   0x000f25       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB0DLCbits   0x000f25       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0EIDH   0x000f23       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0EIDHbits   0x000f23       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0EIDL   0x000f24       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0EIDLbits   0x000f24       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0SIDH   0x000f21       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0SIDHbits   0x000f21       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0SIDL   0x000f22       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0SIDLbits   0x000f22       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB1CON   0x000f10       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB1CONbits   0x000f10       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D0   0x000f16       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D0bits   0x000f16       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D1   0x000f17       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D1bits   0x000f17       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D2   0x000f18       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D2bits   0x000f18       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D3   0x000f19       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D3bits   0x000f19       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D4   0x000f1a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D4bits   0x000f1a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D5   0x000f1b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D5bits   0x000f1b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D6   0x000f1c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D6bits   0x000f1c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D7   0x000f1d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D7bits   0x000f1d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB1DLC   0x000f15       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB1DLCbits   0x000f15       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1EIDH   0x000f13       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1EIDHbits   0x000f13       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1EIDL   0x000f14       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1EIDLbits   0x000f14       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1SIDH   0x000f11       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1SIDHbits   0x000f11       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1SIDL   0x000f12       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1SIDLbits   0x000f12       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB2CON   0x000f00       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB2CONbits   0x000f00       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D0   0x000f06       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D0bits   0x000f06       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D1   0x000f07       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D1bits   0x000f07       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D2   0x000f08       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D2bits   0x000f08       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D3   0x000f09       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D3bits   0x000f09       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D4   0x000f0a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D4bits   0x000f0a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D5   0x000f0b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D5bits   0x000f0b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D6   0x000f0c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D6bits   0x000f0c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D7   0x000f0d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D7bits   0x000f0d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB2DLC   0x000f05       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB2DLCbits   0x000f05       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2EIDH   0x000f03       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2EIDHbits   0x000f03       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2EIDL   0x000f04       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2EIDLbits   0x000f04       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2SIDH   0x000f01       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2SIDHbits   0x000f01       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2SIDL   0x000f02       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2SIDLbits   0x000f02       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXBIE   0x000e7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TXBIEbits   0x000e7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXERRCNT   0x000e42       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXERRCNTbits   0x000e42       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXREG   0x000fad       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXREG1   0x000fad       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXREG2   0x000f79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXSTA   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXSTA1   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXSTA1bits   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXSTA2   0x000fba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXSTA2bits   0x000fba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TXSTAbits   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   WDTCON   0x000fd1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               WDTCONbits   0x000fd1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     WPUB   0x000f5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 WPUBbits   0x000f5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     WREG   0x000fe8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+     _ECANRxFilterHitInfo   0x0001e7       data     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                 __AARGB0   0x000009       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB1   0x000008       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB2   0x000007       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB3   0x000006       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB4   0x000005       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB5   0x000004       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB6   0x000003       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB7   0x000002       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                   __AEXP   0x00000a       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __BARGB0   0x00000e       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB1   0x00000d       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB2   0x00000c       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB3   0x00000b       data     extern C:\MCC18\src\traditional\math\barg.asm
+                   __BEXP   0x00000f       data     extern C:\MCC18\src\traditional\math\barg.asm
+                __FPFLAGS   0x000001       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+            __FPFLAGSbits   0x000001       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+                  __REMB0   0x000005       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB1   0x000004       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB2   0x000003       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB3   0x000002       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                  __tmp_1   0x000018       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                curr_byte   0x0001d2       data     static C:\MCC18\src\traditional\startup\c018i.c
+               curr_entry   0x0001d4       data     static C:\MCC18\src\traditional\startup\c018i.c
+                 data_ptr   0x0001d6       data     static C:\MCC18\src\traditional\startup\c018i.c
+                gCAN_Data   0x0001c6       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+             gCAN_MAILBOX   0x000100       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+          gCAN_Rx_Overrun   0x0001ce       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                     gCFG   0x000200       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                    gCVAD   0x00022a       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gDCC   0x0001dd       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gDRG   0x0002ac       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                   gEvent   0x0001e1       data     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+     gLTC_SelfTest_Result   0x0001d9       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             gLTC_TimeOut   0x0001db       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gTMP   0x000282       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+           gTimeSlotCount   0x0001e3       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                     prom   0x0001cf       data     static C:\MCC18\src\traditional\startup\c018i.c
+
+
+
+                              Symbols - Sorted by Address
+                     Name    Address   Location    Storage File                     
+                ---------  ---------  ---------  --------- ---------                
+                   _entry   0x000000    program     extern C:\MCC18\src\traditional\startup\c018i.c
+       ___return_lbl00000   0x000004    program     static                          
+                   __init   0x000006    program     extern C:\MCC18\src\traditional\stdclib\__init.c
+  interrupt_at_low_vector   0x000018    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+       ___return_lbl00000   0x00001c    program     static                          
+                 LTC_Init   0x000038    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                   LTC_Do   0x0001ba    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_BalanceOn   0x00035c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+           LTC_BalanceOff   0x0003f8    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_Terminate   0x000494    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+           LTC_GetVoltage   0x0004b4    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+       LTC_GetTemperature   0x000518    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+            LTC_GetStatus   0x000560    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             LTC_SelfTest   0x00073c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+               LTC_SetCFG   0x000b42    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+               LTC_GetCFG   0x000e20    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+          LTC_MeasureDiag   0x00104c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+       LTC_MeasureVoltage   0x001174    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+   LTC_MeasureTemperature   0x001354    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+              LTC_CalcPEC   0x0015f0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                  InitSPI   0x001758    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+        LTC_Field2IntEven   0x001766    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+         LTC_Field2IntOdd   0x001822    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+         LTC_StartMeasure   0x0018e2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                 LTC_Read   0x00190c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                InitTimer   0x0019a0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+          Set_LTC_TimeOut   0x0019b0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                 CAN_Init   0x0019b6    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+         CAN_Init_Mailbox   0x001b96    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                CAN_Write   0x001ca2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                 CAN_Read   0x001d46    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+        CAN_Write_Voltage   0x001de4    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+    CAN_Write_Temperature   0x001f90    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+       CAN_Read_Balancing   0x00207c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+         CAN_Write_Status   0x002248    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+             Load_Mailbox   0x00232a    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+           ECANInitialize   0x00252e    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+          ECANSendMessage   0x0025b2    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+       ECANReceiveMessage   0x002858    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+     ECANSetOperationMode   0x002ab8    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+             _CANIDToRegs   0x002ae0    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+             _RegsToCANID   0x002c90    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                   my_isr   0x002e66    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                      ini   0x00303c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+      ___case_51_lbl00015   0x00306a    program     static                          
+      ___case_56_lbl00016   0x003070    program     static                          
+      ___case_58_lbl00017   0x003072    program     static                          
+      ___case_43_lbl00018   0x003074    program     static                          
+      ___case_27_lbl00019   0x003076    program     static                          
+      ___default_lbl00020   0x003078    program     static                          
+   ___switchexit_lbl00014   0x00307a    program     static                          
+       ___return_lbl00013   0x003082    program     static                          
+                     main   0x00308c    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+               NTC_LookUp   0x0031de    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+                _do_cinit   0x0032fa    program     extern C:\MCC18\src\traditional\startup\c018i.c
+                     test   0x003314    program     static                          
+                copy_loop   0x00336c    program     static                          
+            copy_one_byte   0x003372    program     static                          
+             done_copying   0x003380    program     static                          
+       ___return_lbl00002   0x003396    program     static                          
+                     done   0x003396    program     static                          
+                 FXD0808S   0x003398    program     extern C:\MCC18\src\traditional\math\fxd0808s.asm
+                  DA0808S   0x0033a4    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                   D0808S   0x0033ae    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                 D0808SOK   0x0033b8    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                D0808SNEG   0x0033bc    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                  D0808SX   0x0033c2    program     static C:\MCC18\src\traditional\math\fxd0808s.asm
+                 FXD3232S   0x0033cc    program     extern C:\MCC18\src\traditional\math\fxd3232s.asm
+                  DA3232S   0x0033e6    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                   D3232S   0x0033fc    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                 D3232SOK   0x003406    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                D3232SNEG   0x00340a    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+                  D3232SX   0x00342a    program     static C:\MCC18\src\traditional\math\fxd3232s.asm
+    LTC_CONV_UMESS_2_TEMP   0x003434    program     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+                 FXD3232U   0x0034ce    program     extern C:\MCC18\src\traditional\math\fxd3232u.c
+                     loop   0x0034dc    program     static                          
+                   _false   0x003510    program     static                          
+       ___return_lbl00000   0x003514    program     static                          
+             Delay10KTCYx   0x003516    program     extern C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                    D10Kx   0x003520    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                   D10K_1   0x003522    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+       _D10KTCYXCODE_0010   0x003526    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                    D10Kl   0x00352e    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+       _D10KTCYXCODE_001C   0x003532    program     static C:\MCC18\src\traditional\delays\d10ktcyx.asm
+                 FXD1616U   0x003544    program     extern C:\MCC18\src\traditional\math\fxd1616u.c
+                     loop   0x00354e    program     static                          
+                  endloop   0x00356a    program     static                          
+       ___return_lbl00000   0x00356e    program     static                          
+            __zero_memory   0x003570    program     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   loop_h   0x00357e    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+               zero_block   0x00357e    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                compare_l   0x003586    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   loop_l   0x003588    program     static C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 _startup   0x003590    program     extern C:\MCC18\src\traditional\startup\c018i.c
+                     loop   0x0035a0    program     static                          
+       ___return_lbl00001   0x0035aa    program     static                          
+             Delay100TCYx   0x0035ac    program     extern C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D100TCYXCODE_0008   0x0035b4    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+                    D100x   0x0035b8    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+                   D100_1   0x0035ba    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D100TCYXCODE_0012   0x0035be    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+       _D100TCYXCODE_0018   0x0035c4    program     static C:\MCC18\src\traditional\delays\d100tcyx.asm
+                 FXD0808U   0x0035c8    program     extern C:\MCC18\src\traditional\math\fxd0808u.c
+                     loop   0x0035d0    program     static                          
+                  endloop   0x0035de    program     static                          
+       ___return_lbl00000   0x0035e2    program     static                          
+               __config_0   0x300000    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+               __config_1   0x300001    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+               __config_2   0x300003    program     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                     SIGN   0x000000       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+            __FPFLAGSbits   0x000001       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+                __FPFLAGS   0x000001       data     extern C:\MCC18\src\traditional\math\cmath18.asm
+                 __AARGB7   0x000002       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB3   0x000002       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB6   0x000003       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB2   0x000003       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB1   0x000004       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB5   0x000004       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                  __REMB0   0x000005       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB4   0x000005       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB3   0x000006       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB2   0x000007       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB1   0x000008       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __AARGB0   0x000009       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                   __AEXP   0x00000a       data     extern C:\MCC18\src\traditional\math\aarg.asm
+                 __BARGB3   0x00000b       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB2   0x00000c       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB1   0x00000d       data     extern C:\MCC18\src\traditional\math\barg.asm
+                 __BARGB0   0x00000e       data     extern C:\MCC18\src\traditional\math\barg.asm
+                   __BEXP   0x00000f       data     extern C:\MCC18\src\traditional\math\barg.asm
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_NTC28.c
+                  __tmp_0   0x000010       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+                  __tmp_1   0x000018       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+            DelayCounter2   0x00001c       data     extern C:\MCC18\src\traditional\delays\delayd2.asm
+            DelayCounter1   0x00001d       data     extern C:\MCC18\src\traditional\delays\delayd1.asm
+             gCAN_MAILBOX   0x000100       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                gCAN_Data   0x0001c6       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+          gCAN_Rx_Overrun   0x0001ce       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_CAN.c
+                     prom   0x0001cf       data     static C:\MCC18\src\traditional\startup\c018i.c
+                curr_byte   0x0001d2       data     static C:\MCC18\src\traditional\startup\c018i.c
+               curr_entry   0x0001d4       data     static C:\MCC18\src\traditional\startup\c018i.c
+                 data_ptr   0x0001d6       data     static C:\MCC18\src\traditional\startup\c018i.c
+     gLTC_SelfTest_Result   0x0001d9       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+             gLTC_TimeOut   0x0001db       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gDCC   0x0001dd       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                   gEvent   0x0001e1       data     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+           gTimeSlotCount   0x0001e3       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_Slave.c
+     _ECANRxFilterHitInfo   0x0001e7       data     extern C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_ECAN.c
+                     gCFG   0x000200       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                    gCVAD   0x00022a       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gTMP   0x000282       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                     gDRG   0x0002ac       data     static C:\Users\Reiling\Desktop\BMS\Firmware\BMS_Slave\BMS_LTC.c
+                 RXERRCNT   0x000e41       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXERRCNTbits   0x000e41       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXERRCNT   0x000e42       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXERRCNTbits   0x000e42       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON1   0x000e43       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON1bits   0x000e43       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON2   0x000e44       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON2bits   0x000e44       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BRGCON3   0x000e45       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              BRGCON3bits   0x000e45       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXFCON0bits   0x000e46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXFCON0   0x000e46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXFCON1   0x000e47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXFCON1bits   0x000e47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6SIDH   0x000e48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6SIDHbits   0x000e48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6SIDL   0x000e49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6SIDLbits   0x000e49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6EIDH   0x000e4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6EIDHbits   0x000e4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF6EIDL   0x000e4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF6EIDLbits   0x000e4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7SIDH   0x000e4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7SIDHbits   0x000e4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7SIDLbits   0x000e4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7SIDL   0x000e4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7EIDHbits   0x000e4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7EIDH   0x000e4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF7EIDL   0x000e4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF7EIDLbits   0x000e4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8SIDHbits   0x000e50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8SIDH   0x000e50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8SIDLbits   0x000e51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8SIDL   0x000e51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8EIDHbits   0x000e52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8EIDH   0x000e52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF8EIDLbits   0x000e53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF8EIDL   0x000e53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9SIDHbits   0x000e54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9SIDH   0x000e54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9SIDL   0x000e55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9SIDLbits   0x000e55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9EIDH   0x000e56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9EIDHbits   0x000e56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF9EIDL   0x000e57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF9EIDLbits   0x000e57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10SIDHbits   0x000e58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10SIDH   0x000e58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10SIDLbits   0x000e59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10SIDL   0x000e59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10EIDHbits   0x000e5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10EIDH   0x000e5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF10EIDLbits   0x000e5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF10EIDL   0x000e5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11SIDH   0x000e5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11SIDHbits   0x000e5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11SIDL   0x000e5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11SIDLbits   0x000e5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11EIDHbits   0x000e5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11EIDH   0x000e5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF11EIDL   0x000e5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF11EIDLbits   0x000e5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12SIDHbits   0x000e60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12SIDH   0x000e60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12SIDL   0x000e61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12SIDLbits   0x000e61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12EIDH   0x000e62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12EIDHbits   0x000e62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF12EIDL   0x000e63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF12EIDLbits   0x000e63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13SIDHbits   0x000e64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13SIDH   0x000e64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13SIDLbits   0x000e65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13SIDL   0x000e65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13EIDHbits   0x000e66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13EIDH   0x000e66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF13EIDL   0x000e67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF13EIDLbits   0x000e67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14SIDHbits   0x000e68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14SIDH   0x000e68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14SIDL   0x000e69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14SIDLbits   0x000e69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14EIDH   0x000e6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14EIDHbits   0x000e6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF14EIDL   0x000e6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF14EIDLbits   0x000e6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15SIDHbits   0x000e6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15SIDH   0x000e6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15SIDLbits   0x000e6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15SIDL   0x000e6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15EIDHbits   0x000e6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15EIDH   0x000e6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+            RXF15EIDLbits   0x000e6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RXF15EIDL   0x000e6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                SDFLCbits   0x000e70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    SDFLC   0x000e70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON0bits   0x000e71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON0   0x000e71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON1bits   0x000e72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON1   0x000e72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON2bits   0x000e73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON2   0x000e73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON3bits   0x000e74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON3   0x000e74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON4   0x000e75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON4bits   0x000e75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON5bits   0x000e76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON5   0x000e76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON6bits   0x000e77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON6   0x000e77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXFBCON7bits   0x000e78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXFBCON7   0x000e78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL0   0x000e79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL0bits   0x000e79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL1   0x000e7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL1bits   0x000e7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL2   0x000e7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL2bits   0x000e7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    MSEL3   0x000e7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                MSEL3bits   0x000e7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    BSEL0   0x000e7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                BSEL0bits   0x000e7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BIE0bits   0x000e7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     BIE0   0x000e7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TXBIEbits   0x000e7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXBIE   0x000e7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B0CONbits   0x000e80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B0CON   0x000e80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0SIDHbits   0x000e81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0SIDH   0x000e81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0SIDL   0x000e82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0SIDLbits   0x000e82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0EIDHbits   0x000e83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0EIDH   0x000e83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B0EIDL   0x000e84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B0EIDLbits   0x000e84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B0DLCbits   0x000e85       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B0DLC   0x000e85       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D0bits   0x000e86       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D0   0x000e86       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D1bits   0x000e87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D1   0x000e87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D2bits   0x000e88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D2   0x000e88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D3bits   0x000e89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D3   0x000e89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D4bits   0x000e8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D4   0x000e8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D5bits   0x000e8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D5   0x000e8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D6bits   0x000e8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D6   0x000e8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B0D7   0x000e8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B0D7bits   0x000e8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO9bits   0x000e8e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO9   0x000e8e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO9bits   0x000e8f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO9   0x000e8f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B1CONbits   0x000e90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B1CON   0x000e90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1SIDH   0x000e91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1SIDHbits   0x000e91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1SIDLbits   0x000e92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1SIDL   0x000e92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1EIDHbits   0x000e93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1EIDH   0x000e93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B1EIDLbits   0x000e94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B1EIDL   0x000e94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B1DLCbits   0x000e95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B1DLC   0x000e95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D0   0x000e96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D0bits   0x000e96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D1bits   0x000e97       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D1   0x000e97       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D2   0x000e98       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D2bits   0x000e98       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D3   0x000e99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D3bits   0x000e99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D4   0x000e9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D4bits   0x000e9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D5   0x000e9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D5bits   0x000e9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D6   0x000e9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D6bits   0x000e9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B1D7   0x000e9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B1D7bits   0x000e9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO8bits   0x000e9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO8   0x000e9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO8   0x000e9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO8bits   0x000e9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B2CON   0x000ea0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B2CONbits   0x000ea0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2SIDH   0x000ea1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2SIDHbits   0x000ea1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2SIDL   0x000ea2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2SIDLbits   0x000ea2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2EIDH   0x000ea3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2EIDHbits   0x000ea3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B2EIDLbits   0x000ea4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B2EIDL   0x000ea4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B2DLCbits   0x000ea5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B2DLC   0x000ea5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D0   0x000ea6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D0bits   0x000ea6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D1   0x000ea7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D1bits   0x000ea7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D2bits   0x000ea8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D2   0x000ea8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D3   0x000ea9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D3bits   0x000ea9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D4   0x000eaa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D4bits   0x000eaa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D5   0x000eab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D5bits   0x000eab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D6   0x000eac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D6bits   0x000eac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B2D7   0x000ead       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B2D7bits   0x000ead       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO7bits   0x000eae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO7   0x000eae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO7bits   0x000eaf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO7   0x000eaf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B3CON   0x000eb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B3CONbits   0x000eb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3SIDH   0x000eb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3SIDHbits   0x000eb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3SIDL   0x000eb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3SIDLbits   0x000eb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3EIDH   0x000eb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3EIDHbits   0x000eb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B3EIDL   0x000eb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B3EIDLbits   0x000eb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B3DLCbits   0x000eb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B3DLC   0x000eb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D0bits   0x000eb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D0   0x000eb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D1bits   0x000eb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D1   0x000eb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D2   0x000eb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D2bits   0x000eb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D3   0x000eb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D3bits   0x000eb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D4   0x000eba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D4bits   0x000eba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D5   0x000ebb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D5bits   0x000ebb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D6   0x000ebc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D6bits   0x000ebc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B3D7bits   0x000ebd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B3D7   0x000ebd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO6   0x000ebe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO6bits   0x000ebe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO6   0x000ebf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO6bits   0x000ebf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B4CON   0x000ec0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B4CONbits   0x000ec0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4SIDH   0x000ec1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4SIDHbits   0x000ec1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4SIDL   0x000ec2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4SIDLbits   0x000ec2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4EIDH   0x000ec3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4EIDHbits   0x000ec3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B4EIDLbits   0x000ec4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B4EIDL   0x000ec4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B4DLC   0x000ec5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B4DLCbits   0x000ec5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D0bits   0x000ec6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D0   0x000ec6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D1bits   0x000ec7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D1   0x000ec7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D2   0x000ec8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D2bits   0x000ec8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D3   0x000ec9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D3bits   0x000ec9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D4   0x000eca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D4bits   0x000eca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D5bits   0x000ecb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D5   0x000ecb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D6bits   0x000ecc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D6   0x000ecc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B4D7   0x000ecd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B4D7bits   0x000ecd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO5bits   0x000ece       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO5   0x000ece       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO5   0x000ecf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO5bits   0x000ecf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B5CONbits   0x000ed0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B5CON   0x000ed0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5SIDHbits   0x000ed1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5SIDH   0x000ed1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5SIDL   0x000ed2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5SIDLbits   0x000ed2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5EIDH   0x000ed3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5EIDHbits   0x000ed3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   B5EIDL   0x000ed4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               B5EIDLbits   0x000ed4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                B5DLCbits   0x000ed5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    B5DLC   0x000ed5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D0bits   0x000ed6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D0   0x000ed6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D1bits   0x000ed7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D1   0x000ed7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D2bits   0x000ed8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D2   0x000ed8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D3   0x000ed9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D3bits   0x000ed9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D4   0x000eda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D4bits   0x000eda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D5   0x000edb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D5bits   0x000edb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D6bits   0x000edc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D6   0x000edc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 B5D7bits   0x000edd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     B5D7   0x000edd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO4bits   0x000ede       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO4   0x000ede       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO4   0x000edf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO4bits   0x000edf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0SIDHbits   0x000ee0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0SIDH   0x000ee0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0SIDL   0x000ee1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0SIDLbits   0x000ee1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0EIDHbits   0x000ee2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0EIDH   0x000ee2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF0EIDLbits   0x000ee3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF0EIDL   0x000ee3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1SIDH   0x000ee4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1SIDHbits   0x000ee4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1SIDLbits   0x000ee5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1SIDL   0x000ee5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1EIDH   0x000ee6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1EIDHbits   0x000ee6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF1EIDL   0x000ee7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF1EIDLbits   0x000ee7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2SIDHbits   0x000ee8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2SIDH   0x000ee8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2SIDL   0x000ee9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2SIDLbits   0x000ee9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2EIDHbits   0x000eea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2EIDH   0x000eea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF2EIDLbits   0x000eeb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF2EIDL   0x000eeb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3SIDHbits   0x000eec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3SIDH   0x000eec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3SIDL   0x000eed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3SIDLbits   0x000eed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3EIDH   0x000eee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3EIDHbits   0x000eee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF3EIDL   0x000eef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF3EIDLbits   0x000eef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4SIDH   0x000ef0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4SIDHbits   0x000ef0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4SIDLbits   0x000ef1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4SIDL   0x000ef1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4EIDHbits   0x000ef2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4EIDH   0x000ef2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF4EIDLbits   0x000ef3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF4EIDL   0x000ef3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5SIDH   0x000ef4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5SIDHbits   0x000ef4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5SIDL   0x000ef5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5SIDLbits   0x000ef5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5EIDH   0x000ef6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5EIDHbits   0x000ef6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXF5EIDLbits   0x000ef7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXF5EIDL   0x000ef7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0SIDH   0x000ef8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0SIDHbits   0x000ef8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0SIDLbits   0x000ef9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0SIDL   0x000ef9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0EIDHbits   0x000efa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0EIDH   0x000efa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM0EIDL   0x000efb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM0EIDLbits   0x000efb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1SIDH   0x000efc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1SIDHbits   0x000efc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1SIDLbits   0x000efd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1SIDL   0x000efd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1EIDH   0x000efe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1EIDHbits   0x000efe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXM1EIDLbits   0x000eff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXM1EIDL   0x000eff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB2CONbits   0x000f00       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB2CON   0x000f00       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2SIDH   0x000f01       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2SIDHbits   0x000f01       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2SIDL   0x000f02       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2SIDLbits   0x000f02       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2EIDHbits   0x000f03       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2EIDH   0x000f03       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB2EIDLbits   0x000f04       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB2EIDL   0x000f04       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB2DLC   0x000f05       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB2DLCbits   0x000f05       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D0   0x000f06       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D0bits   0x000f06       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D1   0x000f07       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D1bits   0x000f07       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D2bits   0x000f08       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D2   0x000f08       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D3bits   0x000f09       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D3   0x000f09       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D4bits   0x000f0a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D4   0x000f0a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D5   0x000f0b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D5bits   0x000f0b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D6   0x000f0c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D6bits   0x000f0c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB2D7   0x000f0d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB2D7bits   0x000f0d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO3   0x000f0e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO3bits   0x000f0e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO3bits   0x000f0f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO3   0x000f0f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB1CON   0x000f10       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB1CONbits   0x000f10       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1SIDH   0x000f11       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1SIDHbits   0x000f11       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1SIDLbits   0x000f12       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1SIDL   0x000f12       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1EIDHbits   0x000f13       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1EIDH   0x000f13       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB1EIDL   0x000f14       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB1EIDLbits   0x000f14       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB1DLCbits   0x000f15       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB1DLC   0x000f15       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D0bits   0x000f16       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D0   0x000f16       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D1bits   0x000f17       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D1   0x000f17       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D2bits   0x000f18       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D2   0x000f18       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D3bits   0x000f19       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D3   0x000f19       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D4   0x000f1a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D4bits   0x000f1a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D5bits   0x000f1b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D5   0x000f1b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D6   0x000f1c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D6bits   0x000f1c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB1D7   0x000f1d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB1D7bits   0x000f1d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO2bits   0x000f1e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO2   0x000f1e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO2bits   0x000f1f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO2   0x000f1f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB0CON   0x000f20       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB0CONbits   0x000f20       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0SIDHbits   0x000f21       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0SIDH   0x000f21       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0SIDLbits   0x000f22       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0SIDL   0x000f22       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0EIDHbits   0x000f23       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0EIDH   0x000f23       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TXB0EIDL   0x000f24       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             TXB0EIDLbits   0x000f24       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TXB0DLC   0x000f25       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TXB0DLCbits   0x000f25       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D0bits   0x000f26       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D0   0x000f26       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D1   0x000f27       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D1bits   0x000f27       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D2bits   0x000f28       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D2   0x000f28       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D3bits   0x000f29       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D3   0x000f29       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D4bits   0x000f2a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D4   0x000f2a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D5bits   0x000f2b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D5   0x000f2b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D6bits   0x000f2c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D6   0x000f2c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXB0D7bits   0x000f2d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXB0D7   0x000f2d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO1bits   0x000f2e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO1   0x000f2e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO1bits   0x000f2f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO1   0x000f2f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB1CON   0x000f30       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB1CONbits   0x000f30       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1SIDH   0x000f31       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1SIDHbits   0x000f31       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1SIDLbits   0x000f32       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1SIDL   0x000f32       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1EIDHbits   0x000f33       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1EIDH   0x000f33       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB1EIDLbits   0x000f34       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB1EIDL   0x000f34       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB1DLCbits   0x000f35       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB1DLC   0x000f35       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D0bits   0x000f36       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D0   0x000f36       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D1bits   0x000f37       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D1   0x000f37       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D2bits   0x000f38       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D2   0x000f38       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D3   0x000f39       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D3bits   0x000f39       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D4bits   0x000f3a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D4   0x000f3a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D5bits   0x000f3b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D5   0x000f3b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D6   0x000f3c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D6bits   0x000f3c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB1D7   0x000f3d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB1D7bits   0x000f3d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTAT_RO0   0x000f3e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+          CANSTAT_RO0bits   0x000f3e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+           CANCON_RO0bits   0x000f3f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCON_RO0   0x000f3f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PSPCON   0x000f46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               PSPCONbits   0x000f46       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP5CONbits   0x000f47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP5CON   0x000f47       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR5   0x000f48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR5L   0x000f48       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR5H   0x000f49       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP4CON   0x000f4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP4CONbits   0x000f4a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR4   0x000f4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR4L   0x000f4b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR4H   0x000f4c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP3CON   0x000f4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP3CONbits   0x000f4d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR3   0x000f4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR3L   0x000f4e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR3H   0x000f4f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP2CONbits   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP2CON   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP2CON   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP2CONbits   0x000f50       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR2L   0x000f51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR2   0x000f51       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR2H   0x000f52       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUICON   0x000f53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUICONbits   0x000f53       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUCONL   0x000f54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUCONLbits   0x000f54       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CTMUCONH   0x000f55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CTMUCONHbits   0x000f55       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PADCFG1   0x000f56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              PADCFG1bits   0x000f56       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD2bits   0x000f57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD2   0x000f57       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD1bits   0x000f58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD1   0x000f58       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PMD0bits   0x000f59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PMD0   0x000f59       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IOCB   0x000f5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IOCBbits   0x000f5a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 WPUBbits   0x000f5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     WPUB   0x000f5b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ANCON1bits   0x000f5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ANCON1   0x000f5c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ANCON0   0x000f5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ANCON0bits   0x000f5d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CM2CON   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CM2CON1   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CM2CON1bits   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CM2CONbits   0x000f5e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CM1CON   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CM1CON1   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CM1CON1bits   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CM1CONbits   0x000f5f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB0CONbits   0x000f60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB0CON   0x000f60       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0SIDHbits   0x000f61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0SIDH   0x000f61       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0SIDLbits   0x000f62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0SIDL   0x000f62       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0EIDH   0x000f63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0EIDHbits   0x000f63       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RXB0EIDL   0x000f64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             RXB0EIDLbits   0x000f64       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  RXB0DLC   0x000f65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              RXB0DLCbits   0x000f65       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D0   0x000f66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D0bits   0x000f66       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D1   0x000f67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D1bits   0x000f67       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D2   0x000f68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D2bits   0x000f68       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D3   0x000f69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D3bits   0x000f69       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D4   0x000f6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D4bits   0x000f6a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D5bits   0x000f6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D5   0x000f6b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D6bits   0x000f6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D6   0x000f6c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RXB0D7bits   0x000f6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RXB0D7   0x000f6d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CANSTATbits   0x000f6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CANSTAT   0x000f6e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CANCON   0x000f6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CANCONbits   0x000f6f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CIOCON   0x000f70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CIOCONbits   0x000f70       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              COMSTATbits   0x000f71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  COMSTAT   0x000f71       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  ECANCON   0x000f72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              ECANCONbits   0x000f72       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EEDATA   0x000f73       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    EEADR   0x000f74       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EEADRH   0x000f75       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE5bits   0x000f76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE5   0x000f76       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR5bits   0x000f77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR5   0x000f77       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR5bits   0x000f78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR5   0x000f78       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXREG2   0x000f79       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCREG2   0x000f7a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SPBRG2   0x000f7b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SPBRGH2   0x000f7c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SPBRGH1   0x000f7d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EECON2   0x000f7e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               EECON1bits   0x000f7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   EECON1   0x000f7f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTA   0x000f80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTAbits   0x000f80       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTB   0x000f81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTBbits   0x000f81       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTCbits   0x000f82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTC   0x000f82       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTD   0x000f83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTDbits   0x000f83       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                PORTEbits   0x000f84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PORTE   0x000f84       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TMR4   0x000f87       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T4CON   0x000f88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T4CONbits   0x000f88       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATAbits   0x000f89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATA   0x000f89       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATB   0x000f8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATBbits   0x000f8a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATCbits   0x000f8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATC   0x000f8b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATD   0x000f8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATDbits   0x000f8c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     LATE   0x000f8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 LATEbits   0x000f8d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SLRCON   0x000f90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               SLRCONbits   0x000f90       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                ODCONbits   0x000f91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    ODCON   0x000f91       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISA   0x000f92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISAbits   0x000f92       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISBbits   0x000f93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISB   0x000f93       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISCbits   0x000f94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISC   0x000f94       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISDbits   0x000f95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISD   0x000f95       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TRISE   0x000f96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TRISEbits   0x000f96       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCPTMRS   0x000f99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCPTMRSbits   0x000f99       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              REFOCONbits   0x000f9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  REFOCON   0x000f9a       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  OSCTUNE   0x000f9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              OSCTUNEbits   0x000f9b       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             PSTR1CONbits   0x000f9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PSTR1CON   0x000f9c       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE1bits   0x000f9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE1   0x000f9d       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR1bits   0x000f9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR1   0x000f9e       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR1bits   0x000f9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR1   0x000f9f       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE2   0x000fa0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE2bits   0x000fa0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR2   0x000fa1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR2bits   0x000fa1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR2   0x000fa2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR2bits   0x000fa2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE3   0x000fa3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE3bits   0x000fa3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR3bits   0x000fa4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR3   0x000fa4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR3bits   0x000fa5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR3   0x000fa5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCSTA2   0x000fa6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RCSTA2bits   0x000fa6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BAUDCON1   0x000fa7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             BAUDCON1bits   0x000fa7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  HLVDCON   0x000fa8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              HLVDCONbits   0x000fa8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PR4   0x000fa9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   T1GCON   0x000faa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               T1GCONbits   0x000faa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                RCSTAbits   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               RCSTA1bits   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCSTA1   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    RCSTA   0x000fab       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXSTA   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXSTA1   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXSTA1bits   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                TXSTAbits   0x000fac       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TXREG   0x000fad       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXREG1   0x000fad       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   RCREG1   0x000fae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    RCREG   0x000fae       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    SPBRG   0x000faf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SPBRG1   0x000faf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   T3GCON   0x000fb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               T3GCONbits   0x000fb0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T3CON   0x000fb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T3CONbits   0x000fb1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR3L   0x000fb2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR3H   0x000fb3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CMSTAT   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 CMSTATUS   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             CMSTATUSbits   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CMSTATbits   0x000fb4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CVRCON   0x000fb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               CVRCONbits   0x000fb5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIE4bits   0x000fb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIE4   0x000fb6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 PIR4bits   0x000fb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PIR4   0x000fb7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     IPR4   0x000fb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 IPR4bits   0x000fb8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             BAUDCON2bits   0x000fb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 BAUDCON2   0x000fb9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TXSTA2   0x000fba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               TXSTA2bits   0x000fba       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              CCP1CONbits   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  CCP1CON   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP1CON   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP1CONbits   0x000fbb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR1L   0x000fbc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    CCPR1   0x000fbc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   CCPR1H   0x000fbd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+             ECCP1DELbits   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PWM1CON   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              PWM1CONbits   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 ECCP1DEL   0x000fbe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              ECCP1ASbits   0x000fbf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  ECCP1AS   0x000fbf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON2bits   0x000fc0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON2   0x000fc0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON1bits   0x000fc1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON1   0x000fc1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADCON0   0x000fc2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               ADCON0bits   0x000fc2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    ADRES   0x000fc3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADRESL   0x000fc3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   ADRESH   0x000fc4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPCON2bits   0x000fc5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPCON2   0x000fc5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPCON1   0x000fc6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPCON1bits   0x000fc6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              SSPSTATbits   0x000fc7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  SSPSTAT   0x000fc7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SSPADD   0x000fc8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               SSPADDbits   0x000fc8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   SSPBUF   0x000fc9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T2CONbits   0x000fca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T2CON   0x000fca       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PR2   0x000fcb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TMR2   0x000fcc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T1CONbits   0x000fcd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T1CON   0x000fcd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR1L   0x000fce       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR1H   0x000fcf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 RCONbits   0x000fd0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     RCON   0x000fd0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               WDTCONbits   0x000fd1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   WDTCON   0x000fd1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              OSCCON2bits   0x000fd2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  OSCCON2   0x000fd2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               OSCCONbits   0x000fd3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   OSCCON   0x000fd3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    T0CON   0x000fd5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                T0CONbits   0x000fd5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR0L   0x000fd6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    TMR0H   0x000fd7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               STATUSbits   0x000fd8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   STATUS   0x000fd8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR2   0x000fd9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR2L   0x000fd9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR2Hbits   0x000fda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR2H   0x000fda       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW2   0x000fdb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC2   0x000fdc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC2   0x000fdd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC2   0x000fde       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF2   0x000fdf       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  BSRbits   0x000fe0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      BSR   0x000fe0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR1   0x000fe1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR1L   0x000fe1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR1Hbits   0x000fe2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR1H   0x000fe2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW1   0x000fe3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC1   0x000fe4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC1   0x000fe5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC1   0x000fe6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF1   0x000fe7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     WREG   0x000fe8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR0L   0x000fe9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     FSR0   0x000fe9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                FSR0Hbits   0x000fea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    FSR0H   0x000fea       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PLUSW0   0x000feb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  PREINC0   0x000fec       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTDEC0   0x000fed       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 POSTINC0   0x000fee       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    INDF0   0x000fef       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON3   0x000ff0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON3bits   0x000ff0       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON2   0x000ff1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON2bits   0x000ff1       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   INTCON   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  INTCON1   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              INTCON1bits   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               INTCONbits   0x000ff2       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PRODL   0x000ff3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     PROD   0x000ff3       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                    PRODH   0x000ff4       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TABLAT   0x000ff5       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRL   0x000ff6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   TBLPTR   0x000ff6       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRH   0x000ff7       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+              TBLPTRUbits   0x000ff8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                  TBLPTRU   0x000ff8       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                       PC   0x000ff9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      PCL   0x000ff9       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PCLATH   0x000ffa       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   PCLATU   0x000ffb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               PCLATUbits   0x000ffb       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                   STKPTR   0x000ffc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+               STKPTRbits   0x000ffc       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                      TOS   0x000ffd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSL   0x000ffd       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSH   0x000ffe       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                     TOSU   0x000fff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+                 TOSUbits   0x000fff       data     extern C:\MCC18\src\traditional\proc\p18F45K80.asm
+
+

+ 108 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/Makefile

@@ -0,0 +1,108 @@
+#
+#  There exist several targets which are by default empty and which can be 
+#  used for execution of your targets. These targets are usually executed 
+#  before and after some main targets. They are: 
+#
+#     .build-pre:              called before 'build' target
+#     .build-post:             called after 'build' target
+#     .clean-pre:              called before 'clean' target
+#     .clean-post:             called after 'clean' target
+#     .clobber-pre:            called before 'clobber' target
+#     .clobber-post:           called after 'clobber' target
+#     .all-pre:                called before 'all' target
+#     .all-post:               called after 'all' target
+#     .help-pre:               called before 'help' target
+#     .help-post:              called after 'help' target
+#
+#  Targets beginning with '.' are not intended to be called on their own.
+#
+#  Main targets can be executed directly, and they are:
+#  
+#     build                    build a specific configuration
+#     clean                    remove built files from a configuration
+#     clobber                  remove all built files
+#     all                      build all configurations
+#     help                     print help mesage
+#  
+#  Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
+#  .help-impl are implemented in nbproject/makefile-impl.mk.
+#
+#  Available make variables:
+#
+#     CND_BASEDIR                base directory for relative paths
+#     CND_DISTDIR                default top distribution directory (build artifacts)
+#     CND_BUILDDIR               default top build directory (object files, ...)
+#     CONF                       name of current configuration
+#     CND_ARTIFACT_DIR_${CONF}   directory of build artifact (current configuration)
+#     CND_ARTIFACT_NAME_${CONF}  name of build artifact (current configuration)
+#     CND_ARTIFACT_PATH_${CONF}  path to build artifact (current configuration)
+#     CND_PACKAGE_DIR_${CONF}    directory of package (current configuration)
+#     CND_PACKAGE_NAME_${CONF}   name of package (current configuration)
+#     CND_PACKAGE_PATH_${CONF}   path to package (current configuration)
+#
+# NOCDDL
+
+
+# Environment 
+MKDIR=mkdir
+CP=cp
+CCADMIN=CCadmin
+RANLIB=ranlib
+
+
+# build
+build: .build-post
+
+.build-pre:
+# Add your pre 'build' code here...
+
+.build-post: .build-impl
+# Add your post 'build' code here...
+
+
+# clean
+clean: .clean-post
+
+.clean-pre:
+# Add your pre 'clean' code here...
+
+.clean-post: .clean-impl
+# Add your post 'clean' code here...
+
+
+# clobber
+clobber: .clobber-post
+
+.clobber-pre:
+# Add your pre 'clobber' code here...
+
+.clobber-post: .clobber-impl
+# Add your post 'clobber' code here...
+
+
+# all
+all: .all-post
+
+.all-pre:
+# Add your pre 'all' code here...
+
+.all-post: .all-impl
+# Add your post 'all' code here...
+
+
+# help
+help: .help-post
+
+.help-pre:
+# Add your pre 'help' code here...
+
+.help-post: .help-impl
+# Add your post 'help' code here...
+
+
+
+# include project implementation makefile
+include nbproject/Makefile-impl.mk
+
+# include project make variables
+include nbproject/Makefile-variables.mk

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_CAN.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_CAN.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_CAN.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_ECAN.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_ECAN.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_ECAN.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_EEPROM.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_EEPROM.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_EEPROM.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_LTC.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_LTC.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_LTC.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_NTC28.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_NTC28.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_NTC28.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_Slave.o


+ 11 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/build/default/production/_ext/1472/BMS_Slave.o.d

@@ -0,0 +1,11 @@
+build/default/production/_ext/1472/BMS_Slave.o:  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.c  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_NTC28.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_LTC.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_CAN.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_EEPROM.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_Slave.h  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_ECAN.def  \
+	D:/Woldemar/Software/RCT\ Slave/BMS_Slave.RCT.v216/ProjectSource/BMS_Slave_RCT/BMS_MISRA.h  \
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/dist/default/production/BMS_Slave.X.production.cof


+ 1094 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/dist/default/production/BMS_Slave.X.production.hex

@@ -0,0 +1,1094 @@
+:020000040000FA
+:060000002CEF21F01200BC
+:020006001200E6
+:080008000000000000000000F0
+:0700100000000000000000E9
+:060018004CEF1AF012008B
+:02001E000300DD
+:1000200010000000080E000007000000080000009B
+:10003000000E000008000000AC420000CF010000EC
+:0400400015000000A7
+:0C004400D9CFE6FFE1CFD9FF0B0EE1267B
+:10005000DF6A010EDB6A040EF36E020EF3CFDBFFE4
+:10006000010EF36E030EF3CFDBFF080EF36E040EEA
+:10007000F3CFDBFF060EF36E050EF3CFDBFF010EB1
+:10008000F36E060EF3CFDBFF010EF36E070EF3CF18
+:10009000DBFF010EF36E080EF3CFDBFF090EDB6A08
+:1000A0000A0EDB6AD398D38AD38C9B9CC26A300E2B
+:1000B000C16E920EC06E0F010B0E5D6F5C6BC28045
+:1000C000928092829286898A929AFB0E936E949085
+:1000D000949294948C6A956A96909692030E8D12DF
+:1000E000F80E8B148B6E8B802EEC0CF052EC0DF016
+:1000F000010EF1C1DBFFD950010FE66E000EDA20D0
+:10010000E66E89EC0DF0E552E552DF6ADFCF14F0C0
+:10011000180EE76E1418E8AE02D0E73402D0E750AC
+:10012000145C1BE2DFCFE9FFEA6AE9BEEA68D89017
+:10013000E936EA36520EE926020EEA22EE68ED684A
+:10014000DFCFE9FFEA6AE9BEEA68900EE926020E0F
+:10015000EA22CD0EEF6EDF2AD9D7E668E668E668B8
+:10016000E66AE66AE66AE66AE66A010EE66EE3ECCD
+:1001700005F0146E090EE15E14500201BC6BF28EA4
+:10018000F28C0B0EE15C02E2E16AE552E16EE552AF
+:10019000E7CFD9FF1200D9CFE6FFE1CFD9FFE65272
+:1001A000DF6AFD0EDBCFE9FFFE0EDBCFEAFFEECF0D
+:1001B00008F0EDCF09F00850100B23E082A821D001
+:1001C000100EE66EE66AB00EE66E100EE66EFEECFF
+:1001D00008F0E552E552E552E552000902E002015D
+:1001E000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE9866
+:1001F000ED52FD0EDBCFE9FFFE0EDBCFEAFFEE8A0C
+:10020000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECFB6
+:1002100008F0EDCF09F00850200B1BE082A819D0A0
+:10022000200EE66EE66AB00EE66E100EE66EFEEC8E
+:1002300008F0E552E552E552E552000902E00201FC
+:10024000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE9A03
+:10025000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECF66
+:1002600008F0EDCF09F00850400B23E082A821D020
+:10027000400EE66EE66A500EE66E300EE66E20EC3C
+:100280000AF0E552E552E552E552000902E00201AA
+:10029000BC2BFD0EDBCFE9FFFE0EDBCFEAFFEE8EBF
+:1002A000ED52FD0EDBCFE9FFFE0EDBCFEAFFEE9C49
+:1002B000ED52FD0EDBCFE9FFFE0EDBCFEAFFEECF06
+:1002C00008F0EDCF09F00850800B33E082A831D060
+:1002D000800EE66EE66A500EE66E300EE66E20EC9C
+:1002E0000AF0E552E552E552E552000902E002014A
+:1002F000BC2B070E8B14DF6EF80E8B148B6EDFCFCA
+:1003000014F0060EE76E1418E8AE02D0E73402D0FF
+:10031000E750145C04E2DF508B10010F01D0010E96
+:100320008B6EFD0EDBCFE9FFFE0EDBCFEAFFEE9E0C
+:10033000ED6AE552E552E7CFD9FF1200D9CFE6FFCB
+:10034000E1CFD9FF040EE126010EDE6EDE6ADE6A21
+:10035000DD6ADD52DD52DECF14F0DECF15F0DECFE8
+:1003600016F0DDCF17F0DD52DD52FE0EDB5008E057
+:100370000001D8901436153616361736E804F9E120
+:1003800014C0DFFF010E15C0DBFF020E16C0DBFF3D
+:10039000030E17C0DBFFE66AE66AE66AE66AD9CFB3
+:1003A000E9FFDACFEAFFEECFE6FFEECFE6FFEECFD2
+:1003B000E6FFEFCFE6FF010EE66EE3EC05F0146E0C
+:1003C000090EE15E1450040EE15C02E2E16AE552BE
+:1003D000E16EE552E7CFD9FF1200D9CFE6FFE1CFBA
+:1003E000D9FF040EE126010EDE6EDE6ADE6ADD6AEA
+:1003F000DD52DD52DECF14F0DECF15F0DECF16F089
+:10040000DDCF17F0DD52DD52FE0EDB5008E00001BB
+:10041000D8901436153616361736E804F9E114C0AC
+:10042000DFFF010E15C0DBFF020E16C0DBFF030E5F
+:1004300017C0DBFFD9CFE9FFDACFEAFFEECFE6FF47
+:10044000EECFE6FFEECFE6FFEFCFE6FFE66AE66A25
+:10045000E66AE66A010EE66EB6DB146E090EE15E30
+:100460001450040EE15C02E2E16AE552E16EE552ED
+:10047000E7CFD9FF1200E6680F0EE66EE66AE66A7D
+:10048000E66AE66AE66AE66AE66A9DDB146E090ECB
+:10049000E15E14501200D9CFE6FFE1CFD9FF020E82
+:1004A000E126FE0EEA6ADB34FE0BEA36E96E520EF6
+:1004B000E926020EEA22EECFDEFFEDCFDDFF0E01D0
+:1004C0000E5125E1DECF14F0DDCF15F0D890155098
+:1004D00004E6030E145C000E155819E3DECF14F089
+:1004E000DDCF15F0153411E21450F0080A0E155442
+:1004F0000CE2DECF16F0DDCF17F0D890175004E6EF
+:10050000100E165C0E0E175802E3010E0E6FFE0E53
+:10051000EA6ADB34FE0BEA36E96E520EE926020E79
+:10052000EA22EE68ED68DECF14F0DDCF15F014C0DE
+:10053000F3FF15C0F4FF020EE15C02E2E16AE5524E
+:10054000E16EE552E7CFD9FF1200D9CFE6FFE1CF48
+:10055000D9FFE652FE0EDB50EA6A900FE96E020EFA
+:10056000EA22EFCFDFFF0E010D5127E1DFCF14F0BC
+:10057000D30EE76E1418E8AE02D0E73402D0E7508D
+:10058000145C1BE3DFCF14F00A0EE76E1418E8AE1C
+:1005900002D0143403D0E750D88014540CE2DFCFDB
+:1005A00015F0320EE76E1518E8AE02D0E73402D02F
+:1005B000E750155C02E3010E0D6FFE0EDB50EA6A98
+:1005C000900FE96E020EEA22CD0EEF6EDFCF14F02F
+:1005D000156A14BE156814C0F3FF15C0F4FFE55288
+:1005E000E552E7CFD9FF1200D9CFE6FFE1CFD9FF1F
+:1005F000FD0EDBCFE9FFFE0EDBCFEAFFEE6AED6A10
+:10060000D80E0201E76EA819E8AE02D0E73402D096
+:10061000E750A85D08E2FD0EDBCFE9FFFE0EDBCF61
+:10062000EAFFEE80ED52D80EE76EA919E8AE02D0CF
+:10063000E73402D0E750A95D08E2FD0EDBCFE9FF09
+:10064000FE0EDBCFEAFFEE82ED52500EE76EA819E8
+:10065000E8AE02D0A83503D0E750D880A85508E20C
+:10066000FD0EDBCFE9FFFE0EDBCFEAFFEE84ED529D
+:10067000500EE76EA919E8AE02D0A93503D0E750B5
+:10068000D880A95508E2FD0EDBCFE9FFFE0EDBCFD7
+:10069000EAFFEE86ED52AA5108E0FD0EDBCFE9FF3E
+:1006A000FE0EDBCFEAFFEE88ED52AB5108E0FD0E07
+:1006B000DBCFE9FFFE0EDBCFEAFFEE8AED520E0143
+:1006C0000251031108E0FD0EDBCFE9FFFE0EDBCF88
+:1006D000EAFFEE8CED52026B036B0201BC5108E0A5
+:1006E000FD0EDBCFE9FFFE0EDBCFEAFFEE8EED5213
+:1006F00080B408D0FD0EDBCFE9FFFE0EDBCFEAFFB2
+:10070000EE52ED80FD0EDBCFE9FFFE0EDBCFEAFF00
+:10071000020EE926000EEA22BCC2EFFFBC6BFD0E02
+:10072000DBCFE9FFFE0EDBCFEAFF040EE926000E69
+:10073000EA2200CEEEFF01CEEDFFE552E7CFD9FF72
+:100740001200D9CFE6FFE1CFD9FF020EE126DE6A23
+:10075000DD6A830EC2140C09C26EC282C2B2FED719
+:10076000C450176E166AC35000011624146E000E92
+:100770001720156E14C0DEFFDD6ED9CFE9FFDACF8A
+:10078000EAFFF40EEE5E010EED5AD9CFE9FFDACFA3
+:10079000EAFF0A0E0D6E0E6AEECF08F0EDCF09F0FB
+:1007A00019EC1FF008C0EEFF09C0EDFFFD0EDBCF16
+:1007B000E9FFFE0EDBCFEAFF030EE926000EEA2278
+:1007C000DFCFEFFF020EE15C02E2E16AE552E16E8B
+:1007D000E552E7CFD9FF1200D9CFE6FFE1CFD9FF2D
+:1007E000E652DF6A0E01006B016B600EE66EDFEC15
+:1007F00020F0E552100EE66EE66A9A0EE66E1E0EC8
+:10080000E66EFEEC08F0E552E552E552E552600E68
+:10081000E66EDFEC20F0E552200EE66EE66A9A0EF8
+:10082000E66E1E0EE66EFEEC08F0E552E552E5526D
+:10083000E552000903E00E01008F2BD0020EDF6E9F
+:10084000DFCF14F0140EE76E1418E8AE02D0E734D0
+:1008500002D0E750145C1DE2DFCFE9FFEA6AE9BE8F
+:10086000EA682A0EE926020EEA22EF0402E10E01EE
+:100870000081130EDF24E96EEA6AE9BEEA682A0EF7
+:10088000E926020EEA22EF0402E10E010181DF2ACD
+:10089000D7D7100EE66EE66A9D0EE66E1F0EE66E68
+:1008A000FEEC08F0E552E552E552E552600EE66EC8
+:1008B000DFEC20F0E552200EE66EE66A9D0EE66E55
+:1008C0001F0EE66EFEEC08F0E552E552E552E552E9
+:1008D000000903E00E01008F2BD0020EDF6EDFCF88
+:1008E00014F0140EE76E1418E8AE02D0E73402D00C
+:1008F000E750145C1DE2DFCFE9FFEA6AE9BEEA686F
+:100900002A0EE926020EEA22EF0402E10E0100831C
+:10091000130EDF24E96EEA6AE9BEEA682A0EE926C8
+:10092000020EEA22EF0402E10E010183DF2AD7D78B
+:10093000100EE66EE66AB00EE66E100EE66EFEEC87
+:1009400008F0E552E552E552E552600EE66EDFEC46
+:1009500020F0E552200EE66EE66AB00EE66E100E4E
+:10096000E66EFEEC08F0E552E552E552E55200096C
+:1009700002E00E01008F400EE66EE66A7A0EE66E29
+:100980003E0EE66E20EC0AF0E552E552E552E552E5
+:10099000140EE66EDFEC20F0E552800EE66EE66A9D
+:1009A0007A0EE66E3E0EE66E20EC0AF0E552E55257
+:1009B000E552E552000903E00E01008F35D0020E2A
+:1009C000DF6EDFCF14F0060EE76E1418E8AE02D02B
+:1009D000E73402D0E750145C1DE2DFCFE9FFEA6A9A
+:1009E000E9BEEA68820EE926020EEA22EF0402E17D
+:1009F0000E010085060EDF24E96EEA6AE9BEEA68A8
+:100A0000820EE926020EEA22EF0402E10E010185C0
+:100A1000DF2AD7D70201880502E10E010085020115
+:100A20008E0502E10E010185400EE66EE66A7D0E3E
+:100A3000E66E3F0EE66E20EC0AF0E552E552E55216
+:100A4000E552140EE66EDFEC20F0E552800EE66E05
+:100A5000E66A7D0EE66E3F0EE66E20EC0AF0E55289
+:100A6000E552E552E552000903E00E01008F35D052
+:100A7000020EDF6EDFCF14F0060EE76E1418E8AE3C
+:100A800002D0E73402D0E750145C1DE2DFCFE9FF6B
+:100A9000EA6AE9BEEA68820EE926020EEA22EF045B
+:100AA00002E10E010087060EDF24E96EEA6AE9BE64
+:100AB000EA68820EE926020EEA22EF0402E10E0144
+:100AC0000187DF2AD7D70201880502E10E010087DE
+:100AD00002018E0502E10E010187400EE66EE66A14
+:100AE000500EE66E300EE66E20EC0AF0E552E5524E
+:100AF000E552E552140EE66EDFEC20F0E552800E72
+:100B0000E66EE66A500EE66E300EE66E20EC0AF0F7
+:100B1000E552E552E552E552000902E00E01008F70
+:100B2000100EE66EE66AD6DAE552E5526E0EE66E15
+:100B3000DFEC20F0E552200EE66EE66ACBDAE552F5
+:100B4000E552000903E00E01008F34D00201D89075
+:100B5000B55104E6340EB45D080EB55902E20E013B
+:100B600000890201B53507E2B45154080B0EB555A2
+:100B700002E20E01008B0201B85102E00E01008D6D
+:100B80000201D890B75104E6340EB65D080EB7598D
+:100B900002E20E0101890201B73507E2B65154089D
+:100BA0000B0EB75502E20E01018B0201B95102E0B2
+:100BB0000E01018D00CEF3FF01CEF4FFE552E552A8
+:100BC000E7CFD9FF1200D9CFE6FFE1CFD9FF180E4A
+:100BD000E126140EDB6A150EDB6A160EDB6A170EB1
+:100BE000DB6AD950FA0FE96EFF0EDA20EA6E0E01C9
+:100BF0000451EE10046F0551EE10056F0651EE1012
+:100C0000066F0751EE10076FF60EDBCF14F0F70EEC
+:100C1000DBCF15F0F80EDBCF16F0F90EDBCF17F0B7
+:100C2000141E151E161E171E040EE96E0E0EEA6E19
+:100C3000EE501414046FEE501514056FEE50161498
+:100C4000066FEE501714076F140E04CEDBFF150E5F
+:100C500005CEDBFF160E06CEDBFF170E07CEDBFF41
+:100C6000140EDBCF14F0150EDBCF15F0160EDBCF14
+:100C700016F0170EDBCF17F01450E76E020EE7CF19
+:100C8000DBFF140EDBCF14F0150EDBCF15F0160EC4
+:100C9000DBCF16F0170EDBCF17F0080ED890173207
+:100CA000163215321432E806F9E1140E14C0DBFFD7
+:100CB000150E15C0DBFF160E16C0DBFF170E17C092
+:100CC000DBFF0F0E146E156A166A176AD950140FDF
+:100CD000E96EDACFEAFFEE501416EE501516EE501C
+:100CE0001616EE501716030E14C0DBFF140EDBCFE2
+:100CF00014F0150EDBCF15F0160EDBCF16F0170E25
+:100D0000DBCF17F0040ED89017321632153214329A
+:100D1000E806F9E1140E14C0DBFF150E15C0DBFF69
+:100D2000160E16C0DBFF170E17C0DBFF140EDBCF4D
+:100D300014F0150EDBCF15F0160EDBCF16F0170EE4
+:100D4000DBCF17F01450DF6E140EDBCF14F0150E4E
+:100D5000DBCF15F0160EDBCF16F0170EDBCF17F03A
+:100D6000080ED8901732163215321432E806F9E11F
+:100D7000140E14C0DBFF150E15C0DBFF160E16C0D7
+:100D8000DBFF170E17C0DBFF0F0E146E156A166A15
+:100D9000176AD950140FE96EDACFEAFFEE50141635
+:100DA000EE501516EE501616EE501716010E14C022
+:100DB000DBFFFE0EDB50100FE76E060EE7CFDBFF0A
+:100DC000070EDFCFDBFF010EDB50E76E080EE7CF2B
+:100DD000DBFF090EDB6A770EF36E0A0EF3CFDBFF43
+:100DE000AA0EF36E0B0EF3CFDBFF060EE66ED950A4
+:100DF000060FE66E000EDA20E66E7AEC0BF0E55296
+:100E0000E552E552E76E0C0EE7CFDBFFFE0EDB503E
+:100E1000100FE76E0D0EE7CFDBFF020EDB50E76E23
+:100E20000E0EE7CFDBFF030EDB50E76E0F0EE7CFB2
+:100E3000DBFF100EDB6A770EF36E110EF3CFDBFFD4
+:100E4000AA0EF36E120EF3CFDBFF060EE66ED9503C
+:100E50000D0FE66E000EDA20E66E7AEC0BF0E5522E
+:100E6000E552E552E76E130EE7CFDBFFD950040FD2
+:100E7000E66E000EDA20E66E100EE66EC70EE66E27
+:100E8000010EE66E08EC0DF0146E050EE15E1450D6
+:100E9000180EE15C02E2E16AE552E16EE552E7CF4D
+:100EA000D9FF1200D9CFE6FFE1CFD9FFE652DF6AC2
+:100EB000000EE66E020EE66E100EE66ECE0EE66ECA
+:100EC000020EE66E08EC0DF0146E050EE15E145095
+:100ED000060EE66E020EE66E020EE66E7AEC0BF081
+:100EE000E552E552E5520201085D0EE1060EE66E9E
+:100EF000090EE66E020EE66E7AEC0BF0E552E55254
+:100F0000E55202010F5D02E0DF6ADED0070E09152F
+:100F1000116F070E0215106F0951E840E840E840D4
+:100F20001F0B010B136F0251E840E840E8401F0B14
+:100F3000010B126F09390F0B010B156F02390F0BE3
+:100F4000010B146F0951E00BE838E840030B176FF1
+:100F50000251E00BE838E840030B166F0945010B1E
+:100F6000010B196F0245010B010B186F0F0E0B15CA
+:100F70001C6F1D6B156E146A0A5114241C6F000E31
+:100F800015201D6F0F0E04151A6F1B6B156E146A5A
+:100F9000035114241A6F000E15201B6F0C51206F83
+:100FA000216B0CC214F021C215F0040ED890143637
+:100FB0001536E804FBE102010B390F0B1424206FF6
+:100FC000000E1520216F05511E6F1F6B05C214F016
+:100FD0001FC215F0040ED89014361536E804FBE154
+:100FE000020104390F0B14241E6F000E15201F6F11
+:100FF0001F0E0D5D246F256B040E000A06E0020132
+:10100000D89024372537E804FBE124C214F025C228
+:1010100015F0D89015321432020124511424246F93
+:1010200025511520256F1F0E065D226F236B040EC0
+:10103000000A06E00201D89022372337E804FBE1DA
+:1010400022C214F023C215F0D890153214320201D6
+:1010500022511424226F23511520236F200E0E5D80
+:10106000286F296B040E000A06E00201D890283789
+:101070002937E804FBE128C214F029C215F0D89002
+:1010800015321432020128511424286F29511520D9
+:10109000296F200E075D266F276B040E000A06E0FD
+:1010A0000201D89026372737E804FBE126C214F066
+:1010B00027C215F0D890153214320201265114249B
+:1010C000266F27511520276FDF50E552E552E7CFF5
+:1010D000D9FF1200D9CFE6FFE1CFD9FFE652DF6A90
+:1010E000D950FD0FE96EFF0EDA20EA6E100EEE18F1
+:1010F0000AE1ED5008E1790EE66E520EE66EF3EC71
+:101100000CF0E552E552D950FD0FE96EFF0EDA20E2
+:10111000EA6E200EEE186CE1ED506AE182A868D00C
+:10112000898AAC0EE66E020EE66E080EE66E6B0E57
+:10113000E66E540EE66E08EC0DF0146E050EE15EE0
+:101140001450020EE66EAE0EE66E020EE66ED2DAB7
+:10115000E552E552E5520201B05D0DE1020EE66E88
+:10116000B10EE66E020EE66EC5DAE552E552E552C4
+:101170000201B35D02E0DF6A3BD0AFC2E6FFAEC260
+:10118000E6FF73DBE552E552F3CFB4F2F4CFB5F2EC
+:10119000B2C2E6FFB1C2E6FF68DBE552E552F3CF2B
+:1011A000B6F2F4CFB7F20201AF51E00BE838E840F5
+:1011B000010BB86FB251E00BE838E840010BB96F92
+:1011C000060EAFC2E7FF070B04E0E742E79EE80622
+:1011D000FCE1E7500201BA6F060EB2C2E7FF070B4F
+:1011E00004E0E742E79EE806FCE1E7500201BB6F3E
+:1011F000DF50E552E552E7CFD9FF1200D9CFE6FF25
+:10120000E1CFD9FF030EE126020EDB6AD950FB0FB6
+:10121000E96EFF0EDA20EA6E100EEE181AE1ED50BC
+:1012200018E1E668E668E668E66AE66AE66AE66A9B
+:10123000E66A010EE66EC7DC146E090EE15E14501C
+:10124000FD0EDBCFE6FFFE0EDBCFE6FFCCDBE5528B
+:10125000E552D950FB0FE96EFF0EDA20EA6E200E40
+:10126000EE1801E0DFD0ED5001E0DCD082A8DAD04A
+:10127000898ACFC114F0D0C115F0D1C116F0D2C106
+:1012800017F0141E151E161E171E14C0E6FF15C0FB
+:10129000E6FF16C0E6FF17C0E6FFCFC1E6FFD0C1EC
+:1012A000E6FFD1C1E6FFD2C1E6FF010EE66E8BDCA0
+:1012B000186E090EE15E18502A0EE66E020EE66EFA
+:1012C000280EE66EDC0EE66E040EE66EA1DB146EF2
+:1012D000050EE15E1450120EE66E2C0EE66E020E46
+:1012E000E66E08DAE552E552E55202013E5D0DE197
+:1012F000120EE66E3F0EE66E020EE66EFBD9E5526A
+:10130000E552E5520201515D03E0020EDB6A8AD02C
+:10131000DF6ADFCF14F0180EE76E1418E8AE02D0C3
+:10132000E73402D0E750145C01E37CD0DF407F0B50
+:10133000DF24E76E010EE7CFDBFFDFCF14F00B0EEB
+:10134000E76E1418E8AE02D0143403D0E750D8800A
+:10135000145402E2010EDB2A010EDB50030FE96E8A
+:10136000EA6AE9BEEA682A0EE926020EEA22EF508E
+:10137000E66E010EDB50020FE96EEA6AE9BEEA682A
+:101380002A0EE926020EEA22EF50E66E6EDAE552E8
+:10139000E552F3CF14F0F4CF15F0DFCFE9FFEA6A9E
+:1013A000E9BEEA68D890E936EA36520EE926020E1E
+:1013B000EA2214C0EEFF15C0EDFF010EDB50040F52
+:1013C000E96EEA6AE9BEEA682A0EE926020EEA2216
+:1013D000EF50E66E010EDB50030FE96EEA6AE9BEDC
+:1013E000EA682A0EE926020EEA22EF50E66E9BDA40
+:1013F000E552E552F3CF14F0F4CF15F0DF28E96E93
+:10140000EA6AE9BEEA68D890E936EA36520EE92679
+:10141000020EEA2214C0EEFF15C0EDFF020EDF241B
+:10142000DF6E77D7020EDB50146E030EE15C02E232
+:10143000E16AE552E16E1450E552E7CFD9FF1200A0
+:10144000D9CFE6FFE1CFD9FF070EE126040EDB6A14
+:10145000050EDB6A060EDB6AD950FB0FE96EFF0E44
+:10146000DA20EA6E400EEE180BE1ED5009E1FD0EB8
+:10147000DBCFE6FFFE0EDBCFE6FFB5DAE552E55245
+:10148000D950FB0FE96EFF0EDA20EA6E800EEE18DF
+:1014900001E022D1ED5001E01FD182A81DD1898A3F
+:1014A000820EE66E020EE66E0E0EE66EEA0EE66E38
+:1014B0000E0EE66EADDA146E050EE15E1450050EEA
+:1014C000E66E840EE66E020EE66E14D9E552E55223
+:1014D000E5520201895D0DE1050EE66E8A0EE66EAB
+:1014E000020EE66E07D9E552E552E55202018F5D24
+:1014F00003E0060EDB6AF0D0DE52020EDD6E070E50
+:101500008B14E76E040EE7CFDBFFDB06DBCFE6FFD5
+:10151000050EE552D880E754E76E050EE7CFDBFFF6
+:10152000DF6ADFCF14F0180EE76E1418E8AE02D0B1
+:10153000E73402D0E750145C01E3C5D0010EDB288C
+:10154000E96EEA6AE9BEEA68820EE926020EEA223C
+:10155000EF50E66E010EDBCFE9FFEA6AE9BEEA680A
+:10156000820EE926020EEA22EF50E66E7ED9E5529F
+:10157000E552020EF3CFDBFF030EF4CFDBFF020ECA
+:10158000DBCFE6FF030EDBCFE6FF6EEC20F0E5528B
+:10159000E552E66E040EDB50E824DF24EA6A900F81
+:1015A000E96E020EEA22E552E750EF6E010EDB2AE9
+:1015B000DB28E96EEA6AE9BEEA68820EE926020ED5
+:1015C000EA22EF50E66E010EDBCFE9FFEA6AE9BEE0
+:1015D000EA68820EE926020EEA22EF50E66EA3D9EF
+:1015E000E552E552020EF3CFDBFF030EF4CFDBFF33
+:1015F000020EDBCFE6FF030EDBCFE6FF6EEC20F042
+:10160000E552E552E66E050EDB50E824DF24010FBB
+:10161000EA6A900FE96E020EEA22E552E750EF6E99
+:10162000010EDB50020FE76E010EE7CFDBFFDB2878
+:10163000E96EEA6AE9BEEA68820EE926020EEA224B
+:10164000EF50E66E010EDBCFE9FFEA6AE9BEEA6819
+:10165000820EE926020EEA22EF50E66E06D9E55226
+:10166000E552020EF3CFDBFF030EF4CFDBFF020ED9
+:10167000DBCF15F0030EDBCF16F0D8901632153203
+:10168000E804FBE1110E155E010E165A0C0E146EE5
+:101690000E6EDFCF09F0FFEC1EF009C0E9FFEA6A29
+:1016A000E9BEEA68A80EE926020EEA2215C0EFFF9D
+:1016B000010EDB50030FE76E010EE7CFDBFF0C0ED0
+:1016C000DF24DF6E2ED7020188390F0B010BAA6FC2
+:1016D0008E390F0B010BAB6F060EDB50146E070E2D
+:1016E000E15C02E2E16AE552E16E1450E552E7CFB7
+:1016F000D9FF1200D9CFE6FFE1CFD9FF070EE126CF
+:10170000410EF36E020EF3CFDBFF030EDB6A040E15
+:10171000DB6A050EDB6A060EDB6ADF6AFC0EDB5055
+:10172000DF5C01E38DD0010EDB6ADBCF14F0080E25
+:10173000E76E1418E8AE02D0E73402D0E750145C2C
+:1017400001E37CD0800E156E010EDB5015C0E7FF63
+:10175000070B04E0E742E79EE806FCE1E750146E61
+:10176000DF50E76EFD0EDBCFE9FFFE0EDBCFEAFFB9
+:10177000E750E926000EEA22EF501414E76E030E3C
+:10178000E7CFDBFF010EDBCFE6FF070EE552D88087
+:10179000E754146E030EDB5014C0E7FFE75204E079
+:1017A000E8427F0BE706FCE1E76E030EE7CFDBFFC5
+:1017B000DBCFE6FF020EDB50800BE844010BE55265
+:1017C000E718E76E040EE7CFDBFFDBCFE6FF020E84
+:1017D000DB50010BE552E718E76E050EE7CFDBFFA4
+:1017E000040EDBCFE6FF020EDB50020BE8407F0B5E
+:1017F000E552E718E76E060EE7CFDBFF020EDB507F
+:10180000020D020EF3CFDBFF040EDBCFE6FF050E69
+:10181000DB50E824156E060EDB50040DF350151056
+:10182000E552E710146E020EDB50F80B1410E76E51
+:10183000020EE7CFDBFF010EDB2A77D7DF2A6ED758
+:10184000020EDB50146E070EE15C02E2E16AE55223
+:10185000E16E1450E552E7CFD9FF12009496949AA6
+:10186000320EC66EC79C9E961200D9CFE6FFE1CF1E
+:10187000D9FF020EE126DE6ADD6AFD0EDB500F0B9A
+:10188000DE6EDD6ADECF16F0DDCF17F016C017F082
+:10189000166AFE0EDB501624146E000E172014C0BC
+:1018A000DEFFDD6EDECF14F0DDCF15F0000E145E2E
+:1018B000020E155A14C0DEFF15C0DDFFDECF14F096
+:1018C000DDCF15F0800E151408E1DECF16F0DDCF68
+:1018D00017F0D890173216320BD0DECF16F0DDCFCE
+:1018E00017F0D89017321632000E1626800E1722E7
+:1018F000DE501624146EDD501720156E14C0DEFF66
+:10190000DD6EDECF14F0DDCF15F014C0F3FF15C08F
+:10191000F4FF020EE15C02E2E16AE552E16EE5529B
+:10192000E7CFD9FF1200D9CFE6FFE1CFD9FF020EF2
+:10193000E126DE6ADD6AFD0EDB50DE6EDD6ADECF9B
+:1019400016F0DDCF17F0040ED89016361736E804DF
+:10195000FBE1FE0EDB380F0B1624146E000E172071
+:1019600014C0DEFFDD6EDECF14F0DDCF15F0000E0B
+:10197000145E020E155A14C0DEFF15C0DDFFDECF67
+:1019800014F0DDCF15F0800E151408E1DECF16F04F
+:10199000DDCF17F0D890173216320BD0DECF16F00D
+:1019A000DDCF17F0D89017321632000E1626800EB3
+:1019B0001722DE501624146EDD50172014C0DEFFEF
+:1019C000DD6EDECF14F0DDCF15F014C0F3FF15C0CF
+:1019D000F4FF020EE15C02E2E16AE552E16EE552DB
+:1019E000E7CFD9FF1200D9CFE6FFE1CFD9FF899A1F
+:1019F000FE0EDB50C96E9EA6FED79E96FD0EDB50F6
+:101A0000C96E9EA6FED79E96E552E7CFD9FF12007B
+:101A1000D9CFE6FFE1CFD9FFE652FA0EDBCFE9FFDF
+:101A2000FB0EDBCFEAFFFE0EDBCFEFFF010EE76E12
+:101A3000FA0EDBCFE9FFFB0EDBCFEAFFE750E9262A
+:101A4000000EEA22FD0EDBCFEFFF899ADF6AFC0E63
+:101A5000DB50DF5C21E2DF50E76EFA0EDBCFE9FFFF
+:101A6000FB0EDBCFEAFFE750E926000EEA22EF503B
+:101A7000C96E9EA6FED79E96DF50E76EFA0EDBCFAC
+:101A8000E9FFFB0EDBCFEAFFE750E926000EEA2272
+:101A9000C9CFEFFFDF2ADBD7898AE552E552E7CFCE
+:101AA000D9FF1200CD88CD8A9F909D809E90CD82D7
+:101AB000CD8012000E01028D1200D9CFE6FFE1CFDA
+:101AC000D9FF020EE126DE6ADD6A830EC214000928
+:101AD000C26EC282C2B2FED7C450176E166AC3501D
+:101AE0001624146E000E172014C0DEFFDD6EDECF4C
+:101AF00014F0DDCF15F014C0F3FF15C0F4FF020E93
+:101B0000E15C02E2E16AE552E16EE552E7CFD9FF1E
+:021B10001200C1
+:0E1B1200D9CFE6FFE1CFD9FF800EE66E75EC6D
+:101B200018F0E552729E728CFD0EDBCFE9FFFE0EBF
+:101B3000DBCFEAFFEE52EF04146EFD0EDBCFE9FFC0
+:101B4000FE0EDBCFEAFF050EE926000EEA22EF04C7
+:101B5000400DF35014100E01436FFD0EDBCFE9FF73
+:101B6000FE0EDBCFEAFF020EE926000EEA22EF04AA
+:101B7000166EFD0EDBCFE9FFFE0EDBCFEAFF030E94
+:101B8000E926000EEA22EF04080DF3CF15F0FD0E52
+:101B9000DBCFE9FFFE0EDBCFEAFF070EE926000EE2
+:101BA000EA22EF50400DF3CF14F0FD0EDBCFE9FF3A
+:101BB000FE0EDBCFEAFF060EE926000EEA22EF500A
+:101BC000800DF350141015101610446FFD0EDBCF6E
+:101BD000E9FFFE0EDBCFEAFF040EE926000EEA2243
+:101BE000EF04156EFD0EDBCFE9FFFE0EDBCFEAFF43
+:101BF000090EE926000EEA22EF50400DF3CF14F053
+:101C0000FD0EDBCFE9FFFE0EDBCFEAFF080EE92673
+:101C1000000EEA22EF50800DF35014101510456F9E
+:101C20007D95E66AE668070EE66EE66AE66AF80EF5
+:101C3000E66E0E0EE66E89EC18F0146E070EE15E8D
+:101C400014500E01466B476B4681E66AFD0EDBCFF2
+:101C5000E9FFFE0EDBCFEAFFEF50156A000F146EAE
+:101C6000010E1522166A176A15AE02D0166817689B
+:101C700014C0E6FF15C0E6FF16C0E6FF17C0E6FF7A
+:101C8000E00EE66E0E0EE66E89EC18F0186E070E8A
+:101C9000E15E18500E01FC0E796FF00E716F7269E3
+:101CA000200E706EE66A75EC18F0E552606A0F015E
+:101CB000306B0E01806BFD0EDBCFE9FFFE0EDBCF3C
+:101CC000EAFFEF50E66EC5EC14F0E552010EE55266
+:101CD000E7CFD9FF1200D9CFE6FFE1CFD9FFE65217
+:101CE000FD0EDBCFE9FFFE0EDBCFEAFFEFCFDFFF1C
+:101CF000DF50120DF3CFE9FFF4CFEAFF000EE92623
+:101D0000010EEA22DFCFEFFFFD0EDBCFE9FFFE0E73
+:101D1000DBCFEAFFEE52EECF14F0EECF15F0EECFB0
+:101D200016F0EFCF17F0DF50120DF3CFE9FFF4CF2D
+:101D3000EAFF000EE926010EEA22EE5214C0EEFF81
+:101D400015C0EEFF16C0EEFF17C0EEFFFD0EDBCF95
+:101D5000E9FFFE0EDBCFEAFF050EE926000EEA22C0
+:101D6000EF50E66EDF50120DF3CFE9FFF4CFEAFF3C
+:101D7000000EE926010EEA22050EE926000EEA22EF
+:101D8000E552E750EF6EFD0EDBCFE9FFFE0EDBCF35
+:101D9000EAFF060EE926000EEA22EECF14F0EECF9F
+:101DA00015F0EECF16F0EFCF17F0DF50120DF3CF96
+:101DB000E9FFF4CFEAFF000EE926010EEA22060E43
+:101DC000E926000EEA2214C0EEFF15C0EEFF16C091
+:101DD000EEFF17C0EEFF010EE552E552E7CFD9FF47
+:101DE0001200D9CFE6FFE1CFD9FF020EE126DF6A6C
+:101DF000010EDB6ADB6A320EF36E010EDBCFF4FFFD
+:101E0000F350F45C33E2E66AFD0EDBCFE9FFFE0E31
+:101E1000DBCFEAFF050EE926000EEA22EF50E66E60
+:101E2000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCFCC
+:101E3000E9FFFE0EDBCFEAFFEE52EECFE6FFEECF7C
+:101E4000E6FFEECFE6FFEFCFE6FFF2EC15F0146E03
+:101E5000080EE15E1450DF6EDF5008E10B0EE66EF7
+:101E60003AEC21F0E552010EDB2AC5D7DF50146EA3
+:101E7000020EE15C02E2E16AE552E16E1450E552C5
+:101E8000E7CFD9FF1200D9CFE6FFE1CFD9FF020E8D
+:101E9000E126010EDB6AD9CFE6FFDACFE6FFFD0EC1
+:101EA000DBCFE9FFFE0EDBCFEAFF050EE926000ED1
+:101EB000EA22E9CF14F0EACF15F0E9CFE6FFEACF46
+:101EC000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EF1
+:101ED000DBCFE9FFFE0EDBCFEAFFEE52E9CF16F0D3
+:101EE000EACF17F0E9CFE6FFEACFE6FF45EC17F0BF
+:101EF000186E080EE15E1850E76E010EE7CFDBFFAB
+:101F0000080EDF140101CE6F010EDB50146E020EBD
+:101F1000E15C02E2E16AE552E16E1450E552E7CF7E
+:101F2000D9FF1200D9CFE6FFE1CFD9FF040EE12699
+:101F3000DF6A010EDB6A020EDB6A030EDB6ADF6A10
+:101F4000DFCF14F0060EE76E1418E8AE02D0E734C7
+:101F500002D0E750145C01E3B5D0040EDF02F35069
+:101F6000E66E4BEC02F0E552020EF3CFDBFF030E00
+:101F7000F4CFDBFF0101D551200DF350E00B01013F
+:101F8000C66F020E030EDBCF17F017C016F0176AEC
+:101F9000C65100011610E8CFC6F1FF0EE76E020E23
+:101FA000DBCF14F0030EE7501416156A14C0C7F106
+:101FB000040EDF02F328E66E4BEC02F0E552020E4F
+:101FC000F3CFDBFF030EF4CFDBFF020E030EDBCFFC
+:101FD00015F015C014F0156A14C0C8F1FF0EE76EB5
+:101FE000020EDBCF14F0030EE7501416156A14C06E
+:101FF000C9F1040EDF02F350020FE66E4BEC02F063
+:10200000E552020EF3CFDBFF030EF4CFDBFF020E2F
+:10201000030EDBCF15F015C014F0156A14C0CAF119
+:10202000FF0EE76E020EDBCF14F0030EE75014161E
+:10203000156A14C0CBF1040EDF02F350030FE66EF5
+:102040004BEC02F0E552020EF3CFDBFF030EF4CFB0
+:10205000DBFF020E030EDBCF15F015C014F0156A7E
+:1020600014C0CCF1FF0EE76E020EDBCF14F0030EAE
+:10207000E7501416156A14C0CDF1C60EE66E010EB7
+:10208000E66EDF28146E156A14BE1568120E15026E
+:10209000F3CF15F01402F3CF14F0F4501526000E10
+:1020A0001426010E152214C0E6FF15C0E6FF99DEC6
+:1020B000E552E552E552E552E76E010EE7CFDBFF50
+:1020C000DF2A3ED7010EDB50146E040EE15C02E203
+:1020D000E16AE552E16E1450E552E7CFD9FF1200F4
+:1020E000D9CFE6FFE1CFD9FF080EE126060EDB6A65
+:1020F000D9CFE6FFDACFE6FFA1EC03F0E552E552D7
+:10210000030EDB50E76E070EE7CFDBFFDBCF14F0EB
+:10211000000EE76E1418E8AE02D0143403D0E75076
+:10212000D88014540DE2070EDBCF15F0460EE76E93
+:102130001518E8AE02D0E73402D0E750155C03E38F
+:102140000E01010E0C6F0101D651040DF3CF14F0F6
+:102150000101D551200DF35014240101C66F070E63
+:10216000DBCFC7F1040E0101D603F350E66EA5ECF8
+:1021700002F0E552F3CFC8F1040E0101D603F328B3
+:10218000E66EA5EC02F0E552F3CFC9F1040E0101B1
+:10219000D603F350020FE66EA5EC02F0E552F3CF42
+:1021A000CAF1040E0101D603F350030FE66EA5EC4D
+:1021B00002F0E552F3CFCBF10101CC6BCD6BC60E33
+:1021C000E66E010EE66E900EE66E010EE66E09DE1C
+:1021D000E552E552E552E552E76E060EE7CFDBFF2A
+:1021E000DB50146E080EE15C02E2E16AE552E16E3A
+:1021F0001450E552E7CFD9FF1200D9CFE6FFE1CF67
+:10220000D9FF090EE126080EDB6AD9CFE6FFDACF47
+:10221000E6FF000EE66E010EE66E35DEE552E55293
+:10222000E552E552000919E0010EF36E080EF3CFF6
+:10223000DBFF8D70E00EDF14E00BE838E8400101B1
+:10224000D86F1F0EDF140101D76FD8C1DAF1010179
+:10225000DA2B080EDA5D01E3DA6B080EDB50146E40
+:10226000090EE15C02E2E16AE552E16E1450E552CA
+:10227000E7CFD9FF1200D9CFE6FFE1CFD9FF090E92
+:10228000E126080EDB6AD9CFE6FFDACFE6FF000EC3
+:10229000E66E010EE66EF7DDE552E552E552E552D7
+:1022A000000976E0010EF36E080EF3CFDBFF7792A4
+:1022B0008D70E00EDF14E00BE838E8400101D86FC4
+:1022C0001F0EDF140101D76F0101DA510101D85D42
+:1022D00003E10101DA2B06D0D8C1DAF10101DA2BD2
+:1022E0000101DB2B080E0101DA5D01E3DA6B030E5D
+:1022F000DBCFCFF10101D06BD16BD26B080E1F0B7E
+:10230000CFC114F0D0C115F0D1C116F0D2C117F071
+:1023100007E0D8901436153616361736E806F9E178
+:10232000020EDBCF18F0196A1A6A1B6A14501824BF
+:102330000101CF6F15501920D06F16501A20D16FA0
+:1023400017501B20D26F080E1F0BCFC114F0D0C145
+:1023500015F0D1C116F0D2C117F007E0D8901436AD
+:10236000153616361736E806F9E1010EDBCF18F000
+:10237000196A1A6A1B6A145018240101CF6F15508C
+:102380001920D06F16501A20D16F17501B20D26F12
+:10239000080EDB50146E090EE15C02E2E16AE552C0
+:1023A000E16E1450E552E7CFD9FF1200D9CFE6FF16
+:1023B000E1CFD9FF1C0EE126030EF36E080EF3CF1A
+:1023C000DBFF090EDB6A0E0EF36E0A0EF3CFDBFFA6
+:1023D0000B0EDB6A0C0EDB6A080EF36E0D0EF3CFEC
+:1023E000DBFF0E0EDB6A0F0EDB6A100EDB6A110ECE
+:1023F000DB6AD950120FE66E000EDA20E66ED95075
+:102400000D0FE66E000EDA20E66ED9CFE6FFDACFCA
+:10241000E6FFD9500E0FE66E000EDA20E66E45ECB0
+:1024200017F0146E080EE15E1450E76E0C0EE7CF45
+:10243000DBFF120EDB50080B0101CE6FD9500E0FDF
+:10244000E96EDACFEAFFEE5065E1030EEE1862E1C5
+:10245000EE5060E1EE505EE1070EDBCFE6FF060EC8
+:10246000DBCFE6FF050EDBCFE6FF040EDBCFE6FF9A
+:10247000030EDBCFE6FF020EDBCFE6FF010EDB50E3
+:10248000DF18E552E718E552E718E552E718E5527C
+:10249000E718E552E718E552E718E76E0B0EE7CFAD
+:1024A000DBFF080EDB50F36E0B0EDB50F35C0CE130
+:1024B0000101400EDD6F0101F16BF1C1E6FF65DA4C
+:1024C000E552E66AF50E0CD0090EDB50F36E0B0EEA
+:1024D000DB50F35C15E10101800EDD6FE66AF60E5C
+:1024E000E66E0D0EE66EE66AE66AF80EE66E0E0E13
+:1024F000E66E89EC18F0146E070EE15E14500AD0F7
+:102500000A0EDB50F36E0B0EDB50F35C03E10101AE
+:102510000A0EDD6F0101DD510A0A01E111D18A0ABB
+:1025200001E183D0C00A01E012D1D9500E0FE96E4B
+:10253000DACFEAFF0A0EEE1808E1010EEE1805E107
+:10254000EE5003E1EE5001E110D9D9500E0FE96EC3
+:10255000DACFEAFF0A0EEE1801E0F9D0030EEE180A
+:1025600001E0F5D0EE5001E0F2D0EE5001E0EFD006
+:10257000130EDB6A0D0EDB50F36E130EDBCFF4FF90
+:10258000F350F45C20E2D9CF16F0DACF17F0130E37
+:10259000DB500F01D924E96E000EDA20EA6EEF500D
+:1025A000E66ED950140F146EDACF15F0130EDB500F
+:1025B0001424E96E000EDA20EA6EE552E750EF6E61
+:1025C000130EDB2AD7D7140EDB500101F25D01E0B8
+:1025D000BED0150EDB50F35D01E0B9D0160EDB5016
+:1025E000E95D01E0B4D0180EDB50EC5D01E0AFD046
+:1025F0001B0EDBCFE6FFC9D9E552E66AE6680D0E91
+:10260000E66EE66AE66AF80EE66E0E0EE66E89EC97
+:1026100018F0146E070EE15E14501B0EDBCFE6FFC0
+:102620000D0EE66EDEEC1EF088D0D9500E0FE96E6E
+:10263000DACFEAFF090EEE1806E1030EEE1803E109
+:10264000EE5001E1EE5002E0000E01D0010E146EDA
+:10265000D9500E0FE96EDACFEAFF080EEE1806E148
+:10266000030EEE1803E1EE5001E1EE5002E0000E21
+:1026700001D0010E14106BE0130EDB6A0D0EDB505F
+:10268000F36E130EDBCFF4FFF350F45C20E2D9CFEE
+:1026900016F0DACF17F0130EDB500F01D924E96ED4
+:1026A000000EDA20EA6EEF50E66ED950140F146E69
+:1026B000DACF15F0130EDB501424E96E000EDA2089
+:1026C000EA6EE552E750EF6E130EDB2AD7D7D950EA
+:1026D0000E0FE96EDACFEAFF080EEE1814E1030ED2
+:1026E000EE1811E1EE500FE1EE500DE1D950140F4C
+:1026F000E66E000EDA20E66EE66A82EC1DF0E55228
+:10270000E552E55224D0D9500E0FE96EDACFEAFF38
+:10271000090EEE181CE1030EEE1819E1EE5017E158
+:10272000EE5015E1D950140FE66E000EDA20E66E79
+:10273000080EE66E82EC1DF0E552E552E55201D03E
+:1027400014D80101200ED76F0101010EDD6F0C0EB0
+:10275000DB50146E1C0EE15C02E2E16AE552E16EB0
+:102760001450E552E7CFD9FF1200D9CFE6FFE1CFF1
+:10277000D9FF060EE126DF6A010EDB6A020EDB6A74
+:10278000030EDB6A040EDB6AF36E050EF3CFDBFF8C
+:10279000F2C1C6F1F3C1C7F1E9C1C8F1F4C1C9F191
+:1027A000ECC1CAF1F5C1CBF1EFC1CCF1F0C1CDF173
+:1027B0000101F351E66ED950010FE96EDACFEAFF5D
+:1027C000E552E750EE6EED6A010EDBCF14F0020E1B
+:1027D00014C015F0146A010E14C0DBFF020E15C000
+:1027E000DBFFF251E76E010EDBCF14F0020EDBCF00
+:1027F00015F0E7501412010E14C0DBFF020E15C0D5
+:10280000DBFF010EDB2A020E01E3DB2A030EDBCF26
+:1028100014F0040EDBCF15F0010EDBCF16F0020E24
+:10282000DBCF17F01450165C155017580CE3050E4B
+:10283000DBCFE6FF0CEC21F0E552030EDB2A040EA1
+:10284000E5E3DB2AE3D7C60EE66E010EE66EA20EC6
+:10285000E66E010EE66EF1EC0EF0E552E552E55241
+:10286000E552DF6EDF50146E060EE15C02E2E16AB3
+:10287000E552E16E1450E552E7CFD9FF1200D9CFEF
+:10288000E6FFE1CFD9FF070EE126060EDB6A0E0157
+:10289000096B0A6B0B6BD9CFE6FFDACFE6FFF4ECDE
+:1028A00002F0E552E552DECF14F0DDCF15F0400E18
+:1028B0001416000E1516060ED89015321432E804C0
+:1028C000FBE114C00AFE040EDBCF14F0050EDBCFD3
+:1028D00015F0010E145C000E155803E30E01010EF5
+:1028E0000B6F0101C66B0101D551200DF3500101A1
+:1028F000D7250101C66FC76B0E010851400DF3CFFC
+:10290000C7F10951200DF3500101C7130E010A3917
+:10291000F00B0101C7130E010B51080DF35001011B
+:10292000C7130E010C51040DF3500101C7130E0122
+:102930000D51E8240101C7130E010E510101C71307
+:10294000C86BC96BCA6BCB6BCC6BCD6BC60EE66E1E
+:10295000010EE66E7E0EE66E010EE66EF1EC0EF0F6
+:10296000E552E552E552E552E76E060EE7CFDBFF92
+:10297000DB50146E070EE15C02E2E16AE552E16EA3
+:102980001450E552E7CFD9FF1200D9CFE6FFE1CFCF
+:10299000D9FF0101006BFE0EDB50016F026B000ED0
+:1029A0000127010E0223036B046B02AF02D00369FF
+:1029B0000469050E056FFE0EDB50066F076B000EF7
+:1029C0000627010E0723086B096B07AF02D00869C1
+:1029D0000969126FFE0EDB50136F146B000E132784
+:1029E000020E1423156B166B14AF02D0156916690D
+:1029F000080E176F186B196B1A6B1B6B020E246F86
+:102A0000FE0EDB50256F266B010E2527020E2623B6
+:102A1000276B286B26AF02D027692869080E296F1B
+:102A20002A6B2B6B2C6B2D6B030E366FFE0EDB505F
+:102A3000376F386B020E37273823396B3A6B38AF54
+:102A400002D039693A69080E3B6F3C6B3D6B3E6BB7
+:102A50003F6B040E486FFE0EDB50496F4A6B030E4E
+:102A60004927020E4A234B6B4C6B4AAF02D04B698D
+:102A70004C69080E4D6F4E6B4F6B506B516B050ED2
+:102A80005A6FFE0EDB505B6F5C6B040E5B27020E11
+:102A90005C235D6B5E6B5CAF02D05D695E69080EA6
+:102AA0005F6F606B616B626B636B060E6C6FFE0E2B
+:102AB000DB506D6F6E6B050E6D27020E6E236F6B14
+:102AC000706B6EAF02D06F697069080E716F726BB8
+:102AD000736B746B756B070E7E6FFE0EDB507F6F32
+:102AE000806B060E7F27020E8023816B826B80AF86
+:102AF00002D081698269080E836F846B856B866B57
+:102B0000876B906FFE0EDB50916F926B070E9127D3
+:102B1000020E9223936B946B92AF02D093699469E7
+:102B2000080E956F966B976B986B996BA26FFE0E64
+:102B3000DB50A36FA46B0A0EA327020EA423A56B80
+:102B4000A66BA4AF02D0A569A669080EA76FA86BF3
+:102B5000A96BAA6BAB6B010EE552E7CFD9FF120050
+:102B6000800EE66EC2DAE5520E01010E436FF80EDA
+:102B7000446F440E456F200E706E729E728C606AB8
+:102B80000F01306B0E01806B906BA06BB06BC06B54
+:102B9000D06BF80E7D6F880EE06F220EE16FE46F50
+:102BA000080EE56F140EE86F050EE96F070E466F0D
+:102BB000476B716B110E726F736F746B756B766B05
+:102BC000776B786B500E796F050E7A6F7B6B7B6B32
+:102BD000F869F969F997FC6BFD6BFD97E66A85DA90
+:102BE000E5521200D9CFE6FFE1CFD9FF1A0EE12658
+:102BF000D950060FE96EDACFEAFF200EEE6E0F0E07
+:102C0000ED6ED950080FE96EDACFEAFF100EEE6EC6
+:102C10000F0EED6ED9500A0FE96EDACFEAFF000E03
+:102C2000EE6E0F0EED6ED9500C0FE96EDACFEAFFA3
+:102C3000800EEE6E0E0EED6ED9500E0FE96EDACFED
+:102C4000EAFF900EEE6E0E0EED6ED950100FE96E8B
+:102C5000DACFEAFFA00EEE6E0E0EED6ED950120F17
+:102C6000E96EDACFEAFFB00EEE6E0E0EED6ED950C1
+:102C7000140FE96EDACFEAFFC00EEE6E0E0EED6EA7
+:102C8000D950160FE96EDACFEAFFD00EEE6E0E0EB7
+:102C9000ED6E0E017D417F0BE76E190EE7CFDBFF76
+:102CA000DF6ADF50146E156A080E145C000E1558AA
+:102CB00001E3DED0D950060F146EDF50020D145020
+:102CC000F324E96EDA50F420EA6E020EEECFDBFF59
+:102CD000030EEDCFDBFF020EDBCF08F0030EDBCFE0
+:102CE00009F0040E08C0DBFF050E09C0DBFFDF5052
+:102CF000020810E2190EDBCFF3FFF390F342F3CF9B
+:102D0000DBFFD950190FE96EDACFEAFFEF50010B64
+:102D100001E1ACD0020EDBCFE9FF030EDBCFEAFF0F
+:102D2000EF50080B01E0A2D0FC0E146E020EDBCFB8
+:102D3000E9FF030EDBCFEAFF1450EF16F70EDB506E
+:102D4000030B146E020EDBCFE9FF030EDBCFEAFFAD
+:102D50001450EF12F70EDBAC04D0F80EDB50400934
+:102D600002D0F80EDB50E76E180EE7CFDBFF050E42
+:102D7000E76E020EDBCFE9FF030EDBCFEAFFE75081
+:102D8000E926000EEA22180EDBCFEFFFF70EDBAAD2
+:102D900006D0010EF36E180EF3CFDBFF02D0180E33
+:102DA000DB6ADBCFE6FFD950FB0FE96EFF0EDA20BE
+:102DB000EA6EEECFE6FFEECFE6FFEECFE6FFEFCF17
+:102DC000E6FF010EE76E020EDBCF14F0030EDBCF41
+:102DD00015F0E7501426000E152214C0E6FF15C0AA
+:102DE000E6FF97D9166E070EE15E1650D950020F16
+:102DF000E96EDACFEAFF060EEE26000EED22010E96
+:102E0000DB6AF80EDB50F36E010EDBCFF4FFF350FC
+:102E1000F45C1AE2F90EDBCFE9FFDB2AFA0EDBCF16
+:102E2000EAFF01E3DB2AEF50E66E020EDBCFE9FF9B
+:102E3000DB2A030EDBCFEAFF01E3DB2AE552E75092
+:102E4000EF6E010EDB2ADDD7040EDBCFE9FF050EA6
+:102E5000DBCFEAFFEF50040B07E1040EDBCFE9FF05
+:102E6000050EDBCFEAFFEF86010E03D0DF2A19D76C
+:102E7000000E146E1A0EE15C02E2E16AE552E16EA8
+:102E80001450E552E7CFD9FF1200D9CFE6FFE1CFCA
+:102E9000D9FF060EE1260E010F6B60AE04D0600E66
+:102EA000DE6E0F0E43D00F0130AF04D0300EDE6E59
+:102EB0000F0E3CD00E017D51040B07E18051800BB9
+:102EC00004E0800EDE6E0E0E31D07D51080B07E15E
+:102ED0009051800B04E0900EDE6E0E0E27D07D51D7
+:102EE000100B07E1A051800B04E0A00EDE6E0E0E69
+:102EF0001DD07D51200B07E1B051800B04E0B00ED6
+:102F0000DE6E0E0E13D07D51400B07E1C051800BD9
+:102F100004E0C00EDE6E0E0E09D07D51800B13E171
+:102F2000D051800B10E0D00EDE6E0E0EDD6EDECFC7
+:102F3000E9FFDDCFEAFFEF501F0B0E010F6F779215
+:102F400071AC0BD002D0000EC4D0F70EDBCFE9FF7E
+:102F5000F80EDBCFEAFFEF86719CD9CFE9FFDACF1D
+:102F6000EAFF020EEECFDBFF030EEDCFDBFFF70E25
+:102F7000DBCFE9FFF80EDBCFEAFFEF6ADECFE9FF38
+:102F8000DDCFEAFF050EE926000EEA22050EEFCF9F
+:102F9000DBFFDB500F0BE66EF90EDBCFE9FFFA0E1D
+:102FA000DBCFEAFFE552E750EF6ED950050FE96E2F
+:102FB000DACFEAFFEF50400B07E0F70EDBCFE9FF77
+:102FC000F80EDBCFEAFFEF8CDECFE9FFDDCFEAFFC3
+:102FD000020EE926000EEA22050EEFCFDBFFD950E4
+:102FE000050FE96EDACFEAFFEF50080B0DE0F70EA0
+:102FF000DBCFE9FFF80EDBCFEAFFEF8A010EF36EBD
+:10300000050EF3CFDBFF02D0050EDB6ADBCFE6FF58
+:10301000FD0EDBCFE6FFFE0EDBCFE6FFDECF14F0CA
+:10302000DDCF15F0010E1426000E152214C0E6FFA8
+:1030300015C0E6FF46D9166E050EE15E1650060E67
+:10304000DE26000EDD22F90EDBCFE9FFFA0EDBCF24
+:10305000EAFF050EEFCFDBFF040EDB6ADBCF14F0D7
+:10306000156A14BE1568050EDB50000115AE02D0BE
+:10307000D89003D0145C000E155819E2DFCFE9FF99
+:10308000DF2A010EDBCFEAFF01E3DB2AEF50E66E19
+:10309000FB0EDBCFE9FFDB2AFC0EDBCFEAFF01E30F
+:1030A000DB2AE552E750EF6E040EDB2AD7D777AE66
+:1030B00008D0F70EDBCFE9FFF80EDBCFEAFFEF8891
+:1030C000779E020EDBCFE9FF030EDBCFEAFFEF9E18
+:1030D000010E146E060EE15C02E2E16AE552E16E59
+:1030E0001450E552E7CFD9FF1200D9CFE6FFE1CF68
+:1030F000D9FF1F0E6F16FE0EDB506F12E00E6F141D
+:10310000146EFE0EDB50145CF9E1E552E7CFD9FFF7
+:103110001200D9CFE6FFE1CFD9FF020EE126D95048
+:10312000F90F146EFF0EDA2014C0DEFFDD6EF80E0C
+:10313000DB50146E156AE850151031E1DECFE9FF5F
+:10314000DDCFEAFFEF50E840E840E8401F0BE66EB5
+:10315000FD0EDBCFE9FFFE0EDBCFEAFFE552E750C5
+:10316000EF6EDECFE9FFDDCFEAFFEE52EF50200D2C
+:10317000F3CF14F0FD0EDBCFE9FFFE0EDBCFEAFF4D
+:10318000F350EF12FD0EDB2AFE0E01E3DB2ADECF49
+:10319000E9FFDDCFEAFFEF50200DF3507ED0DECF08
+:1031A000E9FFDDCFEAFF020EE926000EEA22EF502A
+:1031B000E00BE838E840E66EFD0EDBCFE9FFFE0EDF
+:1031C000DBCFEAFFE552E750EF6EDECFE9FFDDCF60
+:1031D000EAFF030EE926000EEA22EF50080DF3CFB6
+:1031E00014F0FD0EDBCFE9FFFE0EDBCFEAFFF3505C
+:1031F000EF12FD0EDB2AFE0E01E3DB2ADECFE9FF34
+:10320000DDCFEAFF020EE926000EEA22EF50080D9C
+:10321000F350E00BE66EFD0EDBCFE9FFFE0EDBCFD9
+:10322000EAFFE552E750EF6EFD0EDBCFE9FFFE0E41
+:10323000DBCFEAFFEF86DECFE9FFDDCFEAFF020E4C
+:10324000E926000EEA22EF50030B146EFD0EDBCFD1
+:10325000E9FFFE0EDBCFEAFF1450EF12FD0EDB2A72
+:10326000FE0E01E3DB2ADECFE9FFDDCFEAFFEE52FF
+:10327000EF50E66EFD0EDBCFE9FFFE0EDBCFEAFF7F
+:10328000E552E750EF6EFD0EDB2AFE0E01E3DB2A6E
+:10329000DECFE9FFDDCFEAFFEF50E66EFD0EDBCFBC
+:1032A000E9FFFE0EDBCFEAFFE552E750EF6E020EBC
+:1032B000E15C02E2E16AE552E16EE552E7CFD9FF57
+:1032C0001200D9CFE6FFE1CFD9FF020EE126FB0EB7
+:1032D000DBCFDEFFDBCFDDFFFA0EDB50156AE850F7
+:1032E00015104CE1FD0EDBCFE9FFFE0EDBCFEAFF50
+:1032F000EF50080DF350E66EDECFE9FFDDCFEAFFB9
+:10330000E552E750EF6EFD0EDBCFE9FFFE0EDBCF9F
+:10331000EAFFEF50E00BE838E840E66EDECFE9FF69
+:10332000DDCFEAFFEE52E552E750EF6EFD0EDB2AED
+:10333000FE0E01E3DB2AFD0EDBCFE9FFFE0EDBCF45
+:10334000EAFFEF50E00BE838E840DECFE9FFDDCFE1
+:10335000EAFFE850EF12DECFE9FFDDCFEAFF020E11
+:10336000E926000EEA22EF6ADECFE9FFDDCFEAFFB1
+:10337000030EE926000EEA22EF6A84D0FD0EDBCFB1
+:10338000E9FFFE0EDBCFEAFFEF50200DF350E66EB3
+:10339000DECFE9FFDDCFEAFF020EE926000EEA22CA
+:1033A000E552E750EF6EFD0EDBCFE9FFFE0EDBCFFF
+:1033B000EAFFEF50E840E840E8401F0BE66EDECF42
+:1033C000E9FFDDCFEAFF030EE926000EEA22E5520F
+:1033D000E750EF6EFD0EDB2AFE0E01E3DB2AFD0E49
+:1033E000DBCFE9FFFE0EDBCFEAFFEF50030B146EDD
+:1033F000DECFE9FFDDCFEAFF020EE926000EEA226A
+:103400001450EF12FD0EDBCFE9FFFE0EDBCFEAFF1B
+:10341000EF50E00BE840E840E8401F0B146EDECFB1
+:10342000E9FFDDCFEAFF020EE926000EEA22145082
+:10343000EF12FD0EDB2AFE0E01E3DB2AFD0EDBCFD1
+:10344000E9FFFE0EDBCFEAFFEF50E66EDECFE9FFCD
+:10345000DDCFEAFFEE52E552E750EF6EFD0EDB2ABC
+:10346000FE0E01E3DB2AFD0EDBCFE9FFFE0EDBCF14
+:10347000EAFFEF50E66EDECFE9FFDDCFEAFFE5526F
+:10348000E750EF6E020EE15C02E2E16AE552E16EA6
+:08349000E552E7CFD9FF12005D
+:08349800DACFE4FFE2CFDAFF16
+:1034A000E9CFE4FFEACFE4FFF6CFE4FFF7CFE4FF94
+:1034B000F5CFE4FFF3CFE4FFF4CFE4FFFACFE4FF6E
+:1034C00000EE00F0140EE80403E3EECFE4FFFBD7B8
+:1034D00000EE14F00E0EE80403E3EECFE4FFFBD79A
+:1034E000E6529D50010B01E1B8D09E50010B01E165
+:1034F000B4D0B20ECF6ECE6A9E90E0C122F0E1C190
+:1035000023F0E2C124F0E3C125F0030E0B6E0C6A38
+:103510000D6A0E6AE0C106F0E1C107F0E2C108F0F1
+:10352000E3C109F03FEC1FF0025003100410051036
+:1035300002E10101D381E0C122F0E1C123F0E2C147
+:1035400024F0E3C125F00A0E0B6E0C6A0D6A0E6AB8
+:10355000E0C106F0E1C107F0E2C108F0E3C109F003
+:103560003FEC1FF0025003100410051009E10101A7
+:10357000D3838D72040ED75D03E1DE2B000EDF23B3
+:10358000050E0101E01907E1E15105E1E25103E116
+:10359000E35101E1D385080EE01907E1E15105E1AE
+:1035A000E25103E1E35101E1D3850B0EE01907E19C
+:1035B000E15105E1E25103E1E35101E1D3850E0E52
+:1035C000E01907E1E15105E1E25103E1E35101E1D5
+:1035D000D385110EE01907E1E15105E1E25103E164
+:1035E000E35101E1D385140EE01907E1E15105E152
+:1035F000E25103E1E35101E1D385E0C122F0E1C1F1
+:1036000023F0E2C124F0E3C125F0640E0B6E0C6AD6
+:103610000D6A0E6AE0C106F0E1C107F0E2C108F0F0
+:10362000E3C109F03FEC1FF002C022F003C023F019
+:1036300004C024F005C025F002500310041005104A
+:1036400006E10101D387E06BE16BE26BE36B010103
+:10365000E02B000EE123E223E3237750020B1CE072
+:103660007650020B19E00101100EDC6F779292EC9C
+:103670000FF070EC10F03FEC14F03BEC11F0010196
+:10368000DE6BDF6BD52BD62B080ED55D01E3D56B3A
+:10369000060ED65D01E3D66BE55200EE21F00E0E6C
+:1036A000E80403E3E5CFEDFFFBD700EE13F0140EC3
+:1036B000E80403E3E5CFEDFFFBD7E5CFFAFFE5CF65
+:1036C000F4FFE5CFF3FFE5CFF5FFE5CFF7FFE5CF5B
+:1036D000F6FFE5CFEAFFE5CFE9FFE5CFDAFF11001E
+:1036E000D9CFE6FFE1CFD9FFE652D050DF6E000E12
+:1036F000DB94DB9CDB9EDF501B0A0EE0300A0BE004
+:10370000110A08E0020A05E00B0A01E006D00400F5
+:1037100005D004D003D002D001D000D03F0ED0128B
+:1037200022EC00F0FE0EDBCFD7F1E552E552E7CFF9
+:10373000D9FF1200D9CFE6FFE1CFD9FF070EE1266E
+:10374000DE6ADD6A020EDB6A030EDB6A040EDB6AE8
+:10375000050EDB6A060EDB6A0101D751100A01E192
+:1037600063D1180A01E156D10C0A01E187D0060A9B
+:1037700001E17AD0220A10E0210A01E085D1FDECB6
+:1037800010F0040E0101D75D06E1789276827792FF
+:103790000E010F0E7E6F79D1E66A50EC1DF0E552F6
+:1037A000E76E020EE7CFDBFF0101020ED76F020EBC
+:1037B000DB50AA0803E00101100ED76FD7C1E6FF66
+:1037C0008FDFE5525DEC0DF0F3CF14F0F4CF15F080
+:1037D000166A176A15AE02D016681768030E14C071
+:1037E000DBFF040E15C0DBFF050E16C0DBFF060E67
+:1037F00017C0DBFFD950030FE96EDACFEAFFD8908C
+:10380000030EEB50000A08E6440EEE5C090EEE587B
+:10381000000EEE58000EEE5802E3000E01D0010E2D
+:10382000146E030EDBCF07F0040EDBCF08F0050E9D
+:10383000DBCF09F0060EDBCF0AF00A34000E0A18BF
+:1038400009E6D8803E0E07540A0E0854000E0954AB
+:10385000000E0A5402E3000E01D0010E141003E022
+:103860000E01010E086F11D1ECEC03F0F3CFDEFF77
+:10387000F4CFDDFF0101010ED76F07D10101D35154
+:10388000010B0BE00101D3910101D351100B03E0B7
+:103890005AEC0DF002D00101D3890101D351020B82
+:1038A00002E00101D3930101D351040B0BE00101AC
+:1038B000D3950101D351400B03E05AEC0DF002D037
+:1038C0000101D38D0101D351080B5EE00101D397B3
+:1038D000040E0101DB5D03E30101080ED76F0E0149
+:1038E000086B5DEC0DF0F3CF14F0F4CF15F0166A11
+:1038F000176A15AE02D016681768030E14C0DBFFF6
+:10390000040E15C0DBFF050E16C0DBFF060E17C048
+:10391000DBFFD950030FE96EDACFEAFFD890030E30
+:10392000EB50000A08E6440EEE5C090EEE58000E5D
+:10393000EE58000EEE5802E3000E01D0010E146E98
+:10394000030EDBCF07F0040EDBCF08F0050EDBCF54
+:1039500009F0060EDBCF0AF00A34000E0A1809E659
+:10396000D8803E0E07540A0E0854000E0954000E6B
+:103970000A5402E3000E01D0010E141003E00E0100
+:10398000010E086F0101DB6B0101D351A00B39E17E
+:1039900001010A0ED880DE55000EDF5507E2010155
+:1039A000CF6BD06BD16BD26B3BEC02F0100E0101F0
+:1039B000DC5D27E10101200EDC6FCFC114F0D0C126
+:1039C00015F0D1C116F0D2C117F0141E151E161E27
+:1039D000171E14C0E6FF15C0E6FF16C0E6FF17C0AD
+:1039E000E6FFCFC1E6FFD0C1E6FFD1C1E6FFD2C1FD
+:1039F000E6FF010EE66EE3EC05F0186E090EE15EDF
+:103A00001850D30EE66E010EE66ECBEC00F0E552D8
+:103A1000E5523BD0FC0E8D148D6E0101010EDD6F61
+:103A20000101040ED76F31D00101DD052AE1030E3B
+:103A30008D12F29EF29C76920101040EDD6FE66A11
+:103A4000E6680D0EE66EE66AE66AF80EE66E0E0EA3
+:103A5000E66E89EC18F0146E070EE15E14500E014C
+:103A60004681E66AE66A010EE66EE66AE66AE00EFE
+:103A7000E66E0E0EE66E89EC18F0146E070EE15E2F
+:103A80001450D6EC11F001D000D00400070EE15C18
+:103A900002E2E16AE552E16EE552E7CFD9FF12009A
+:103AA000D9CFE6FFE1CFD9FF020EE126010EDB6A96
+:103AB000DE52120EDD6EFE0EDB50DF6EDF6A010E8F
+:103AC000DB50DF5C10E2DF50746E7F9E7F9C7F8056
+:103AD0000000DF50EA6AE40FE96E010EEA2273CFBC
+:103AE000EFFFDF2AECD70101E45100D0146E020E83
+:103AF000E15C02E2E16AE552E16E1450E552E7CF83
+:103B0000D9FF1200D9CFE6FFE1CFD9FF090EE12698
+:103B1000010EDB6A020EDB6A030EDB6A040EDB6A4F
+:103B2000050EDB6A060EDB6A070EDB6A080EDB6A2F
+:103B3000FE0EDB5027E1010EDB6A080EF36E010E6C
+:103B4000DBCFF4FFF350F45C01E32ED1010EDB5028
+:103B5000E76EFC0EDBCFE9FFFD0EDBCFEAFFE7509F
+:103B6000E926000EEA22EF50E66E010EDB28EA6A33
+:103B7000E40FE96E010EEA22E552E750EF6E010E06
+:103B8000DB2ADBD7FE0EDB50080801E00DD1010E69
+:103B9000DB6A040EF36E010EDBCFF4FFF350F45C2E
+:103BA0001DE2010EDB50E76EFC0EDBCFE9FFFD0EE0
+:103BB000DBCFEAFFE750E926000EEA22EF50E66E7F
+:103BC000010EDB50090FEA6AE40FE96E010EEA22EA
+:103BD000E552E750EF6E010EDB2ADBD70101AA0E9A
+:103BE000E46FF16B300EE55D1A6E1B6A300EE65D18
+:103BF0001C6E1D6A0A0E086E096A1CC00DF01DC0FD
+:103C00000EF073EC1FF01A500624186E1B5007209C
+:103C1000196E300E0101E75D1E6E1F6A640E086E9C
+:103C2000096A1EC00DF01FC00EF073EC1FF0185093
+:103C30000624166E19500720176E300E0101E85D3C
+:103C4000206E216AE80E086E030E096E20C00DF08A
+:103C500021C00EF073EC1FF016500624146E17509E
+:103C60000720156EFF0E1416000E1516030E14C055
+:103C7000DBFF040E15C0DBFF300E0101E55D1A6E9F
+:103C80001B6A300EE65D1C6E1D6A0A0E086E096A1C
+:103C90001CC00DF01DC00EF073EC1FF01A5006246E
+:103CA000186E1B500720196E300E0101E75D1E6E65
+:103CB0001F6A640E086E096A1EC00DF01FC00EF068
+:103CC00073EC1FF018500624166E19500720176E5B
+:103CD000300E0101E85D206E216AE80E086E030EC9
+:103CE000096E20C00DF021C00EF073EC1FF01650CD
+:103CF000062417500720146E156A050E14C0DBFF4A
+:103D0000060E15C0DBFF300E0101EB5D0A0D300E13
+:103D1000EA5DF324E76E070EE7CFDBFF300EEE5DC2
+:103D20000A0D300EED5DF324E76E080EE7CFDBFFE2
+:103D3000030EDBCFF2F1050EDBCFF3F1070EDBCF85
+:103D4000F4F1080EDBCFF5F1120EF36E020EF3CF95
+:103D5000DBFF010EDB6A020EDB50F36E010EDBCFE0
+:103D6000F4FFF350F45C20E2010EDB50746E010EA0
+:103D7000DB50EA6AE40FE96E010EEA22EF50736E3F
+:103D80007F9E7F9C7F84F250DF6EF26A550E7E6EBE
+:103D9000AA0E7E6E7F82DF50F26E7F94B7ACFED7A4
+:103DA000B79C010EDB2AD7D7090EE15C02E2E16A7B
+:103DB000E552E16EE552E7CFD9FF1200D9CFE6FF19
+:103DC000E1CFD9FFE652FE0EDB50746EFD0EDB50E4
+:103DD000736E7F9E7F9C7F84F250DF6EF26A550E79
+:103DE0007E6EAA0E7E6E7F82DF50F26E7F94B7AC3D
+:0E3DF000FED7B79CE552E552E7CFD9FF12008F
+:023DFE00006A59
+:103E00000EAE05EF1FF00E6C001E09AE0AEF1FF09C
+:103E1000096C001E48EC21F009BE14EF1FF000AE43
+:103E2000000C096C056C000C00BE11EF1FF001883E
+:103E3000FF0C006A0EAE22EF1FF00D6C0E1EE86A3A
+:103E40000E22001E09AE2AEF1FF0086C091EE86A58
+:103E50000922001EF6EC20F009BE3AEF1FF000AE7A
+:103E6000000C086C091EE86A0922046C051EE86A49
+:103E70000522000C00BE31EF1FF00188FF0C006A24
+:103E8000E86A0EAE4CEF1FF00B6C0C1E0D1E0E1EE2
+:103E90000C220D220E22001E09AE57EF1FF0066CF9
+:103EA000071E081E091E072208220922001EBBEC5D
+:103EB00020F009BE6EEF1FF000AE000C066C071E6E
+:103EC000081E091EE86A072208220922026C031E46
+:103ED000041E051E032204220522000C00BE5EEF14
+:103EE0001FF00188FF0C08C012F008500D02F4CF3B
+:103EF00007F0F3CF06F009500E02F4CF09F0F3CF2C
+:103F000008F00D02F3500726F4500822E86A09224F
+:103F100012500E02F3500726F4500822E86A0922D4
+:023F2000000C93
+:0E3F22009F119711901188117F1176116D116A
+:103F3000641159114F11441138112C111F11121114
+:103F40000411F610E710D710C710B610A510921084
+:103F50007F106C10571042102C101610FF0FE70F37
+:103F6000CE0FB40F990F7D0F610F440F260F070F6F
+:103F7000E80EC80EA70E850E620E3F0E1B0EF60D44
+:103F8000D10DAB0D850D5E0D360D0D0DE40CBB0C8A
+:103F9000910C670C3C0C120CE60BBA0B8F0B620BEE
+:103FA000360B090BDD0AB00A830A570A2B0AFE09F1
+:103FB000D109A50979094D092109F508CA089E0802
+:103FC000740849081F08F507CC07A3077A075307A9
+:103FD0002B070407DE06B80693066E064A06260679
+:103FE0000306E105BF059E057D055D053E051F0530
+:103FF0000005E204C504A9048D04710456043C04C0
+:1040000023040A04F103D903C203AB0394037F031F
+:104010006903550340032C0319030603F402E2026B
+:10402000D002BF02AE029E028E027E026F026002CA
+:0E40300052024402360229021B020F02030252
+:02403E001E0E54
+:10404000F66E000EF76E000EF86E01010900F550D5
+:10405000FB6F0900F550FC6F03E1FB6701D03DD019
+:104060000900F550F66F0900F550F76F0900F5509B
+:10407000F86F09000900F550E96E0900F550EA6E85
+:10408000090009000900F550F96F0900F550FA6FB1
+:1040900009000900F6CFFDF1F7CFFEF1F8CFFFF1EF
+:1040A000F6C1F6FFF7C1F7FFF8C1F8FF0101F953B8
+:1040B00002E1FA5307E00900F550EE6EF907F8E265
+:1040C000FA07F9D7FDC1F6FFFEC1F7FFFFC1F8FF00
+:0C40D0000101FB07000EFC5BBFD71200D3
+:0440DC00D9CFE6FF53
+:1040E000E1CFD9FF020EE126CD0EDF6E010EDB6AB5
+:1040F000FD0EDBCF14F0FE0EDBCF15F0D89015507F
+:1041000004E6040E145C020E155803E25B0EDF6E2B
+:1041100025D0010EF76ADB34FE0BF736F66E220E61
+:10412000F6263F0EF7220900F5CF14F00800F5CF70
+:1041300015F0FD0EDBCF16F0FE0EDBCF17F015509D
+:104140001718E8AE02D0173404D01650145C17507C
+:10415000155804E3010EDB2ADF2ADBD7DF50146E8B
+:10416000020EE15C02E2E16AE552E16E1450E552B2
+:06417000E7CFD9FF1200A9
+:0A417600056A046A036A026A200E5B
+:10418000E76ED8900636073608360936023603360B
+:10419000043605360B50025C0C5003580D50045881
+:1041A0000E50055809E30B50025E0C50035A0D5097
+:0E41B000045A0E50055A062AE72EE4D71200D4
+:0241BE00FF0EF2
+:1041C000E350276EEF0E01D0F30EE76EE72EE6EF19
+:1041D00020F00C0E266EE76AE72EECEF20F0262E7C
+:0C41E000EBEF20F0272EE4EF20F012009F
+:0441EC00056A046AF2
+:1041F000100EE76ED89008360936043605360D5095
+:10420000045C0E50055805E30D50045E0E50055A2F
+:08421000082AE72EF0D7120086
+:08421800FF0EE350276E480E73
+:1042200001D04C0EE76EE72EFED7E76AE72EFED7E9
+:08423000272EF7D70000120051
+:08423800410EF36E00EE00F0F0
+:104240000E0E01D81200EA6002D0EE6AFCD7F350DD
+:08425000E9601200EE6AFCD7E0
+:084258001DEE00F02DEE00F058
+:10426000F86A019C1FEC20F003EC00F09AEC1BF0C4
+:04427000FBD7120066
+:0C427400FF0EE350276E1B0E00D001D09F
+:10428000200EE76EE72EFED7272EFAD700D01200B9
+:10429000056A080EE76ED890093605360E50055CA3
+:0C42A00002E3056E092AE72EF7D7120092
+:0442AC00000000000E
+:1042B00000000000200000000020010000000000BD
+:0142C00000FD
+:020000040030CA
+:0100000015EA
+:0100010013EB
+:0100030020DC
+:00000001FF

+ 201 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-default.mk

@@ -0,0 +1,201 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Include project Makefile
+ifeq "${IGNORE_LOCAL}" "TRUE"
+# do not include local makefile. User is passing all local related variables already
+else
+include Makefile
+# Include makefile containing local settings
+ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk"
+include nbproject/Makefile-local-default.mk
+endif
+endif
+
+# Environment
+MKDIR=gnumkdir -p
+RM=rm -f 
+MV=mv 
+CP=cp 
+
+# Macros
+CND_CONF=default
+ifeq ($(TYPE_IMAGE), DEBUG_RUN)
+IMAGE_TYPE=debug
+OUTPUT_SUFFIX=cof
+DEBUGGABLE_SUFFIX=cof
+FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
+else
+IMAGE_TYPE=production
+OUTPUT_SUFFIX=hex
+DEBUGGABLE_SUFFIX=cof
+FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
+endif
+
+# Object Directory
+OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE}
+
+# Distribution Directory
+DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
+
+# Object Files Quoted if spaced
+OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/1472/BMS_CAN.o ${OBJECTDIR}/_ext/1472/BMS_ECAN.o ${OBJECTDIR}/_ext/1472/BMS_LTC.o ${OBJECTDIR}/_ext/1472/BMS_NTC28.o ${OBJECTDIR}/_ext/1472/BMS_Slave.o ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o
+POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/1472/BMS_CAN.o.d ${OBJECTDIR}/_ext/1472/BMS_ECAN.o.d ${OBJECTDIR}/_ext/1472/BMS_LTC.o.d ${OBJECTDIR}/_ext/1472/BMS_NTC28.o.d ${OBJECTDIR}/_ext/1472/BMS_Slave.o.d ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o.d
+
+# Object Files
+OBJECTFILES=${OBJECTDIR}/_ext/1472/BMS_CAN.o ${OBJECTDIR}/_ext/1472/BMS_ECAN.o ${OBJECTDIR}/_ext/1472/BMS_LTC.o ${OBJECTDIR}/_ext/1472/BMS_NTC28.o ${OBJECTDIR}/_ext/1472/BMS_Slave.o ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o
+
+
+CFLAGS=
+ASFLAGS=
+LDLIBSOPTIONS=
+
+############# Tool locations ##########################################
+# If you copy a project from one host to another, the path where the  #
+# compiler is installed may be different.                             #
+# If you open this project with MPLAB X in the new host, this         #
+# makefile will be regenerated and the paths will be corrected.       #
+#######################################################################
+# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build
+FIXDEPS=fixDeps
+
+.build-conf:  ${BUILD_SUBPROJECTS}
+	${MAKE} ${MAKE_OPTIONS} -f nbproject/Makefile-default.mk dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
+
+MP_PROCESSOR_OPTION=18F45K80
+MP_PROCESSOR_OPTION_LD=18f45k80
+MP_LINKER_DEBUG_OPTION=
+# ------------------------------------------------------------------------------------
+# Rules for buildStep: assemble
+ifeq ($(TYPE_IMAGE), DEBUG_RUN)
+else
+endif
+
+# ------------------------------------------------------------------------------------
+# Rules for buildStep: compile
+ifeq ($(TYPE_IMAGE), DEBUG_RUN)
+${OBJECTDIR}/_ext/1472/BMS_CAN.o: ../BMS_CAN.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_CAN.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_CAN.o   ../BMS_CAN.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_CAN.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_CAN.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_ECAN.o: ../BMS_ECAN.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_ECAN.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_ECAN.o   ../BMS_ECAN.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_ECAN.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_ECAN.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_LTC.o: ../BMS_LTC.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_LTC.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_LTC.o   ../BMS_LTC.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_LTC.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_LTC.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_NTC28.o: ../BMS_NTC28.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_NTC28.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_NTC28.o   ../BMS_NTC28.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_NTC28.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_NTC28.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_Slave.o: ../BMS_Slave.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_Slave.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_Slave.o   ../BMS_Slave.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_Slave.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_Slave.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_EEPROM.o: ../BMS_EEPROM.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o   ../BMS_EEPROM.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_EEPROM.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+else
+${OBJECTDIR}/_ext/1472/BMS_CAN.o: ../BMS_CAN.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_CAN.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_CAN.o   ../BMS_CAN.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_CAN.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_CAN.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_ECAN.o: ../BMS_ECAN.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_ECAN.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_ECAN.o   ../BMS_ECAN.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_ECAN.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_ECAN.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_LTC.o: ../BMS_LTC.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_LTC.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_LTC.o   ../BMS_LTC.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_LTC.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_LTC.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_NTC28.o: ../BMS_NTC28.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_NTC28.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_NTC28.o   ../BMS_NTC28.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_NTC28.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_NTC28.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_Slave.o: ../BMS_Slave.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_Slave.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_Slave.o   ../BMS_Slave.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_Slave.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_Slave.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+${OBJECTDIR}/_ext/1472/BMS_EEPROM.o: ../BMS_EEPROM.c  nbproject/Makefile-${CND_CONF}.mk
+	@${MKDIR} ${OBJECTDIR}/_ext/1472 
+	@${RM} ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o.d 
+	${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION)   -I ${MP_CC_DIR}\\..\\h  -fo ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o   ../BMS_EEPROM.c 
+	@${DEP_GEN} -d ${OBJECTDIR}/_ext/1472/BMS_EEPROM.o 
+	@${FIXDEPS} "${OBJECTDIR}/_ext/1472/BMS_EEPROM.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c18 
+	
+endif
+
+# ------------------------------------------------------------------------------------
+# Rules for buildStep: link
+ifeq ($(TYPE_IMAGE), DEBUG_RUN)
+dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES}  nbproject/Makefile-${CND_CONF}.mk    
+	@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} 
+	${MP_LD} $(MP_EXTRA_LD_PRE)   -p$(MP_PROCESSOR_OPTION_LD)  -w -x -u_DEBUG   -z__MPLAB_BUILD=1  -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_ICD3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib  -o dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}  ${OBJECTFILES_QUOTED_IF_SPACED}   
+else
+dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES}  nbproject/Makefile-${CND_CONF}.mk   
+	@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} 
+	${MP_LD} $(MP_EXTRA_LD_PRE)   -p$(MP_PROCESSOR_OPTION_LD)  -w    -z__MPLAB_BUILD=1  -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib  -o dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX}  ${OBJECTFILES_QUOTED_IF_SPACED}   
+endif
+
+
+# Subprojects
+.build-subprojects:
+
+
+# Subprojects
+.clean-subprojects:
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+	${RM} -r build/default
+	${RM} -r dist/default
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES})
+ifneq (${DEPFILES},)
+include ${DEPFILES}
+endif

+ 8 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-genesis.properties

@@ -0,0 +1,8 @@
+#
+#Tue Jan 24 13:01:12 CET 2017
+default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=9df9e4755d661dce0f1863ed694b71d6
+default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.43\\bin
+com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=670cb88a404d064bff26af5dc6a4990c
+default.languagetoolchain.version=3.43
+host.platform=windows
+conf.ids=default

+ 69 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-impl.mk

@@ -0,0 +1,69 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a pre- and a post- target defined where you can add customization code.
+#
+# This makefile implements macros and targets common to all configurations.
+#
+# NOCDDL
+
+
+# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
+# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
+# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
+# and .clean-reqprojects-conf unless SUB has the value 'no'
+SUB_no=NO
+SUBPROJECTS=${SUB_${SUB}}
+BUILD_SUBPROJECTS_=.build-subprojects
+BUILD_SUBPROJECTS_NO=
+BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
+CLEAN_SUBPROJECTS_=.clean-subprojects
+CLEAN_SUBPROJECTS_NO=
+CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
+
+
+# Project Name
+PROJECTNAME=BMS_Slave.X
+
+# Active Configuration
+DEFAULTCONF=default
+CONF=${DEFAULTCONF}
+
+# All Configurations
+ALLCONFS=default 
+
+
+# build
+.build-impl: .build-pre
+	${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf
+
+
+# clean
+.clean-impl: .clean-pre
+	${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf
+
+# clobber
+.clobber-impl: .clobber-pre .depcheck-impl
+	    ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean
+
+
+
+# all
+.all-impl: .all-pre .depcheck-impl
+	    ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build
+
+
+
+# dependency checking support
+.depcheck-impl:
+#	@echo "# This code depends on make tool being used" >.dep.inc
+#	@if [ -n "${MAKE_VERSION}" ]; then \
+#	    echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
+#	    echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
+#	    echo "include \$${DEPFILES}" >>.dep.inc; \
+#	    echo "endif" >>.dep.inc; \
+#	else \
+#	    echo ".KEEP_STATE:" >>.dep.inc; \
+#	    echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
+#	fi

+ 37 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-local-default.mk

@@ -0,0 +1,37 @@
+#
+# Generated Makefile - do not edit!
+#
+#
+# This file contains information about the location of compilers and other tools.
+# If you commmit this file into your revision control server, you will be able to 
+# to checkout the project and build it from the command line with make. However,
+# if more than one person works on the same project, then this file might show
+# conflicts since different users are bound to have compilers in different places.
+# In that case you might choose to not commit this file and let MPLAB X recreate this file
+# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at
+# least once so the file gets created and the project can be built. Finally, you can also
+# avoid using this file at all if you are only building from the command line with make.
+# You can invoke make with the values of the macros:
+# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ...  
+#
+SHELL=cmd.exe
+PATH_TO_IDE_BIN=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/
+# Adding MPLAB X bin directory to path.
+PATH:=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/:$(PATH)
+# Path to java used to run MPLAB X when this makefile was created
+MP_JAVA_PATH="C:\Program Files (x86)\Microchip\MPLABX\sys\java\jre1.6.0_32-windows-x64\java-windows/bin/"
+OS_CURRENT="$(shell uname -s)"
+MP_CC="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\mcc18.exe"
+# MP_CPPC is not defined
+# MP_BC is not defined
+MP_AS="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\..\mpasm\MPASMWIN.exe"
+MP_LD="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\mplink.exe"
+MP_AR="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\mplib.exe"
+DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/extractobjectdependencies.jar" 
+MP_CC_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin"
+# MP_CPPC_DIR is not defined
+# MP_BC_DIR is not defined
+MP_AS_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\..\mpasm"
+MP_LD_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin"
+MP_AR_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin"
+# MP_BC_DIR is not defined

+ 13 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Makefile-variables.mk

@@ -0,0 +1,13 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+CND_BASEDIR=`pwd`
+# default configuration
+CND_ARTIFACT_DIR_default=dist/default/production
+CND_ARTIFACT_NAME_default=BMS_Slave.X.production.hex
+CND_ARTIFACT_PATH_default=dist/default/production/BMS_Slave.X.production.hex
+CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package
+CND_PACKAGE_NAME_default=bmsslave.x.tar
+CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/bmsslave.x.tar

+ 73 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/Package-default.bash

@@ -0,0 +1,73 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_CONF=default
+CND_DISTDIR=dist
+TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
+OUTPUT_BASENAME=BMS_Slave.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}
+PACKAGE_TOP_DIR=bmsslave.x/
+
+# Functions
+function checkReturnCode
+{
+    rc=$?
+    if [ $rc != 0 ]
+    then
+        exit $rc
+    fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+    mkdir -p "$1"
+    checkReturnCode
+    if [ "$2" != "" ]
+    then
+      chmod $2 "$1"
+      checkReturnCode
+    fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+    cp "$1" "$2"
+    checkReturnCode
+    if [ "$3" != "" ]
+    then
+        chmod $3 "$2"
+        checkReturnCode
+    fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/package
+rm -rf ${TMPDIR}
+mkdir -p ${TMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory ${TMPDIR}/bmsslave.x/bin
+copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/package/bmsslave.x.tar
+cd ${TMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/bmsslave.x.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${TMPDIR}

+ 113 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/configurations.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="62">
+  <logicalFolder name="root" displayName="root" projectFiles="true">
+    <logicalFolder name="HeaderFiles"
+                   displayName="Header Files"
+                   projectFiles="true">
+      <itemPath>../BMS_CAN.h</itemPath>
+      <itemPath>../BMS_ECAN.h</itemPath>
+      <itemPath>../BMS_LTC.h</itemPath>
+      <itemPath>../BMS_MISRA.h</itemPath>
+      <itemPath>../BMS_NTC28.h</itemPath>
+      <itemPath>../BMS_Slave.h</itemPath>
+      <itemPath>../BMS_EEPROM.h</itemPath>
+    </logicalFolder>
+    <logicalFolder name="LinkerScript"
+                   displayName="Linker Files"
+                   projectFiles="true">
+    </logicalFolder>
+    <logicalFolder name="SourceFiles"
+                   displayName="Source Files"
+                   projectFiles="true">
+      <itemPath>../BMS_CAN.c</itemPath>
+      <itemPath>../BMS_ECAN.c</itemPath>
+      <itemPath>../BMS_LTC.c</itemPath>
+      <itemPath>../BMS_NTC28.c</itemPath>
+      <itemPath>../BMS_Slave.c</itemPath>
+      <itemPath>../BMS_EEPROM.c</itemPath>
+    </logicalFolder>
+    <logicalFolder name="ExternalFiles"
+                   displayName="Important Files"
+                   projectFiles="false">
+      <itemPath>../BMS_ECAN.def</itemPath>
+    </logicalFolder>
+  </logicalFolder>
+  <projectmakefile>Makefile</projectmakefile>
+  <confs>
+    <conf name="default" type="2">
+      <toolsSet>
+        <developmentServer>localhost</developmentServer>
+        <targetDevice>PIC18F45K80</targetDevice>
+        <targetHeader></targetHeader>
+        <targetPluginBoard></targetPluginBoard>
+        <platformTool>ICD3PlatformTool</platformTool>
+        <languageToolchain>C18</languageToolchain>
+        <languageToolchainVersion>3.43</languageToolchainVersion>
+        <platform>3</platform>
+      </toolsSet>
+      <compileType>
+        <linkerTool>
+          <linkerLibItems>
+          </linkerLibItems>
+        </linkerTool>
+        <loading>
+          <useAlternateLoadableFile>false</useAlternateLoadableFile>
+          <alternateLoadableFile></alternateLoadableFile>
+        </loading>
+      </compileType>
+      <makeCustomizationType>
+        <makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
+        <makeCustomizationPreStep></makeCustomizationPreStep>
+        <makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
+        <makeCustomizationPostStep></makeCustomizationPostStep>
+        <makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
+        <makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines>
+        <makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
+      </makeCustomizationType>
+      <C18>
+      </C18>
+      <C18-AS>
+      </C18-AS>
+      <C18-LD>
+      </C18-LD>
+      <C18LanguageToolchain>
+        <property key="extended-mode" value="false"/>
+        <property key="extended-mode-mcc18" value="false"/>
+        <property key="extended-mode-mpasm" value="false"/>
+        <property key="extended-mode-mplink" value="false"/>
+        <property key="stack-analysis" value="false"/>
+        <property key="stack-analysis-mcc18" value="false"/>
+        <property key="stack-analysis-mplink" value="false"/>
+      </C18LanguageToolchain>
+      <ICD3PlatformTool>
+        <property key="AutoSelectMemRanges" value="auto"/>
+        <property key="Freeze Peripherals" value="true"/>
+        <property key="SecureSegment.SegmentProgramming" value="FullChipProgramming"/>
+        <property key="ToolFirmwareFilePath"
+                  value="Press to browse for a specific firmware version"/>
+        <property key="ToolFirmwareOption.UseLatestFirmware" value="true"/>
+        <property key="debugoptions.useswbreakpoints" value="false"/>
+        <property key="hwtoolclock.frcindebug" value="false"/>
+        <property key="memories.aux" value="false"/>
+        <property key="memories.bootflash" value="false"/>
+        <property key="memories.configurationmemory" value="false"/>
+        <property key="memories.eeprom" value="false"/>
+        <property key="memories.flashdata" value="true"/>
+        <property key="memories.id" value="true"/>
+        <property key="memories.programmemory" value="true"/>
+        <property key="memories.programmemory.end" value="0x7fff"/>
+        <property key="memories.programmemory.start" value="0x0"/>
+        <property key="poweroptions.powerenable" value="false"/>
+        <property key="programoptions.eraseb4program" value="true"/>
+        <property key="programoptions.preserveeeprom" value="true"/>
+        <property key="programoptions.preserveprogramrange" value="false"/>
+        <property key="programoptions.preserveprogramrange.end" value="0x7fff"/>
+        <property key="programoptions.preserveprogramrange.start" value="0x0"/>
+        <property key="programoptions.preserveuserid" value="false"/>
+        <property key="programoptions.usehighvoltageonmclr" value="false"/>
+        <property key="programoptions.uselvpprogramming" value="false"/>
+        <property key="voltagevalue" value="5.0"/>
+      </ICD3PlatformTool>
+    </conf>
+  </confs>
+</configurationDescriptor>

+ 4 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/SuppressibleMessageMemo.properties

@@ -0,0 +1,4 @@
+#
+#Fri Sep 30 10:39:14 CEST 2016
+icd3/CHECK_4_HIGH_VOLTAGE_VPP=true
+realice/CHECK_4_HIGH_VOLTAGE_VPP=true

+ 25 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/configurations.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="62">
+  <projectmakefile>Makefile</projectmakefile>
+  <defaultConf>0</defaultConf>
+  <confs>
+    <conf name="default" type="2">
+      <platformToolSN>:=MPLABCommUSB:=04D8:=9009:=0100:=Microchip Technology, Inc. (www.microchip.com):=MPLAB ICD3 tm (www.microchip.com):=JIT122910484:=x:=en</platformToolSN>
+      <languageToolchainDir>C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin</languageToolchainDir>
+      <mdbdebugger version="1">
+        <placeholder1>place holder 1</placeholder1>
+        <placeholder2>place holder 2</placeholder2>
+      </mdbdebugger>
+      <runprofile version="6">
+        <args></args>
+        <rundir></rundir>
+        <buildfirst>true</buildfirst>
+        <console-type>0</console-type>
+        <terminal-type>0</terminal-type>
+        <remove-instrumentation>0</remove-instrumentation>
+        <environment>
+        </environment>
+      </runprofile>
+    </conf>
+  </confs>
+</configurationDescriptor>

+ 0 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/private.properties


+ 9 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/private/private.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+    <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1">
+        <file>
+            <url>file:/D:/Woldemar/Software/RCT%20Slave/BMS_Slave.RCT.v214/ProjectSource/BMS_Slave_RCT/BMS_Slave.c</url>
+            <line>353</line>
+        </file>
+    </editor-bookmarks>
+</project-private>

+ 0 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/project.properties


+ 16 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.X/nbproject/project.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>com.microchip.mplab.nbide.embedded.makeproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/make-project/1">
+            <name>BMS_Slave_RCT_v216</name>
+            <creation-uuid>a0899ae0-c033-431a-a798-2ced7005bc84</creation-uuid>
+            <make-project-type>0</make-project-type>
+            <c-extensions>c</c-extensions>
+            <cpp-extensions/>
+            <header-extensions>h</header-extensions>
+            <sourceEncoding>ISO-8859-1</sourceEncoding>
+            <make-dep-projects/>
+        </data>
+    </configuration>
+</project>

+ 360 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.c

@@ -0,0 +1,360 @@
+/*********************************************************************
+ *
+ *                  BMS Slave Main File
+ *
+ *********************************************************************
+ * FileName:        BMS_Slave.c
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       04.04.2012   Release
+ *********************************************************************/
+
+
+/*********************************************************************
+ *
+ *                          Include Files
+ *
+ ********************************************************************/
+#include "BMS_Slave.h"
+
+/*********************************************************************
+*
+*                              Pragmas
+*
+*********************************************************************/
+#pragma config XINST   = OFF
+#pragma config FOSC    = HS1
+#pragma config WDTEN   = OFF     // SWDTDIS
+#pragma config WDTPS   = 256     // WD TimeOut 1024ms
+#pragma config SOSCSEL = DIG     // Port C, Pin 0 & 1 => Digital
+#pragma config PLLCFG  = ON
+
+
+
+/*********************************************************************
+*
+*                              Globals
+*
+*********************************************************************/
+uint32_t CAN_BAL  = 0;
+uint16_t gEvent = 0;
+uint8_t  gCounter = 0;
+uint8_t  MuxCounter = 0;                    // MuxCounter for Temp.
+uint8_t  SlaveMode = INITIALISATION_MODE;   // UI Initialisierung
+uint8_t  Alive_Master = 0;                  // Alivecounter Master
+uint8_t  Alive_Slave = 0;                   // Alivecounter Slave
+uint8_t  Check_Alive_Master = 0;            // Check Alivecounter Master
+uint8_t  Count_Error_Master = 0;            // Counter-Error Master
+uint8_t  SPI_SyncFlag = SPI_SYNC_OFF;
+uint8_t  STATE_STATUS = RUN_SLAVE;
+volatile uint16_t    timeout_cnt=0;
+SERIAL_NR_t gSerial;
+extern ERROR_flags gERROR;
+
+
+
+/*********************************************************************
+*
+*                       Interrupt Vector Tabelle
+*   
+*********************************************************************/
+#pragma code low_vetor=0x18
+void interrupt_at_low_vector(void)
+{
+  _asm GOTO my_isr _endasm
+}
+#pragma code // Return to default code section
+
+
+
+/*********************************************************************
+*
+*                   Interrupt High-priority service
+*
+*********************************************************************/
+#pragma interrupt my_isr
+void my_isr( void )
+{
+  static int32_t gTimeSlotCount = 0;
+
+  /***** Timer 1 Code *****/
+  if((PIE1bits.TMR1IE)&&(PIR1bits.TMR1IF))
+  {
+    TMR1H    = 178;                     // reload Timer
+    TMR1L    = 0;                       // 10 ms bei 16 Mhz OSC
+    PIR1bits.TMR1IF=0;                  // clear event flag
+    
+    if(!(gTimeSlotCount % 3))           // jeder 3. Interrupt ist 30ms Event
+      gEvent |= EV__TimeSlot30ms;
+    
+    if(!(gTimeSlotCount % 10))          // jeder 10. Interrupt ist 100ms Event
+    {
+      gEvent |= EV__TimeSlot100ms;
+      LATE ^= 2; // toggle LED_1
+      if(SlaveMode == RUN_MODE) {
+        timeout_cnt++;
+      }
+    }
+
+    if(gTimeSlotCount == 5)             // 1. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+    if(gTimeSlotCount == 8)             // 2. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+    if(gTimeSlotCount == 11)            // 3. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+    if(gTimeSlotCount == 14)            // 4. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+    if(gTimeSlotCount == 17)            // 5. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+    if(gTimeSlotCount == 20)            // 6. Temperature Event
+      gEvent |= EV__TimeSlotT;
+
+
+    if(!(gTimeSlotCount % 100))         // jeder 100. Interrupt ist 1000ms Event
+    {
+      gEvent |= EV__TimeSlot1000ms;
+      gTimeSlotCount = 0;
+    }
+    
+    gTimeSlotCount++;                   // naechster Slot
+  }
+
+  if(PIR5bits.RXBnIF && PIE5bits.RXBnIE)    // bei Auslösen des CAN-Empfangen-Interrupts
+  {
+      SPI_SyncFlag = SPI_SYNC_ON;
+      PIR5bits.RXBnIF = 0;
+
+      CAN_Write_Voltage();                  // Tx CAN Spannungswerte
+      CAN_Write_Temperature();              // Tx CAN Temperaturwerte
+      CAN_Write_Status();                   // Tx CAN Statuswerte
+
+      CAN_Read_Balancing();                 // CAN RX Auswertung
+      timeout_cnt=0;
+
+      gCounter++;
+      MuxCounter++;
+
+      if(gCounter >= MAX_ALIVE)             // After  7 alive Counter is set to 0
+      {
+          gCounter = 0;
+      }
+
+      if(MuxCounter >= MAX_MUX)             // After  5 Mux Counter is set to 0
+      {
+          MuxCounter = 0;
+      }
+   }
+}
+#pragma interrupt my_isr
+
+
+
+/*********************************************************************
+*
+*                   Intialisierung des BMS Slave
+*
+*********************************************************************/
+void ini( uint8_t SlaveStatus )
+{
+  uint8_t RCONcopy = RCON;
+
+  RCONcopy &= 0x3B;                 // IPEN, SBOREN und /PD wegfiltern
+  switch(RCONcopy)
+  {
+    case 0x33:                      // Watch Dog Timer Reset
+         ClrWdt();                  // WDT Reset
+         break;
+    case 0x38:                      // Power On Reset
+         break;
+    case 0x3A:                      // Brown Out Reset
+         break;
+    case 0x2B:                      // Reset by Software
+         break;
+    case 0x1B:                      // Configuration Mismatch Reset
+         break;
+    default:                        // Stack Over/Under Flow Reset or Combinations
+         break;
+  }
+  RCON |= 0x3F;                     // Reset Flags clear
+
+  LTC_Init( );
+
+  SlaveMode = SlaveStatus;
+}
+
+// ***** MAIN SLAVE ***************************************************************
+void main(void)
+{
+    uint16_t PEC = 0;
+    uint8_t  EEPROM_DATA = 0;
+    int32_t  adc_value = 0;
+
+// ***** SLAVE STATUS *************************************************************
+switch( SlaveMode )
+    {
+
+// ***** OFF or POWERUP ********************************************************
+    case  STANDBY_MODE :
+
+        CAN_Read_Master();                          // Read Master Frame
+
+        if(SlaveMode == RUN_MODE)
+        {
+            IPR5bits.RXBnIP   = 0;      // 0 = make this a low priority interrupt
+            PIE5bits.RXBnIE   = 1;      // enable CAN-Receive interrupt
+            PIR5bits.RXBnIF   = 0;      // clear any pending events
+            BIE0              = 0x0F;
+        }
+
+    break;
+
+// ***** SLAVE INITIALISATION ********************************************************
+    case  INITIALISATION_MODE :
+
+        EEPROM_DATA =  EEread(EE_START_a);      // Read data from EEPROM
+        SlaveMode = CALIBRATION_MODE;
+        if( !(EEPROM_DATA == EE_LOAD) )
+        {
+            SlaveMode = RESET_MODE;
+        }
+        ini(SlaveMode);                                  // Ini des BMS Slaves
+        
+        // Readout AN0 and AN1
+        adc_value = ADC_supply_voltage();
+
+        if( (adc_value > SUPPLY_MAX) | (adc_value < SUPPLY_MIN) )
+        {
+            gERROR.LIMITVOLTAGE = 1;
+        }
+
+
+    break;
+
+// ***** SLAVE CALIBRATION ********************************************************
+    case  CALIBRATION_MODE :
+        
+        PEC = LTC_SelfTest();       // Selbsttest der LTCs
+        SlaveMode = STANDBY_MODE;   // Standby Mode
+
+    break;
+
+// ***** RUN MODE **************************************************************
+    case  RUN_MODE :
+
+        if( gEvent & EV__TimeSlot30ms )     	// wenn 30ms Slot
+        {
+            gEvent &= (~EV__TimeSlot30ms);    	// reset 30ms Flag
+            if(gEvent & EV__LTC_V_Start)
+                Set_LTC_TimeOut();
+            else
+            {
+                gEvent |= EV__LTC_V_Start;      // set Spg Messung Start
+            }
+	}
+
+	if( gEvent & EV__TimeSlot100ms )    	// wenn 100ms Slot
+        {
+            gEvent &= (~EV__TimeSlot100ms);   	// reset 100ms Flag
+        }
+
+	if( gEvent & EV__TimeSlotT )        	// wenn T Slot
+        {
+            gEvent &= (~EV__TimeSlotT);       	// reset T Slot
+            if(gEvent & EV__LTC_T_Start)
+                Set_LTC_TimeOut();
+            else
+                gEvent |= EV__LTC_T_Start;      // set Temperatur Messung Start
+	}
+
+	if( gEvent & EV__TimeSlot1000ms )   	// wenn 1000ms Slot
+	{
+            gEvent &= (~EV__TimeSlot1000ms);  	// reset 1000ms Flag
+
+            if(Count_Error_Master >= 4)
+            {
+                SlaveMode = ERROR_MODE;         // Slave Error Case
+            }
+
+            gERROR.LIMITVOLTAGE = 0;            // Clear Errorflag
+            
+            // Readout AN0 and AN1
+            adc_value = ADC_supply_voltage();
+
+            if( (adc_value > SUPPLY_MAX) | (adc_value < SUPPLY_MIN) )
+            {
+                gERROR.LIMITVOLTAGE = 1;
+            }
+
+            Count_Error_Master   = 0;           // clear Error Master
+        }
+
+	if( !(gEvent & ( EV__LTC_V_Wait + EV__LTC_T_Wait )))	// wenn keine Messung laeuft
+	{
+            if(timeout_cnt > 10)                // Shutdown LTC if there is no longer response from Master
+            {
+                CAN_BAL = 0x00;                 //Set Balancing off
+                LTC_Terminate();                //Shutdown LTC
+            }
+
+            if(SPI_SyncFlag == SPI_SYNC_ON)
+            {
+                SPI_SyncFlag = SPI_SYNC_OFF;
+
+                LTC_SetCFG(CDC_1, CAN_BAL, ~CAN_BAL);   // Set Balancing Outs
+            }
+
+	}
+
+        LTC_Do(&gEvent);                    	// Ablaufsteuerung Messung ausführen
+
+    break;
+
+// ***** ERROR MODE ************************************************************
+    case  ERROR_MODE :
+        
+        LATE = LATE & 0xFC;                // LED0, LED1 = off
+
+        STATE_STATUS = RUN_SLAVE;
+        SlaveMode = RUN_MODE;
+
+    break;
+
+// ***** RESET SLAVE **************************************************************
+    case  RESET_MODE :
+        
+        if(STATE_STATUS == RUN_SLAVE)
+        {
+            LATE             |= 3;          // LED0, LED1 = on
+
+            INTCONbits.GIE    = 0;          // disable Interrupt
+            INTCONbits.PEIE   = 0;
+            PIE5bits.RXBnIE   = 0;          // disable CAN-Receive interrupt
+            
+            STATE_STATUS = UNLOCK_SYSTEM_CAN;
+
+            // Unlock System Frame for autom. ID allocation
+            ECANSetRXM0Value(0xDFF, ECAN_MSG_STD);        // activate 0x300 Frame
+            ECANSetRXF0Value(0x100, ECAN_MSG_STD);        // Change start adress for new Canid
+        }
+
+        CAN_Read_System();                 // CAN RX System
+
+    break;
+
+// ***** PV__STAND_BY **********************************************************
+    default :
+        break;
+    }
+
+ClrWdt();                                   // WDT Reset
+
+}

+ 118 - 0
ProjectSource/BMS_Slave_RCT/BMS_Slave.h

@@ -0,0 +1,118 @@
+/*********************************************************************
+ *
+ *                  BMS_Slave Header
+ *
+ *********************************************************************
+ * FileName:        BMS_Slave.h
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       30.03.2012   Release
+ *********************************************************************/
+
+//#ifndef BMS_H      // To avoid duplicate inclusion
+#define BMS_H
+
+
+/*********************************************************************
+ *
+ * Include Files
+ *
+ ********************************************************************/
+#include "P18F45K80.h"
+#include "delays.h"
+#include "BMS_ECAN.h"
+#include "BMS_MISRA.h"
+#include "BMS_NTC28.h"
+#include "BMS_LTC.h"
+#include "BMS_CAN.h"
+#include "BMS_EEPROM.h"
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+#define EV__TimeSlot30ms       0x0001
+#define EV__TimeSlot100ms      0x0002
+#define EV__TimeSlotT          0x0004
+#define EV__TimeSlot1000ms     0x0008
+#define EV__LTC_V_Start        0x0010
+#define EV__LTC_V_Wait         0x0020
+#define EV__LTC_T_Start        0x0040
+#define EV__LTC_T_Wait         0x0080
+
+#define CAN_Tx_ErrorCountMax   24u
+#define CAN_Rx_ErrorCountMax   240u
+
+#define STANDBY_MODE            0x01
+#define CALIBRATION_MODE        0x02
+#define RUN_MODE                0x04
+#define ERROR_MODE              0x08
+#define RESET_MODE              0x10
+#define INITIALISATION_MODE     0x20
+
+#define EE_DEFAULT_d            0xFF        // Default value EEPROM in debuggmode
+#define EE_DEFAULT_f            0x00        // Default value EEPROM in flashmode
+#define EE_LOAD                 0xAA        // EEPROM is written
+#define EE_START_a              0x00        // EEPROM startadress
+#define EE_308_a                0           // EEPROM startadress for frame 0x308
+#define EE_309_a                8           // EEPROM startadress for frame 0x309
+
+#define RUN_SLAVE               0x01
+#define STOP_SLAVE              0x02
+#define UNLOCK_SYSTEM_CAN       0x04
+#define DISABLE_SYSTEM_CAN      0x08
+#define SPI_SYNC_ON             0x10
+#define SPI_SYNC_OFF            0x20
+#define SYSTEM_IDSEARCH         0x40
+#define SYSTEM_SERNRPRG         0x80
+#define SYSTEM_GETSERNR         0x0A
+
+#define SUPPLY_MIN              2372        // Limit min. Supply voltage in ADC value
+#define SUPPLY_MAX              2622        // Limit max. Supply voltage in ADC value
+
+/*********************************************************************
+*
+*                             Data Types
+*
+*********************************************************************/
+typedef union
+{
+uint8_t EE_ADRESS[18];
+    struct
+    {
+    uint8_t FLASH;
+    uint8_t LFT1;
+    uint8_t LFT2;
+    uint8_t LFT3;
+    uint8_t LFT4;
+    uint8_t LIEF;
+    uint8_t BAU1;
+    uint8_t BAU2;
+    uint8_t EE_REV;
+    uint8_t FAM1;
+    uint8_t FAM2;
+    uint8_t GERAET;
+    uint8_t LAEN;
+    uint8_t SLAVE_ID;
+    uint8_t LFT_1;
+    uint8_t LFT_2;
+    uint8_t BAU_1;
+    uint8_t FAM_1;
+    }EE_BYTE;
+} SERIAL_NR_t;
+
+/*********************************************************************
+*
+*                        Function Prototypes
+*
+*********************************************************************/
+void  interrupt_at_low_vector ( void );
+void  my_isr                  ( void );
+void  ini                     ( uint8_t SlaveStatus );
+void  main                    ( void );
+

BIN
ProjectSource/BMS_Slave_RCT/BMS_Slave.rar


+ 1246 - 0
ProjectSource/BMS_Slave_RCT/ECAN.c

@@ -0,0 +1,1246 @@
+/*********************************************************************
+ *
+ *              ECAN C Library Source Code
+ *
+ *********************************************************************
+ * FileName:        ECAN.C
+ * Dependencies:    p18cxxx.h/pic18.h, ECAN.h
+ * Processor:       PIC18CXX8X
+ * Compiler:        Microchip C 2.10.06 or higher
+ * Company:         Microchip Technology, Inc.
+ *
+ * Software License Agreement
+ *
+ * The software supplied herewith by Microchip Technology Incorporated
+ * (the “Company”) for its PICmicro® Microcontroller is intended and
+ * supplied to you, the Company’s customer, for use solely and
+ * exclusively on Microchip PICmicro Microcontroller products. The
+ * software is owned by the Company and/or its supplier, and is
+ * protected under applicable copyright laws. All rights are reserved.
+ * Any use in violation of the foregoing restrictions may subject the
+ * user to criminal sanctions under applicable laws, as well as to
+ * civil liability for the breach of the terms and conditions of this
+ * license.
+ *
+ * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
+ * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
+ * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * Author               Date    Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Caio Gubel           5/5/03  ECAN Version 1.0 - Initial Release
+ * Nilesh R.            7/22/03 Improved.
+ ********************************************************************/
+
+#include "ecan.h"
+#include "BMS_Slave.h"
+
+
+void _CANIDToRegs(BYTE* ptr,
+                 unsigned long val,
+                 BYTE type);
+void _RegsToCANID(BYTE* ptr,
+                 unsigned long *val,
+                 BYTE type);
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+    static BYTE* _ECANPointBuffer(BYTE b);
+#endif
+
+BYTE_VAL _ECANRxFilterHitInfo;
+
+#define _SetStdRXFnValue(f, val)                                \
+    ##f##SIDH = (long)ECAN_##f##_VAL >> 3L;                     \
+    ##f##SIDL = (long)ECAN_##f##_VAL >> 5L
+
+#define _SetXtdRXFnValue(f, val)                                \
+    ##f##SIDH = (long)ECAN_##f##_VAL >> 21L;                    \
+    ##f##SIDL = (((long)ECAN_##f##_VAL >> 13L) & 0xe0) |        \
+                    ((long)(ECAN_##f##_VAL) & 0x03L)   |        \
+                    0x08;                                       \
+    ##f##EIDH = (long)ECAN_##f##_VAL >> 8L;                     \
+    ##f##EIDL = ECAN_##f##_VAL;
+
+
+#define _SetStdRXMnValue(m, val)                                \
+    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 3L;               \
+    RXM##m##SIDL = (long)ECAN_RXM##m##_VAL >> 5L
+
+#define _SetXtdRXMnValue(m, val)                                \
+    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 21L;              \
+    RXM##m##SIDL = (((long)ECAN_RXM##m##_VAL >> 13L) & 0xe0) |  \
+                    ((long)(ECAN_RXM##m##_VAL) & 0x03L);\
+    RXM##m##EIDH = (long)ECAN_RXM##m##_VAL >> 8L;\
+    RXM##m##EIDL = ECAN_RXM##m##_VAL;
+
+#define RXF0            0
+#define RXF1            1
+#define RXF2            2
+#define RXF3            3
+#define RXF4            4
+#define RXF5            5
+#define RXF6            6
+#define RXF7            7
+#define RXF8            8
+#define RXF9            9
+#define RXF10           10
+#define RXF11           11
+#define RXF12           12
+#define RXF13           13
+#define RXF14           14
+#define RXF15           15
+
+
+/*
+ * Compile-time validation ECAN options as per ECAN and ECAN rules.
+ */
+#if ( ECAN_SJW_VAL > 4 )
+#error Invalid SJW value received.
+#endif
+
+#if ( ECAN_BRP_VAL > 64 )
+#error Invalid BRP value received.
+#endif
+
+#if ( ECAN_PHSEG1_VAL > 8 )
+#error Invalid PHSEG1 value received.
+#endif
+
+#if ( ECAN_PHSEG2_VAL > 8 )
+#error Invalid PHSEG2 value received.
+#endif
+
+#if ( ECAN_PROPSEG_VAL > 8 )
+#error Invalid PROPSEG value received.
+#endif
+
+// In Mode 1 & 2, double buffering on RXB0 is not available.
+
+
+/*
+ * In Mode 0, RXF0-RXF5 are always enabled.
+ */
+#if ( ECAN_FUNC_MODE_VAL == ECAN_MODE_0 )
+    #undef ECAN_RXF0_MODE_VAL
+    #define ECAN_RXF0_MODE_VAL      ECAN_RXF0_ENABLE
+
+    #undef ECAN_RXF1_MODE_VAL
+    #define ECAN_RXF1_MODE_VAL      ECAN_RXF1_ENABLE
+
+    #undef ECAN_RXF2_MODE_VAL
+    #define ECAN_RXF2_MODE_VAL      ECAN_RXF2_ENABLE
+
+    #undef ECAN_RXF3_MODE_VAL
+    #define ECAN_RXF3_MODE_VAL      ECAN_RXF3_ENABLE
+
+    #undef ECAN_RXF4_MODE_VAL
+    #define ECAN_RXF4_MODE_VAL      ECAN_RXF4_ENABLE
+
+    #undef ECAN_RXF5_MODE_VAL
+    #define ECAN_RXF5_MODE_VAL      ECAN_RXF5_ENABLE
+#endif
+
+
+/*********************************************************************
+ * Function:        void ECANInitialize(void)
+ *
+ * Overview:        Use this function to initialize ECAN module with
+ *                  options defined in ECAN.def file.
+ *                  You may manually edit ECAN.def file as per your
+ *                  requirements, or use Microchip Application
+ *                  Maestro tool.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    All pending transmissions are aborted.
+ ********************************************************************/
+void ECANInitialize(void)
+{
+
+    // Put module into Configuration mode.
+    ECANSetOperationMode(ECAN_OP_MODE_CONFIG);
+
+
+    // Set Bit rate values as per defines.
+    BRGCON1 = ((ECAN_SJW_VAL-1) << 6) | (ECAN_BRP_VAL-1);
+    BRGCON2 = (ECAN_PHSEG2_MODE_VAL << 7)      | \
+              (ECAN_BUS_SAMPLE_MODE_VAL << 6)  | \
+              ((ECAN_PHSEG1_VAL-1) << 3)       | \
+              (ECAN_PROPSEG_VAL-1);
+    BRGCON3 = (ECAN_WAKEUP_MODE_VAL << 7)      |
+              (ECAN_FILTER_MODE_VAL << 6)      |
+              (ECAN_PHSEG2_VAL-1);
+
+    // Set CANTX2, TXDRIVE and CAN Capture modes.
+    CIOCON = ECAN_TX2_SOURCE_VAL << 7           | \
+             ECAN_TX2_MODE_VAL << 6         | \
+             ECAN_TXDRIVE_MODE_VAL << 5        | \
+             ECAN_CAPTURE_MODE_VAL;
+
+
+    // Set WCAN functional mode.
+    ECANCON_MDSEL1 = ECAN_FUNC_MODE_VAL >> 7;
+    ECANCON_MDSEL0 = ECAN_FUNC_MODE_VAL >> 6;
+
+
+    // Set RXB0 and RXB1 buffer modes.
+#if ( ECAN_FUNC_MODE_VAL == ECAN_MODE_0 )
+    RXB0CON = (ECAN_RXB0_MODE_VAL << 5) | (ECAN_RXB0_DBL_BUFFER_MODE_VAL << 2);
+    RXB1CON = ECAN_RXB1_MODE_VAL << 5;
+#else
+    // In Mode1 & 2, Map 2-bit RXM bits into 1 RXM1 bit.
+    #if ( ECAN_RXB0_MODE_VAL == ECAN_RECEIVE_ALL )
+        RXB0CON = 0x40;
+    #else
+        RXB0CON = 0;
+    #endif
+
+    #if ( ECAN_RXB1_MODE_VAL == ECAN_RECEIVE_ALL )
+        RXB1CON = 0x40;
+    #else
+        RXB1CON = 0;
+    #endif
+#endif
+
+    // B0-B5 are available in Mode 1 and 2 only.
+#if (ECAN_FUNC_MODE_VAL != ECAN_MODE_0)
+    #if (ECAN_B0_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B0_MODE_VAL == ECAN_RECEIVE_ALL )
+            B0CON = 0x40;
+        #else
+            B0CON = 0;
+        #endif
+    #else
+        B0CON = ECAN_B0_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B1_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B1_MODE_VAL == ECAN_RECEIVE_ALL )
+            B1CON = 0x40;
+        #else
+            B1CON = 0;
+        #endif
+    #else
+        B1CON = ECAN_B1_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B2_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B2_MODE_VAL == ECAN_RECEIVE_ALL )
+            B2CON = 0x40;
+        #else
+            B2CON = 0;
+        #endif
+    #else
+        B2CON = ECAN_B2_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B3_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B3_MODE_VAL == ECAN_RECEIVE_ALL )
+            B3CON = 0x40;
+        #else
+            B3CON = 0;
+        #endif
+    #else
+        B3CON = ECAN_B3_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B4_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B4_MODE_VAL == ECAN_RECEIVE_ALL )
+            B4CON = 0x40;
+        #else
+            B4CON = 0;
+        #endif
+    #else
+        B4CON = ECAN_B4_AUTORTR_MODE << 2;
+    #endif
+
+    #if (ECAN_B5_TXRX_MODE_VAL != ECAN_BUFFER_TX)
+        #if ( ECAN_B5_MODE_VAL == ECAN_RECEIVE_ALL )
+            B5CON = 0x40;
+        #else
+            B5CON = 0;
+        #endif
+    #else
+        B5CON = ECAN_B5_AUTORTR_MODE << 2;
+    #endif
+
+    // Enable/disable buffers B0-B5.
+    BSEL0 = ECAN_B5_TXRX_MODE_VAL << 7 | \
+            ECAN_B4_TXRX_MODE_VAL << 6 | \
+            ECAN_B3_TXRX_MODE_VAL << 5 | \
+            ECAN_B2_TXRX_MODE_VAL << 4 | \
+            ECAN_B1_TXRX_MODE_VAL << 3 | \
+            ECAN_B0_TXRX_MODE_VAL << 2;
+#endif
+
+
+
+
+    // Assign value to RXF0 only if Mode0 is used or RXF0 itself is enabled.
+#if ( (ECAN_RXF0_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    // Set Standard or Extended value.
+    #if ( ECAN_RXF0_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF0, ECAN_RXF0_VAL);
+        RXF0SIDH = (long)ECAN_RXF0_VAL >> 3L;
+        RXF0SIDL = (long)ECAN_RXF0_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF0, ECAN_RXF0_VAL);
+    #endif
+#endif
+
+#if ( (ECAN_RXF1_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF1_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF1, ECAN_RXF1_VAL);
+        RXF1SIDH = (long)ECAN_RXF1_VAL >> 3L;
+        RXF1SIDL = (long)ECAN_RXF1_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF1, ECAN_RXF1_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF2_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF2_MSG_TYPE_VAL == ECAN_MSG_STD )
+        //_SetStdRXFnValue(RXF2, ECAN_RXF2_VAL);
+        RXF2SIDH = (long)ECAN_RXF2_VAL >> 3L;
+        RXF2SIDL = (long)ECAN_RXF2_VAL >> 5L;
+    #else
+        _SetXtdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF3_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF3_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #else
+        _SetXtdRXFnValue(RXF3, ECAN_RXF3_VAL);
+    #endif
+#endif
+
+
+#if ( (ECAN_RXF4_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF4_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF4, ECAN_RXF4_VAL);
+    #else
+        _SetXtdRXFnValue(RXF4, ECAN_RXF4_VAL);
+    #endif
+#endif
+
+#if ( (ECAN_RXF5_MODE_VAL == ECAN_RXFn_ENABLE) || (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    #if ( ECAN_RXF5_MSG_TYPE_VAL == ECAN_MSG_STD )
+        _SetStdRXFnValue(RXF5, ECAN_RXF4_VAL);
+    #else
+        _SetXtdRXFnValue(RXF5, ECAN_RXF5_VAL);
+    #endif
+#endif
+
+
+    // Filters 6-15 are available in Modes 1 and 2 only.
+#if (ECAN_FUNC_MODE_VAL != ECAN_MODE_0)
+    #if ( ECAN_RXF6_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF6_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF6, ECAN_RXF6_VAL);
+        #else
+            _SetXtdRXFnValue(RXF6, ECAN_RXF6_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF7_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF7_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF7, ECAN_RXF7_VAL);
+        #else
+            _SetXtdRXFnValue(RXF7, ECAN_RXF7_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF8_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF8_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF8, ECAN_RXF9_VAL);
+        #else
+            _SetXtdRXFnValue(RXF8, ECAN_RXF9_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF9_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF9_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF9, ECAN_RXF9_VAL);
+        #else
+            _SetXtdRXFnValue(RXF9, ECAN_RXF9_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF10_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF10_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF10, ECAN_RXF10_VAL);
+        #else
+            _SetXtdRXFnValue(RXF10, ECAN_RXF10_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF11_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF11_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF11, ECAN_RXF11_VAL);
+        #else
+            _SetXtdRXFnValue(RXF11, ECAN_RXF11_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF12_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF12_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF12, ECAN_RXF12_VAL);
+        #else
+            _SetXtdRXFnValue(RXF12, ECAN_RXF12_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF13_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF13_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF13, ECAN_RXF13_VAL);
+        #else
+            _SetXtdRXFnValue(RXF13, ECAN_RXF13_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF14_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF14_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF14, ECAN_RXF14_VAL);
+        #else
+            _SetXtdRXFnValue(RXF14, ECAN_RXF14_VAL);
+        #endif
+    #endif
+
+    #if ( ECAN_RXF15_MODE_VAL == ECAN_RXFn_ENABLE )
+        #if ( ECAN_RXF15_MSG_TYPE_VAL == ECAN_MSG_STD )
+            _SetStdRXFnValue(RXF15, ECAN_RXF15_VAL);
+        #else
+            _SetXtdRXFnValue(RXF15, ECAN_RXF15_VAL);
+        #endif
+    #endif
+#endif
+
+    // Enable/Disable filters in Modes 1 and 2 only.
+#if ( ECAN_FUNC_MODE_VAL != ECAN_MODE_0 )
+    RXFCON0 = (ECAN_RXF7_MODE_VAL << 7) | \
+              (ECAN_RXF6_MODE_VAL << 6) | \
+              (ECAN_RXF5_MODE_VAL << 5) | \
+              (ECAN_RXF4_MODE_VAL << 4) | \
+              (ECAN_RXF3_MODE_VAL << 3) | \
+              (ECAN_RXF2_MODE_VAL << 2) | \
+              (ECAN_RXF1_MODE_VAL << 1) | \
+              (ECAN_RXF0_MODE_VAL);
+    RXFCON1 = (ECAN_RXF15_MODE_VAL << 7) | \
+              (ECAN_RXF14_MODE_VAL << 6) | \
+              (ECAN_RXF13_MODE_VAL << 5) | \
+              (ECAN_RXF12_MODE_VAL << 4) | \
+              (ECAN_RXF11_MODE_VAL << 3) | \
+              (ECAN_RXF10_MODE_VAL << 2) | \
+              (ECAN_RXF9_MODE_VAL << 1)  | \
+              (ECAN_RXF8_MODE_VAL);
+#endif
+
+
+    // Link each filter to corresponding buffer only if we are in Mode 1 or 2.
+#if ( ECAN_FUNC_MODE_VAL != ECAN_MODE_0 )
+    ECANLinkRXF0F1ToBuffer(ECAN_RXF0_BUFFER_VAL,     ECAN_RXF1_BUFFER_VAL);
+    ECANLinkRXF2F3ToBuffer(ECAN_RXF2_BUFFER_VAL,     ECAN_RXF3_BUFFER_VAL);
+    ECANLinkRXF4F5ToBuffer(ECAN_RXF4_BUFFER_VAL,     ECAN_RXF5_BUFFER_VAL);
+    ECANLinkRXF6F7ToBuffer(ECAN_RXF6_BUFFER_VAL,     ECAN_RXF7_BUFFER_VAL);
+    ECANLinkRXF8F9ToBuffer(ECAN_RXF8_BUFFER_VAL,     ECAN_RXF9_BUFFER_VAL);
+    ECANLinkRXF10F11ToBuffer(ECAN_RXF10_BUFFER_VAL,  ECAN_RXF11_BUFFER_VAL);
+    ECANLinkRXF12F13ToBuffer(ECAN_RXF12_BUFFER_VAL,  ECAN_RXF13_BUFFER_VAL);
+    ECANLinkRXF14F15ToBuffer(ECAN_RXF14_BUFFER_VAL,  ECAN_RXF15_BUFFER_VAL);
+
+    ECANLinkRXF0Thru3ToMask(ECAN_RXF0_MASK_VAL, \
+                           ECAN_RXF1_MASK_VAL, \
+                           ECAN_RXF2_MASK_VAL, \
+                           ECAN_RXF3_MASK_VAL);
+    ECANLinkRXF4Thru7ToMask(ECAN_RXF4_MASK_VAL, \
+                           ECAN_RXF5_MASK_VAL, \
+                           ECAN_RXF6_MASK_VAL, \
+                           ECAN_RXF7_MASK_VAL);
+    ECANLinkRXF8Thru11ToMask(ECAN_RXF8_MASK_VAL, \
+                           ECAN_RXF9_MASK_VAL, \
+                           ECAN_RXF10_MASK_VAL, \
+                           ECAN_RXF11_MASK_VAL);
+    ECANLinkRXF12Thru15ToMask(ECAN_RXF12_MASK_VAL, \
+                           ECAN_RXF13_MASK_VAL, \
+                           ECAN_RXF14_MASK_VAL, \
+                           ECAN_RXF15_MASK_VAL);
+#endif
+
+
+#if ( ECAN_RXM0_MSG_TYPE == ECAN_MSG_STD )
+    _SetStdRXMnValue(0, ECAN_RXM0_VAL);
+    RXM0SIDL_EXIDEN = 0;
+#else
+    _SetXtdRXMnValue(0, ECAN_RXM0_VAL);
+    RXM0SIDL_EXIDEN = 1;
+#endif
+
+#if ECAN_RXM1_MSG_TYPE == ECAN_MSG_STD
+    _SetStdRXMnValue(1, ECAN_RXM1_VAL);
+    RXM1SIDL_EXIDEN = 0;
+#else
+    _SetXtdRXMnValue(1, ECAN_RXM1_VAL);
+    RXM1SIDL_EXIDEN = 1;
+#endif
+
+    // SDFLC value
+
+    // Exit with speicfied mode.  If selected mode is Configuration,
+    // we do not need to do anything.
+#if ( ECAN_INIT_MODE != ECAN_INIT_CONFIGURATION )
+    ECANSetOperationMode(ECAN_INIT_MODE);
+#endif
+}
+
+
+
+/*********************************************************************
+ * Function:        BOOL ECANLoadRTRBuffer(BYTE buffer,
+ *                                         unsigned long id,
+ *                                         BYTE *data,
+ *                                         BYTE dataLen,
+ *                                         BYTE type)
+ *
+ * Overview:        Use this function to update automatic RTR buffer.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer number that is to be loaded
+ *                  id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                type parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  type        - Buffer type
+ *                                Must be ECAN_MSG_STD for Standard
+ *                                        ECAN_MSG_XTD for Extended
+ *
+ * Output:          TRUE, if given data was successfully loaded
+ *                  FALSE, if RTR buffer was in process of transmitting
+ *                          automated response.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#if ( defined(ECAN_ENABLE_AUTO_RTR) )
+BOOL ECANLoadRTRBuffer(BYTE buffer,
+                       unsigned long id,
+                       BYTE *data,
+                       BYTE dataLen,
+                       BYTE type)
+{
+    BYTE *pBuffer;
+    BYTE *pSavedBuffer;
+    BYTE i;
+
+    pSavedBuffer = pBuffer;
+
+#if defined(ECAN_CHECKED_BUILD)
+    // Make sure that this buffer is configured for RTR handling.
+    if ( !((BYTE_VAL*)pBuffer)->bits.b2 )
+        return FALSE;
+#endif
+
+    /*
+     * Make sure that RTR response is not currently being transmitted.
+     */
+    if ( ((BYTE_VAL*)pBuffer)->bits.b4 )
+        return FALSE;
+
+    // Start with zero length.
+    *(pBuffer+5) = 0;
+
+    // Save given id into ID registers..
+    _CANIDToRegs((BYTE*)(pBuffer+1), id, type);
+
+    // Prepare for data byte access.
+    pBuffer += 6;
+
+    // Copy given number of data bytes.
+    for ( i = 0; i < dataLen; i++ )
+        *pBuffer++ = *data++;
+
+    // At last, update DLC value.
+    *(pSavedBuffer + 5) = dataLen;
+
+    return TRUE;
+}
+#endif
+
+
+/*********************************************************************
+ * Function:        BOOL ECANSendMessage(unsigned long id,
+ *                                      BYTE *data,
+ *                                      BYTE dataLen,
+ *                                      ECAN_TX_MSG_FLAGS msgFlags)
+ *
+ * Overview:        Use this function to transmit a CAN message.
+ *                  This function searches for empty transmit buffer
+ *                  and loads it with given messages. Buffer is then
+ *                  marked for ready to transmit.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                msgFlags parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  msgFlags    - One or ECAN_TX_MSG_FLAGS values ORed
+ *                                together
+ *
+ * Output:          TRUE, if an empty buffer was found and loaded with
+ *                  given data
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+BOOL ECANSendMessage( unsigned long id,
+                     BYTE* data,
+                     BYTE dataLen,
+                     ECAN_TX_MSG_FLAGS msgFlags)
+{
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    BYTE mode;
+    BYTE buffers;
+#elif ( ECAN_FUNC_MODE == ECAN_MODE_0 )
+    #define buffers 2
+#else
+    #define buffers 8
+
+#endif
+
+    BYTE i,j;
+    BYTE *ptr, *tempPtr;
+    BYTE* pb[9];
+    BYTE temp;
+
+//#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE != ECAN_MODE_0) )
+    BYTE_VAL tempBSEL0;
+//#endif
+
+    /*
+     * Since there are more than one transmit buffers and they are scattered in
+     * SFR map, prepare table of all transmit buffers.
+     */
+    pb[0]=(BYTE*)&TXB0CON;
+    pb[1]=(BYTE*)&TXB1CON;
+    pb[2]=(BYTE*)&TXB2CON;
+
+    /*
+     * Include programmable buffers only if mode 1 or 2 is used.
+     */
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE != ECAN_MODE_0) )
+
+    pb[3]=(BYTE*)&B0CON;
+    pb[4]=(BYTE*)&B1CON;
+    pb[5]=(BYTE*)&B2CON;
+    pb[6]=(BYTE*)&B3CON;
+    pb[7]=(BYTE*)&B4CON;
+    pb[8]=(BYTE*)&B5CON;
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    mode = ECANCON&0xC0;
+    if ( mode == ECAN_MODE_0 )
+        buffers = 2;
+    else
+        buffers = 8;
+#endif
+
+
+    /*
+     * Depending on whether only mode 0 is used or not, we would only need to check
+     * either 3 or all buffers.
+     */
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    for ( i = 0; i < buffers; i++ )
+#else
+
+
+
+    /*
+     * In Mode 1 & 2, programmable buffers must be checked for buffer mode.
+     * By remembering BSEL0 (programmable buffer mode type info), we can
+     * reduce code required to check invidual buffer type as we scan through
+     * all buffers.
+     */
+    tempBSEL0.Val = BSEL0 >> 1;
+
+    for ( i = 0; i < buffers; i++ )
+#endif
+    {
+        /*
+         * Use local poiter to reduce overall code.
+         * It will be more efficient to access using pointer instead of index.
+         */
+        ptr = pb[i];
+        tempPtr = ptr;
+
+
+        /*
+         * In Mode 1 & 2, if buffer number is above TXB2, we must also check to
+         * see if this buffer is configured for transmit mode.
+         */
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+        if ( i > 2 )
+        {
+            /*
+             * Use previously saved BSEL0 value.
+             */
+            tempBSEL0.Val >>= 1;
+
+            /*
+             * If this is not transmit buffer, continue with next buffer.
+             */
+            if ( !tempBSEL0.bits.b0 )
+                continue;
+        }
+#endif
+
+        /*
+         * Check to see if this buffer is empty by looking at BnCON.TXREQ bit (bit3).
+         */
+        if ( !(*ptr & 0x08) )
+        {
+            // Set transmit priority in BnCON register.
+            *ptr &= ~ECAN_TX_PRIORITY_BITS;
+            *ptr |= msgFlags & ECAN_TX_PRIORITY_BITS;
+
+            // Also save DLC value.
+            if ( msgFlags & ECAN_TX_RTR_BIT )
+                temp = 0x40 | dataLen;
+            else
+                temp = dataLen;
+            // Use temp to reduce evaluation of *(ptr+5) to only once.
+            *(ptr+5) = temp;
+
+            // Set standard or extended message type.
+            if ( msgFlags & ECAN_TX_FRAME_BIT )
+                temp = ECAN_MSG_XTD;
+
+            else
+                temp = ECAN_MSG_STD;
+
+            // And rearrange given id accordingly.
+            _CANIDToRegs((BYTE*)(ptr+1), id, temp);
+
+            // Prepare for data byte access.
+            ptr += 6;
+            // Copy given number of data bytes.
+            for ( j = 0 ; j < dataLen; j++ )
+                *ptr++ = *data++;
+
+            // If this buffer is configured to automatically handle RTR messages,
+            // do not set TXREQ bit.  TXREQ bit will be set whenever matching RTR is received.
+            if ( !(*tempPtr & 0x04) )
+                *tempPtr |= 0x08;
+
+            return TRUE;
+        }
+    }
+
+    // There were no empty buffers.
+    return FALSE;
+}
+
+
+
+/*********************************************************************
+ * Function:        BOOL ECANReceiveMessage(unsigned long *id,
+ *                                  BYTE *data,
+ *                                  BYTE *dataLen,
+ *                                  ECAN_RX_MSG_FLAGS *msgFlags)
+ *
+ * Overview:        Use this function to check for full receive buffer
+ *                  and extract received data into local buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - Pointer to buffer that will be
+ *                                populated with receive ID.
+ *                  data        - Pointer to buffer that will be
+ *                                populated with data if there is any
+ *                  dataLen     - Pointer to buffer that will be
+ *                                populated with count of bytes
+ *                                copied in data buffer.
+ *                  msgFlags    - Pointer to buffer that will be
+ *                                copied with information about
+ *                                received message. More than
+ *                                one information is ORed together.
+ *
+ * Output:          TRUE, if a full receive buffer was found and
+ *                  given parameters were populated.
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ * Note:            If you need to know the filter number that caused
+ *                  this message to get accepted, call
+ *                  ECANGetFilterHitInfo().
+ *
+ ********************************************************************/
+BOOL ECANReceiveMessage(unsigned long *id,
+                       BYTE *data,
+                       BYTE *dataLen,
+                       ECAN_RX_MSG_FLAGS *msgFlags)
+{
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    BYTE mode;
+#endif
+
+    BYTE *ptr, *savedPtr;
+    char i;
+    BYTE_VAL temp;
+
+    _ECANRxFilterHitInfo.Val = 0;
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    mode = ECANCON&0xC0;
+    if ( mode == ECAN_MODE_0 )
+#endif
+
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+    {
+        // Find which buffer is ready.
+        if ( RXB0CON_RXFUL )
+        {
+            // Clear the received flag.
+            PIR3_RXB0IF = 0;
+
+            // Record and forget any previous overflow
+            if ( COMSTAT_RXB0OVFL )
+            {
+                *msgFlags |= ECAN_RX_OVERFLOW;
+                COMSTAT_RXB0OVFL = 0;
+            }
+
+            _ECANRxFilterHitInfo.bits.b0 = RXB0CON_FILHIT0;
+
+            ptr = (BYTE*)&RXB0CON;
+
+        }
+        else if ( RXB1CON_RXFUL )
+        {
+            // Clear the received flag.
+            PIR3_RXB1IF = 0;
+
+            // Record and forget any previous overflow
+            if ( COMSTAT_RXB1OVFL )
+            {
+                *msgFlags |= ECAN_RX_OVERFLOW;
+                COMSTAT_RXB1OVFL = 0;
+            }
+
+            _ECANRxFilterHitInfo.Val = RXB1CON & 0x07;
+
+            if ( _ECANRxFilterHitInfo.Val < 0x02 )
+                *msgFlags |= ECAN_RX_DBL_BUFFERED;
+
+
+            ptr = (BYTE*)&RXB1CON;
+        }
+        else
+            return FALSE;
+
+        goto _SaveMessage;
+    }
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    else if ( mode == ECAN_MODE_1 )
+#endif
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_1) )
+
+    {
+        if ( RXB0CON_RXFUL )
+            ptr = (BYTE*)&RXB0CON;
+
+        else if (RXB1CON_RXFUL)
+            ptr = (BYTE*)&RXB1CON;
+
+        else if ( (BSEL0_B0TXEN==0) && B0CON_RXFUL )
+            ptr = (BYTE*)&B0CON;
+
+        else if ( (BSEL0_B1TXEN==0) && B1CON_RXFUL )
+            ptr = (BYTE*)&B1CON;
+
+        else if ( (BSEL0_B2TXEN==0) && B2CON_RXFUL )
+            ptr = (BYTE*)&B2CON;
+
+        else if ( (BSEL0_B3TXEN==0) && B3CON_RXFUL )
+            ptr = (BYTE*)&B3CON;
+
+        else if ( (BSEL0_B4TXEN==0) && B4CON_RXFUL )
+            ptr = (BYTE*)&B4CON;
+
+        else if ( (BSEL0_B5TXEN==0) && B5CON_RXFUL )
+            ptr = (BYTE*)&B5CON;
+
+        else
+            return FALSE;
+
+        goto _SaveMode12Message;
+
+
+    }
+#endif
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    else
+#endif
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+    {
+        if ( COMSTAT_FIFOEMPTY == 1 )      //if FIFO is NOT empty --> meaning there is a message to be read waiting in Bn or RXBn Buffer
+        {
+            ptr = (BYTE*)_ECANPointBuffer(CANCON&0x07);          // get the pointer to the proper buffer
+
+            goto _SaveMode12Message;
+        }
+
+        return FALSE;
+    }
+#endif
+
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+_SaveMode12Message:
+    _ECANRxFilterHitInfo.Val = *ptr & 0x1f;
+
+    PIR5bits.RXB1IF = 0;
+
+    if ( COMSTAT_RXBnOVFL )
+    {
+        *msgFlags |= ECAN_RX_OVERFLOW;
+        COMSTAT_RXBnOVFL = 0;
+    }
+#endif
+
+_SaveMessage:
+    savedPtr = ptr;
+    *msgFlags = 0;
+
+    // Retrieve message length.
+    temp.Val = *(ptr+5);
+    *dataLen = temp.Val & 0b00001111;
+
+    // Determine whether this was RTR or not.
+    if ( temp.bits.b6 )
+        *msgFlags |= ECAN_RX_RTR_FRAME;
+
+    // Retrieve EIDX bytes only if this is extended message
+    temp.Val = *(ptr+2);
+    if ( temp.bits.b3 )
+    {
+        *msgFlags |= ECAN_RX_XTD_FRAME;
+        temp.Val = ECAN_MSG_XTD;
+    }
+    else
+        temp.Val = ECAN_MSG_STD;
+
+    _RegsToCANID(ptr+1, id, temp.Val);
+
+    // Get message data itself
+    ptr += 6;
+    temp.Val = *dataLen;
+    for ( i = 0; i < temp.Val; i++ )
+        *data++ = *ptr++;
+
+    // Record and Clear any previous invalid message bit flag.
+    if ( PIR5bits.IRXIF )
+    {
+        *msgFlags |= ECAN_RX_INVALID_MSG;
+        PIR5bits.IRXIF = 0;
+    }
+
+    // Mark that this buffer is read and empty.
+    *savedPtr &= 0x7f;
+
+#if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    // Workaround for Rev A1 silicon
+    if ( mode == ECAN_MODE_2 )
+        COMSTAT_FIFOEMPTY = 0;
+
+#elif ( ECAN_FUNC_MODE_VAL == ECAN_MODE_2 )
+    COMSTAT_FIFOEMPTY = 0;
+#endif
+
+    return TRUE;
+}
+
+/*********************************************************************
+ * Function:        void ECANSetOperationMode(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this function to switch ECAN module into
+ *                  given operational mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a blocking call.  It will not return until
+ *                  requested mode is set.
+ ********************************************************************/
+void ECANSetOperationMode(ECAN_OP_MODE mode)
+{
+    CANCON &= 0x1F;                         // clear previous mode
+    CANCON |= mode;                         // set new mode
+
+    while( ECANGetOperationMode() != mode ); // Wait till desired mode is set.
+}
+
+
+/*********************************************************************
+ * Function:        void _CANIDToRegs(BYTE* ptr,
+ *                                    unsigned long val,
+ *                                    ECAN_MSG_TYPE type)
+ *
+ * PreCondition:    None
+ *
+ * Input:           ptr     - Starting address of a buffer to be updated
+ *                  val     - 32-bit value to be converted
+ *                  type    - Type of message - either
+ *                            CAN_CONFIG_XTD_MSG or CAN_CONFIG_STD_MSG
+ *
+ * Output:          Given CAN id value 'val' is bit adjusted and copied
+ *                  into corresponding PIC18CXX8 CAN registers
+ *
+ * Side Effects:    None
+ *
+ * Overview:        If given id is of type standard identifier,
+ *                  only SIDH and SIDL are updated
+ *                  If given id is of type extended identifier,
+ *                  bits val<17:0> is copied to EIDH, EIDL and SIDH<1:0>
+ *                  bits val<28:18> is copied to SIDH and SIDL
+ *
+ ********************************************************************/
+//////////////////////////////////////////////////////////////////////
+
+/*********************************************************************
+ *
+ * union CAN_MESSAGE_ID
+ *
+ * This union provides abstract data type for CAN message id.
+ * It is used for both 11-bit and 29-bit message identifiers.
+ * There are multiple union members to be able to access individual
+ * parts of it.
+ *
+ ********************************************************************/
+ // Parse-out 29-bit or 11-bit (saved in 32-bit number)
+typedef union _CAN_MESSAGE_ID
+{
+    unsigned long ID;
+
+    struct
+    {
+        struct
+        {
+            unsigned SIDL:3;        // SIDL<5:7>
+            unsigned SIDH:5;        // SIDH<0:4>
+        } BYTE1;
+        struct
+        {
+            unsigned SIDHU:3;       // SIDH<5:7>
+            unsigned EIDL_LN:5;     // EIDL<0:4>
+        } BYTE2;
+        struct
+        {
+            unsigned EIDL_UN:3;     // EIDL<5:7>
+            unsigned EIDH_LN:5;     // EIDH<0:4>
+        } BYTE3;
+        struct
+        {
+            unsigned EIDH_UN:3;     // EIDH<5:7>
+            unsigned EIDHU:2;       // SIDL<0:1>
+            unsigned :3;
+        } BYTE4;
+    } ID_VALS;
+
+    // This is to allow individual byte access within message id.
+    struct
+    {
+        BYTE BYTE_1;
+        BYTE BYTE_2;
+        BYTE BYTE_3;
+        BYTE BYTE_4;
+    } BYTES;
+} CAN_MESSAGE_ID;
+
+void _CANIDToRegs(BYTE* ptr,
+                  unsigned long val,
+                  BYTE type)
+{
+    CAN_MESSAGE_ID *Value;
+
+    Value =  (CAN_MESSAGE_ID*)&val;
+
+    if ( type == ECAN_MSG_STD )
+    {
+        // Standard Identifier
+        *ptr = Value->BYTES.BYTE_1 >> 3;        // Copy SID<7:3> to SIDH<4:0>
+        *ptr |= (Value->BYTES.BYTE_2 << 5);     // Copy SID<10:8> to SIDH<7:5>
+        ptr++;                                  // Point to SIDL
+        *ptr = Value->BYTES.BYTE_1 << 5;        // Copy SID<2:0> to SIDL<7:5>
+    }
+    else
+    {
+        // Extended Identifier
+        *ptr = Value->BYTES.BYTE_3 >> 5;        // Copy EID<23:21> to SIDH<2:0>
+        *ptr |= Value->BYTES.BYTE_4 << 3;       // Copy EID<28:24> to SIDH<7:3>
+        ptr++;                                  // Point to SIDL
+        *ptr = (Value->BYTES.BYTE_3 << 3) & 0xE0; // Copy EID<20:18> to SIDL<7:5>
+                                                // mask out EID<17:16> bits
+        *ptr |= 0b00001000;                     // Set EXIDEN bit  to SIDL<3>
+        *ptr |= Value->BYTES.BYTE_3 & 0x03;     // Copy EID<17:16> to SIDL<1:0>
+        ptr++;                                  // Point to EIDH
+        *ptr = Value->BYTES.BYTE_2;             // Copy EID<15:8> to EIDH<7:0>
+        ptr++;                                  // Point to EIDL
+        *ptr = Value->BYTES.BYTE_1;             // Copy EID<7:0> to EIDL<7:0>
+    }
+}
+
+/*********************************************************************
+ * Function:        void _RegsToCANID(BYTE *ptr,
+ *                                   unsigned long *val,
+ *                                   BYTE type)
+ *
+ * PreCondition:    None
+ *
+ * Input:           ptr     - Starting address of a buffer to be updated
+ *                  val     - 32-bit buffer to hold value
+ *                  type    - Type of message - either
+ *                            CAN_CONFIG_XTD_MSG or CAN_CONFIG_STD_MSG
+ *
+ * Output:          CAN registers starting at given address are bit
+ *                  adjusted and copied into 'val'
+ *
+ * Side Effects:    None
+ *
+ * Overview:        If given id is of type standard identifier,
+ *                  only SIDH and SIDL are used
+ *                  If given id is of type extended identifier,
+ *                  bits EIDH, EIDL and SIDL<1:0> is copied to val<17:0>
+ *                  bits SIDH and SIDL is copied to val<28:18>
+ *
+ ********************************************************************/
+void _RegsToCANID( BYTE* ptr,
+                   unsigned long *val,
+                   BYTE type )
+{
+    CAN_MESSAGE_ID *Value;
+
+    Value = (CAN_MESSAGE_ID*)val;
+
+    if ( type == ECAN_MSG_STD )
+    {
+        // Standard Identifier
+        Value->BYTES.BYTE_1 = (*ptr << 3);      // Copy SIDH<4:0> to SID<7:3>
+        Value->BYTES.BYTE_2 = *ptr >> 5;        // Copy SIDH<7:5> to SID<10:8>
+        ptr++;                                  // Point to SIDL
+        Value->BYTES.BYTE_1 |= (*ptr >> 5);     // Copy SIDL<7:6> to SID<2:0>
+        Value->BYTES.BYTE_3 = 0x00;
+        Value->BYTES.BYTE_4 = 0x00;
+    }
+    else
+    {
+        // Extended Identifier
+        Value->BYTES.BYTE_3 = (*ptr << 5);      // Copy SIDH<2:0> to EID<23:21>
+        Value->BYTES.BYTE_4 = (*ptr >> 3);      // Copy SIDH<7:3> to EID<29:25>
+        ptr++;                          // Point to SIDL
+        Value->BYTES.BYTE_3 |= (*ptr & 0x03);   // Copy SIDH<1:0> to EID<17:16>
+        // Bug-Fix NKR 11/20/00
+        Value->BYTES.BYTE_3 |= ((*ptr & 0xe0) >> 3);  // Copy SIDL<7:6> to EID<20:18>
+        ptr++;                          // Point to EIDH
+        Value->BYTES.BYTE_2 = *ptr;             // Copy EIDH<15:8> to EID<15:8>
+        ptr++;                                  // Point to EIDL
+        Value->BYTES.BYTE_1 = *ptr;             // Copy EIDH<7:0> to EID<7:0>
+    }
+}
+
+
+/*********************************************************************
+ * Function:        BYTE* _ECANPointBuffer(BYTE b)
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer number
+ *
+ * Output:          RXBnCON or RnCON address
+ *
+ * Side Effects:    None
+ *
+ * Overview:        This functions returns a pointer to the
+ *                  beginning of a reception buffer
+ *
+ * Note:
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_FIXED) && (ECAN_FUNC_MODE_VAL == ECAN_MODE_2) )
+static BYTE* _ECANPointBuffer(BYTE b)
+{
+    BYTE* pt;
+
+    switch(b)
+    {
+    case 0:
+        pt=(BYTE*)&RXB0CON;     // return pointer to correct buffer
+        break;
+    case 1:
+        pt=(BYTE*)&RXB1CON;
+        break;
+    case 2:
+        pt=(BYTE*)&B0CON;
+        break;
+    case 3:
+        pt=(BYTE*)&B1CON;
+        break;
+    case 4:
+        pt=(BYTE*)&B2CON;
+        break;
+    case 5:
+        pt=(BYTE*)&B3CON;
+        break;
+    case 6:
+        pt=(BYTE*)&B4CON;
+        break;
+    default:              //case 7:
+        pt=(BYTE*)&B5CON;
+        break;
+    }
+    return (pt);
+}
+#endif
+
+
+

+ 376 - 0
ProjectSource/BMS_Slave_RCT/ECAN.def

@@ -0,0 +1,376 @@
+/*###########################################################################
+*This file is generated by Microchip Application Maestro
+*DO NOT MODIFY MANUALLY
+*###########################################################################*/
+#ifndef  _ECAN_DEF
+#define _ECAN_DEF
+// 
+//
+// ECAN Routine Mode:
+// Possible values are ECAN_LIB_MODE_FIXED, ECAN_LIB_MODE_RUN_TIME
+//   Use ECAN_LIB_MODE_FIXED if run-time selection of mode is not required.
+//   Use ECAN_LIB_MODE_RUN_TIME if run-time selection is required.
+#define ECAN_LIB_MODE_VAL ECAN_LIB_MODE_FIXED
+//
+// ECAN Functional Mode to be used in ECANInitialize().
+// Possible values are ECAN_MODE_0, ECAN_MODE_1, ECAN_MODE_2
+#define ECAN_FUNC_MODE_VAL ECAN_MODE_1
+//
+// Mode to leave ECAN after ECANInit. 
+// Possible values are ECAN_INIT_NORMAL, ECAN_INIT_CONFIGURATION, ECAN_INIT_LOOPBACK, ECAN_INIT_DISABLE
+#define ECAN_INIT_MODE ECAN_INIT_NORMAL
+//
+// SJW value - Value must be between 1-4 inclusive.
+#define ECAN_SJW_VAL 1
+//
+// BRP value - Value must be between 1-64 inclusive.
+#define ECAN_BRP_VAL 2
+//
+// PHSEG1 value - Value must be between 1-8 inclusive.
+#define ECAN_PHSEG1_VAL 8
+//
+// PHSEG2 value - Value must be between 1-8 inclusive.
+#define ECAN_PHSEG2_VAL 5
+//
+// PROPSEG value - Value must be between 1-8 inclusive.
+#define ECAN_PROPSEG_VAL 1
+//
+// Use freely progrmable PHSEG2 or calculated value.
+#define ECAN_PHSEG2_MODE_VAL 0
+//
+// Bus Sample Mode
+#define ECAN_BUS_SAMPLE_MODE_VAL ECAN_BUS_SAMPLE_MODE_THRICE
+//
+// Wakeup Mode
+#define ECAN_WAKEUP_MODE_VAL ECAN_WAKEUP_MODE_ENABLE
+//
+// Filter Mode
+#define ECAN_FILTER_MODE_VAL ECAN_FILTER_MODE_ENABLE
+//
+// CANTX1 Drive Mode
+#define ECAN_TXDRIVE_MODE_VAL ECAN_TXDRIVE_MODE_VDD
+//
+// CANTX2 pin mode
+#define ECAN_TX2_MODE_VAL ECAN_TX2_MODE_DISABLE
+//
+// CANTX2 Source
+#define ECAN_TX2_SOURCE_VAL ECAN_TX2_SOURCE_COMP
+//
+// CAN Capture Mode
+#define ECAN_CAPTURE_MODE_VAL ECAN_CAPTURE_MODE_DISABLE
+//
+// RXB0 Recieve Mode
+#define ECAN_RXB0_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// RXB0 Double Buffer Mode
+#define ECAN_RXB0_DBL_BUFFER_MODE_VAL ECAN_DBL_BUFFER_MODE_DISABLE
+//
+// RXB1 Recieve Mode
+#define ECAN_RXB1_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B0 Tx/Rx mode Mode
+#define ECAN_B0_TXRX_MODE_VAL ECAN_BUFFER_RX
+//
+// B0 Recieve Mode
+#define ECAN_B0_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B0 Auto RTR Mode
+#define ECAN_B0_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B1 Tx/Rx mode Mode
+#define ECAN_B1_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B1 Recieve Mode
+#define ECAN_B1_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B1 Auto RTR Mode
+#define ECAN_B1_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B2 Tx/Rx mode Mode
+#define ECAN_B2_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B2 Recieve Mode
+#define ECAN_B2_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B2 Auto RTR Mode
+#define ECAN_B2_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B3 Tx/Rx mode Mode
+#define ECAN_B3_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B3 Recieve Mode
+#define ECAN_B3_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B3 Auto RTR Mode
+#define ECAN_B3_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B4 Tx/Rx mode Mode
+#define ECAN_B4_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B4 Recieve Mode
+#define ECAN_B4_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B4 Auto RTR Mode
+#define ECAN_B4_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// B5 Tx/Rx mode Mode
+#define ECAN_B5_TXRX_MODE_VAL ECAN_BUFFER_TX
+//
+// B5 Recieve Mode
+#define ECAN_B5_MODE_VAL ECAN_RECEIVE_ALL_VALID
+//
+// B5 Auto RTR Mode
+#define ECAN_B5_AUTORTR_MODE ECAN_AUTORTR_MODE_DISABLE
+//
+// RXF0 Filter Enable/Disable
+#define ECAN_RXF0_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF0 Filter Type
+#define ECAN_RXF0_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF0 Value
+#define ECAN_RXF0_VAL 0x0444L
+//
+// RXF0 Buffer Link
+#define ECAN_RXF0_BUFFER_VAL RXB0
+//
+// RXF0 Mask Link
+#define ECAN_RXF0_MASK_VAL ECAN_RXM0
+//
+// RXF1 Filter Enable/Disable
+#define ECAN_RXF1_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF1 Filter Type
+#define ECAN_RXF1_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF1 Value
+#define ECAN_RXF1_VAL 0x0111L
+//
+// RXF1 Buffer Link
+#define ECAN_RXF1_BUFFER_VAL RXB0
+//
+// RXF1 Mask Link
+#define ECAN_RXF1_MASK_VAL ECAN_RXM0
+//
+// RXF2 Filter Enable/Disable
+#define ECAN_RXF2_MODE_VAL ECAN_RXFn_ENABLE
+//
+// RXF2 Filter Type
+#define ECAN_RXF2_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF2 Value
+#define ECAN_RXF2_VAL 0x00A0L
+//
+// RXF2 Buffer Link
+#define ECAN_RXF2_BUFFER_VAL RXB1
+//
+// RXF2 Mask Link
+#define ECAN_RXF2_MASK_VAL ECAN_RXM1
+//
+// RXF3 Filter Enable/Disable
+#define ECAN_RXF3_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF3 Filter Type
+#define ECAN_RXF3_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF3 Value
+#define ECAN_RXF3_VAL 0x0L
+//
+// RXF3 Buffer Link
+#define ECAN_RXF3_BUFFER_VAL RXB1
+//
+// RXF3 Mask Link
+#define ECAN_RXF3_MASK_VAL ECAN_RXM1
+//
+// RXF4 Filter Enable/Disable
+#define ECAN_RXF4_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF4 Filter Type
+#define ECAN_RXF4_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF4 Value
+#define ECAN_RXF4_VAL 0x0L
+//
+// RXF4 Buffer Link
+#define ECAN_RXF4_BUFFER_VAL RXB1
+//
+// RXF4 Mask Link
+#define ECAN_RXF4_MASK_VAL ECAN_RXM1
+//
+// RXF5 Filter Enable/Disable
+#define ECAN_RXF5_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF5 Filter Type
+#define ECAN_RXF5_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF5 Value
+#define ECAN_RXF5_VAL 0x0L
+//
+// RXF5 Buffer Link
+#define ECAN_RXF5_BUFFER_VAL RXB1
+//
+// RXF5 Mask Link
+#define ECAN_RXF5_MASK_VAL ECAN_RXM1
+//
+// RXF6 Filter Enable/Disable
+#define ECAN_RXF6_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF6 Filter Type
+#define ECAN_RXF6_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF6 Value
+#define ECAN_RXF6_VAL 0x0L
+//
+// RXF6 Buffer Link
+#define ECAN_RXF6_BUFFER_VAL RXB0
+//
+// RXF6 Mask Link
+#define ECAN_RXF6_MASK_VAL ECAN_RXM0
+//
+// RXF7 Filter Enable/Disable
+#define ECAN_RXF7_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF7 Filter Type
+#define ECAN_RXF7_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF7 Value
+#define ECAN_RXF7_VAL 0x0L
+//
+// RXF7 Buffer Link
+#define ECAN_RXF7_BUFFER_VAL RXB0
+//
+// RXF7 Mask Link
+#define ECAN_RXF7_MASK_VAL ECAN_RXM0
+//
+// RXF8 Filter Enable/Disable
+#define ECAN_RXF8_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF8 Filter Type
+#define ECAN_RXF8_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF8 Value
+#define ECAN_RXF8_VAL 0x0L
+//
+// RXF8 Buffer Link
+#define ECAN_RXF8_BUFFER_VAL RXB0
+//
+// RXF8 Mask Link
+#define ECAN_RXF8_MASK_VAL ECAN_RXM0
+//
+// RXF9 Filter Enable/Disable
+#define ECAN_RXF9_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF9 Filter Type
+#define ECAN_RXF9_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF9 Value
+#define ECAN_RXF9_VAL 0x0L
+//
+// RXF9 Buffer Link
+#define ECAN_RXF9_BUFFER_VAL RXB0
+//
+// RXF9 Mask Link
+#define ECAN_RXF9_MASK_VAL ECAN_RXM0
+//
+// RXF10 Filter Enable/Disable
+#define ECAN_RXF10_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF10 Filter Type
+#define ECAN_RXF10_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF10 Value
+#define ECAN_RXF10_VAL 0x0L
+//
+// RXF10 Buffer Link
+#define ECAN_RXF10_BUFFER_VAL RXB0
+//
+// RXF10 Mask Link
+#define ECAN_RXF10_MASK_VAL ECAN_RXM0
+//
+// RXF11 Filter Enable/Disable
+#define ECAN_RXF11_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF11 Filter Type
+#define ECAN_RXF11_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF11 Value
+#define ECAN_RXF11_VAL 0x0L
+//
+// RXF11 Buffer Link
+#define ECAN_RXF11_BUFFER_VAL RXB0
+//
+// RXF11 Mask Link
+#define ECAN_RXF11_MASK_VAL ECAN_RXM0
+//
+// RXF12 Filter Enable/Disable
+#define ECAN_RXF12_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF12 Filter Type
+#define ECAN_RXF12_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF12 Value
+#define ECAN_RXF12_VAL 0x0L
+//
+// RXF12 Buffer Link
+#define ECAN_RXF12_BUFFER_VAL RXB0
+//
+// RXF12 Mask Link
+#define ECAN_RXF12_MASK_VAL ECAN_RXM0
+//
+// RXF13 Filter Enable/Disable
+#define ECAN_RXF13_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF13 Filter Type
+#define ECAN_RXF13_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF13 Value
+#define ECAN_RXF13_VAL 0x0L
+//
+// RXF13 Buffer Link
+#define ECAN_RXF13_BUFFER_VAL RXB0
+//
+// RXF13 Mask Link
+#define ECAN_RXF13_MASK_VAL ECAN_RXM0
+//
+// RXF14 Filter Enable/Disable
+#define ECAN_RXF14_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF14 Filter Type
+#define ECAN_RXF14_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF14 Value
+#define ECAN_RXF14_VAL 0x0L
+//
+// RXF14 Buffer Link
+#define ECAN_RXF14_BUFFER_VAL RXB0
+//
+// RXF14 Mask Link
+#define ECAN_RXF14_MASK_VAL ECAN_RXM0
+//
+// RXF15 Filter Enable/Disable
+#define ECAN_RXF15_MODE_VAL ECAN_RXFn_DISABLE
+//
+// RXF15 Filter Type
+#define ECAN_RXF15_MSG_TYPE_VAL ECAN_MSG_STD
+//
+// RXF15 Value
+#define ECAN_RXF15_VAL 0x0L
+//
+// RXF15 Buffer Link
+#define ECAN_RXF15_BUFFER_VAL RXB0
+//
+// RXF15 Mask Link
+#define ECAN_RXF15_MASK_VAL ECAN_RXM0
+//
+// RXM0 Type
+#define ECAN_RXM0_MSG_TYPE ECAN_MSG_STD
+//
+// RXM0 Value
+#define ECAN_RXM0_VAL 0xFFFFL
+//
+// RXM1 Type
+#define ECAN_RXM1_MSG_TYPE ECAN_MSG_STD
+//
+// RXM1 Value
+#define ECAN_RXM1_VAL 0x0L
+#endif

+ 1714 - 0
ProjectSource/BMS_Slave_RCT/ECAN.h

@@ -0,0 +1,1714 @@
+/*********************************************************************
+ *
+ *              ECAN C Library Source Code
+ *
+ *********************************************************************
+ * FileName:        ECAN.h
+ * Dependencies:    ECAN.def
+ * Processor:       Any PIC18 with ECAN module
+ * Complier:        Microchip C 2.10.06 or higher
+ * Company:         Microchip Technology, Inc.
+ *
+ *
+ * Software License Agreement
+ *
+ * The software supplied herewith by Microchip Technology Incorporated
+ * (the “Company”) for its PICmicro® Microcontroller is intended and
+ * supplied to you, the Company’s customer, for use solely and
+ * exclusively on Microchip PICmicro Microcontroller products. The
+ * software is owned by the Company and/or its supplier, and is
+ * protected under applicable copyright laws. All rights are reserved.
+ *  Any use in violation of the foregoing restrictions may subject the
+ * user to criminal sanctions under applicable laws, as well as to
+ * civil liability for the breach of the terms and conditions of this
+ * license.
+ *
+ * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
+ * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
+ * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ * Author               Date    Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Caio Gubel           5/5/03  Version 1.0 - Initial Release
+ * Nilesh R.            7/22/03 Improved
+ *********************************************************************/
+
+#ifndef ECAN_H          // To avoid duplicate inclusion
+#define ECAN_H
+
+#include   "ecan.def"
+
+#if defined(HI_TECH_C)
+    #define HITECH_C18
+#else
+    #define MCHP_C18
+#endif
+
+#if defined(MCHP_C18) && defined(HITECH_C18)
+#error "Invalid Compiler selection."
+#endif
+
+#if !defined(MCHP_C18) && !defined(HITECH_C18)
+#error "Compiler not supported."
+#endif
+
+#if defined(MCHP_C18)
+    #include <p18cxxx.h>    // p18cxxx.h must have current processor
+                            // defined.
+#endif
+
+#if defined(HITECH_C18)
+    #include <pic18.h>
+#endif
+
+
+
+
+/*********************************************************************
+ *
+ * General purpose typedef's
+ *
+ * Remove these definations if they are already defined in one of your
+ * application files.
+ ********************************************************************/
+typedef enum _BOOL { FALSE = 0, TRUE } BOOL;
+typedef unsigned char BYTE;
+
+typedef union _BYTE_VAL
+{
+    struct
+    {
+        unsigned int b0:1;
+        unsigned int b1:1;
+        unsigned int b2:1;
+        unsigned int b3:1;
+        unsigned int b4:1;
+        unsigned int b5:1;
+        unsigned int b6:1;
+        unsigned int b7:1;
+    } bits;
+    BYTE Val;
+} BYTE_VAL;
+
+
+#define ECAN_LIB_MODE_FIXED     1
+#define ECAN_LIB_MODE_RUN_TIME  0
+
+#define ECAN_TX2_MODE_DISABLE   0
+#define ECAN_TX2_MODE_ENABLE    1
+
+    #define ECAN_INIT_NORMAL            0x00
+    #define ECAN_INIT_LOOPBACK          0x40
+    #define ECAN_INIT_CONFIGURATION     0x80
+    #define ECAN_INIT_DISABLE           0x20
+    #define ECAN_INIT_LISTEN_ONLY       0X60
+
+#define ECAN_RXFn_ENABLE        1
+#define ECAN_RXFn_DISABLE       0
+
+
+// Enable auto RTR code when at least one buffer is configured in
+// auto RTR mode.
+#if (ECAN_FUNC_MODE_VAL != MODE_0 )
+    #if ( (ECAN_B0_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B1_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B2_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B3_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B4_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) || \
+          (ECAN_B5_AUTORTR_MODE == ECAN_AUTORTR_MODE_ENABLE) )
+        #define ECAN_ENABLE_AUTO_RTR
+    #endif
+#endif
+
+
+/*********************************************************************
+ * Function:        void ECANInitialize(void)
+ *
+ * Overview:        Use this function to initialize ECAN module with
+ *                  options defined in ECAN.def file.
+ *                  You may manually edit ECAN.def file as per your
+ *                  requirements, or use Microchip Application
+ *                  Maestro tool.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    All pending transmissions are aborted.
+ ********************************************************************/
+void ECANInitialize(void);
+
+
+/*********************************************************************
+ *
+ * ECAN_TX_MSG_FLAGS
+ *
+ * This enumeration values define flags related to transmission of a
+ * CAN message.  There could be more than one this flag
+ * ORed together to form multiple flags.
+ *
+ *********************************************************************/
+typedef enum _ECAN_TX_MSG_FLAGS
+ {
+    ECAN_TX_PRIORITY_BITS    = 0b00000011,
+    ECAN_TX_PRIORITY_0       = 0b00000000,
+    ECAN_TX_PRIORITY_1       = 0b00000001,
+    ECAN_TX_PRIORITY_2       = 0b00000010,
+    ECAN_TX_PRIORITY_3       = 0b00000011,
+
+    ECAN_TX_FRAME_BIT        = 0b00100000,
+    ECAN_TX_STD_FRAME        = 0b00000000,
+    ECAN_TX_XTD_FRAME        = 0b00100000,
+
+    ECAN_TX_RTR_BIT          = 0b01000000,
+    ECAN_TX_NO_RTR_FRAME     = 0b00000000,
+    ECAN_TX_RTR_FRAME        = 0b01000000
+} ECAN_TX_MSG_FLAGS;
+
+
+/*********************************************************************
+ * Function:        BOOL ECANSendMessage(unsigned long id,
+ *                                      BYTE *data,
+ *                                      BYTE dataLen,
+ *                                      ECAN_TX_MSG_FLAGS msgFlags)
+ *
+ * Overview:        Use this function to transmit a CAN message.
+ *                  This function searches for empty transmit buffer
+ *                  and loads it with given messages. Buffer is then
+ *                  marked for ready to transmit.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                msgFlags parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  msgFlags    - One or ECAN_TX_MSG_FLAGS values ORed
+ *                                together
+ *
+ * Output:          TRUE, if an empty buffer was found and loaded with
+ *                  given data
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+BOOL ECANSendMessage( unsigned long id,
+                     BYTE *data,
+                     BYTE dataLen,
+                     ECAN_TX_MSG_FLAGS msgFlags);
+
+/*********************************************************************
+ * Function:        BOOL ECANLoadRTRBuffer(BYTE buffer,
+ *                                         unsigned long id,
+ *                                         BYTE *data,
+ *                                         BYTE dataLen,
+ *                                         BYTE type)
+ *
+ * Overview:        Use this function to update automatic RTR buffer.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer number that is to be loaded
+ *                  id          - CAN message identifier.
+ *                                Only 11 or 29 bits may be used
+ *                                depending on standard or extended
+ *                                message type as specified in
+ *                                type parameter.
+ *                  data        - Data bytes of upto 8 bytes in length
+ *                  dataLen     - Data length from 0 thru 8.
+ *                                If 0, data may be NULL.
+ *                  type        - Buffer type
+ *                                Must be ECAN_MSG_STD for Standard
+ *                                        ECAN_MSG_XTD for Extended
+ *
+ * Output:          TRUE, if given data was successfully loaded
+ *                  FALSE, if RTR buffer was in process of transmitting
+ *                          automated response.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#if ( defined(ECAN_ENABLE_AUTO_RTR) )
+    BOOL ECANLoadRTRBuffer(BYTE buffer,
+                           unsigned long id,
+                           BYTE *data,
+                           BYTE dataLen,
+                           BYTE type);
+#endif
+
+
+/*********************************************************************
+ *
+ * ECAN_RX_MSG_FLAGS
+ *
+ * This enumeration values define flags related to reception of a ECAN
+ * message.  There could be more than one this flag
+ * ORed together to form multiple flags.
+ * If a particular bit is set, corresponding meaning is TRUE or else
+ * it will be FALSE.
+ *
+ * e.g.
+ *      if (msgFlag & ECAN_RX_OVERFLOW)
+ *      {
+ *          // Receiver overflow has occured.
+ *          ...
+ *      }
+ *
+ ********************************************************************/
+typedef enum _ECAN_RX_MSG_FLAGS
+{
+    ECAN_RX_OVERFLOW     = 0b00001000,
+    ECAN_RX_INVALID_MSG  = 0b00010000,
+    ECAN_RX_XTD_FRAME    = 0b00100000,
+    ECAN_RX_RTR_FRAME    = 0b01000000,
+    ECAN_RX_DBL_BUFFERED = 0b10000000
+} ECAN_RX_MSG_FLAGS;
+
+/*********************************************************************
+ * Function:        BOOL ECANReceiveMessage(unsigned long *id,
+ *                                  BYTE *data,
+ *                                  BYTE *dataLen,
+ *                                  ECAN_RX_MSG_FLAGS *msgFlags)
+ *
+ * Overview:        Use this function to check for full receive buffer
+ *                  and extract received data into local buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           id          - Pointer to buffer that will be
+ *                                populated with receive ID.
+ *                  data        - Pointer to buffer that will be
+ *                                populated with data if there is any
+ *                  dataLen     - Pointer to buffer that will be
+ *                                populated with count of bytes
+ *                                copied in data buffer.
+ *                  msgFlags    - Pointer to buffer that will be
+ *                                copied with information about
+ *                                received message. More than
+ *                                one information is ORed together.
+ *
+ * Output:          TRUE, if a full receive buffer was found and
+ *                  given parameters were populated.
+ *                  FALSE, if otherwise.
+ *
+ * Side Effects:    None
+ *
+ * Note:            If you need to know the filter number that caused
+ *                  this message to get accepted, call
+ *                  ECANGetFilterHitInfo().
+ *
+ ********************************************************************/
+BOOL ECANReceiveMessage( unsigned long* id,
+                        BYTE *Data,
+                        BYTE *DataLen,
+                        ECAN_RX_MSG_FLAGS *MsgFlags);
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetFilterHitInfo(void)
+ *
+ * Overview:        Use this macro to extract filter number that
+ *                  caused a message to get accepted.
+ *                  You must call this macro immediately after calling
+ *                  ECANReceiveMessage function.
+ *
+ * PreCondition:    ECANReceiveMessage is called and returned TRUE
+ *
+ * Input:           None
+ *
+ * Output:          Number of filter that caused acceptance.
+ *                  0 means RXF0, 1 means RXF1 and so on.
+ *
+ * Side Effects:    None
+ *
+ * Note:            This macro will return filter hit information
+ *                  for previously received message only.
+ *
+ ********************************************************************/
+#define ECANGetFilterHitInfo()          (_ECANRxFilterHitInfo.Val)
+    extern BYTE_VAL _ECANRxFilterHitInfo;
+
+
+/*********************************************************************
+ *
+ * ECAN_OP_MODE
+ *
+ * This enumeration values define codes related to ECAN module
+ * operation mode. ECANSetOperationMode() routine requires this code.
+ * These values must be used by itself
+ * i.e. it cannot be ORed to form * multiple values.
+ *
+ ********************************************************************/
+typedef enum _ECAN_OP_MODE
+{
+    ECAN_OP_MODE_BITS    = 0xe0,   // Use this to access opmode bits
+    ECAN_OP_MODE_NORMAL  = 0x00,
+    ECAN_OP_MODE_SLEEP   = 0x20,
+    ECAN_OP_MODE_LOOP    = 0x40,
+    ECAN_OP_MODE_LISTEN  = 0x60,
+    ECAN_OP_MODE_CONFIG  = 0x80
+} ECAN_OP_MODE;
+
+/*********************************************************************
+ * Function:        void ECANSetOperationMode(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this function to switch ECAN module into
+ *                  given operational mode.
+ *                  You may not need to call this function if
+ *                  your application does not require run-time
+ *                  changes in ECAN mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a blocking call.  It will not return until
+ *                  requested mode is set.
+ ********************************************************************/
+void ECANSetOperationMode(ECAN_OP_MODE mode);
+
+/*********************************************************************
+ * Macro:           void ECANSetOperationModeNoWait(ECAN_OP_MODE mode)
+ *
+ * Overview:        Use this macro to request operation mode but
+ *                  do not want macro to wait for it get accepted.
+ *                  You must use ECANGetOperationMode() to esnure
+ *                  requested operation mode is accepted before
+ *                  performing operation critical steps.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes
+ *                  in ECAN mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode    - Operation mode code
+ *                            must be of type enum ECAN_OP_MODES
+ *
+ * Output:          MCU is set to requested mode
+ *
+ * Side Effects:    None
+ *
+ * Note:            This is a non-blocking call.
+ *                  It does not verify that
+ *                  ECAN module is switched to requested mode or not.
+ *                  Caller must use ECANGetOperationMode() to verify
+ *                  correct operation mode before performing mode
+ *                  specific operation.
+ *
+ ********************************************************************/
+#define ECANSetOperationModeNoWait(mode)     CANCON = mode
+
+/*********************************************************************
+ * Macro:           ECAN_OP_MODE ECANGetOperationMode()
+ *
+ * Overview:        Use this macro to obtain current operation mode
+ *                  ECAN module.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes.
+ * PreCondition:
+ *
+ * Input:
+ *
+ * Output:          Current operational mode of ECAN module is returned
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetOperationMode() (CANCON & ECAN_OP_MODE_BITS)
+
+
+/*********************************************************************
+ * Macro:           ECANSetFunctionalMode(mode)
+ *
+ * Overview:        Use this macro to set functional mode of ECAN.
+ *                  You may not need to call this macro if
+ *                  your application will not change mode at run-time.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *                  and ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME
+ *
+ * Input:           mode        - New mode
+ *                                Allowable values are
+ *                                  ECAN_MODE_0 for Mode 0
+ *                                  ECAN_MODE_1 for Mode 1
+ *                                  ECAN_MODE_2 for Mode 2
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+//if ( ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME )
+    #define ECANSetFunctionalMode(mode)      \
+            ECANCON_MDSEL1 = mode >> 7; \
+            ECANCON_MDSEL0 = mode >> 6;
+//#endif
+
+    #define ECAN_MODE_0     0x00
+    #define ECAN_MODE_1     0x40
+    #define ECAN_MODE_2     0x80
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetFunctionalMode()
+ *
+ * Overview:        Use this macro to get functional mode of ECAN.
+ *                  You may not need to call this macro if
+ *                  your application will not change mode at run-time.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          mode    -   ECAN_MODE_0
+ *                              ECAN_MODE_1
+ *                              ECAN_MODE_2
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANGetFunctionalMode()      (ECANCON & 0b11000000)
+
+
+/*********************************************************************
+ * Macro:           ECANSetBusSampleMode(mode)
+ *
+ * Overview:        Use this macro to set CAN bus sample mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change
+ *                  to sampling mode.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - Bus sample mode
+ *                     Allowable values are
+ *                      ECAN_BUS_SAMPLE_MODE_ONCE to sample once
+ *                      ECAN_BUS_SAMPLE_THRICE to sample thrice.
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetBusSampleMode(mode)   BRGCON2_SAM = mode
+
+    #define ECAN_BUS_SAMPLE_MODE_ONCE       0
+    #define ECAN_BUS_SAMPLE_MODE_THRICE     1
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetWakeupMode(mode)
+ *
+ * Overview:        Use this macro to set CAN bus activity bus mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time changes.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - CAN Bus activity wakeup mode
+ *                     Allowable values are
+ *                      ECAN_WAKEUP_MODE_ENABLE to enable bus wakeup
+ *                      ECAN_WAKEUP_MODE_DISABLE to disable bus wakeup
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetWakeupMode(mode)      BRGCON3_WAKDIS = mode
+
+    #define ECAN_WAKEUP_MODE_ENABLE         0
+    #define ECAN_WAKEUP_MODE_DISABLE        1
+
+
+/*********************************************************************
+ * Macro:           ECANSetFilterMode(mode)
+ *
+ * Overview:        Use this macro to CAN wakeup low pass filter mode.
+ *                  You may not need to call this macro if your application
+ *                  does not require run-time changes.
+ *
+ * PreCondition:    ECAN must be in configuration mode
+ *
+ * Input:           mode        - CAN wakeup filter mode
+ *                     Allowable values are
+ *                      ECAN_FILTER_MODE_DISABLE to not use wakeup filter
+ *                      ECAN_FILTER_MODE_ENABLE to use wakeup filter
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetFilterMode(mode)      BRGCON3_WAKFIL = mode
+
+    #define ECAN_FILTER_MODE_DISABLE        0
+    #define ECAN_FILTER_MODE_ENABLE         1
+
+/*********************************************************************
+ * Macro:           ECANSetTxDriveMode(mode)
+ *
+ * Overview:        Use this macro to set CANTX pin drive options.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - CANTX drive mode when trnasmitting
+ *                                recessive bit.
+ *                     Allowable values are
+ *                      ECAN_TXDRIVE_MODE_TRISTATE to drive tri-state
+ *                      ECAN_TXDRIVE_MODE_VDD to drive to Vdd
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetTxDriveMode(mode)     CIOCON_ENDRHI = mode
+
+    #define ECAN_TXDRIVE_MODE_TRISTATE  0
+    #define ECAN_TXDRIVE_MODE_VDD       1
+
+
+/*********************************************************************
+ * Macro:           ECANSetCANTX2Source(source)
+ *
+ * Overview:        Use this macro to set CANTX2 pin source.
+ *                  This macro automatically enables CANTX2 pin.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           source      - CANTX2 source
+ *                     Allowable values are
+ *                      ECAN_TX2_CAN_CLOCK to output CAN clock on TX2
+ *                      ECAN_TX2_CAN_DATA to output complete CAN
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetCANTX2Mode(mode)         CIOCON_TX2SRC = mode << 7; \
+                                        CIOCON_TX2EN = 1
+    #define ECAN_TX2_SOURCE_COMP    0
+    #define ECAN_TX2_SOURCE_CLOCK   1
+
+
+/*********************************************************************
+ * Macro:           ECANDisableCANTX2()
+ *
+ * Overview:        Use this macro to disable CANTX2 pin.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANDisableCANTX2()              CIOCON_TX2EN = 0
+
+
+/*********************************************************************
+ * Macro:           ECANSetCaptureMode(mode)
+ *
+ * Overview:        Use this macro to set CAN CAPTURE mode.  This is
+ *                  mainly used to timestamp incoming CAN messages.
+ *                  You would also need to setup and enable CCP module
+ *                  to obtain timeestamp information.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - Capture mode
+ *                                Allowable values are
+ *                                  ECAN_CAPTURE_MODE_DISABLE
+ *                                  ECAN_CAPTURE_MODE_ENABLE
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetCaptureMode(mode)     CIOCON_CANCAP = mode
+
+    #define ECAN_CAPTURE_MODE_DISABLE   0
+    #define ECAN_CAPTURE_MODE_ENABLE    1
+
+/*********************************************************************
+ * Macro:           ECANSetPHSEG2Mode(mode)
+ *
+ * Overview:        Use this macro to set PHSEG2 mode.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - PHSEG2 Mode
+ *                                Allowable values are
+ *                    ECAN_PHSEG2_MODE_AUTOMATIC
+ *                      - Max. of PHSEG1 of IPT, whichever is greater
+ *                    ECAN_PHSEG2_MODE_PROGRAMMABLE
+ *                      - Freely programmable
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#define ECANSetPHSEG2Mode(mode)      BRGCON2_SEG2PHTS = mode
+
+    #define ECAN_PHSEG2_MODE_AUTOMATIC      0
+    #define ECAN_PHSEG2_MODE_PROGRAMMABLE   1
+
+
+/*********************************************************************
+ * Macro:           ECANSetB0AutoRTRMode(mode)
+ *                  ECANSetB1AutoRTRMode(mode)
+ *                  ECANSetB2AutoRTRMode(mode)
+ *                  ECANSetB3AutoRTRMode(mode)
+ *                  ECANSetB4AutoRTRMode(mode)
+ *                  ECANSetB5AutoRTRMode(mode)
+ *
+ * Overview:        Use these macros to set automatic RTR handling
+ *                  mode for given programmable buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME
+ *                  ECAN_FUNC_MODE_VAL != ECAN_MODE_0
+ *
+ * Input:           mode        - AutoRTR mode
+ *                  Allowable values are
+ *                    ECAN_AUTORTR_MODE_DISABLE
+ *                      - To disable automatic RTR handling
+ *                    ECAN_AUTORTR_MODE_ENABLE
+ *                      - To enable automatic RTR handling
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetB0AutoRTRMode(mode)      B0CON_RTREN = mode;     \
+                                            BSEL0_B0TXEN = 1
+    #define ECANSetB1AutoRTRMode(mode)      B1CON_RTREN = mode;     \
+                                            BSEL0_B1TXEN = 1
+    #define ECANSetB2AutoRTRMode(mode)      B2CON_RTREN = mode;     \
+                                            BSEL0_B2TXEN = 1
+    #define ECANSetB3AutoRTRMode(mode)      B3CON_RTREN = mode;     \
+                                            BSEL0_B3TXEN = 1
+    #define ECANSetB4AutoRTRMode(mode)      B4CON_RTREN = mode;     \
+                                            BSEL0_B4TXEN = 1
+    #define ECANSetB5AutoRTRMode(mode)      B5CON_RTREN = mode;     \
+                                            BSEL0_B5TXEN = 1
+#endif
+
+    #define ECAN_AUTORTR_MODE_DISABLE   0
+    #define ECAN_AUTORTR_MODE_ENABLE    1
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetRXMnValue(val, type)
+ *
+ * Overview:        Use these macros to set specific mask value.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *
+ * Input:           val     - Value to be set
+ *                      Actual value would depend on type.
+ *                      If type is Standard, value will be 11-bit long
+ *                      If type is Extended, value will be 29-bit long
+ *                  type    - Mask type
+ *                      Allowable values are
+ *                          ECAN_MSG_STD for Standard type
+ *                          ECAN_MSG_XTD for Extended type
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Overview:        This function sets mask value for given mask number.
+ *                  Type of mask, whether standard or extended is defined
+ *                  by type parameter.
+ *
+ * Note:            The MASK_RXF15 is only available in enhanced and
+ *                  FIFO modes
+ ********************************************************************/
+#define ECANSetRXM0Value(val, type)       \
+                    _CANIDToRegs((BYTE*)&RXM0SIDH, val, type)
+#define ECANSetRXM1Value(val, type)       \
+                    _CANIDToRegs((BYTE*)&RXM1SIDH, val, type)
+
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetRXFnValue(val, type)
+ *
+ * Overview:        Use these macros to set receive filter values.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *                  To set RXF6-RXF15 values,
+ *                  ECAN_LIB_MODE_VAL = ECAN_LIB_MODE_RUN_TIME OR
+ *                  ECAN_FUNC_MODE != ECAN_MODE_0
+ *
+ * Input:           val         - Value to be set
+ *                  type        - Type of filter
+ *                                Allowable values are
+ *                                  ECAN_MSG_STD if this is Standard filter
+ *                                  ECAN_MSG_XTD if this is Extended filter
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ * Overview:        Use this macro to assign value to a receive filter.
+ *
+ * Note:            There are total of sixteen macros - one for each
+ *                  receive filter. e.g. for RXF0 use ECANSetRXF0Value()
+ *                  for RXF2 use ECANSetRXF2Value()
+ ********************************************************************/
+#define ECANSetRXF0Value(val, type)       \
+    RXFCON0_RXF0EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF0SIDH, val, type)
+
+#define ECANSetRXF1Value(val, type)       \
+    RXFCON0_RXF1EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF1SIDH, val, type);
+
+#define ECANSetRXF2Value(val, type)       \
+    RXFCON0_RXF2EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF2SIDH, val, type);
+
+#define ECANSetRXF3Value(val, type)       \
+    RXFCON0_RXF3EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF3SIDH, val, type);
+
+#define ECANSetRXF4Value(val, type)       \
+    RXFCON0_RXF4EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF4SIDH, val, type);
+
+#define ECANSetRXF5Value(val, type)       \
+    RXFCON0_RXF5EN = 1;         \
+    _CANIDToRegs((BYTE*)&RXF5SIDH, val, type);
+
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetRXF6Value(val, type)       \
+        RXFCON0_RXF6EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF6SIDH, val, type);
+
+    #define ECANSetRXF7Value(val, type)       \
+        RXFCON0_RXF7EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF7SIDH, val, type);
+
+    #define ECANSetRXF8Value(val, type)       \
+        RXFCON1_RXF8EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF8SIDH, val, type);
+
+    #define ECANSetRXF9Value(val, type)       \
+        RXFCON1_RXF9EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF9SIDH, val, type);
+
+    #define ECANSetRXF10Value(val, type)       \
+        RXFCON1_RXF10EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF10SIDH, val, type);
+
+    #define ECANSetRXF11Value(val, type)       \
+        RXFCON1_RXF11EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF11SIDH, val, type);
+
+    #define ECANSetRXF12Value(val, type)       \
+        RXFCON1_RXF12EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF12SIDH, val, type);
+
+    #define ECANSetRXF13Value(val, type)       \
+        RXFCON1_RXF13EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF13SIDH, val, type);
+
+    #define ECANSetRXF14Value(val, type)       \
+        RXFCON1_RXF14EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF14SIDH, val, type);
+
+    #define ECANSetRXF15Value(val, type)       \
+        RXFCON1_RXF15EN = 1;         \
+        _CANIDToRegs((BYTE*)&RXF15SIDH, val, type);
+#endif
+
+    #define ECAN_MSG_STD    0
+    #define ECAN_MSG_XTD    1
+
+
+/*********************************************************************
+ * Macro:           ECANSetBnTxRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure a programmable buffer (B0-B5)
+ *                  as either transmit or receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN_LIB_MODE = ECAN_LIB_MODE_RUN_TIME OR
+ *                  ECAN_FUNC_MODE_VAL != ECAN_MODE_0
+ *
+ * Input:           buffer      - Buffer that needs to be setup
+ *                                Allowable values are:
+ *                                      B0, B1, B2, B3, B4, B5
+ *                  mode        - Mode to be set.
+ *                                Allowable values are:
+ *                                      ECAN_BUFFER_TX, ECAN_BUFFER_RX
+ *
+ * Output:          None
+ *
+ * Side Effects:
+ *
+ * Example:        // Set B0 as Transmit buffer
+ *                  ECANSetBnTxRxMode(B0, ECAN_TX)
+ *
+ *                  // Set B2 as receive buffer
+ *                  ECANSetBnTxRxMode(B2, ECAN_RX)
+ *
+ * Note:            Parameter buffer must be a constant symbol of either
+ *                  B0, B1, B2, B3, B4 or B5.
+ *                  A variable parameter would result in compiler error.
+ *
+ *                  e.g. ECANSetBnTxRxMode(myBuffer, ECAN_BUFFER_TX)
+ *                       would not compile.
+ *
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANSetBnTxRxMode(buffer, mode)          \
+                            BSEL0_##buffer##TXEN = mode
+#endif
+
+    #define RXB0            0
+    #define RXB1            1
+    #define B0              2
+    #define B1              3
+    #define B2              4
+    #define B3              5
+    #define B4              6
+    #define B5              7
+    #define TXB0            8
+    #define TXB1            9
+    #define TXB2            10
+
+    #define ECAN_BUFFER_RX  0
+    #define ECAN_BUFFER_TX  1
+
+/*********************************************************************
+ * Macro:           ECANSetRXB0DblBuffer(mode)
+ *
+ * Overview:        Use this macro to configure RXB0 in double buffering mode
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           mode        - Double buffer mode
+ *                                Allowable values are
+ *                                  ECAN_DBL_BUFFER_ENABLE
+ *                                  ECAN_DBL_BUFFER_DISABLE,
+ *
+ * Output:          None
+ *
+ * Example:         // Enable Double buffering mode
+ *                  ECANSetRXB0DblBuffer(ECAN_DBL_BUFFER_ENABLE)
+ *
+ *
+ * Side Effects:
+ *
+ * Note:            None
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL == ECAN_MODE_0) )
+
+    #define ECANSetRXB0DblBuffer(mode)       RXB0CON_RXB0DBEN = mode
+#endif
+
+    #define ECAN_DBL_BUFFER_MODE_DISABLE    0
+    #define ECAN_DBL_BUFFER_MODE_ENABLE     1
+
+
+/*********************************************************************
+ * Macro:           ECANSetRxBnRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure receive mode of a fixed receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer that needs to be configured
+ *                                Allowable values are
+ *                                  RXB0, RXB1
+ *                  mode        - Mode to be setup.
+ *                                Allowable values are
+ *                                  ECAN_RECEIVE_ALL,
+ *                                  ECAN_RECEIVE_STANDARD,
+ *                                  ECAN_RECEIVE_EXTENDED,
+ *                                  ECAN_RECEIVE_ALL_VALID
+ *
+ * Output:          None
+ *
+ * Example:         // Configure RXB0 buffer to receive all valid messages.
+ *                  ECANSetRxBnRxMode(RXB0, ECAN_RECEIVE_ALL_VALID)
+ *
+ *                  // Configure RXB1 buffer to receive only Standard messages.
+ *                  ECANSetRxBnRxMode(RXB1, ECAN_RECEIVE_STANDARD)
+ *
+ * Side Effects:
+ *
+ * Note:            Parameter buffer must be a constant symbol of either
+ *                  RXB0 or RXB1.
+ *                  A variable paraemter would result in compiler error.
+ *
+ *                  e.g. ECANSetRxBnTxRxMode(myBuffer, ECAN_RECEIVE_ALL_VALID)
+ *                       would not compiler
+ *
+ ********************************************************************/
+#define ECANSetRxBnRxMode(buffer, mode)      \
+        ##buffer##CON_RXM1 = mode >> 1; \
+        ##buffer##CON_RXM0 = mode;
+
+    #define ECAN_RECEIVE_ALL_VALID  0
+    #define ECAN_RECEIVE_STANDARD   1
+    #define ECAN_RECEIVE_EXTENDED   2
+    #define ECAN_RECEIVE_ALL        3
+
+
+
+/*********************************************************************
+ * Macro:           ECANSetBnRxMode(buffer, mode)
+ *
+ * Overview:        Use this macro to configure receive mode of a programmable
+ *                  receive buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    None
+ *
+ * Input:           buffer      - Buffer that needs to be configured
+ *                                Allowable values are
+ *                                  B0, B1, B2, B3, B4, B5
+ *                  mode        - Mode to be setup.
+ *                                Allowable values are
+ *                                  ECAN_RECEIVE_ALL,
+ *                                  ECAN_RECEIVE_ALL_VALID
+ *
+ * Output:          None
+ *
+ * Example:         // Configure B0 buffer to receive all valid messages.
+ *                  ECANSetBnRxMode(B0, ECAN_RECEIVE_ALL_VALID)
+ *
+ *                  // Configure B1 buffer to receive only Standard messages.
+ *                  ECANSetBnRxMode(RXB1, ECAN_RECEIVE_STANDARD)
+ *
+ * Side Effects:
+ *
+ * Note 1:          Parameter buffer must be a constant symbol of either
+ *                  B0, B1, B2, B3, B4 or B5.
+ *                  A variable paraemter would result in compiler error.
+ *
+ *                  e.g. ECANSetBnTxRxMode(myBuffer, ECAN_RECEIVE_ALL_VALID)
+ *                       would not compiler
+ *
+ *      2:          This macro should be used in Mode 1 or 2 only.
+ *
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+    #define ECANSetBnRxMode(buffer, mode)      ##buffer##CON_RXM1 = mode
+
+#endif
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetTxErrorCount()
+ *
+ * Overview:        Use this macro to get current TXERRCNT value
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          Current transmit error count as defined by
+ *                  CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetTxErrorCount()            (TXERRCNT)
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANGetRxErrorCount()
+ *
+ * Overview:        Use this macro to get current RXERRCNT value.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          Current receive error count as defined by
+ *                  CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANGetRxErrorCount()            (RXERRCNT)
+
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsBusOff()
+ *
+ * Overview:        Use this macro to check if CAN module is in
+ *                  Bus off condition.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN Module is off due to excessive error
+ *                  FALSE is it is not off.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsBusOff()                   (COMSTAT_TXB0)
+
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsTxPassive()
+ *
+ * Overview:        Use this macro to check if CAN module is in
+ *                  Tx passive mode.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN transmit module is error passive as
+ *                  defined by CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsTxPassive()                (COMSTAT_TXBP)
+
+
+/*********************************************************************
+ * Macro:           BYTE ECANIsRxPassive()
+ *
+ * Overview:        Use this macro to check if CAN is in Rx passive.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE if CAN receive module is error active as
+ *                  defined by CAN specifications.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsRxPassive()                (COMSTAT_RXBP)
+
+
+/*********************************************************************
+ * Macro:           void ECANAbortAll()
+ *
+ * Overview:        Use this macro to request abort for all tx buffers.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANAbortAll()                   (CANCON_ABAT = 1)
+
+/*********************************************************************
+ * Macro:           BOOL ECANIsAllAborted()
+ *
+ * Overview:        Use this macro to see if previous ECANAbortAll
+ *                  is complete or not.
+ *
+ * PreCondition:    None
+ *
+ * Input:           None
+ *
+ * Output:          TRUE: if there are no pending messages.
+ *                  FALSE: if there abort is still in progress.
+ *
+ * Side Effects:    None
+ *
+ ********************************************************************/
+#define ECANIsAllAborted()               (CANCON_ABAT)
+
+
+/*********************************************************************
+ * Macro:           ECANLinkRXFnFmToBuffer(RXFnBuffer, RXFmBuffer)
+ *                      n = { 0, 2, 4, 6, 8, 10, 12, 14 }
+ *                      m = ( 1, 3, 5, 7, 9, 11, 13, 15 }
+ *                      m = n + 1
+ *
+ * Overview:        Use this macro to link RXFn and RXFm to
+ *                  any of RXB0, RXB1, B0, B1, B2, B3, B4, B5 buffer.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *                  Given buffer must be configured as receive buffer.
+ *                      (See ECANSetRxBnTxRxMode and ECANSetBnTxRxMode)
+ *
+ *
+ * Input:           RXFnBuffer  - Buffer that is to be linked
+ *                                with RXFn filter
+ *                  RXFmBuffer  - Buffer that is to be linked
+ *                                with RXFm filter
+ *
+ *                                Allowable values for both parameters
+ *                                  RXB0, RXB1, B0, B1, B2, B3, B4, B5
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Note:            If possible, call this macro with constant
+ *                  parameters to reduce generated code.
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANLinkRXF0F1ToBuffer(RXF0Buffer, RXF1Buffer)     \
+                RXFBCON0 = (RXF1Buffer << 4) | RXF0Buffer
+    #define ECANLinkRXF2F3ToBuffer(RXF2Buffer, RXF3Buffer)     \
+                RXFBCON1 = (RXF2Buffer << 4) | RXF3Buffer
+    #define ECANLinkRXF4F5ToBuffer(RXF4Buffer, RXF5Buffer)     \
+                RXFBCON2 = (RXF4Buffer << 4) | RXF5Buffer
+    #define ECANLinkRXF6F7ToBuffer(RXF6Buffer, RXF7Buffer)     \
+                RXFBCON3 = (RXF6Buffer << 4) | RXF7Buffer
+    #define ECANLinkRXF8F9ToBuffer(RXF8Buffer, RXF9Buffer)     \
+                RXFBCON4 = (RXF8Buffer << 4) | RXF9Buffer
+    #define ECANLinkRXF10F11ToBuffer(RXF10Buffer, RXF11Buffer) \
+                RXFBCON5 = (RXF10Buffer << 4) | RXF11Buffer
+    #define ECANLinkRXF12F13ToBuffer(RXF12Buffer, RXF13Buffer) \
+                RXFBCON6 = (RXF12Buffer << 4) | RXF13Buffer
+    #define ECANLinkRXF14F15ToBuffer(RXF14Buffer, RXF15Buffer) \
+                RXFBCON7 = (RXF14Buffer << 4) | RXF15Buffer
+#endif
+
+
+/*********************************************************************
+ * Macro:           ECANLinkRXF0Thru3ToMask(m0, m1, m2, m3)
+ *                  ECANLinkRXF4Thru7ToMask(m4, m5, m6, m7)
+ *                  ECANLinkRXF8Thru11ToMask(m8, m9, m10, m11, m12)
+ *                  ECANLinkRXF12Thru15ToMask(m13, m14, m15, m16)
+ *
+ * Overview:        Use this macro to link receive filters to masks.
+ *                  You may not need to call this macro if your
+ *                  application does not require run-time change.
+ *
+ *
+ * PreCondition:    ECAN must be in Configuration mode
+ *
+ * Input:           mn  - Buffer that is to be linked
+ *                                with Mask
+ *
+ *                                Allowable values for both parameters
+ *                                  ECAN_RXM0, ECAN_RXM1, ECAN_RXMF15
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ *
+ * Note:            If possible, call this macro with constant
+ *                  parameters to reduce generated code.
+ ********************************************************************/
+#if ( (ECAN_LIB_MODE_VAL == ECAN_LIB_MODE_RUN_TIME) || \
+      (ECAN_FUNC_MODE_VAL != ECAN_MODE_0) )
+
+    #define ECANLinkRXF0Thru3ToMask(m0, m1, m2, m3) \
+        MSEL0 = m3 << 6 | m2 << 4 | m1 << 2 | m0;
+    #define ECANLinkRXF4Thru7ToMask(m4, m5, m6, m7) \
+        MSEL1 = m7 << 6 | m6 << 4 | m5 << 2 | m4;
+    #define ECANLinkRXF8Thru11ToMask(m8, m9, m10, m11) \
+        MSEL2 = m11 << 6 | m10 << 4 | m9 << 2 | m8;
+    #define ECANLinkRXF12Thru15ToMask(m12, m13, m14, m15) \
+        MSEL2 = m15 << 6 | m14 << 4 | m13 << 2 | m12;
+#endif
+
+    #define ECAN_RXM0       0
+    #define ECAN_RXM1       1
+    #define ECAN_RXMF15     2
+
+
+/*********************************************************************
+ * Macro:           ECANSetBaudRate(sjw,
+ *                                 brp,
+ *                                 phseg1,
+ *                                 phseg2,
+ *                                 propseg)
+ *
+ * Overview:        Use this macro to change ECAN baud rate. Normally
+ *                  you would call this macro only, if your application
+ *                  needs run-time baud rate changes.
+ *
+ * PreCondition:    ECAN is in Configuration mode
+ *
+ * Input:           sjw     - SJW value of 1-4
+ *                  brp     - BRP value of 1-64
+ *                  phseg1  - PHSEG1 value of 1-8
+ *                  phseg2  - PHSEG2 value of 1-8
+ *
+ * Output:          None
+ *
+ * Side Effects:    None
+ *
+ * Note:            If possible, call this macro with constant values
+ *                  to reduce generated code size.
+ ********************************************************************/
+#define ECANSetBaudRate(sjw, brp, phseg1, phseg2, propseg)           \
+        BRGCON1 = ((sjw-1) << 6) | (brp-1);                         \
+        BRGCON2 |= (((phseg1-1) << 3) | (propseg-1));               \
+        BRGCON3 = phseg2;
+
+/*
+ * This is a helper function used by some macros. Normally, you would
+ * not need to call this function directly.
+ */
+void _CANIDToRegs(BYTE* ptr,
+                  unsigned long val,
+                  BYTE type );
+
+
+/*
+ * Following compile-time logic switches symbols as per compiler
+ * being used.  Currently, it supports Microchip C18 and HiTech
+ * PICC18 compilers only.
+ */
+#if defined(MCHP_C18)
+    #define COMSTAT_TXB0            COMSTATbits.TXB0
+    #define COMSTAT_TXBP            COMSTATbits.TXBP
+    #define COMSTAT_RXBP            COMSTATbits.RXBP
+    #define COMSTAT_RXBnOVFL        COMSTATbits.RXB1OVFL
+    #define COMSTAT_RXB0OVFL        COMSTATbits.RXB0OVFL
+    #define COMSTAT_FIFOEMPTY       COMSTATbits.FIFOEMPTY
+    #define COMSTAT_RXB1OVFL        COMSTATbits.RXB1OVFL
+
+    #define BRGCON2_SEG2PHTS        BRGCON2bits.SEG2PHTS
+    #define BRGCON2_SAM             BRGCON2bits.SAM
+    #define BRGCON3_WAKDIS          BRGCON3bits.WAKDIS
+    #define BRGCON3_WAKFIL          BRGCON3bits.WAKFIL
+
+    #define CIOCON_ENDRHI           CIOCONbits.ENDRHI
+    #define CIOCON_CANCAP           CIOCONbits.CANCAP
+
+    #define PIR3_RXBnIF             PIR3bits.RXB1IF
+    #define PIR3_RXB0IF             PIR3bits.RXB0IF
+    #define PIR3_RXB1IF             PIR3bits.RXB1IF
+
+    #define PIR3_IRXIF              PIR3bits.IRXIF
+
+    #define CANCON_ABAT             CANCONbits.ABAT
+    #define RXB0CON_RXFUL           RXB0CONbits.RXFUL
+    #define RXB1CON_RXFUL           RXB1CONbits.RXFUL
+    #define RXB0CON_RXB0DBEN        RXB0CONbits.RXBODBEN
+    #define TXB0CON_TXREQ           TXB0CONbits.TXREQ
+    #define TXB1CON_TXREQ           TXB1CONbits.TXREQ
+    #define TXB2CON_TXREQ           TXB2CONbits.TXREQ
+    #define RXB0CON_FILHIT0         RXB0CONbits.FILHIT0
+    #define RXB0CON_RXM1            RXB0CONbits.RXM1
+    #define RXB0CON_RXM0            RXB0CONbits.RXM0
+
+
+    #define BSEL0_B0TXEN            BSEL0bits.B0TXEN
+    #define BSEL0_B1TXEN            BSEL0bits.B1TXEN
+    #define BSEL0_B2TXEN            BSEL0bits.B2TXEN
+    #define BSEL0_B3TXEN            BSEL0bits.B3TXEN
+    #define BSEL0_B4TXEN            BSEL0bits.B4TXEN
+    #define BSEL0_B5TXEN            BSEL0bits.B5TXEN
+
+    #define RXFCON0_RXF0EN          RXFCON0bits.RXF0EN
+    #define RXFCON0_RXF1EN          RXFCON0bits.RXF1EN
+    #define RXFCON0_RXF2EN          RXFCON0bits.RXF2EN
+    #define RXFCON0_RXF3EN          RXFCON0bits.RXF3EN
+    #define RXFCON0_RXF4EN          RXFCON0bits.RXF4EN
+    #define RXFCON0_RXF5EN          RXFCON0bits.RXF5EN
+    #define RXFCON0_RXF6EN          RXFCON0bits.RXF6EN
+    #define RXFCON0_RXF7EN          RXFCON0bits.RXF7EN
+
+    #define RXFCON1_RXF8EN          RXFCON1bits.RXF8EN
+    #define RXFCON1_RXF9EN          RXFCON1bits.RXF9EN
+    #define RXFCON1_RXF10EN         RXFCON1bits.RXF10EN
+    #define RXFCON1_RXF11EN         RXFCON1bits.RXF11EN
+    #define RXFCON1_RXF12EN         RXFCON1bits.RXF12EN
+    #define RXFCON1_RXF13EN         RXFCON1bits.RXF13EN
+    #define RXFCON1_RXF14EN         RXFCON1bits.RXF14EN
+    #define RXFCON1_RXF15EN         RXFCON1bits.RXF15EN
+
+
+    #define RXFBCON0_F0BP_0         RXFBCON0bits.F0BP_0
+    #define RXFBCON0_F0BP_1         RXFBCON0bits.F0BP_1
+    #define RXFBCON0_F0BP_2         RXFBCON0bits.F0BP_2
+    #define RXFBCON0_F0BP_3         RXFBCON0bits.F0BP_3
+    #define RXFBCON0_F1BP_0         RXFBCON0bits.F1BP_0
+    #define RXFBCON0_F1BP_1         RXFBCON0bits.F1BP_1
+    #define RXFBCON0_F1BP_2         RXFBCON0bits.F1BP_2
+    #define RXFBCON0_F1BP_3         RXFBCON0bits.F1BP_3
+
+    #define RXFBCON1_F2BP_0         RXFBCON1bits.F2BP_0
+    #define RXFBCON1_F2BP_1         RXFBCON1bits.F2BP_1
+    #define RXFBCON1_F2BP_2         RXFBCON1bits.F2BP_2
+    #define RXFBCON1_F2BP_3         RXFBCON1bits.F2BP_3
+    #define RXFBCON1_F3BP_0         RXFBCON1bits.F3BP_0
+    #define RXFBCON1_F3BP_1         RXFBCON1bits.F3BP_1
+    #define RXFBCON1_F3BP_2         RXFBCON1bits.F3BP_2
+    #define RXFBCON1_F3BP_3         RXFBCON1bits.F3BP_3
+
+    #define RXFBCON2_F4BP_0         RXFBCON2bits.F4BP_0
+    #define RXFBCON2_F4BP_1         RXFBCON2bits.F4BP_1
+    #define RXFBCON2_F4BP_2         RXFBCON2bits.F4BP_2
+    #define RXFBCON2_F4BP_3         RXFBCON2bits.F4BP_3
+    #define RXFBCON2_F5BP_0         RXFBCON2bits.F5BP_0
+    #define RXFBCON2_F5BP_1         RXFBCON2bits.F5BP_1
+    #define RXFBCON2_F5BP_2         RXFBCON2bits.F5BP_2
+    #define RXFBCON2_F5BP_3         RXFBCON2bits.F5BP_3
+
+    #define RXFBCON3_F6BP_0         RXFBCON3BITS.F6BP_0
+    #define RXFBCON3_F6BP_1         RXFBCON3BITS.F6BP_1
+    #define RXFBCON3_F6BP_2         RXFBCON3BITS.F6BP_2
+    #define RXFBCON3_F6BP_3         RXFBCON3BITS.F6BP_3
+    #define RXFBCON3_F7BP_0         RXFBCON3BITS.F7BP_0
+    #define RXFBCON3_F7BP_1         RXFBCON3BITS.F7BP_1
+    #define RXFBCON3_F7BP_2         RXFBCON3BITS.F7BP_2
+    #define RXFBCON3_F7BP_3         RXFBCON3BITS.F7BP_3
+
+    #define RXFBCON4_F8BP_0         RXFBCON4bits.F8BP_0
+    #define RXFBCON4_F8BP_1         RXFBCON4bits.F8BP_1
+    #define RXFBCON4_F8BP_2         RXFBCON4bits.F8BP_2
+    #define RXFBCON4_F8BP_3         RXFBCON4bits.F8BP_3
+    #define RXFBCON4_F9BP_0         RXFBCON4bits.F9BP_0
+    #define RXFBCON4_F9BP_1         RXFBCON4bits.F9BP_1
+    #define RXFBCON4_F9BP_2         RXFBCON4bits.F9BP_2
+    #define RXFBCON4_F9BP_3         RXFBCON4bits.F9BP_3
+
+    #define RXFBCON5_F10BP_0        RXFBCON5bits.F10BP_0
+    #define RXFBCON5_F10BP_1        RXFBCON5bits.F10BP_1
+    #define RXFBCON5_F10BP_2        RXFBCON5bits.F10BP_2
+    #define RXFBCON5_F10BP_3        RXFBCON5bits.F10BP_3
+    #define RXFBCON5_F11BP_0        RXFBCON5bits.F11BP_0
+    #define RXFBCON5_F11BP_1        RXFBCON5bits.F11BP_1
+    #define RXFBCON5_F11BP_2        RXFBCON5bits.F11BP_2
+    #define RXFBCON5_F11BP_3        RXFBCON5bits.F11BP_3
+
+    #define RXFBCON6_F12BP_0        RXFBCON6bits.F12BP_0
+    #define RXFBCON6_F12BP_1        RXFBCON6bits.F12BP_1
+    #define RXFBCON6_F12BP_2        RXFBCON6bits.F12BP_2
+    #define RXFBCON6_F12BP_3        RXFBCON6bits.F12BP_3
+    #define RXFBCON6_F13BP_0        RXFBCON6bits.F13BP_0
+    #define RXFBCON6_F13BP_1        RXFBCON6bits.F13BP_1
+    #define RXFBCON6_F13BP_2        RXFBCON6bits.F13BP_2
+    #define RXFBCON6_F13BP_3        RXFBCON6bits.F13BP_3
+
+    #define RXFBCON7_F14BP_0        RXFBCON7bits.F14BP_0
+    #define RXFBCON7_F14BP_1        RXFBCON7bits.F14BP_1
+    #define RXFBCON7_F14BP_2        RXFBCON7bits.F14BP_2
+    #define RXFBCON7_F14BP_3        RXFBCON7bits.F14BP_3
+    #define RXFBCON7_F15BP_0        RXFBCON7bits.F15BP_0
+    #define RXFBCON7_F15BP_1        RXFBCON7bits.F15BP_1
+    #define RXFBCON7_F15BP_2        RXFBCON7bits.F15BP_2
+    #define RXFBCON7_F15BP_3        RXFBCON7bits.F15BP_3
+
+    #define B0CON_TXREQ             B0CONbits.TXREQ
+    #define B1CON_TXREQ             B1CONbits.TXREQ
+    #define B2CON_TXREQ             B2CONbits.TXREQ
+    #define B3CON_TXREQ             B3CONbits.TXREQ
+    #define B4CON_TXREQ             B4CONbits.TXREQ
+    #define B5CON_TXREQ             B5CONbits.TXREQ
+
+    #define B0CON_RXM1              B0CONbits.RXM1
+    #define B1CON_RXM1              B1CONbits.RXM1
+    #define B2CON_RXM1              B2CONbits.RXM1
+    #define B3CON_RXM1              B3CONbits.RXM1
+    #define B4CON_RXM1              B4CONbits.RXM1
+    #define B5CON_RXM1              B5CONbits.RXM1
+
+    #define B0CON_RXFUL             B0CONbits.RXFUL
+    #define B1CON_RXFUL             B1CONbits.RXFUL
+    #define B2CON_RXFUL             B2CONbits.RXFUL
+    #define B3CON_RXFUL             B3CONbits.RXFUL
+    #define B4CON_RXFUL             B4CONbits.RXFUL
+    #define B5CON_RXFUL             B5CONbits.RXFUL
+
+    #define RXM0SIDL_EXIDEN         RXM0SIDLbits.EXIDEN
+    #define RXM1SIDL_EXIDEN         RXM1SIDLbits.EXIDEN
+
+    #define ECANCON_MDSEL1          ECANCONbits.MDSEL1
+    #define ECANCON_MDSEL0          ECANCONbits.MDSEL0
+
+#endif
+
+#if defined(HITECH_C18)
+    #define COMSTAT_TXB0            TXB0
+    #define COMSTAT_TXBP            TXBP
+    #define COMSTAT_RXBP            RXBP
+    #define CANCON_ABAT             ABAT
+    #define RXB0CON_RXFUL           RXB0FUL
+    #define TXB0CON_TXREQ           TXB0REQ
+    #define RXB0CON_RXM1            RXB0M1
+    #define RXB0CON_RXM0            RXB0M0
+
+    #define BSEL0_B0TXEN            B0TXEN      // configure buffer in Transmit=1 or receive mode=0
+    #define BSEL0_B1TXEN            B1TXEN
+    #define BSEL0_B2TXEN            B2TXEN
+    #define BSEL0_B3TXEN            B3TXEN
+    #define BSEL0_B4TXEN            B4TXEN
+    #define BSEL0_B5TXEN            B5TXEN
+
+
+
+    #define RXFCON0_RXF0EN          RXF0EN
+    #define RXFCON0_RXF1EN          RXF1EN
+    #define RXFCON0_RXF2EN          RXF2EN
+    #define RXFCON0_RXF3EN          RXF3EN
+    #define RXFCON0_RXF4EN          RXF4EN
+    #define RXFCON0_RXF5EN          RXF5EN
+    #define RXFCON0_RXF6EN          RXF6EN
+    #define RXFCON0_RXF7EN          RXF7EN
+
+    #define RXFCON1_RXF8EN          XF8EN
+    #define RXFCON1_RXF9EN          XF9EN
+    #define RXFCON1_RXF10EN         RXF10EN
+    #define RXFCON1_RXF11EN         RXF11EN
+    #define RXFCON1_RXF12EN         RXF12EN
+    #define RXFCON1_RXF13EN         RXF13EN
+    #define RXFCON1_RXF14EN         RXF14EN
+    #define RXFCON1_RXF15EN         RXF15EN
+
+
+    #define RXFBCON0_F0BP_0         F0BP_01
+    #define RXFBCON0_F0BP_1         F0BP_1
+    #define RXFBCON0_F0BP_2         F0BP_2
+    #define RXFBCON0_F0BP_3         F0BP_3
+    #define RXFBCON0_F1BP_0         F1BP_0
+    #define RXFBCON0_F1BP_1         F1BP_1
+    #define RXFBCON0_F1BP_2         F1BP_2
+    #define RXFBCON0_F1BP_3         F1BP_3
+
+    #define RXFBCON1_F2BP_0         F2BP_01
+    #define RXFBCON1_F2BP_1         F2BP_1
+    #define RXFBCON1_F2BP_2         F2BP_2
+    #define RXFBCON1_F2BP_3         F2BP_3
+    #define RXFBCON1_F3BP_0         F3BP_0
+    #define RXFBCON1_F3BP_1         F3BP_1
+    #define RXFBCON1_F3BP_2         F3BP_2
+    #define RXFBCON1_F3BP_3         F3BP_3
+
+    #define RXFBCON2_F4BP_0         F4BP_01
+    #define RXFBCON2_F4BP_1         F4BP_1
+    #define RXFBCON2_F4BP_2         F4BP_2
+    #define RXFBCON2_F4BP_3         F4BP_3
+    #define RXFBCON2_F5BP_0         F5BP_0
+    #define RXFBCON2_F5BP_1         F5BP_1
+    #define RXFBCON2_F5BP_2         F5BP_2
+    #define RXFBCON2_F5BP_3         F5BP_3
+
+    #define RXFBCON3_F6BP_0         F6BP_01
+    #define RXFBCON3_F6BP_1         F6BP_1
+    #define RXFBCON3_F6BP_2         F6BP_2
+    #define RXFBCON3_F6BP_3         F6BP_3
+    #define RXFBCON3_F7BP_0         F7BP_0
+    #define RXFBCON3_F7BP_1         F7BP_1
+    #define RXFBCON3_F7BP_2         F7BP_2
+    #define RXFBCON3_F7BP_3         F7BP_3
+
+    #define RXFBCON4_F8BP_0         F8BP_01
+    #define RXFBCON4_F8BP_1         F8BP_1
+    #define RXFBCON4_F8BP_2         F8BP_2
+    #define RXFBCON4_F8BP_3         F8BP_3
+    #define RXFBCON4_F9BP_0         F9BP_0
+    #define RXFBCON4_F9BP_1         F9BP_1
+    #define RXFBCON4_F9BP_2         F9BP_2
+    #define RXFBCON4_F9BP_3         F9BP_3
+
+    #define RXFBCON5_F10BP_0        F10BP_01
+    #define RXFBCON5_F10BP_1        F10BP_1
+    #define RXFBCON5_F10BP_2        F10BP_2
+    #define RXFBCON5_F10BP_3        F10BP_3
+    #define RXFBCON5_F11BP_0        F11BP_0
+    #define RXFBCON5_F11BP_1        F11BP_1
+    #define RXFBCON5_F11BP_2        F11BP_2
+    #define RXFBCON5_F11BP_3        F11BP_3
+
+    #define RXFBCON6_F12BP_0        F12BP_01
+    #define RXFBCON6_F12BP_1        F12BP_1
+    #define RXFBCON6_F12BP_2        F12BP_2
+    #define RXFBCON6_F12BP_3        F12BP_3
+    #define RXFBCON6_F13BP_0        F13BP_0
+    #define RXFBCON6_F13BP_1        F13BP_1
+    #define RXFBCON6_F13BP_2        F13BP_2
+    #define RXFBCON6_F13BP_3        F13BP_3
+
+    #define RXFBCON7_F14BP_0        F14BP_01
+    #define RXFBCON7_F14BP_1        F14BP_1
+    #define RXFBCON7_F14BP_2        F14BP_2
+    #define RXFBCON7_F14BP_3        F14BP_3
+    #define RXFBCON7_F15BP_0        F15BP_0
+    #define RXFBCON7_F15BP_1        F15BP_1
+    #define RXFBCON7_F15BP_2        F15BP_2
+    #define RXFBCON7_F15BP_3        F15BP_3
+
+    #define B0CON_TXREQ             B0TXREQ
+    #define B1CON_TXREQ             B1TXREQ
+    #define B2CON_TXREQ             B2TXREQ
+    #define B3CON_TXREQ             B3TXREQ
+    #define B4CON_TXREQ             B4TXREQ
+    #define B5CON_TXREQ             B5TXREQ
+
+    #define B0CON_RXFUL             B0RXFUL
+    #define B1CON_RXFUL             B1RXFUL
+    #define B2CON_RXFUL             B2RXFUL
+    #define B3CON_RXFUL             B3RXFUL
+    #define B4CON_RXFUL             B4RXFUL
+    #define B5CON_RXFUL             B5RXFUL
+
+    #define B0CON_RXM1              B0RXM1
+    #define B1CON_RXM1              B1RXM1
+    #define B2CON_RXM1              B2RXM1
+    #define B3CON_RXM1              B3RXM1
+    #define B4CON_RXM1              B4RXM1
+    #define B5CON_RXM1              B5RXM1
+
+    /*
+     * Following are special defs to overcome compiler problem
+     * at the time of this re-write.
+     * Set following line to "#if 0" after verifiying correct
+     * compiler behavior.
+     */
+    #if 1
+        static struct
+        {
+            unsigned : 7;
+            unsigned RXFUL : 1;
+        } RXB1CONbits @ 0xf50;
+        #define RXB1CON_RXFUL       RXB1CONbits.RXFUL
+
+        static struct
+        {
+            unsigned TXPRI0:1;
+            unsigned TXPRI1:1;
+            unsigned :1;
+            unsigned TXREQ:1;
+            unsigned TXERR:1;
+            unsigned TXLARB:1;
+            unsigned TXABT:1;
+        } TXB1CONbits @ 0xf30;
+        #define TXB1CON_TXREQ       TXB1CONbits.TXREQ
+
+        static struct
+        {
+            unsigned TXPRI0:1;
+            unsigned TXPRI1:1;
+            unsigned :1;
+            unsigned TXREQ:1;
+            unsigned TXERR:1;
+            unsigned TXLARB:1;
+            unsigned TXABT:1;
+        } TXB2CONbits @ 0xf20;
+        #define TXB2CON_TXREQ       TXB2CONbits.TXREQ
+    #else
+        #define RXB1CON_RXFUL       RXB1RXFUL
+        #define TXB1CON_TXREQ       TXB1REQ
+        #define TXB2CON_TXREQ       TXB2REQ
+    #endif
+
+    #define RXM0SIDL_EXIDEN         RXM0EXIDM
+    #define RXM1SIDL_EXIDEN         RXM1EXIDEN
+
+    #define ECANCON_MDSEL1          MDSEL1
+    #define ECANCON_MDSEL0          MDSEL0
+
+    #define COMSTAT_FIFOEMPTY       FIFOEMPTY
+    #define COMSTAT_RXBnOVFL        RXB1OVFL
+    #define COMSTAT_RXB0OVFL        RXB0OVFL
+    #define COMSTAT_RXB1OVFL        RXB1OVFL
+
+    #define BRGCON2_SEG2PHTS        SEG2PHT
+    #define BRGCON2_SAM             SAM
+    #define BRGCON3_WAKDIS          WAKDIS
+    #define BRGCON3_WAKFIL          WAKFIL
+
+    #define CIOCON_ENDRHI           ENDRHI
+    #define CIOCON_CANCAP           CANCAP
+
+    #define PIR3_RXBnIF             RXB1IF
+    #define PIR3_IRXIF              IRXIF
+    #define PIR3_RXB0IF             RXB0IF
+    #define PIR3_RXB1IF             RXB1IF
+
+    #define RXB0CON_FILHIT0         RXB0FILHIT0
+
+
+
+    #define RXB0CON_RXB0DBEN        RXBODBEN
+    static volatile near bit        RXBODBEN   @ ((unsigned)&RXB0CON*8)+2;
+
+
+#endif
+
+
+
+
+
+#endif
+

+ 194 - 0
ProjectSource/BMS_Slave_RCT/SSL_CheckerBoardTest.c

@@ -0,0 +1,194 @@
+/*******************************************************************************
+  Class B Library implementation file
+
+  Summary:
+    This file contains the implementation for the
+    the Class B Safety Software Library RAM Checkerboard Tests
+    for PIC18 MCUs.
+        
+*******************************************************************************/
+/*******************************************************************************
+FileName:       SSL_CheckerBoardTest.c
+Processor:      PIC18
+Compiler:       Microchip MPLAB® C18 v3.41 or higher
+
+Copyright © 2008-2009 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+the accompanying software only when embedded on a Microchip microcontroller or
+digital signal controller that is integrated into your product or third party product.  
+ 
+If the accompanying software required your consent to the terms of Microchip's
+click-wrap license agreement, then you should also refer to such license agreement
+for additional information regarding your rights and obligations.
+Your acceptance and/or use of this software constitutes your agreement to the terms
+and conditions of this notice and applicable click-wrap license, if any.
+
+You agree that you are solely responsible for testing the code and determining its suitability.
+Microchip has no obligation to modify, test, certify, or support the code.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST dataC, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+#include "SSL_CheckerBoardTest.h"
+
+
+#pragma idata RAMFIX=0xE00
+int8_t*   pRAM1_RAM      = (int8_t *)RAM_StartAddress;
+int8_t*   pRAM2_RAM      = (int8_t *)RAM_StartAddress;
+int8_t    BYTE_Low_RAM   = 0x00;
+int8_t    BYTE_High_RAM  = 0x00;
+uint16_t  CB_Counter_RAM = RAM_Length;
+
+#pragma idata STACKFIX=0x100
+int8_t*   pRAM1_STACK      = (int8_t *)STACK_StartAddress;
+int8_t*   pRAM2_STACK      = (int8_t *)STACK_StartAddress;
+int8_t    BYTE_Low_STACK   = 0x00;
+int8_t    BYTE_High_STACK  = 0x00;
+uint16_t  CB_Counter_STACK = STACK_Length;
+
+
+
+/*
+/*******************************************************************************
+  Function:
+    int SSL_CheckerBoard( void )
+
+  Summary:
+    The RAM Checker Board test implements one of the functional tests
+    H.2.19.6 as defined by the IEC 60730 standard.
+    
+
+  Description:
+    This routine detects single bit Faults in the variable memory.
+    This ensures that the bits in the tested RAM are not stuck at
+    a value ‘0’ or ‘1’.
+
+    The test writes the checkerboard pattern (0x55 followed by 0xAA)
+    to adjacent memory locations starting at ramStartAddress.
+	It performs the following steps:                                           
+		1. The content of a 2 bytes memory chunk to be tested is saved in
+		   temporary CPU registers.                                                      
+		2. Writes the pattern 0x55 followed by 0xAA to adjacent memory locations
+		   filling up the 2 bytes memory chunk.
+		3. It reads the memory chunk adjacent locations and checks that the read-back values match
+           the written pattern.
+           If the values match set the success result and go to step 4.
+           Else set the error result and go to step 6.
+		4. Writes the inverted pattern 0xAA followed by 0x55 to adjacent memory locations
+		   filling up the 2 bytes memory chunk.
+		5. It reads the memory chunk adjacent locations and checks that the read-back values match
+           the written pattern.
+           If the values match set the success result.
+           Else set the error result.
+		6. The content of the tested 2 bytes memory chunk is restored from the
+           temporary CPU registers.
+        7. If the result shows error the test is done and returns.
+        8. The address pointer is incremented to point to the next sequential 4 bytes memory chunk
+           and the test is repeated from step 1 until all the number of requested memory locations
+           is tested.
+                                                                             
+  Precondition:
+    Global dataC
+    ramStartAddress     - start Address from which the checker Board test is to be performed
+                         
+    ramStopAddresse     - stop Address where the checker Board test is ending
+                   
+    
+  Returns:
+    Result identifying the pass/fail status of the test:
+      CB_TEST_PASS    - The test passed. RAM area tested has not been detected to have stuck bits.
+
+      CB_TEST_FAIL    - The test failed. Some RAM area location has been detected to have stuck bits. 
+
+  
+  Remarks:
+    This is a non-destructive memory test. The content of the tested memory area is saved and restored.
+    The test operates in 2 bytes long memory chunks at a time.
+    
+    The tested RAM area must not overlap the stack.
+    
+    The Start Address from which the Checker Board test is to be performed is
+    PIC18 variant and application dependent. It is a run-time parameter.
+    
+    Refer to the AN1229 for details regarding 
+  *****************************************************************************/
+int16_t  SSL_RAMtest_CheckerBoard( void )
+{
+    pRAM2_RAM++;
+
+    while(CB_Counter_RAM)
+    {
+        BYTE_Low_RAM  = *pRAM1_RAM;
+        BYTE_High_RAM = *pRAM2_RAM;
+
+        *pRAM1_RAM = 0xAA;
+        *pRAM2_RAM = 0x55;
+       
+        if(*pRAM1_RAM != 0xAA)
+            return CB_TEST_FAIL;
+        if(*pRAM2_RAM != 0x55)
+            return CB_TEST_FAIL;
+
+        *pRAM1_RAM = 0x55;
+        *pRAM2_RAM = 0xAA;
+ 
+        if(*pRAM1_RAM != 0x55)
+            return CB_TEST_FAIL;
+        if(*pRAM2_RAM != 0xAA)
+            return CB_TEST_FAIL;
+
+        *pRAM1_RAM = BYTE_Low_RAM;
+        *pRAM2_RAM = BYTE_High_RAM;
+
+        pRAM1_RAM++;
+        pRAM2_RAM++;
+        CB_Counter_RAM--;
+    }
+    return CB_TEST_PASS;
+}
+
+
+
+int16_t  SSL_STACKtest_CheckerBoard( void )
+{
+    pRAM2_STACK++;
+
+    while(CB_Counter_STACK)
+    {
+        BYTE_Low_STACK  = *pRAM1_STACK;
+        BYTE_High_STACK = *pRAM2_STACK;
+
+        *pRAM1_STACK = 0xAA;
+        *pRAM2_STACK = 0x55;
+
+        if(*pRAM1_STACK != 0xAA)
+            return CB_TEST_FAIL;
+        if(*pRAM2_STACK != 0x55)
+            return CB_TEST_FAIL;
+
+        *pRAM1_STACK = 0x55;
+        *pRAM2_STACK = 0xAA;
+
+        if(*pRAM1_STACK != 0x55)
+            return CB_TEST_FAIL;
+        if(*pRAM2_STACK != 0xAA)
+            return CB_TEST_FAIL;
+
+        *pRAM1_STACK = BYTE_Low_STACK;
+        *pRAM2_STACK = BYTE_High_STACK;
+
+        pRAM1_STACK++;
+        pRAM2_STACK++;
+        CB_Counter_STACK--;
+    }
+    return CB_TEST_PASS;
+}

+ 57 - 0
ProjectSource/BMS_Slave_RCT/SSL_CheckerBoardTest.h

@@ -0,0 +1,57 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_CheckerBoardTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULL..\h\EST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+
+#ifndef __SSL_CB_TEST_H__
+#define __SSL_CB_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define CB_TEST_PASS  1
+#define CB_TEST_FAIL  0
+
+#define RAM_StartAddress    0x0000
+#define RAM_StopAddress     0x0CFF   // Start of Stack -1
+#define RAM_Length          RAM_StopAddress-RAM_StartAddress
+#define STACK_StartAddress  0x0D00   // Stack
+#define STACK_StopAddress   0x0E3F   // End of regular GPR
+#define STACK_Length        STACK_StopAddress-STACK_StartAddress
+
+
+int16_t  SSL_RAMtest_CheckerBoard( void );
+int16_t  SSL_STACKtest_CheckerBoard( void );
+
+#endif

+ 38 - 0
ProjectSource/BMS_Slave_RCT/SSL_Class_B_Demo.c

@@ -0,0 +1,38 @@
+/*******************************************************************************
+  Class B Implementation Demo File
+********************************************************************************
+
+  File:      SSL_Class_B_Demo.c
+  Processor: PIC18
+  Compiler:  Microchip MPLAB® C18 v3.41 or higher
+  Author:    Reiling
+ 
+  Created on 13. Juli 2012, 11:50
+ ******************************************************************************/
+#include "SSL_Class_B_Tests.h"
+
+
+/*******************************************************************************
+  Pragmas
+ ******************************************************************************/
+#pragma config XINST   = OFF
+#pragma config FOSC    = HS1
+#pragma config WDTEN   = OFF     // OFF     // SWDTDIS
+#pragma config WDTPS   = 256     // WD TimeOut 1024ms
+#pragma config SOSCSEL = DIG     // Port C, Pin 0 & 1 => Digital
+#pragma config PLLCFG  = ON
+
+
+
+/*******************************************************************************
+ *                          Main SSL Demo
+ ******************************************************************************/
+void main( void )
+{
+    uint16_t Class_B_Result = 0;
+    
+    while(1)
+    {
+       Class_B_Result = SSL_Class_B_Tests( );
+    }
+}

+ 132 - 0
ProjectSource/BMS_Slave_RCT/SSL_Class_B_Tests.c

@@ -0,0 +1,132 @@
+/*******************************************************************************
+  Class B Implementation Test File
+
+  Summary:
+    This file contains the test program for the
+    the Class B Safety Software on PIC18 MCUs.
+
+********************************************************************************
+
+  File:      SSL_Demo2.c
+  Processor: PIC18
+  Compiler:  Microchip MPLAB® C18 v3.41 or higher
+  Author:    Reiling
+ 
+  Created on 11. Juli 2012, 10:58
+ ******************************************************************************/
+#include "SSL_Class_B_Tests.h"
+
+#pragma romdata CRCID=0x2000
+rom const uint16_t  crc_Result_CONST = 0x97B9;  /* FLASH CRC result constant */
+#pragma romdata
+
+
+
+/*******************************************************************************
+ *                          Main SSL Demo
+ ******************************************************************************/
+uint16_t  SSL_Class_B_Tests( void )
+{
+    uint16_t testFlags   = 0;
+    uint16_t crc_Result = 0;                        // CRC values FLASH
+
+/************************ CPU REGISTER TEST ***********************************/
+    if(SSL_CPU_RegisterTest() == CPU_REGISTER_TEST_PASS)
+    {
+        // the CPU registers don't have stuck bits
+        testFlags |= CPURegister_TestResult;
+    }
+    else
+    {
+        testFlags &= ~CPURegister_TestResult;
+    }
+
+/*********************** PROGRAM COUNTER TEST *********************************/
+    if (SSL_PCtest() == PROGRAM_COUNTER_TEST_PASS)
+    {
+        // the PC register does not have stuck bits
+        testFlags |= ProgramCounter_TestResult;
+    }
+    else
+    {
+        testFlags &= ~ProgramCounter_TestResult;
+    }
+
+/**************************** RAM TESTS ***************************************/
+
+/********************** Checker Board RAM test ********************************/
+// Note that this test is not destructive. It has to NOT overlap the stack space!
+    if (SSL_RAMtest_CheckerBoard( ) == CB_TEST_PASS)
+    { 
+        // the test succeeded and we are confident that the RAM area can be used
+        testFlags |= CheckerboardRam_TestResult;
+    }
+    else
+    {
+        testFlags &= ~CheckerboardRam_TestResult;
+    }
+
+/********************** Checker Board Stack test ********************************/
+// Note that this test is not destructive. It test Stack and Heap RAM!
+    if (SSL_STACKtest_CheckerBoard( ) == CB_TEST_PASS)
+    {
+        // the test succeeded and we are confident that the RAM area can be used
+        testFlags |= CheckerboardRam_TestResult;
+    }
+    else
+    {
+        testFlags &= ~CheckerboardRam_TestResult;
+    }
+
+/************************ March B RAM Test ************************************/
+    if (SSL_RAMtest_MarchB() == MARCHB_RAM_TEST_PASS)
+    {
+        // the test succeeded and we can go ahead and use the allocated memory
+        testFlags |= MarchBRam_TestResult;
+    }
+    else
+    {
+        testFlags &= ~MarchBRam_TestResult;
+    }
+
+/************************ March C RAM Test ************************************/
+    if (SSL_RAMtest_MarchC() == MARCHC_RAM_TEST_PASS)
+    {
+        testFlags |= MarchCRam_TestResult;
+    }
+    else
+    {
+       testFlags &= ~MarchCRam_TestResult;
+    }
+
+/************************ MarchC Minus RAM test *******************************/
+    if (SSL_RAMtest_MarchCMinus() == MARCHCminus_RAM_TEST_PASS)
+    {
+        // if both tests succeeded we can go ahead and use the allocated memory
+        testFlags |= MarchCMinusRam_TestResult;
+    }
+    else
+    {
+        testFlags &= ~MarchCMinusRam_TestResult;
+    }
+
+/*************************** FLASH CRC TEST ***********************************/
+// This function can be called periodically and the generated checksum can be
+// compared with the reference checksum. Reference must be generated after
+// compile and written into "crc_Result_CONST". See above.
+    crc_Result = SSL_FLASHtest_CRC( );
+
+    // make sure that the periodic check is equal to the reference one
+    if ( crc_Result == crc_Result_CONST)
+    {
+        testFlags |= Flash_TestResult;
+        // we are confident that the data programmed in Flash
+        // has not been altered in any way
+    }
+    else
+    {
+        testFlags &= ~Flash_TestResult;
+    }
+    return testFlags;
+}
+

+ 85 - 0
ProjectSource/BMS_Slave_RCT/SSL_Class_B_Tests.h

@@ -0,0 +1,85 @@
+/*********************************************************************
+ *
+ *                  SSL_Demo Header
+ *
+ *********************************************************************
+ * FileName:        SSL_CLASS_B_Tests.h
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       11.07.2012   Release
+ *********************************************************************/
+
+#ifndef SSL_H      // To avoid duplicate inclusion
+#define SSL_H
+
+
+/*********************************************************************
+ *
+ * Include Files
+ *
+ ********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <P18F45K80.h>
+#include "BMS_MISRA.h"
+#include "SSL_CpuRegisterTest.h"
+#include "SSL_ProgCounterTest.h"
+#include "SSL_CheckerBoardTest.h"
+#include "SSL_MarchBRamTest.h"
+#include "SSL_MarchCMinusRamTest.h"
+#include "SSL_MarchCRamTest.h"
+#include "SSL_Flash_CRC.h"
+
+
+
+/*********************************************************************
+ *
+ * Typdefs
+ *
+ *********************************************************************/
+typedef union _ClassB_Test_Flags
+{
+    struct
+    {
+        uint8_t cpuRegister_TestResult:1;
+        uint8_t programCounter_TestResult:1;
+        uint8_t checkerboardRam_TestResult:1;
+        uint8_t marchBRam_TestResult:1;
+        uint8_t marchCRam_TestResult:1;
+        uint8_t marchCMinusRam_TestResult:1;
+//        uint8_t marchCRamStack_TestResult:1;
+        uint8_t flash_TestResult:1;
+//        uint8_t clock_TestResult:1;
+//        uint8_t clockLine_TestResult:1;
+    };
+} TESTFLAG;
+
+
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+#define CPURegister_TestResult      0x01
+#define ProgramCounter_TestResult   0x02
+#define CheckerboardRam_TestResult  0x04
+#define MarchBRam_TestResult        0x08
+#define MarchCRam_TestResult        0x10
+#define MarchCMinusRam_TestResult   0x20
+#define Flash_TestResult            0x40
+
+
+
+/*********************************************************************
+*
+*                        Function Prototypes
+*
+*********************************************************************/
+uint16_t  SSL_Class_B_Tests( void );
+
+#endif

+ 117 - 0
ProjectSource/BMS_Slave_RCT/SSL_CpuRegisterTest.c

@@ -0,0 +1,117 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_CpuRegisterTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC16FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST dataC, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+*CT             09/15/2008  First release of source file
+*Mike Cahill	11/11/2010  Updated for HI-TECH v9.80
+*MVL		02/22/2011  Modified for HI-TECH v9.80 & v9.81
+*VR             06/22/2012  Modified for C18 v3.41
+*
+*Version 	1.03
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+#include "SSL_CpuRegisterTest.h"
+
+
+volatile uint8_t  tempWF, tempREG;
+
+
+/********************************************************************************************
+* Function Name: SSL_8bit_CPU_RegisterTest      
+* 
+* Description  : The "SSL_8bit_CPU_RegisterTest" function tests the CPU W register for stuck up 
+*  faults, insuring that bits in the registers are not stuck at a value. This test can be done 
+* by successively doing a write, read and check of 0x55 & 0xAA value into the W register.
+* The Register is saved into RAM before the test is performed and restored after the test is done.
+*
+* Input        : None
+*                
+* Returns      : return value = 0 Test FAIL 
+*                return value = 1 Test PASS 
+*********************************************************************************************/
+ uint16_t  SSL_CPU_RegisterTest( )
+{
+    uint8_t  cpuTestResult;
+
+    // save the original value of W
+    _asm
+     MOVWF tempWF,1
+    
+    
+    /* Test WREG with 0x55 */
+    MOVLW 0x55
+    MOVWF tempREG,1
+    _endasm
+
+    cpuTestResult= Test_Register(tempREG, 0x55);
+    if(cpuTestResult == CPU_REGISTER_TEST_FAIL)
+    {	
+        _asm
+        MOVF tempWF,0,1
+        _endasm
+	return CPU_REGISTER_TEST_FAIL;
+    }
+
+    // Test WREG with 0xAA
+    _asm
+    MOVLW 0xAA
+    MOVWF tempREG,1
+    _endasm
+
+    cpuTestResult= Test_Register(tempREG, 0xAA);
+    if(cpuTestResult==CPU_REGISTER_TEST_FAIL)
+    {	
+ 	_asm
+        MOVF tempWF,0,1
+        _endasm
+	return CPU_REGISTER_TEST_FAIL;
+    }
+
+    // POP the W-reg before return
+    _asm
+    MOVF tempWF,0,1
+    _endasm
+
+    //cpuTestResult = CPU_REGISTER_TEST_PASS ;
+    return CPU_REGISTER_TEST_PASS;
+}
+
+
+uint16_t  Test_Register(uint8_t  tempREG, uint8_t  value)
+{
+    if (tempREG != value)
+    {
+        return CPU_REGISTER_TEST_FAIL;
+    } 
+    else
+    {
+	return  CPU_REGISTER_TEST_PASS;
+    }
+}

+ 50 - 0
ProjectSource/BMS_Slave_RCT/SSL_CpuRegisterTest.h

@@ -0,0 +1,50 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_CpuRegisterTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULL..\h\EST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+
+#ifndef __SSL_CPU_TEST_H__
+#define __SSL_CPU_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define CPU_REGISTER_TEST_PASS 1u              	/*ONE if the Test passes.*/
+#define CPU_REGISTER_TEST_FAIL 0u              	/*ZERO if the Test Fails.*/
+
+
+uint16_t  Test_Register        ( uint8_t tempREG, uint8_t Value );
+uint16_t  SSL_CPU_RegisterTest ( void );
+
+#endif

+ 253 - 0
ProjectSource/BMS_Slave_RCT/SSL_Demo.c

@@ -0,0 +1,253 @@
+/*******************************************************************************
+  Class B Library Implementation Test File
+
+  Summary:
+    This file contains the test program for the 
+    the Class B Safety Software Library on PIC32MX MCUs.
+    
+*******************************************************************************/
+/*******************************************************************************
+FileName:       ClassB_main.c
+Processor:      PIC32MX
+Compiler:       Microchip MPLAB® C32 v1.04 or higher
+
+Copyright © 2008-2009 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+the accompanying software only when embedded on a Microchip microcontroller or
+digital signal controller that is integrated into your product or third party product.  
+ 
+If the accompanying software required your consent to the terms of Microchip's
+click-wrap license agreement, then you should also refer to such license agreement
+for additional information regarding your rights and obligations.
+Your acceptance and/or use of this software constitutes your agreement to the terms
+and conditions of this notice and applicable click-wrap license, if any.
+
+You agree that you are solely responsible for testing the code and determining its suitability.
+Microchip has no obligation to modify, test, certify, or support the code.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST dataC, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+
+/*********************************************************************
+ *
+ *                          Include Files
+ *
+ ********************************************************************/
+#include <stdlib.h>
+#include <P18F45K80.h>
+
+#include "SSL_CpuRegisterTest.h"
+#include "SSL_CheckerBoardTest.h"
+#include "SSL_ProgCounterTest.h"
+#include "SSL_MarchCMinusRamTest.h"
+#include "SSL_MarchBRamTest.h"
+#include "SSL_MarchCRamTest.h"
+#include "SSL_Flash_CRC.h"
+
+
+
+/*********************************************************************
+*
+*                              Pragmas
+*
+*********************************************************************/
+#pragma config XINST   = OFF
+#pragma config FOSC    = HS1
+#pragma config WDTEN   = SWDTDIS //OFF     // SWDTDIS
+#pragma config WDTPS   = 256     // WD TimeOut 1024ms
+#pragma config SOSCSEL = DIG     // Port C, Pin 0 & 1 => Digital
+#pragma config PLLCFG  = ON
+
+
+
+/*********************************************************************
+*
+*                              Typdefs
+*
+*********************************************************************/
+volatile struct  ClassB_Test_Flags {
+    unsigned cpuRegister_TestResult : 1;
+    unsigned programCounter_TestResult:1;
+    unsigned checkerboardRam_TestResult:1;
+    unsigned marchCRam_TestResult:1;
+    unsigned marchCMinusRam_TestResult:1;
+    unsigned marchCRamStack_TestResult:1;
+    unsigned marchBRam_TestResult:1;
+    unsigned flash_TestResult:1;
+    unsigned clock_TestResult:1;
+    unsigned clockLine_TestResult:1;
+} testFlag;
+
+
+
+/*+++++++ Main SSL Demo +++++++++++++++++++++++++++++++++++++++++++*/
+int main(void)
+{
+     /* ini()? */
+    
+
+    /**********************************************************************************/
+    /*                                  CPU REGISTER TEST                             */                              
+    /**********************************************************************************/
+
+    if (SSL_PCtest()==CPU_REGISTER_TEST_PASS)
+    {
+        // the CPU registers don't have stuck bits
+        testFlag.cpuRegister_TestResult = 1;
+    }
+    else 
+    {
+        testFlag.cpuRegister_TestResult = 0;
+    }
+
+    /**********************************************************************************/
+    /*                                  PROGRAM COUNTER TEST                          */
+    /*  This requires a special linker script (elf32pic32mx.ld) to be added           */
+    /*   as part of the project. See the description in SSL_PcTest.h                  */
+    /**********************************************************************************/
+
+    if (SSL_PCtest()==PC_TEST_PASS)
+    {
+        // the PC register does not have stuck bits
+        testFlag.programCounter_TestResult = 1;
+    }
+    else 
+    {
+        testFlag.programCounter_TestResult = 0; 
+    }
+
+    /**********************************************************************************/
+    /*                                  RAM TESTS                                     */                              
+    /**********************************************************************************/
+
+  
+    /*************************/
+    /* Checker Board RAM test*/
+    /*************************/
+    // We'll test 1KB chunk at the middle of the RAM
+    // Note that this test is not destructive
+    // It has to NOT overlap the stack space!
+    if (SSL_RAMtest_CheckerBoard( )==CB_TEST_PASS)
+    { 
+        // the test succeeded and we are confident that the RAM area can be used
+        testFlag.checkerboardRam_TestResult = 1;
+    }
+    else
+    {
+        testFlag.checkerboardRam_TestResult = 0;
+    }
+
+
+    /****************************/
+    /*    March B Ram Test      */
+    /****************************/
+    // Suppose we need to allocate and want to use a 1 KB chunk of memory
+    // We'll test it using the Checker Board test before we use it
+    // to make sure there is no problem with the chunk of RAM we selected.
+    // Note that this test is destructive.
+    // Note that the size of the RAM to test has to be multiple of 4.
+
+   
+    { // allocation succeeded and we can perform the test
+        if (SSL_RAMtest_MarchB() ==MARCHB_TEST_PASS)
+        {
+            // the test succeeded and we can go ahead and use the allocated memory
+            testFlag.marchBRam_TestResult = 1;
+        }
+        else
+        {
+            testFlag.marchBRam_TestResult = 0;
+        }
+        
+        //free(ramTestStartAddress);  // we're done with this memory block
+                                    // return it to the heap
+    }
+
+
+    /*************************/
+    /*    MarchC RAM tests    */
+    /*************************/
+    // We allocate and want to use a 2 KB chunk of memory
+    // We'll test it using the March C and March C Minus tests before we use it
+    // Note that the size of the RAM to test has to be multiple of 4.
+    // This test is destructive too.
+
+  
+
+        if (SSL_RAMtest_MarchC() == MARCHC_TEST_PASS)
+        { 
+            testFlag.marchCRam_TestResult = 1;
+        }
+        else
+        {
+            testFlag.marchCRam_TestResult = 0;
+        }
+
+
+        /**************************/
+        /* MarchC Minus RAM test  */
+        /**************************/
+
+        if (SSL_RAMtest_MarchCMinus() == MARCHC_TEST_PASS)
+        { 
+            // if both tests succeeded we can go ahead and use the allocated memory
+            testFlag.marchCMinusRam_TestResult = 1;
+        }
+        else
+        {
+            testFlag.marchCMinusRam_TestResult = 0;  
+        }
+
+    
+
+    
+
+    /**********************************************************************************/
+    /*                                  FLASH CRC TEST                                */                              
+    /**********************************************************************************/
+    // This function can be called at startup to generate the Reference checksum.
+    // The same function can be called periodically and the generated checksum can be 
+    // compared with the reference checksum.
+    // If both are the same the "flash_TestResult" status bit can be set. 
+
+    unsigned int flashCrcRef, flashCrc; // reference and current CRC values
+    unsigned int crcSeed=0xffff;        // initial CRC register value
+                                        // this is the recommended CRC seed
+                                        // for checking properly long 0 streams.
+
+    // calculate the CRC16 of the whole program flash (K0)      
+    char* flashStartAddress = (char*)0x9d000000;       // fixed start K0 address on PIC32MX devices
+    //char* flashEndAddress =  flashStartAddress+BMXPFMSZ-1;  // size of the flash on this device
+                                                            // the BMX register stores the Flash size for this part
+
+    // first we calculate the reference Flash CRC value
+    flashCrcRef = SSL_FLASHtest_CRC( );
+
+    // at some time later we calculate again the CRC of the Flash 
+    flashCrc = SSL_FLASHtest_CRC( );
+
+    // make sure that the periodic check is equal to the reference one
+    if ( flashCrc==flashCrcRef)
+    {
+        testFlag.flash_TestResult=1;
+        // we are confident that the data programmed in Flash
+        // has not been altered in any way 
+    }
+    else
+    { 
+        testFlag.flash_TestResult=0;
+    }
+  }
+
+
+

+ 79 - 0
ProjectSource/BMS_Slave_RCT/SSL_Demo.h

@@ -0,0 +1,79 @@
+/*********************************************************************
+ *
+ *                  SSL_Demo Header
+ *
+ *********************************************************************
+ * FileName:        SSL_Demo.h
+ * Processor:       PIC18F45K80
+ * Compiler:        Microchip C18 v3.41
+ * Company:         KIT - CN - IPE
+ *
+ * Author           Date         Comment
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Reiling V.       11.07.2012   Release
+ *********************************************************************/
+
+#ifndef SSL_H      // To avoid duplicate inclusion
+#define SSL_H
+
+
+/*********************************************************************
+ *
+ * Include Files
+ *
+ ********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <P18F45K80.h>
+#include "BMS_MISRA.h"
+#include "SSL_CpuRegisterTest.h"
+#include "SSL_ProgCounterTest.h"
+#include "SSL_CheckerBoardTest.h"
+#include "SSL_MarchBRamTest.h"
+#include "SSL_MarchCMinusRamTest.h"
+#include "SSL_MarchCRamTest.h"
+#include "SSL_Flash_CRC.h"
+
+
+
+/*********************************************************************
+ *
+ * Typdefs
+ *
+ *********************************************************************/
+typedef union _ClassB_Test_Flags
+{
+    struct
+    {
+        uint8_t cpuRegister_TestResult:1;
+        uint8_t programCounter_TestResult:1;
+        uint8_t checkerboardRam_TestResult:1;
+        uint8_t marchBRam_TestResult:1;
+        uint8_t marchCRam_TestResult:1;
+        uint8_t marchCMinusRam_TestResult:1;
+//        uint8_t marchCRamStack_TestResult:1;
+        uint8_t flash_TestResult:1;
+//        uint8_t clock_TestResult:1;
+//        uint8_t clockLine_TestResult:1;
+    };
+} TESTFLAG;
+
+
+
+/*********************************************************************
+*
+*                             Defines
+*
+*********************************************************************/
+//#define CAN_Rx_ErrorCountMax   240u
+
+
+
+/*********************************************************************
+*
+*                        Function Prototypes
+*
+*********************************************************************/
+void  main                    ( void );
+
+#endif

+ 130 - 0
ProjectSource/BMS_Slave_RCT/SSL_Demo2.c

@@ -0,0 +1,130 @@
+/*******************************************************************************
+  Class B Implementation Test File
+
+  Summary:
+    This file contains the test program for the
+    the Class B Safety Software on PIC18 MCUs.
+
+********************************************************************************
+
+  File:      SSL_Demo2.c
+  Processor: PIC18
+  Compiler:  Microchip MPLAB® C18 v3.41 or higher
+  Author:    Reiling
+ 
+  Created on 11. Juli 2012, 10:58
+ ******************************************************************************/
+#include "SSL_Demo.h"
+
+
+/*******************************************************************************
+  Pragmas
+ ******************************************************************************/
+#pragma config XINST   = OFF
+#pragma config FOSC    = HS1
+#pragma config WDTEN   = OFF     //OFF     // SWDTDIS
+#pragma config WDTPS   = 256     // WD TimeOut 1024ms
+#pragma config SOSCSEL = DIG     // Port C, Pin 0 & 1 => Digital
+#pragma config PLLCFG  = ON
+
+#pragma romdata CRCID=0x1000
+rom const uint16_t  crc_Result_CONST = 0x5a83;  /* EE-Prom CRC result constant */
+#pragma romdata
+
+
+
+/*******************************************************************************
+ *                          Main SSL Demo
+ ******************************************************************************/
+void main( void )
+{
+    TESTFLAG testFlag   = {0,0,0,0,0,0,0};
+    uint16_t crc_Result = 0;                        // CRC values FLASH
+
+/************************ CPU REGISTER TEST ***********************************/
+    if (SSL_CPU_RegisterTest()==CPU_REGISTER_TEST_PASS)
+    {
+        // the CPU registers don't have stuck bits
+        testFlag.cpuRegister_TestResult = 1;
+    }
+    else
+    {
+        testFlag.cpuRegister_TestResult = 0;
+    }
+
+/*********************** PROGRAM COUNTER TEST *********************************/
+    if (SSL_PCtest()==PROGRAM_COUNTER_TEST_PASS)
+    {
+        // the PC register does not have stuck bits
+        testFlag.programCounter_TestResult = 1;
+    }
+    else
+    {
+        testFlag.programCounter_TestResult = 0;
+    }
+
+/**************************** RAM TESTS ***************************************/
+
+/********************** Checker Board RAM test ********************************/
+// Note that this test is not destructive. It has to NOT overlap the stack space!
+    if (SSL_RAMtest_CheckerBoard( )==CB_TEST_PASS)
+    { 
+        // the test succeeded and we are confident that the RAM area can be used
+        testFlag.checkerboardRam_TestResult = 1;
+    }
+    else
+    {
+        testFlag.checkerboardRam_TestResult = 0;
+    }
+
+/************************ March B RAM Test ************************************/
+    if (SSL_RAMtest_MarchB() ==MARCHB_RAM_TEST_PASS)
+    {
+        // the test succeeded and we can go ahead and use the allocated memory
+        testFlag.marchBRam_TestResult = 1;
+    }
+    else
+    {
+        testFlag.marchBRam_TestResult = 0;
+    }
+
+/************************ March C RAM Test ************************************/
+    if (SSL_RAMtest_MarchC() == MARCHC_RAM_TEST_PASS)
+    {
+        testFlag.marchCRam_TestResult = 1;
+    }
+    else
+    {
+       testFlag.marchCRam_TestResult = 0;
+    }
+
+/************************ MarchC Minus RAM test *******************************/
+    if (SSL_RAMtest_MarchCMinus() == MARCHCminus_RAM_TEST_PASS)
+    {
+        // if both tests succeeded we can go ahead and use the allocated memory
+        testFlag.marchCMinusRam_TestResult = 1;
+    }
+    else
+    {
+        testFlag.marchCMinusRam_TestResult = 0;
+    }
+
+/*************************** FLASH CRC TEST ***********************************/
+// This function can be called periodically and the generated checksum can be
+// compared with the reference checksum. Reference must be generated after
+// compile and written into "crc_Result_CONST". See above.
+    crc_Result = SSL_FLASHtest_CRC( );
+
+    // make sure that the periodic check is equal to the reference one
+    if ( crc_Result==crc_Result_CONST)
+    {
+        testFlag.flash_TestResult=1;
+        // we are confident that the data programmed in Flash
+        // has not been altered in any way
+    }
+    else
+    {
+        testFlag.flash_TestResult=0;
+    }
+}
+

+ 112 - 0
ProjectSource/BMS_Slave_RCT/SSL_FLASH_CRC.c

@@ -0,0 +1,112 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        	SSL_EEPROMTest_CRC16.c
+* Dependencies:         Header (.h) files if applicable, see below
+* Processor:       	PIC18
+* Compiler:        	C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author           	Date      		Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT		      	09/15/2008		Initial Revision
+* Mike Cahill		11/11/10		Updated for HI-TECH v9.80
+* MVL			02/22/2011		Updated with HI-TECH v9.81
+* VR                    07/11/2012              Downgrade to C18 v3.41
+*
+* Version 		1.03
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+
+#include "SSL_FLASH_CRC.h"
+
+
+uint16_t           crc_Result = 0;
+uint16_t           partialCRC_Result = 0;
+uint16_t           tempCRC = 0;
+uint8_t            Buffer;
+uint8_t rom       *data_F = 0;
+
+uint16_t volatile  startAddress = FLASH_STARTADDRESS;
+uint16_t volatile  endAddress   = FLASH_ENDADDRESS;
+
+
+
+/*******************************************************************************
+* Description:
+*     The " SSL_8bits_EEPROMtest_CRC16 " function Calculates
+*     the CRC of the data starting fromnAddress
+*     "EEPROM_STARTADDRESS" to "EEPROM_ENDADDRESS". This function
+*     \returns the final CRC Value.
+*     CRC-16 is used as a divisor.
+*     
+*     CRC-16 = 1 1000 0000 0000 0101= 8005(hex)
+* Input:  startAddress :  start Address from which the CRC needs to be calculated
+*         endAddress :    This address indicates the Final address upto which the CRC is calculated
+* Return Values:
+          crc_Result :  	Returns the final CRC result.
+*                                                                  
+*******************************************************************************/
+uint16_t  SSL_FLASHtest_CRC( void )
+{
+    uint16_t  i;
+
+
+    for(i=startAddress; i<endAddress ; i++)
+    {
+        partialCRC_Result=0;
+        Buffer = *(data_F+i);
+        //Buffer=Read_b_eep(i);
+        FLASH_CRC_Checksum();
+        crc_Result= crc_Result + partialCRC_Result;
+    }
+    return crc_Result;
+}
+
+
+
+/*******************************************************************************
+  * Description  : Calculates the Partial Checksum for FLASH_BYTES
+  *****************************************************************************/
+void FLASH_CRC_Checksum()
+{  
+    uint16_t  i;
+
+    tempCRC=0;
+		    
+    for(i=8u; i>0u; i--)
+    {
+        if ( (Buffer ^ (tempCRC)) & 0x80 )
+        {
+            (tempCRC) = ((tempCRC)<< 1) ^ EEPROM_GEN_POLY ;
+        }
+        else
+        {
+            (tempCRC) <<= 1 ;
+        }
+        Buffer <<= 1 ;
+    }
+    partialCRC_Result= partialCRC_Result+tempCRC;
+}
+
+

+ 50 - 0
ProjectSource/BMS_Slave_RCT/SSL_FLASH_CRC.h

@@ -0,0 +1,50 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:           SSL_FLASH_CRC.h
+* Dependencies:       Header (.h) files if applicable, see below
+* Processor:          PIC18
+* Compiler:           C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+#include "SSL_Class_B_Tests.h"
+
+#ifndef __SSL_FLASH_CRC_H__
+#define __SSL_FLASH_CRC_H__
+
+#define FLASH_STARTADDRESS  0x0000
+#define FLASH_ENDADDRESS    0x1FFF
+#define EEPROM_GEN_POLY     0x8005   /*The Generator Polynomial: x^16 + x^15 + x^2 + 1*/
+
+
+uint16_t  SSL_FLASHtest_CRC   ( void );
+void      FLASH_CRC_Checksum  ( void );
+
+#endif

+ 221 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest.c

@@ -0,0 +1,221 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchBRamTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC16FXXX
+* Compiler:        c18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST data, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT                08/15/2008  First release of source file
+* Mike Cahill	    11/11/2010	Updated for HI-TECH v9.80
+* MVL		    02/22/2011	Modified for HI-TECH v9.80 & v9.81
+* VR                07/11/2012  Downgrade to C18 v3.41
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+
+#include "SSL_Class_B_Tests.h"
+
+
+#pragma idata RAMFIX3=0xE20
+uint8_t   *data = (uint8_t *)MARCHB_RAM_START_ADDRESS;
+uint16_t  i=0;
+
+
+
+/*******************************************************************
+* Description  : This function implements the March B test. It is a complete and irredundant test
+* capable of detecting stuck-at faults , linked coupling Idempotent faults or Inversion Coupling
+* faults. This test is of complexity 17n( Where n is the number of bits).
+* Input:
+*     *data                     :  pointer to an array declared in user memory
+*     MAX_MEM                   :  value indicating the number of bytes to test
+* Return Values:
+*     MARCHB_RAM_TEST_FAIL 	:  return value = 0
+*     MARCHB_RAM_TEST_PASS 	:  return value = 1
+*                                                                 
+*******************************************************************/
+unsigned char SSL_RAMtest_MarchB( void )
+{
+    volatile uint8_t testResult;
+
+//***********************************************
+    for(i=0;i<=(MAX_MEM_B-1);i++)
+    {
+	data[i]=0x00;
+    }
+//***********************************************
+    for(i=0;i<=(MAX_MEM_B-1);i++)
+    {
+	testResult = Rd0Wr1Rd1Wr0Rd0Wr1( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+//***********************************************
+    for(i=0;i<=(MAX_MEM_B-1);i++)
+    {
+	testResult = Rd1Wr0Wr1( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+//***********************************************
+    for(i=(MAX_MEM_B-1);i>0;i--)
+    {
+	testResult = Rd1Wr0Wr1Wr0( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = Rd1Wr0Wr1Wr0 ( );
+    if ( !testResult)
+        return MARCHB_RAM_TEST_FAIL;
+//***********************************************
+    for(i=(MAX_MEM_B-1);i>0;i--)
+    {
+    	testResult = Rd0Wr1Wr0( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = Rd0Wr1Wr0( );
+    if( !testResult)
+       return MARCHB_RAM_TEST_FAIL;
+//***********************************************
+    return MARCHB_RAM_TEST_PASS;
+}
+
+
+//******************************************************************************
+unsigned char Rd0Wr1Rd1Wr0Rd0Wr1( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    // read 0, write 1
+    for(r=0;r<8;r++)
+    {
+	if((data[i] >>r) & 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+        {
+            imresult = 1<<r;
+            data[i] += imresult;
+        }
+    }
+    // read 1, write 0
+    for(r=0;r<8;r++)
+    {
+	if(((data[i] >>r) & 0x01) != 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+        {
+            imresult = ~(1<<r);
+            data[i] &= imresult;
+        }
+    }
+    // read 0, write 1
+    for(r=0;r<8;r++)
+    {
+	if((data[i] >>r) & 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+        {
+            imresult = 1<<r;
+            data[i] += imresult;
+        }
+    }
+    return MARCHB_RAM_TEST_PASS;
+}
+
+
+//******************************************************************************
+unsigned char Rd1Wr0Wr1( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    // read 1, write 0, write 1
+    for (r=0; r<8;r++)
+    {
+        if ( ((data[i] >>r ) & 0x01) != 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+	{
+            imresult = ~(1<<r);
+            data[i] &= imresult;
+            imresult = 1<<r;
+            data[i] += imresult;
+	}	
+    }
+    return MARCHB_RAM_TEST_PASS;
+} 
+
+
+//******************************************************************************
+unsigned char Rd1Wr0Wr1Wr0( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    // read 1, write 0, write 1, write 0
+    for(r=0;r<8;r++)
+    {
+	if(((data[i] >>r) & 0x01) != 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+	{
+            imresult = ~(1<<r);
+            data[i] &= imresult;
+            imresult = 1<<r;
+            data[i] += imresult;
+            imresult = ~(1<<r);
+            data[i] &= imresult;
+	}	
+    }
+    return MARCHB_RAM_TEST_PASS;
+}
+
+
+//******************************************************************************
+unsigned char Rd0Wr1Wr0( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    // read 0, write 1, write 0
+    for(r=0;r<8;r++)
+    {
+	if((data[i] >>r) & 0x01)
+            return MARCHB_RAM_TEST_FAIL;
+	else
+	{	
+            imresult = 1<<r;
+            data[i] += imresult;
+            imresult = ~(1<<r);
+            data[i] &= imresult;
+	}
+    }
+    return MARCHB_RAM_TEST_PASS;
+}

+ 56 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest.h

@@ -0,0 +1,56 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchBRamTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+#ifndef __SSL_MARCHB_RAM_TEST_H__
+#define __SSL_MARCHB_RAM_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define MARCHB_RAM_TEST_PASS 1u                 /*ONE if the Test passes.*/
+#define MARCHB_RAM_TEST_FAIL 0u                 /*ZERO if the Test Fails.*/
+
+#define MARCHB_RAM_START_ADDRESS 0x012
+#define MARCHB_RAM_STOP_ADDRESS  0xCFF
+#define MAX_MEM_B ( MARCHB_RAM_STOP_ADDRESS - MARCHB_RAM_START_ADDRESS +1 )
+
+
+uint8_t  SSL_RAMtest_MarchB ( void );
+uint8_t  Rd0Wr1Rd1Wr0Rd0Wr1 ( void );
+uint8_t  Rd1Wr0Wr1          ( void );
+uint8_t  Rd1Wr0Wr1Wr0       ( void );
+uint8_t  Rd0Wr1Wr0          ( void );
+
+#endif

+ 221 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest2.c

@@ -0,0 +1,221 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchBRamTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC16FXXX
+* Compiler:        c18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT                08/15/2008  First release of source file
+* Mike Cahill	    11/11/2010	Updated for HI-TECH v9.80
+* MVL		    02/22/2011	Modified for HI-TECH v9.80 & v9.81
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+
+
+#include "SSL_MarchBRamTest2.h"
+
+#define MAX_MEM ( MARCHB_RAM_STOP_ADDRESS - MARCHB_RAM_START_ADDRESS +1 )
+	volatile unsigned char *data = MARCHB_RAM_START_ADDRESS;
+	volatile unsigned int i;
+
+
+
+void main()
+{
+    volatile unsigned char testResult;
+
+    testResult = SSL_RAMtest_MarchB();
+
+    if (testResult == MARCHB_RAM_TEST_PASS)
+    {
+	Nop();		/* Test pass */
+    }
+    else
+    {
+	Nop();		/* Test not pass */
+    }
+}
+
+
+
+/*******************************************************************
+* Description  : This function implements the March B test. It is a complete and irredundant test
+* capable of detecting stuck-at faults , linked coupling Idempotent faults or Inversion Coupling
+* faults. This test is of complexity 17n( Where n is the number of bits).
+* Input:
+*     *data                     :  pointer to an array declared in user memory
+*     MAX_MEM                   :  value indicating the number of bytes to test
+* Return Values:
+*     MARCHB_RAM_TEST_FAIL 	:  return value = 0
+*     MARCHB_RAM_TEST_PASS 	:  return value = 1
+*                                                                 
+*******************************************************************/
+unsigned char  SSL_RAMtest_MarchB( void )
+{
+    volatile unsigned char testResult;
+
+//***********************************************
+    for (  i=0;i<=(MAX_MEM-1);i++)
+    {
+	data[i]=0x00;
+    }
+//***********************************************
+    for (  i=0;i<=(MAX_MEM-1);i++)
+    {
+	testResult = Rd0Wr1Rd1Wr0Rd0Wr1( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+//***********************************************
+    for (  i=0;i<=(MAX_MEM-1);i++)
+    {
+	testResult = Rd1Wr0Wr1( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+//***********************************************
+    for (i=(MAX_MEM-1); i > 0;i--)
+    {
+	testResult = Rd1Wr0Wr1Wr0( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = Rd1Wr0Wr1Wr0 ( );
+    if ( !testResult)
+        return MARCHB_RAM_TEST_FAIL;
+//***********************************************
+    for (i=(MAX_MEM-1); i > 0;i--)
+    {
+    	testResult = Rd0Wr1Wr0( );
+	if ( !testResult)
+            return MARCHB_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = Rd0Wr1Wr0( );
+    if ( !testResult)
+       return MARCHB_RAM_TEST_FAIL;
+//***********************************************
+    return MARCHB_RAM_TEST_PASS;
+}
+
+
+
+//***********************************************
+unsigned char Rd0Wr1Rd1Wr0Rd0Wr1( void )
+{
+    volatile unsigned char r;
+
+    // read zero , write 1
+    for (r=0; r<8;r++)
+    {
+	if ( (data[i] >>r ) & 0x01)
+            return FAIL;
+	else
+            data[i]=data[i] | (1<<r);
+    }
+    // read one write zero
+    for (r=0; r<8;r++)
+    {
+	if ( ((data[i] >>r ) & 0x01) != 0x01)
+            return FAIL;
+	else
+            data[i]=data[i] & ~(1<<r);
+    }
+    // read zero , write 1
+    for (r=0; r<8;r++)
+    {
+	if ( (data[i] >>r ) & 0x01)
+            return FAIL;
+	else
+            data[i]=data[i] | (1<<r);
+    }
+    return PASS;
+}
+
+
+
+//***********************************************
+unsigned char Rd1Wr0Wr1( void )
+{
+    volatile unsigned char r;
+
+    // read one write zero write one
+    for (r=0; r<8;r++)
+    {
+        if ( ((data[i] >>r ) & 0x01) != 0x01)
+            return FAIL;
+	else
+	{
+            data[i]=data[i] & ~(1<<r);
+            data[i]=data[i] | (1<<r);
+	}	
+    }
+    return PASS;
+} 
+
+
+
+//***********************************************
+unsigned char Rd1Wr0Wr1Wr0( void )
+{
+    volatile unsigned char r;
+
+    // read one write zero write one, write 1 , write 0
+    for (r=0; r<8;r++)
+    {
+	if ( ((data[i] >>r ) & 0x01) != 0x01)
+            return FAIL;
+	else
+	{
+            data[i]=data[i] & ~(1<<r);
+            data[i]=data[i] | (1<<r);
+            data[i]=data[i] & ~(1<<r);
+	}	
+    }
+    return PASS;
+}
+
+
+
+unsigned char Rd0Wr1Wr0( void )
+{
+    volatile unsigned char r;
+
+    // read zero , write 1, write 0
+    for (r=0; r<8;r++)
+    {
+	if ( (data[i] >>r ) & 0x01)
+            return FAIL;
+	else
+	{	
+            data[i]=data[i] | (1<<r);
+            data[i]=data[i] & ~(1<<r);
+	}
+    }
+    return PASS;
+}

+ 92 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchBRamTest2.h

@@ -0,0 +1,92 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchBRamTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+#ifndef __SSL_MARCHB_RAM_TEST_H__
+#define __SSL_MARCHB_RAM_TEST_H__
+
+#include <p18F45K80.h>
+
+#define bitset(var,bitno) ((var) |= 1UL < < (bitno))
+#define bitclr(var,bitno) ((var) &= ~(1UL < < (bitno)))
+
+
+/****************************************************************
+* The stack Start Address from which the March C test is to be
+* performed. This address must be properly aligned according to
+* the data width.                                              
+****************************************************************/
+#define MARCHC_STACK_START_ADDRESS  0X20	
+
+/*Stack size in bytes.*/		 
+#define MARCHC_STACK_LENGTH         0X0F 
+
+
+
+
+#define PASS 1
+
+#define FAIL 0
+
+
+/****************************************************************
+* The Start Address from which the March B test is to be
+* performed. This address must be properly aligned according to
+* the data width.                                              
+*****************************************************************/
+#define MARCHB_RAM_START_ADDRESS 0x00
+
+
+/****************************************************************
+* The Stop Address to which the March B test is to be
+* performed. This address must be properly aligned according to
+* the data width.                                              
+*****************************************************************/                                                                                                                                    
+#define MARCHB_RAM_STOP_ADDRESS  0xCFF
+
+
+#define MARCHB_BIT_WIDTH     8             /*The Data width is 8 bits for PIC16, PIC12*/
+
+#define MARCHB_RAM_TEST_PASS 1             /*ONE if the Test passes.*/
+#define MARCHB_RAM_TEST_FAIL 0             /*ZERO if the Test Fails.*/
+
+
+//Function Declarations
+unsigned char SSL_RAMtest_MarchB ( void );
+unsigned char Rd0Wr1Rd1Wr0Rd0Wr1 ( void );
+unsigned char Rd1Wr0Wr1          ( void );
+unsigned char Rd1Wr0Wr1Wr0       ( void );
+unsigned char Rd0Wr1Wr0          ( void );
+#endif

+ 114 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchCMinusRamTest.c

@@ -0,0 +1,114 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        MarchCMInusRamTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18
+* Compiler:        C18
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT                09/15/2008  First release of source file
+* Mike Cahill       11/11/2010	Updated for HI-TECH v9.80
+* MVL               02/22/2011	Modified for HI-TECH v9.81
+* VR                07/11/2012  Downgrade to C18 v3.41
+*
+* Version           1.03
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+
+#include "SSL_MarchCMinusRamTest.h"
+
+
+volatile uint8_t   *data_Cm = (uint8_t *)MARCHC_RAM_START_ADDRESS;
+volatile uint16_t  k;
+
+
+
+  /*******************************************************************
+  * Description:
+  *     This function that implements the MarchC Minus test.
+  *     This test is a destructive test !!!
+  * Input:
+  *     data[]  :  pointer to an array declared in user memory
+  *     MAX_MEM :  value indicating the number of bytes to test
+  * Return Values:
+  *     FAIL :  return value = 0
+  *     PASS :  return value = 1
+  *                                                                 
+  *******************************************************************/
+unsigned char  SSL_RAMtest_MarchCMinus()
+{
+    volatile uint8_t  testResult;
+
+//***********************************************
+    for(k=0;k<=(MAX_MEM_Cm-1);k++)
+    {
+	data_Cm[k]=0xAA;
+    }
+//***********************************************
+    for(k=0;k<=(MAX_MEM_Cm-1);k++)
+    {
+        if(data_Cm[k] != 0xAA)
+            return MARCHCminus_RAM_TEST_FAIL;
+	else
+            data_Cm[k]=0x55;
+    }
+//************************************************
+    for(k=0;k<=(MAX_MEM_Cm-1);k++)
+    {
+	if(data_Cm[k] != 0x55)
+            return MARCHCminus_RAM_TEST_FAIL;
+	else
+            data_Cm[k]=0xAA;
+    }
+//************************************************
+    for(k=(MAX_MEM_Cm-1);k>0;k--)
+    {
+	if(data_Cm[k] != 0xAA)
+            return MARCHCminus_RAM_TEST_FAIL;
+    	else
+            data_Cm[k]=0x55;
+    }
+    if(data_Cm[0] != 0xAA)
+        return MARCHCminus_RAM_TEST_FAIL;
+    else
+	data_Cm[0]=0x55;
+
+//***********************************************
+    for(k=(MAX_MEM_Cm-1);k>0;k--)
+    {
+	if(data_Cm[k] != 0x55)
+            return MARCHCminus_RAM_TEST_FAIL;
+    	else
+            data_Cm[k]=0xAA;
+    }
+    if(data_Cm[0] != 0x55)
+        return MARCHCminus_RAM_TEST_FAIL;
+    else
+	data_Cm[0]=0xAA;
+//***********************************************
+    return MARCHCminus_RAM_TEST_PASS;
+} // End of function
+

+ 52 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchCMinusRamTest.h

@@ -0,0 +1,52 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        MarchCMInusRamTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+#ifndef __SSL_MARCHCMINUS_RAM_TEST_H__
+#define __SSL_MARCHCMINUS_RAM_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define MARCHCminus_RAM_TEST_PASS 1u     	/*ONE if the Test passes.*/
+#define MARCHCminus_RAM_TEST_FAIL 0u          	/*ZERO if the Test Fails.*/
+
+#define MARCHC_MINUS_RAM_START_ADDRESS 0x000
+#define MARCHC_MINUS_RAM_STOP_ADDRESS  0xCFF
+#define MAX_MEM_Cm ( MARCHC_RAM_STOP_ADDRESS - MARCHC_RAM_START_ADDRESS +1 )
+
+
+uint8_t  SSL_RAMtest_MarchCMinus( void );  
+
+#endif

+ 221 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchCRamTest.c

@@ -0,0 +1,221 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchCRamTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip PIC® microcontroller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST data, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT                09/15/2008  First release of source file
+* Mike Cahill       11/11/2010	Updated for HI-TECH v9.80
+* MVL               02/22/2011	Modified for HI-TECH v9.81 & HI-TECH v9.80
+* VR                07/11/2012  Downgrade to C18
+*
+* Version 		1.03
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+
+#include "SSL_Class_B_Tests.h"
+
+
+#pragma idata RAMFIX2=0xE10
+uint16_t  j=0;
+uint8_t   *dataC = (uint8_t *)MARCHC_RAM_START_ADDRESS;
+
+
+
+
+/*******************************************************************
+* Description:
+*     This function that implements the MarchC test.
+*     This test is a destructive test !!!
+* Input:
+*     dataC[] :  pointer to an array declared in user memory
+*     MAX_MEM :  value indicating the number of bytes to test
+* Return Values:
+*     FAIL :  return value = 0
+*     PASS :  return value = 1
+*                                                                 
+*******************************************************************/
+uint8_t SSL_RAMtest_MarchC( void )
+{
+    volatile uint8_t testResult;
+
+//***********************************************
+    for(j=0;j<=(MAX_MEM_C-1);j++)
+    {
+	dataC[j]=0x00;
+    }
+
+//***********************************************
+    for(j=0;j<=(MAX_MEM_C-1);j++)
+    {
+	testResult = ReadZeroWriteOne( );
+	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+//************************************************
+    for(j=0;j<=(MAX_MEM_C-1);j++)
+    {
+    	testResult = ReadOneWriteZero( );
+    	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+//************************************************
+    for(j=0;j<=(MAX_MEM_C-1);j++)
+    {
+	testResult = ReadZero( );
+	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+//***********************************************
+    for(j=(MAX_MEM_C-1);j>0;j--)
+    {
+	testResult = ReadZeroWriteOne( );
+	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = ReadZeroWriteOne( );
+    if(!testResult)
+      return MARCHC_RAM_TEST_FAIL;
+//***********************************************
+    for(j=(MAX_MEM_C-1);j>0;j--)
+    {
+        testResult = ReadOneWriteZero( );
+	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = ReadOneWriteZero( );
+    if(!testResult)
+      return MARCHC_RAM_TEST_FAIL;
+//***********************************************
+    for(j=(MAX_MEM_C-1);j>0;j--)
+    {
+	testResult = ReadZero( );
+	if(!testResult)
+          return MARCHC_RAM_TEST_FAIL;
+    }
+    // do this once more time for zero
+    testResult = ReadZero( );
+    if(!testResult)
+      return MARCHC_RAM_TEST_FAIL;
+//***********************************************
+    return MARCHC_RAM_TEST_PASS;
+} // End of function
+
+
+
+/*******************************************************************
+* Description:
+*     This function tests bitwise if a bit is zero and replaces it
+*     with one.
+* Input:
+*     *test_dataC :  pointer to the byte to test
+* Return Values:
+*     FAIL :  return value = 0
+*     PASS :  return value = 1
+*                                                                 
+*******************************************************************/
+uint8_t  ReadZeroWriteOne( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    for(r=0;r<8;r++)
+    {
+	if((dataC[j] >>r) & 0x01)
+	{	
+            return MARCHC_RAM_TEST_FAIL;
+	}
+	else
+	{
+            imresult = 1<<r;
+            dataC[j] += imresult;
+	}
+    }
+    return MARCHC_RAM_TEST_PASS;
+}
+
+
+
+/******************************************************************
+* Description:
+*     This function tests bitwise if a bit is one and replaces it
+*     with zero.
+* Input:
+*     *test_dataC :  pointer to the byte to test
+* Return Values:
+*     FAIL :  return value = 0
+*     PASS :  return value = 1
+*                                                                
+******************************************************************/
+uint8_t  ReadOneWriteZero( void )
+{
+    volatile uint8_t  r;
+    volatile uint8_t  imresult;
+
+    for(r=0u;r<8u;r++)
+    {
+        if(((dataC[j] >>r) & 0x01) != 0x01)
+	{
+            return MARCHC_RAM_TEST_FAIL;
+	}
+	else
+	{
+            imresult = ~(1<<r);
+            dataC[j] &= imresult;
+	}
+    }
+    return MARCHC_RAM_TEST_PASS;
+}
+
+
+
+/***********************************************************
+* Description:
+*     This function tests bitwise if all bits are zeros .
+* Input:
+*     *test_dataC : pointer to the byte to test
+* Return Values:
+*     FAIL :  return value = 0
+*     PASS :  return value = 1
+*                                                         
+***********************************************************/
+uint8_t  ReadZero( void )
+{
+    volatile uint8_t  r;
+
+    for(r=0;r<8;r++)
+    {
+	if(dataC[j] != 0x00)
+	{	
+            return MARCHC_RAM_TEST_FAIL;
+	}
+    }
+    return MARCHC_RAM_TEST_PASS;
+}

+ 55 - 0
ProjectSource/BMS_Slave_RCT/SSL_MarchCRamTest.h

@@ -0,0 +1,55 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_MarchCRamTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+#ifndef __SSL_MARCHC_RAM_TEST_H__
+#define __SSL_MARCHC_RAM_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define MARCHC_RAM_TEST_PASS 1u
+#define MARCHC_RAM_TEST_FAIL 0u
+
+#define MARCHC_RAM_START_ADDRESS 0x012
+#define MARCHC_RAM_STOP_ADDRESS  0xCFF
+#define MAX_MEM_C ( MARCHC_RAM_STOP_ADDRESS - MARCHC_RAM_START_ADDRESS +1 )
+
+
+uint8_t  SSL_RAMtest_MarchC ( void );
+uint8_t  ReadZeroWriteOne   ( void );
+uint8_t  ReadOneWriteZero   ( void );
+uint8_t  ReadZero           ( void );
+
+#endif

+ 83 - 0
ProjectSource/BMS_Slave_RCT/SSL_ProgCounterTest.c

@@ -0,0 +1,83 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_ProgCounterTest.c
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC1´8FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Inc. (“Microchip”) licenses this software to you
+* solely for use with Microchip dsPIC® digital signal controller
+* products. The software is owned by Microchip and is protected under
+* applicable copyright laws.  All rights reserved.
+*
+* SOFTWARE IS PROVIDED “AS IS.”  MICROCHIP EXPRESSLY DISCLAIMS ANY
+* WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL MICROCHIP
+* BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
+* DAMAGES, LOST PROFITS OR LOST data, HARM TO YOUR EQUIPMENT, COST OF
+* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
+* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
+* ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
+*
+* REVISION HISTORY:
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Author            Date      Comments on this revision
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* CT                09/27/2007  First release of source file
+* Mike Cahill	    11/11/2010	Updated for HI-TECH v9.80
+* MVL		    02/22/2011	Tested with HI-TECH v9.81
+* VR KIT            07/11/2012  Downgrade to C18 v3.41
+* Version 	    1.03
+*
+*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ADDITIONAL NOTES:
+*
+**********************************************************************/
+#include "SSL_ProgCounterTest.h"
+
+
+uint16_t  returnAddress,tempAddress;
+int16_t   ProgramCounterResult;
+
+
+uint16_t  SSL_PCtest( void )
+{
+    //store Address of SSL_TestFunction1
+    tempAddress= (unsigned int)&SSL_TestFunction1;
+
+    // Branch to SSL_TestFunction1
+    returnAddress=SSL_TestFunction1();
+
+    // Test if the addresses match
+    if( tempAddress != returnAddress)
+      return	PROGRAM_COUNTER_TEST_FAIL;
+
+   // store Address of SSL_TestFunction2
+   tempAddress= (long )&SSL_TestFunction2;
+
+   // Branch to SSL_TestFunction2
+   returnAddress=SSL_TestFunction2();
+
+   // Test if the addresses match
+   if( tempAddress != returnAddress)
+     return	PROGRAM_COUNTER_TEST_FAIL;
+
+   return PROGRAM_COUNTER_TEST_PASS;
+}
+
+
+#pragma code my_code=0x400
+uint16_t  SSL_TestFunction1( void )
+{
+    return ( uint16_t )&SSL_TestFunction1;
+}
+
+
+#pragma code my_code1=0x500
+uint16_t  SSL_TestFunction2(void)
+{
+    return ( uint16_t )&SSL_TestFunction2;
+}

+ 51 - 0
ProjectSource/BMS_Slave_RCT/SSL_ProgCounterTest.h

@@ -0,0 +1,51 @@
+/**********************************************************************
+* © 2010 Microchip Technology Inc.
+*
+* FileName:        SSL_ProgCounterTest.h
+* Dependencies:    Header (.h) files if applicable, see below
+* Processor:       PIC18FXXX
+* Compiler:        C18 v3.41
+*
+* SOFTWARE LICENSE AGREEMENT:
+* Microchip Technology Incorporated ("Microchip") retains all ownership and 
+* intellectual property rights in the code accompanying this message and in all 
+* derivatives hereto.  You may use this code, and any derivatives created by 
+* any person or entity by or on your behalf, exclusively with Microchip's
+* proprietary products.  Your acceptance and/or use of this code constitutes 
+* agreement to the terms and conditions of this notice.
+*
+* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
+* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
+* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
+* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
+* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
+*
+* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
+* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
+* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
+* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
+* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
+* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULL..\h\EST EXTENT 
+* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
+* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
+* HAVE THIS CODE DEVELOPED.
+*
+* You agree that you are solely responsible for testing the code and 
+* determining its suitability.  Microchip has no obligation to modify, test, 
+* certify, or support the code.*/
+/**************************************************************************************/
+
+#ifndef __SSL_PROGRAM_COUNTER_TEST_H__
+#define __SSL_PROGRAM_COUNTER_TEST_H__
+
+#include "SSL_Class_B_Tests.h"
+
+#define   PROGRAM_COUNTER_TEST_PASS  1u
+#define   PROGRAM_COUNTER_TEST_FAIL  0u
+
+
+uint16_t SSL_PCtest        ( void );
+uint16_t SSL_TestFunction1 ( void );
+uint16_t SSL_TestFunction2 ( void );
+
+#endif

+ 51 - 0
Release_Notes/Release_History.txt

@@ -0,0 +1,51 @@
+Relase History - BMS Slave
+
+
+
+BMS_Slave.RCT.v217:               # EEPROM Read Bug behoben
+Datum: 30.01.2017; 		  
+Autor: Bi, Ot, Re		 
+		
+
+#######################################################################################################################
+
+BMS_Slave.RCT.v216:               # Temperaturfühlerreihenfolge für MUX2 angepasst 
+Datum: 16.01.2017; 		  # Synchronisierung von Messung und Balancing über beide LTC (Zelle 11 und 12) eingefügt 
+Autor: Bi, Ot, Re		 
+
+						
+
+#######################################################################################################################
+
+
+BMS_Slave.RCT.v215:               #  5V Messung und Prüfung eingefügt. Die Grenze auf 5% eingestellt, jede Sek. wird gemessen.  
+Datum: 15.12.2016; 		     Errorflag (LimitVoltage) im 0x2X6 Telegramm hinzugefügt --> Byte1 Bit6  
+Autor: Bi, Ot, Re		  #  Temperaturmessung angepasst (Multiplexer)
+				  #  auto. CANID Reihenfolgen-Bug behoben
+				  #  Temperatursensor Nr.25 Grenze auf 70°C eingestellt
+				  #  Slave sendet auch bei Errorflags weiter								
+
+#######################################################################################################################
+
+
+BMS_Slave.RCT.v214:                Das Shiftproblem bei der Spannungsmessung wurde korrigiert. Master muss ebenfalls die Software anpassen
+Datum: 01.12.2016; 		   Automatische ID Vergabe, Seriennummervergabe und der Seriennummervergleich wurde eingefügt.
+Autor: Bi, Ot, Re
+
+#######################################################################################################################
+
+BMS_Slave.RCT.v211:                Timeout Bug im Slave Behoben => Balancing wird bei unterbrochener KOmmunikation beendet
+Datum: 24.8.2016; 
+Autor: Bi, Ot, Re
+
+#######################################################################################################################
+
+BMS_Slave.RCT.v210:                Anpassung Grenzwerte 
+Datum: 9.6.2016;
+Autor: Bi, Ot, Re
+
+#######################################################################################################################
+
+BMS_Slave.RCT.v100:                Inbetriebnahme-SW; Release zum Testen des BMS Systems bei RCT; 
+Datum: 8.6.2016;
+Autor: Bi, Ot, Re