77 Serial.print(F(
"\n******************************************************************\n"));
78 Serial.print(F(
" LTC2983 Demonstration Program \n"));
79 Serial.print(F(
" \n"));
80 Serial.print(F(
" This program demonstrates how to read the multi-sensor \n"));
81 Serial.print(F(
" temperature measurement system. \n"));
82 Serial.print(F(
" \n"));
83 Serial.print(F(
" Set the baud rate to 115200 and select the newline terminator. \n"));
84 Serial.print(F(
"******************************************************************\n"));
90 void assign_channel(uint8_t chip_select, uint8_t channel_number, uint32_t channel_assignment_data)
105 SPI.transfer(highByte(start_address));
106 SPI.transfer(lowByte(start_address));
108 for (i=0; i< table_length; i++)
111 SPI.transfer((uint8_t)(coeff >> 16));
112 SPI.transfer((uint8_t)(coeff >> 8));
113 SPI.transfer((uint8_t)coeff);
116 SPI.transfer((uint8_t)(coeff >> 16));
117 SPI.transfer((uint8_t)(coeff >> 8));
118 SPI.transfer((uint8_t)coeff);
132 SPI.transfer(highByte(start_address));
133 SPI.transfer(lowByte(start_address));
135 for (i = 0; i < 6; i++)
137 coeff = steinhart_hart_coeffs[
i];
138 SPI.transfer((uint8_t)(coeff >> 24));
139 SPI.transfer((uint8_t)(coeff >> 16));
140 SPI.transfer((uint8_t)(coeff >> 8));
141 SPI.transfer((uint8_t)coeff);
152 void measure_channel(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
155 get_result(chip_select, channel_number, channel_output);
170 uint8_t process_finished = 0;
172 while (process_finished == 0)
175 process_finished = data & 0x40;
183 void get_result(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
188 uint32_t raw_conversion_result;
192 Serial.print(F(
"\nChannel "));
193 Serial.println(channel_number);
196 raw_conversion_result = raw_data & 0xFFFFFF;
206 fault_data = raw_data >> 24;
213 int32_t signed_data = raw_conversion_result;
217 if (signed_data & 0x800000)
218 signed_data = signed_data | 0xFF000000;
223 scaled_result = float(signed_data) / 1024;
224 Serial.print(F(
" Temperature = "));
225 Serial.println(scaled_result);
227 else if (channel_output ==
VOLTAGE)
229 scaled_result = float(signed_data) / 2097152;
230 Serial.print(F(
" Direct ADC reading in V = "));
231 Serial.println(scaled_result);
240 float voltage_or_resistance_result;
244 voltage_or_resistance_result = (float)raw_data/1024;
245 Serial.print(F(
" Voltage or resistance = "));
246 Serial.println(voltage_or_resistance_result);
254 Serial.print(F(
" FAULT DATA = "));
255 Serial.println(fault_byte, BIN);
258 Serial.println(F(
" - SENSOR HARD FALURE"));
260 Serial.println(F(
" - ADC_HARD_FAILURE"));
262 Serial.println(F(
" - CJ_HARD_FAILURE"));
264 Serial.println(F(
" - CJ_SOFT_FAILURE"));
266 Serial.println(F(
" - SENSOR_ABOVE"));
268 Serial.println(F(
" - SENSOR_BELOW"));
270 Serial.println(F(
" - ADC_RANGE_ERROR"));
271 if (!(fault_byte &
VALID))
272 Serial.println(F(
"INVALID READING !!!!!!"));
273 if (fault_byte == 0b11111111)
274 Serial.println(F(
"CONFIGURATION ERROR !!!!!!"));
284 uint32_t
transfer_four_bytes(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint32_t input_data)
286 uint32_t output_data;
287 uint8_t tx[7], rx[7];
289 tx[6] = ram_read_or_write;
290 tx[5] = highByte(start_address);
291 tx[4] = lowByte(start_address);
292 tx[3] = (uint8_t)(input_data >> 24);
293 tx[2] = (uint8_t)(input_data >> 16);
294 tx[1] = (uint8_t)(input_data >> 8);
295 tx[0] = (uint8_t) input_data;
299 output_data = (uint32_t) rx[3] << 24 |
300 (uint32_t) rx[2] << 16 |
301 (uint32_t) rx[1] << 8 |
308 uint8_t
transfer_byte(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint8_t input_data)
310 uint8_t tx[4], rx[4];
312 tx[3] = ram_read_or_write;
313 tx[2] = (uint8_t)(start_address >> 8);
314 tx[1] = (uint8_t)start_address;
326 return base_address + 4 * (channel_number-1);
334 for (uint8_t
i=0;
i< array_length;
i++)
336 if (number == array[
i])
#define CONVERSION_RESULT_MEMORY_BASE
void read_voltage_or_resistance_results(uint8_t chip_select, uint8_t channel_number)
#define SENSOR_HARD_FAILURE
bool is_number_in_array(uint8_t number, uint8_t *array, uint8_t array_length)
void assign_channel(uint8_t chip_select, uint8_t channel_number, uint32_t channel_assignment_data)
#define output_high(pin)
Set "pin" high.
void wait_for_process_to_finish(uint8_t chip_select)
Header File for Linduino Libraries and Demo Code.
void get_result(uint8_t chip_select, uint8_t channel_number, uint8_t channel_output)
#define CONVERSION_CONTROL_BYTE
#define COMMAND_STATUS_REGISTER
void write_custom_steinhart_hart(uint8_t chip_select, uint32_t steinhart_hart_coeffs[6], uint16_t start_address)
LTC2983: Multi-Sensor High Accuracy Digital Temperature Measurement System.
union LT_union_int32_4bytes data
LTC2983: Multi-Sensor High Accuracy Digital Temperature Measurement System.
void print_fault_data(uint8_t fault_byte)
#define output_low(pin)
Set "pin" low.
LTC2983: Multi-Sensor High Accuracy Digital Temperature Measurement System.
uint16_t get_start_address(uint16_t base_address, uint8_t channel_number)
void write_custom_table(uint8_t chip_select, struct table_coeffs coefficients[64], uint16_t start_address, uint8_t table_length)
LT_SPI: Routines to communicate with ATmega328P's hardware SPI port.
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.
void print_title()
Prints the title block when program first starts.
uint32_t transfer_four_bytes(uint8_t chip_select, uint8_t ram_read_or_write, uint16_t start_address, uint32_t input_data)
void print_conversion_result(uint32_t raw_conversion_result, uint8_t channel_output)
void spi_transfer_block(uint8_t cs_pin, uint8_t *tx, uint8_t *rx, uint8_t length)
Reads and sends a byte array.
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)