The following describes the data storage and record format of SDHC memory cards used in ASIMET instrumentation with Ver5.xx and later firmware (on Microchip PIC24-based microcontroller hardware).
Three files are created when the SDHC card is initialized for the ASIMET module. ??? in each filename is replaced with the first 3 digits of the serial numnber specified in the UOK command under Menu #2 - MODSER. AESWR???.ID contains ID information from the module. This includes the firmware revision - the SDHC card will NOT store data from the module if the firmware version in the PIC24 FLASH does not match the firmware version written to the AESWR???.ID file; a warning is issued in the L (status command). AESWR???.INF is a user-writeable file of up to 500 characters of arbitrary text, accessed via the SDOK command. AESWR???.DAT is the file containing the one-hour records of module data.
The SDHC data file (AESWR???.DAT) consumes as much of the SDHC card as needed to store the one-hour data records. Each record is 336 bytes long, as described in the data structure below. Each record contains the date and time written, 60 minutes of IEEE single-precision shortwave radiation data, some engineering data, some spare bytes, a flag which is set to 0xA5A5 when the record is written, and a 2 byte CRC of the previous 334 bytes. The actual C language struct is reproduced here to show the format of the stored image.
/* this is the SWR data record structure, 336 bytes */ struct SWR_record { struct time_type time1; /* 8 bytes of time */ char record_size[6]; /* record size ascii */ unsigned short rsize; /* record size */ float swr_cal[60]; /* 60 minutes of SWR data */ float v3_3,vbat; /* rail & battery in volts DC */ float brdtemp; /* board temperature in degC */ char version[24]; /* firmware version (from code) */ char brdversion[16]; /* PC board version (from code) */ char modser[4]; /* first 3 digits of module serial number (from eeprom) */ char senser[8]; /* up to 7 digits of sensor serial number from (eeprom) */ unsigned char unused[4]; /* future use */ unsigned short used; /* set to 0xA5A5 upon record write */ unsigned short swr_CRC; /* CRC of previous 334 bytes (unused) */ };struct time_type { unsigned char sec; unsigned char min; unsigned char hour; unsigned char day; unsigned char dow; /* day of week - NOT USED */ unsigned char mon; unsigned int year; };
Note that time structure is NOT ANSI-compatible.
The offsets and sizes of the record components is shown below.
byte # size name comment 0 8 time 8 bytes of time 8 6 record_size data record size ascii 14 2 rsize data record size integer 16 4 swr_cal[0] minute 0 SWR data 20 4 swr_cal[1] minute 1 SWR data . . . 248 4 swr_cal[58] minute 58 SWR data 252 4 swr_cal[59] minute 59 SWR data 256 4 v3_3 3.3v rail voltage 260 4 vbat battery supply voltage 264 4 brdtemp board temperature in degrees C 268 24 firmware version (ascii) 292 16 PC board revision (ascii) 308 4 first 3 digits of module serial number (ascii) 312 8 up to 7 digits of sensor serial number (ascii) 320 12 reserved 332 2 used flag set to A5A5h when record is written 334 2 swr_CRC CRC of previous 318 bytes
Data is written to the SDHC card immediately following the acquisition of data at the rollover to the 59th minute of each hour. This is reflected in the time stamp on each record, typically 1 second into minute 59.
The byte order of the numeric values stored by the ASISWR24 firmware used on Microchip PIC24-based module boards is the same as Intel-based PC's. That is, a long integer (4 bytes) or short integer (2 bytes) stored by a PIC24-based module will be LS byte first in memory, and floats are stored with mantissa first. The is opposite to older VOS firmware for module boards based on Dallas Semi DS87C530 micros. See the float storage format below.
The "used" flag value is used to simplify finding the end of valid records the .DAT file; as each record is written, the "used" flag is set to A5A5h to provide a distinct pattern to search on for good records.
The CRC is NOT IMPLEMENTED.
"float" 4 byte values are IEEE-754 single-precision float.
Storage format for these float values is as follows:
byte addr +0 +1 +2 +3 contents MMMMMMMM MMMMMMMM EMMMMMMM SEEEEEEE where S => Sign bit; 1 = negative, 0 = positive E => Exponent (2's comp) with offset 127 (decimal) M => 23-bit normal mantissa (highest bit always 1 and therefore not stored)