Introduction
The AIO has an onboard FRAM (FM24W256 - 128 pages of 256 bytes) connected via I2C to the DSPIC33E (The Master). FRAM is used to keep track of the real-time changes, Eeprom is used to store the settings. This document describes the FRAM memory locations used.
General Configuration Bytes (Page 0)
- Page 0 -> General data
- This byte represents the hour (time) of the last system startup.
- This byte represents the minute (time) of the last system startup.
- This byte represents the second (time) of the last system startup.
- This byte represents the day (date) of the last system startup.
- This byte represents the month (date) of the last system startup.
- This byte represents the year (date) of the last system startup.
- These 3 bytes represents the number of hours this system is ON. Byte 70 is the MSB (Most Significant Byte), Byte 72 is the LSB (Least Significant Byte).
- This byte represents the hour (time) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents the minute (time) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents the second (time) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents the day (date) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents the month (date) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents the year (date) of the last system startup with integrity problems of the pulse counters. If never an integrity problem happened, this value will be 0.
- This byte represents which pulse counter input had an integrity problem. When byte.BIT7 (MSB)=1 -> Pulse Counter input 7 had an integrity problem (Byte.BIT7=0 -> value is ok), when byte.BIT0 (LSB)=1 -> Pulse Counter input 0 had an integrity problem (Byte.BIT0=0 -> value is ok)
- This byte represents which pulse counter input had an integrity problem. When byte.BIT7 (MSB)=1 -> Pulse Counter input 15 had an integrity problem (Byte.BIT7=0 -> value is ok), when byte.BIT0 (LSB)=1 -> Pulse Counter input 8 had an integrity problem (Byte.BIT0=0 -> value is ok)
- This byte represents which pulse counter input had correct data loaded. When byte.BIT7 (MSB)=1 -> Pulse Counter input 7 had a correct pulse counter loaded (Byte.BIT7=0 -> value is not ok), when byte.BIT0 (LSB)=1 -> Pulse Counter input 0 had a correct pulse counter loaded (Byte.BIT0=0 -> value is not ok)
- This byte represents which pulse counter input had correct data loaded. When byte.BIT7 (MSB)=1 -> Pulse Counter input 15 had a correct pulse counter loaded (Byte.BIT7=0 -> value is not ok), when byte.BIT0 (LSB)=1 -> Pulse Counter input 8 had a correct pulse counter loaded (Byte.BIT0=0 -> value is not ok)
- This byte represents the next logging location. Event and error codes can be logged in FRAM (see page FRAM 53-58). If the logging location=0 then the 16 bytes will be written starting at FRAM location Byte53/Byte0, if byte=1 then the 16 bytes will be written at FRAM location Byte53/Byte16 etc
- Byte128: logging_location.MSB
- Byte129: logging_location.LSB
Data output modules (Page 1-10)
- Page 1 – 10 -> Contains data of the output modules, 32 bytes per module, 8 modules per page, 10 pages (80 modules maximum, 640 outputs -> 0-639)
- This page is entirely used for output module 0-7:
- * Module 0: Byte0..31
- * Module 1: Byte32..63
- * ...
- This page is entirely used for output module 8-15:
- * Module 8: Byte0..31
- * Module 9: Byte32..63
- * ...
- This page is entirely used for output module 16-23:
- * Module 16: Byte0..31
- * Module 17: Byte32..63
- * ...
...
- This page is entirely used for output module 72-79:
- * Module 72: Byte0..31
- * Module 73: Byte32..63
- * ...
Following Module structure is used:
- Byte 0 (or 32 or 64 ...): Output state of this output (8 outputs, 1 bit per output, 0=OFF, 1=ON)
- Byte 1 (or 33 or 65 ...): Dimmer value of output 0 of the concerning module
- Byte 2 (or 34 or 66 ...): Dimmer value of output 1 of the concerning module
- Byte 3 (or 35 or 67 ...): Dimmer value of output 2 of the concerning module
- Byte 4 (or 36 or 68 ...): Dimmer value of output 3 of the concerning module
- Byte 5 (or 37 or 69 ...): Dimmer value of output 4 of the concerning module
- Byte 6 (or 38 or 70 ...): Dimmer value of output 5 of the concerning module
- Byte 7 (or 39 or 71 ...): Dimmer value of output 6 of the concerning module
- Byte 8 (or 40 or 72 ...): Dimmer value of output 7 of the concerning module
- Byte 9 (or 41 or 73 ...): Output Unlock -> Represents the 8 bits for the 8 Outputs, BIT7 (MSB) -> Output 7 of this module, ..., BIT0 (LSB) -> Output 0 of this module. BITx=0 -> Output is unlocked, BITx=1 -> Output is locked.
Data shutter modules (Page 11-19)
- Page 11-19 -> Contains the real live (not configuration) data of a shutter and Shutter Group
- Page 11 Byte 0-7: Information regarding Shutter 0
- Page 11 Byte 8-15: Information regarding Shutter 1
- Page 11 Byte 16-23: Information regarding Shutter 2
- ...
- Page 18 Byte 248-255: Information regarding Shutter 255
Every Roller/Shutter has 8 bytes:
- 1st byte: Shutter status
- BIT0: =1-> direction UP, =0-> direction DOWN
- BIT1: =1-> shutter is locked, =0-> shutter is unlocked
- 2nd: Current shutter position (MSB)
- 3rd: Current shutter position (LSB)
- 4th: Open
- 5th: Open
- 6th: Open
- 7th: Open
- 8th: Open
- Page 19 Byte 0-7: Information regarding Shutter Group 0
- Page 19 Byte 8-15: Information regarding Shutter Group 1
- Page 19 Byte 16-23: Information regarding Shutter Group 2
- ...
- Page 19 Byte 248-255: Information regarding Shutter Group 31
Every Shutter Group has 8 bytes:
- 1st byte: Shutter Group status
- BIT0: =1-> direction group UP, =0-> direction DOWN
- BIT1: =1-> shutter group is locked, =0-> shutter group is unlocked
- 2nd: Current shutter group position (MSB)
- 3rd: Current shutter group position (LSB)
- 4th: Open
- 5th: Open
- 6th: Open
- 7th: Open
- 8th: Open
Timer data (Page 20-29)
- Page 20-29 -> Contains the timer data of each timer output
- Page 20 Byte 0-3: Information regarding Output 0
- Page 20 Byte 4-7: Information regarding Output 1
- Page 20 Byte 8-11: Information regarding Output 2
- ...
- Page 29 Byte 252-255: Information regarding Output 639
Every Output has 4 bytes:
- 1st: Timer Type:
- 0-> No Timer
- 1-> 100ms Time
- 2-> 1s timer
- 3-> 1m (minute) timer
- 2nd: Timer value MSB (Most Significant Byte)
- 3rd: Timer value LSB (Least Significant Byte)
- 4th: Not in use yet
Input data (Page 30-49)
- Page 30-49 -> Contains the dynamic data for the input modules
Every page represents 4 input modules. Each input module has 64 byte in FRAM to store dynamic data like pulse counter information and others.
- Page 20 Byte 0-63: Information regarding Input Module 0
- Page 20 Byte 64-127: Information regarding Input Module 2
- Page 20 Byte 128-191: Information regarding Input Module 3
- ...
- Page 21 Byte 0-63: Information regarding Input Module 5
- ...
Input UNLOCK
Every Input can be locked or unlocked. 1 Byte in Eeprom per module is used to keep the state if an Input is locked or unlocked. Every bit of that byte represents 1 Input (MSB -> Highest Input, LSB -> Lowest Input). When BITx=1 then the Input is locked, when BITx=0 the Input is unlocked. When an Input is locked, the Input state will not change anymore until the Input is unlocked.
Page
|
Byte
|
30-49 |
0,64,128,192
|
- Byte 0 (and 64,128,192): Represents the 8 bits for the 8 Inputs, BIT7 (MSB) -> Input 7 of this module, ..., BIT0 (LSB) -> Input 0 of this module. BITx=0 -> Input is unlocked, BITx=1 -> Input is locked.
Pulse Counter information (Page 50)
- Page 50 -> Contains the Pulse Counter information of the Inputs embedded on the Core/Core+
Pulse Counters of the internal inputs of the Core/Core+ are stored in FRAM memory. This information is stored twice (Bank 1 and 2) to avoid corruption when writing during a power failure. Each Pulse Counter consist of 4 bytes (the pulse counter) and 2 bytes (CRC16 calculated over the 4 bytes).
- Page 50 Byte 0-63: Pulse Counter information of the first 8 internal inputs - Bank 1
- Page 50 Byte 64-127: Pulse Counter information of the first 8 internal inputs - Bank 2
- Page 50 Byte 128-191: Pulse Counter information of the second 8 internal inputs - Bank 1 (Future use)
- Page 50 Byte 192-255: Pulse Counter information of the second 8 internal inputs - Bank 2 (Future use)
- Input 0-7 Bank 1 (48 bytes used - 16 bytes free)
- Byte 0: Pulse counter Input 0 Byte 3 (MSB)
- Byte 1: Pulse counter Input 0 Byte 2
- Byte 2: Pulse counter Input 0 Byte 1
- Byte 3: Pulse counter Input 0 Byte 0 (LSB)
- Byte 4: CRC16 Input 0 Byte 1 (MSB)
- Byte 5: CRC16 Input 0 Byte 0 (LSB)
- Byte 6: Pulse counter Input 1 Byte 3 (MSB)
- Byte 7: Pulse counter Input 1 Byte 2
- Byte 8: Pulse counter Input 1 Byte 1
- Byte 9: Pulse counter Input 1 Byte 0 (LSB)
- Byte 10: CRC16 Input 1 Byte 1 (MSB)
- Byte 11: CRC16 Input 1 Byte 0 (LSB)
- ...
- Input 0-7 Bank 2 (48 bytes used - 16 bytes free)
- Byte 64: Pulse counter Input 0 Byte 3 (MSB)
- Byte 65: Pulse counter Input 0 Byte 2
- Byte 66: Pulse counter Input 0 Byte 1
- Byte 67: Pulse counter Input 0 Byte 0 (LSB)
- Byte 68: CRC16 Input 0 Byte 1 (MSB)
- Byte 69: CRC16 Input 0 Byte 0 (LSB)
- Byte 70: Pulse counter Input 1 Byte 3 (MSB)
- Byte 71: Pulse counter Input 1 Byte 2
- Byte 72: Pulse counter Input 1 Byte 1
- Byte 73: Pulse counter Input 1 Byte 0 (LSB)
- Byte 74: CRC16 Input 1 Byte 1 (MSB)
- Byte 75: CRC16 Input 1 Byte 0 (LSB)
- ...
- Input 8-15 Bank 1 (48 bytes used - 16 bytes free)
- Byte 128: Pulse counter Input 8 Byte 3 (MSB)
- Byte 129: Pulse counter Input 8 Byte 2
- Byte 130: Pulse counter Input 8 Byte 1
- Byte 131: Pulse counter Input 8 Byte 0 (LSB)
- Byte 132: CRC16 Input 8 Byte 1 (MSB)
- Byte 133: CRC16 Input 8 Byte 0 (LSB)
- Byte 134: Pulse counter Input 9 Byte 3 (MSB)
- Byte 135: Pulse counter Input 9 Byte 2
- Byte 136: Pulse counter Input 9 Byte 1
- Byte 137: Pulse counter Input 9 Byte 0 (LSB)
- Byte 138: CRC16 Input 9 Byte 1 (MSB)
- Byte 139: CRC16 Input 9 Byte 0 (LSB)
- ...
- Input 8-15 Bank 2 (48 bytes used - 16 bytes free)
- Byte 192: Pulse counter Input 8 Byte 3 (MSB)
- Byte 193: Pulse counter Input 8 Byte 2
- Byte 194: Pulse counter Input 8 Byte 1
- Byte 195: Pulse counter Input 8 Byte 0 (LSB)
- Byte 196: CRC16 Input 8 Byte 1 (MSB)
- Byte 197: CRC16 Input 8 Byte 0 (LSB)
- Byte 198: Pulse counter Input 9 Byte 3 (MSB)
- Byte 199: Pulse counter Input 9 Byte 2
- Byte 200: Pulse counter Input 9 Byte 1
- Byte 201: Pulse counter Input 9 Byte 0 (LSB)
- Byte 202: CRC16 Input 9 Byte 1 (MSB)
- Byte 203: CRC16 Input 9 Byte 0 (LSB)
- ...
Temperature sensor Offset information (Page 51-52)
- Page 51 -> Contains the temperature Offset information for the temperature sensors
- Page 52 -> Reserved for future expansion
128 Temperature sensors are available. Every temperature sensor has 2 bytes for the offset:
- First byte: Offset as signed integer
- Second byte: Inverted First byte
These 2 bytes are used as a combination to make sure that the offset value hasn't been corrupted.
- Page 51 Byte 0-1: First and second byte for Offset of Temperature Sensor 0
- Page 51 Byte 2-3: First and second byte for Offset of Temperature Sensor 1
- Page 51 Byte 4-5: First and second byte for Offset of Temperature Sensor 2
- Page 51 Byte 6-7: First and second byte for Offset of Temperature Sensor 3
- ...
Error and Event logging (Page 53-84)
Some Error and Event codes (like health checker info, startup system, some errors) will be logged in FRAM. Each logging item consist of 16 bytes:
- Date and Time: 6 bytes
- Type of logging: 2 bytes
- Event and error data: 8 bytes
- 16 logging items per FRAM page, 32 pages: 512 logging items
The logging location for the next logging item is written in FRAM at Page0/Byte83(MSB)-84(LSB): If the logging location=0 then the 16 bytes will be written starting at FRAM location Byte53/Byte0, if logging location=1 then the 16 bytes will be written at FRAM location Byte53/Byte16 etc. After each 16 byte write operation, the logging location is updated (Page 0/Byte83-84).
When all 16 FRAM pages are written, the oldest location is overwritten.
- Page 53 -> Contains 16 logging items
- Page 54 -> Contains 16 logging items
- Page 55 -> Contains 16 logging items
- etc
- Page 53 Byte 0: Year
- Page 51 Byte 1: Month
- Page 51 Byte 2: Day
- Page 51 Byte 3: Hour
- Page 51 Byte 4: Minute
- Page 51 Byte 5: Second
- Page 51 Byte 6: Logging Type1
- Page 51 Byte 7: Logging Type2
- Page 51 Byte 8-15: Data0-7
- Page 53 Byte 16: Year
- Page 51 Byte 17: Month
- Page 51 Byte 18: Day
- Page 51 Byte 19: Hour
- Page 51 Byte 20: Minute
- Page 51 Byte 21: Second
- Page 51 Byte 22: Logging Type1
- Page 51 Byte 23: Logging Type2
- Page 51 Byte 24-31: Data0-7
...
Note:
- If Logging Type1='E' and Logging Type2='V' -> Event
- If Logging Type1='E' and Logging Type2='R' -> Error
- If Logging Type1='B' and Logging Type2='A' -> Basic Action
uCAN led status (Page 85-88) - Not implemented
- Page85/Byte0: Led brightness (0-255) of CAN led 0
- Page85/Byte1: Led function of CAN led 0
- Page85/Byte2: Led brightness (0-255) of CAN led 1
- Page85/Byte3: Led function of CAN led 1
- Page85/Byte4: Led brightness (0-255) of CAN led 2
- Page85/Byte5: Led function of CAN led 2
- ...
- Page85/Byte254: Led brightness (0-255) of CAN led 127
- Page85/Byte255: Led function of CAN led 127
- Page86/Byte0: Led brightness (0-255) of CAN led 127
- Page86/Byte1: Led function of CAN led 128
- Page86/Byte2: Led brightness (0-255) of CAN led 128
- Page86/Byte3: Led function of CAN led 128
- ...
BB reserved pages (Page 126-127)
These 2 pages are reserved for setting and logging information of the BB.