76 Serial.print(F(
"\n******************************************************************\n"));
77 Serial.print(F(
" LTC2986 Demonstration Program \n"));
78 Serial.print(F(
" \n"));
79 Serial.print(F(
" This program demonstrates how to read the multi-sensor \n"));
80 Serial.print(F(
" temperature measurement system. \n"));
81 Serial.print(F(
" \n"));
82 Serial.print(F(
" Set the baud rate to 115200 and select the newline terminator. \n"));
83 Serial.print(F(
"******************************************************************\n"));
89 void assign_channel(uint8_t chip_select, uint8_t channel_number, uint32_t channel_assignment_data)
104 SPI.transfer(highByte(start_address));
105 SPI.transfer(lowByte(start_address));
107 for (i=0; i< table_length; i++)
110 SPI.transfer((uint8_t)(coeff >> 16));
111 SPI.transfer((uint8_t)(coeff >> 8));
112 SPI.transfer((uint8_t)coeff);
115 SPI.transfer((uint8_t)(coeff >> 16));
116 SPI.transfer((uint8_t)(coeff >> 8));
117 SPI.transfer((uint8_t)coeff);
131 SPI.transfer(highByte(start_address));
132 SPI.transfer(lowByte(start_address));
134 for (i = 0; i < 6; i++)
136 coeff = steinhart_hart_coeffs[
i];
137 SPI.transfer((uint8_t)(coeff >> 24));
138 SPI.transfer((uint8_t)(coeff >> 16));
139 SPI.transfer((uint8_t)(coeff >> 8));
140 SPI.transfer((uint8_t)coeff);
151 void measure_channel(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
154 get_result(chip_select, channel_number, channel_output);
169 uint8_t process_finished = 0;
171 while (process_finished == 0)
174 process_finished = data & 0x40;
182 void get_result(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
187 uint32_t raw_conversion_result;
191 Serial.print(F(
"\nChannel "));
192 Serial.println(channel_number);
195 raw_conversion_result = raw_data & 0xFFFFFF;
205 fault_data = raw_data >> 24;
212 int32_t signed_data = raw_conversion_result;
216 if (signed_data & 0x800000)
217 signed_data = signed_data | 0xFF000000;
222 scaled_result = float(signed_data) / 1024;
223 Serial.print(F(
" Temperature = "));
224 Serial.println(scaled_result);
226 else if (channel_output ==
VOLTAGE)
228 scaled_result = float(signed_data) / 2097152;
229 Serial.print(F(
" Direct ADC reading in V = "));
230 Serial.println(scaled_result);
232 else if (channel_output ==
CODE)
234 Serial.print(F(
" Direct ADC code = "));
235 Serial.println(signed_data);
243 float voltage_or_resistance_result;
247 voltage_or_resistance_result = (float)raw_data/1024;
248 Serial.print(F(
" Voltage or resistance = "));
249 Serial.println(voltage_or_resistance_result);
257 Serial.print(F(
" FAULT DATA = "));
258 Serial.println(fault_byte, BIN);
261 Serial.println(F(
" - SENSOR HARD FALURE"));
263 Serial.println(F(
" - ADC_HARD_FAILURE"));
265 Serial.println(F(
" - CJ_HARD_FAILURE"));
267 Serial.println(F(
" - CJ_SOFT_FAILURE"));
269 Serial.println(F(
" - SENSOR_ABOVE"));
271 Serial.println(F(
" - SENSOR_BELOW"));
273 Serial.println(F(
" - ADC_RANGE_ERROR"));
274 if (!(fault_byte &
VALID))
275 Serial.println(F(
"INVALID READING !!!!!!"));
276 if (fault_byte == 0b11111111)
277 Serial.println(F(
"CONFIGURATION ERROR !!!!!!"));
287 uint32_t
transfer_four_bytes(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint32_t input_data)
289 uint32_t output_data;
290 uint8_t tx[7], rx[7];
292 tx[6] = ram_read_or_write;
293 tx[5] = highByte(start_address);
294 tx[4] = lowByte(start_address);
295 tx[3] = (uint8_t)(input_data >> 24);
296 tx[2] = (uint8_t)(input_data >> 16);
297 tx[1] = (uint8_t)(input_data >> 8);
298 tx[0] = (uint8_t) input_data;
302 output_data = (uint32_t) rx[3] << 24 |
303 (uint32_t) rx[2] << 16 |
304 (uint32_t) rx[1] << 8 |
311 uint8_t
transfer_byte(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint8_t input_data)
313 uint8_t tx[4], rx[4];
315 tx[3] = ram_read_or_write;
316 tx[2] = (uint8_t)(start_address >> 8);
317 tx[1] = (uint8_t)start_address;
329 return base_address + 4 * (channel_number-1);
337 for (uint8_t
i=0;
i< array_length;
i++)
339 if (number == array[
i])
#define CONVERSION_RESULT_MEMORY_BASE
bool is_number_in_array(uint8_t number, uint8_t *array, uint8_t array_length)
#define SENSOR_HARD_FAILURE
void read_voltage_or_resistance_results(uint8_t chip_select, uint8_t channel_number)
void assign_channel(uint8_t chip_select, uint8_t channel_number, uint32_t channel_assignment_data)
#define output_high(pin)
Set "pin" high.
Header File for Linduino Libraries and Demo Code.
void wait_for_process_to_finish(uint8_t chip_select)
void get_result(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
#define CONVERSION_CONTROL_BYTE
#define COMMAND_STATUS_REGISTER
LTC2983: Multi-Sensor High Accuracy Digital Temperature Measurement System.
void write_custom_steinhart_hart(uint8_t chip_select, uint32_t steinhart_hart_coeffs[6], uint16_t start_address)
union LT_union_int32_4bytes data
void print_fault_data(uint8_t fault_byte)
#define output_low(pin)
Set "pin" low.
LTC2986: Multi-Sensor High Accuracy Digital Temperature Measurement System.
uint16_t get_start_address(uint16_t base_address, uint8_t channel_number)
LT_SPI: Routines to communicate with ATmega328P's hardware SPI port.
void write_custom_table(uint8_t chip_select, struct table_coeffs coefficients[64], uint16_t start_address, uint8_t table_length)
void measure_channel(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
LT_I2C: Routines to communicate with ATmega328P's hardware I2C port.
LTC2986: Multi-Sensor High Accuracy Digital Temperature Measurement System.
uint32_t transfer_four_bytes(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint32_t input_data)
void spi_transfer_block(uint8_t cs_pin, uint8_t *tx, uint8_t *rx, uint8_t length)
Reads and sends a byte array.
void print_conversion_result(uint32_t raw_conversion_result, uint8_t channel_output)
void print_title()
Prints the title block when program first starts.
void convert_channel(uint8_t chip_select, uint8_t channel_number)
uint8_t transfer_byte(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint8_t input_data)