void app_cpu_load_task(void) { static uint8_t bar_pos_last = 0; uint8_t bar_pos; /* Wait a total time > 250ms to update display each 250ms */ if ((app_cpu_load_time_active + app_cpu_load_time_sleep) < ((32000lu / 256lu) * 250)) { return; } /* Compute CPU load */ if (tc45_is_overflow(&TCC4)) { tc45_clear_overflow(&TCC4); bar_pos = DISPLAY_CPU_LOAD_PROBAR_MAX_SIZE_X; } else { bar_pos = (app_cpu_load_time_active * DISPLAY_CPU_LOAD_PROBAR_MAX_SIZE_X) / (app_cpu_load_time_active + app_cpu_load_time_sleep); } /* Update progress bar */ if (bar_pos_last < bar_pos) { gfx_mono_draw_filled_rect( DISPLAY_CPU_LOAD_PROBAR_POS_X + bar_pos_last, DISPLAY_CPU_LOAD_PROBAR_POS_Y, bar_pos - bar_pos_last, DISPLAY_CPU_LOAD_PROBAR_SIZE_Y, GFX_PIXEL_SET); } else if (bar_pos_last > bar_pos) { gfx_mono_draw_filled_rect( DISPLAY_CPU_LOAD_PROBAR_POS_X + bar_pos, DISPLAY_CPU_LOAD_PROBAR_POS_Y, bar_pos_last - bar_pos, DISPLAY_CPU_LOAD_PROBAR_SIZE_Y, GFX_PIXEL_CLR); } bar_pos_last = bar_pos; /* Reset counters */ app_cpu_load_time_active = 0; app_cpu_load_time_sleep = 0; }
/** * \brief Timer Counter Overflow interrupt callback function * * This function is called when an overflow interrupt has occurred on * TCC4 and toggles LED0. */ static void example_ovf_interrupt_callback(void) { gpio_toggle_pin(LED0_GPIO); tc45_clear_overflow(&TCC4); }
/** * \brief Timer Counter Overflow interrupt callback function * * This function is called when an overflow interrupt has occurred (50ms) on * TCD5 and change PWM duty single generation on TCD5 CCA. */ static void example_overflow_interrupt_callback(void) { tc45_write_cc(&TCD5, TC45_CCA, tc45_read_cc(&TCD5, TC45_CCA) + 0xA00); tc45_clear_overflow(&TCC4); }
// Software PWM routine from AVR136 static void pwm_callback(void) { static uint8_t portlevelA=PORTA_MASK, portlevelD=PORTD_MASK, portlevelR=PORTR_MASK; static uint8_t softcount=0xFF; // update outputs PORTA.OUT = portlevelA; PORTD.OUT = portlevelD; PORTR.OUT = portlevelR; // unrolled for speed -- process for NUM_CHANNELS if (++softcount == 0) { compare[0] = compbuff[0]; compare[1] = compbuff[1]; compare[2] = compbuff[2]; compare[3] = compbuff[3]; compare[4] = compbuff[4]; compare[5] = compbuff[5]; compare[6] = compbuff[6]; compare[7] = compbuff[7]; compare[8] = compbuff[8]; compare[9] = compbuff[9]; compare[10] = compbuff[10]; compare[11] = compbuff[11]; compare[12] = compbuff[12]; compare[13] = compbuff[13]; compare[14] = compbuff[14]; compare[15] = compbuff[15]; compare[16] = compbuff[16]; compare[17] = compbuff[17]; #ifdef PWM_SINK // set all pins low portlevelA &= ~PORTA_MASK; portlevelD &= ~PORTD_MASK; portlevelR &= ~PORTR_MASK; #else // set all pins high portlevelA |= PORTA_MASK; portlevelD |= PORTD_MASK; portlevelR |= PORTR_MASK; #endif } if (compare[0] == softcount) CH1_SET; if (compare[1] == softcount) CH2_SET; if (compare[2] == softcount) CH3_SET; if (compare[3] == softcount) CH4_SET; if (compare[4] == softcount) CH5_SET; if (compare[5] == softcount) CH6_SET; if (compare[6] == softcount) CH7_SET; if (compare[7] == softcount) CH8_SET; if (compare[8] == softcount) CH9_SET; if (compare[9] == softcount) CH10_SET; if (compare[10] == softcount) CH11_SET; if (compare[11] == softcount) CH12_SET; if (compare[12] == softcount) CH13_SET; if (compare[13] == softcount) CH14_SET; if (compare[14] == softcount) CH15_SET; if (compare[15] == softcount) CH16_SET; if (compare[16] == softcount) CH17_SET; if (compare[17] == softcount) CH18_SET; tc45_clear_overflow(&TCC4); }