57 static void read_a_sample(IRPyro_sensor_device_type* this_device);
112 #define NUMBER_OF_SAMPLES_TO_COUNT 6000000
114 IRPyro_sensor_device_type IRPyro_Sensor =
121 .number_of_active_channels = 1,
127 AFE_reg_type IRPyro_Sensor_AFE =
130 .LP = LOW_POWER_DISABLE,
132 .C_LP = LOW_PASS_180,
133 .CLK_OUT = CLK_ENABLE,
135 .TEMP = TEMP_DISABLE,
139 CCP_reg_type IRPyro_Sensor_Ch_Cfg =
141 .Feedback_cap = FEEDBACK_200_80,
142 .High_pass_filter_setting = HIGH_PASS_1HZ,
143 .Feedback_transconductance = TCONDUCT_1_2T,
144 .status_bit = CH_ENABLE
147 WUP_reg_type IRPyro_Sensor_WUP_Cfg =
149 .UHT = MAX_WUP_THRESHOLD,
150 .ULT = SAFE_WUP_THRESHOLD,
151 .LHT = MIN_WUP_THRESHOLD,
152 .LLT = MIN_WUP_THRESHOLD,
153 .WT_Threshold = DEFAULT_NO_EVENTS,
154 .DP0_DP2 = NOT_IN_USE_VALUE,
156 .ST = SLEEP_MODE_ONE_CH
159 IRPyro_Sensor.AFE_register = IRPyro_Sensor_AFE;
160 IRPyro_Sensor.CCP_register[2] = IRPyro_Sensor_Ch_Cfg;
161 IRPyro_Sensor.WUP_register = IRPyro_Sensor_WUP_Cfg;
164 Micro_controller_template_init();
169 IRPyro_open(&IRPyro_Sensor);
176 IRPyro_read(&IRPyro_Sensor);
178 UART_stream_char_send(IRPyro_Sensor.channel_value, IRPyro_Sensor.channel_saturation_byte);
185 IRPyro_close(&IRPyro_Sensor);
196 #define NUMBER_OF_FRAMES_TO_COUNT 3 // change to the desired number
197 #define IRPyro_FRAME_COUNT_LOCATION 5 // position on the user data buffer
198 uint16_t sample_counter = 0;
204 if(this_device->AFE_register.C_LP)
206 read_delay = (this_device->AFE_register.S7_S0 +1)*6;
210 read_delay = this_device->AFE_register.S7_S0 +1;
212 IRPyro_read(this_device);
215 Micro_controller_delay_ms(read_delay);
216 if (IRPyro_read(this_device))
219 UART_stream_char_send(this_device->channel_value, this_device->channel_saturation_byte);
245 #define IRPyro_MAXINT 2147483647
248 IRPyro_devices IRPyro_device = {0};
252 AFE_reg_type IRPyro_AFE_Master =
255 .LP = LOW_POWER_DISABLE,
257 .C_LP = LOW_PASS_180,
258 .CLK_OUT = CLK_ENABLE,
260 .TEMP = TEMP_DISABLE,
263 AFE_reg_type IRPyro_AFE_Slave =
266 .LP = LOW_POWER_DISABLE,
268 .C_LP = LOW_PASS_180,
269 .CLK_OUT = CLK_DISABLE,
271 .TEMP = TEMP_DISABLE,
275 CCP_reg_type IRPyro_Ch_Cfg =
277 .Feedback_cap = FEEDBACK_200_80,
278 .High_pass_filter_setting = HIGH_PASS_1HZ,
279 .Feedback_transconductance = TCONDUCT_1_2T,
280 .status_bit = CH_ENABLE
283 WUP_reg_type IRPyro_WUP_Cfg =
285 .UHT = MAX_WUP_THRESHOLD,
286 .ULT = SAFE_WUP_THRESHOLD,
287 .LHT = MIN_WUP_THRESHOLD,
288 .LLT = MIN_WUP_THRESHOLD,
289 .WT_Threshold = DEFAULT_NO_EVENTS,
290 .DP0_DP2 = NOT_IN_USE_VALUE,
292 .ST = SLEEP_MODE_ONE_CH
294 uint8_t num_of_IRPyro_on_demo_board = 4;
297 IRPyro_device[0].INT_Port = 1;
298 IRPyro_device[0].CS_Port = 2;
299 IRPyro_device[0].CS_Pin = 1;
300 IRPyro_device[0].INT_Pin = 4;
301 IRPyro_device[0].address = 0x70;
303 IRPyro_device[1].CS_Port = 2;
304 IRPyro_device[1].INT_Port = 1;
305 IRPyro_device[1].CS_Pin = 5;
306 IRPyro_device[1].INT_Pin = 5;
307 IRPyro_device[1].address = 0x69;
309 IRPyro_device[2].CS_Port = 2;
310 IRPyro_device[2].INT_Port = 1;
311 IRPyro_device[2].CS_Pin = 4;
312 IRPyro_device[2].INT_Pin = 6;
313 IRPyro_device[2].address = 0x68;
315 IRPyro_device[3].CS_Port = 2;
316 IRPyro_device[3].INT_Port = 1;
317 IRPyro_device[3].CS_Pin = 3;
318 IRPyro_device[3].INT_Pin = 7;
319 IRPyro_device[3].address = 0x67;
322 IRPyro_device[0].number_of_active_channels =1;
323 IRPyro_device[0].AFE_register = IRPyro_AFE_Master;
324 IRPyro_device[0].CCP_register[2] = IRPyro_Ch_Cfg;
325 IRPyro_device[0].WUP_register = IRPyro_WUP_Cfg;
327 IRPyro_device[1].number_of_active_channels =1;
328 IRPyro_device[1].AFE_register = IRPyro_AFE_Slave;
329 IRPyro_device[1].CCP_register[2] = IRPyro_Ch_Cfg;
330 IRPyro_device[1].WUP_register = IRPyro_WUP_Cfg;
332 IRPyro_device[2].number_of_active_channels =1;
333 IRPyro_device[2].AFE_register = IRPyro_AFE_Slave;
334 IRPyro_device[2].CCP_register[2] = IRPyro_Ch_Cfg;
335 IRPyro_device[2].WUP_register = IRPyro_WUP_Cfg;
337 IRPyro_device[3].number_of_active_channels =1;
338 IRPyro_device[3].AFE_register = IRPyro_AFE_Slave;
339 IRPyro_device[3].CCP_register[2] = IRPyro_Ch_Cfg;
340 IRPyro_device[3].WUP_register = IRPyro_WUP_Cfg;
343 Micro_controller_template_init();
350 IRPyro_open_devices(IRPyro_device, num_of_IRPyro_on_demo_board);
354 IRPyro_read_devices(IRPyro_device, num_of_IRPyro_on_demo_board);
355 for(
int i=0; i<IRPyro_LIST_SIZE; ++i)
357 UART_PutString(USART2, (uint8_t*)
"SENSOR:");
358 UART_PutNumber(USART2, (uint32_t)i);
359 UART_PutString(USART2, (uint8_t*)
" , ");
360 UART_stream_char_send(IRPyro_device[i].channel_value, IRPyro_device[i].channel_saturation_byte);
365 IRPyro_close_devices(IRPyro_device, 4);
390 IRPyro_sensor_device_type IRPyro_Sensor =
397 .number_of_active_channels = 1,
401 AFE_reg_type IRPyro_AFE_Single =
404 .LP = LOW_POWER_DISABLE,
406 .C_LP = LOW_PASS_180,
407 .CLK_OUT = CLK_ENABLE,
409 .TEMP = TEMP_DISABLE,
412 CCP_reg_type IRPyro_Ch_Cfg =
414 .Feedback_cap = FEEDBACK_200_80,
415 .High_pass_filter_setting = HIGH_PASS_1HZ,
416 .Feedback_transconductance = TCONDUCT_1_2T,
417 .status_bit = CH_ENABLE
420 Micro_controller_template_init();
426 IRPyro_Sensor.AFE_register = IRPyro_AFE_Single;
427 IRPyro_Sensor.CCP_register[2] = IRPyro_Ch_Cfg;
429 IRPyro_cmd_type IOCTL_cmd = {0};
430 IRPyro_arg_type IOCTL_arg = {0};
432 IRPyro_open(&IRPyro_Sensor);
434 IOCTL_cmd.cmd = sampling_rate_get;
435 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
438 IOCTL_cmd.cmd = sampling_rate_set;
439 IOCTL_arg.arg = 0x0A;
440 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
443 IOCTL_cmd.cmd = sampling_rate_set;
444 IOCTL_arg.arg = 0x00;
445 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
448 IOCTL_cmd.cmd = high_pass_set;
449 IOCTL_arg.arg = HIGH_PASS_2HZ;
450 IOCTL_arg.channel = 1;
451 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
454 IOCTL_cmd.cmd = high_pass_get;
455 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
458 IOCTL_cmd.cmd = high_pass_set;
459 IOCTL_arg.arg = HIGH_PASS_8HZ;
460 IOCTL_arg.channel = 2;
461 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
464 IOCTL_cmd.cmd = high_pass_get;
467 IOCTL_cmd.cmd = low_pass_set;
468 IOCTL_arg.arg = LOW_PASS_45;
469 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
472 IOCTL_cmd.cmd = low_pass_get;
473 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
476 IOCTL_cmd.cmd = gain_set;
477 IOCTL_arg.arg = GAIN_08;
478 IOCTL_arg.channel = 3;
479 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
482 IOCTL_cmd.cmd = gain_get;
483 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
486 IOCTL_cmd.cmd = gain_set;
487 IOCTL_arg.arg = GAIN_16;
488 IOCTL_arg.channel = 4;
489 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
492 IOCTL_cmd.cmd = power_normal;
493 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
496 IOCTL_cmd.cmd = power_low;
497 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
500 IOCTL_cmd.cmd = power_sleep;
501 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
503 IOCTL_cmd.cmd = power_wakeup;
504 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
506 IOCTL_cmd.cmd = power_off;
507 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
509 IRPyro_close(&IRPyro_Sensor);
528 #define TIME_TO_WAIT 600000
530 IRPyro_sensor_device_type IRPyro_single_sensor = {0};
532 uint8_t wake_up_detected = 0;
533 IRPyro_cmd_type IOCTL_cmd = {0};
534 IRPyro_arg_type IOCTL_arg = {0};
537 IRPyro_single_sensor.CS_Port = 2;
538 IRPyro_single_sensor.CS_Pin = 1;
539 IRPyro_single_sensor.INT_Port = 1;
540 IRPyro_single_sensor.INT_Pin = 4;
542 IRPyro_single_sensor.read_mode = 0;
543 IRPyro_single_sensor.address = 0x08;
544 IRPyro_single_sensor.number_of_active_channels = 1;
546 IRPyro_single_sensor.WUP_register.UHT = MAX_WUP_THRESHOLD;
547 IRPyro_single_sensor.WUP_register.ULT = SAFE_WUP_THRESHOLD;
548 IRPyro_single_sensor.WUP_register.LHT = MIN_WUP_THRESHOLD;
549 IRPyro_single_sensor.WUP_register.LLT = MIN_WUP_THRESHOLD;
550 IRPyro_single_sensor.WUP_register.WT_Threshold = DEFAULT_NO_EVENTS;
551 IRPyro_single_sensor.WUP_register.DP0_DP2 = NOT_IN_USE_VALUE;
552 IRPyro_single_sensor.WUP_register.CH0_CH2 = SEL_CH_2;
553 IRPyro_single_sensor.WUP_register.ST = SLEEP_MODE_ONE_CH;
555 Micro_controller_template_init();
560 UART_PutString(USART2, (uint8_t*)
"15 Configure sensor WAKE UP EVENT, SEND TO SLEEP, DETECT WAKE UP \n");
561 IRPyro_open(&IRPyro_single_sensor);
562 UART_PutString(USART2, (uint8_t*)
"WAKE UP EVENT DETECTION BY HARDWARE INTERRUPT \n");
565 UART_PutString(USART2, (uint8_t*)
"SET IRPyro ON POWER NORMAL \n");
566 IOCTL_cmd.cmd = power_normal;
567 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
570 UART_PutString(USART2, (uint8_t*)
"SET IRPyro ON POWER SLEEP \n");
571 IOCTL_cmd.cmd = power_sleep;
572 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
575 UART_PutString(USART2, (uint8_t*)
"SEND MCU TO SLEEP \n");
576 UART_PutString(USART2, (uint8_t*)
"WAIT FOR IRPyro TO WAKE MCU \n");
581 PWR_EnterSleepMode(PWR_SLEEPEntry_WFI);
586 wake_up_detected = EXTI_detected(0);
589 while ((time_to_wait != 0) && (wake_up_detected == 0));
591 if (time_to_wait == 0 && wake_up_detected == 0)
593 IOCTL_cmd.cmd = power_wakeup;
594 UART_PutString(USART2, (uint8_t*)
"FORCED POWER WAKE UP \n");
595 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
596 UART_PutString(USART2, (uint8_t*)
"READ TEST AFTER FORCED POWER WAKE UP \n");
601 UART_PutString(USART2, (uint8_t*)
"WAKE UP EVENT DETECTED!! \n");
602 UART_PutString(USART2, (uint8_t*)
"READ TEST AFTER WAKE UP EVENT \n");
606 IRPyro_close(&IRPyro_single_sensor);
608 UART_PutString(USART2, (uint8_t*)
"============\n");
609 UART_PutString(USART2, (uint8_t*)
"--------------WAKE UP EVENT DETECTION BY HARDWARE INTERRUPT-------------------------\n");
625 uint8_t uart_byte = (uint8_t)USART_ReceiveData(USART2);
642 uint8_t num_of_IRPyro = *list_size;
643 uint8_t devices_present =0;
644 for(uint8_t current=0 ; current < num_of_IRPyro; ++ current)
646 if (IRPyro_open(&this_list[current]) == 1)
651 *list_size = devices_present;
659 CS_pin_set(2,1,state);
660 CS_pin_set(2,3,state);
661 CS_pin_set(2,4,state);
662 CS_pin_set(2,5,state);