Прерывание в 5 микросекунд - это непростая задача для процессора с частотой 80 МГц, и у него останется мало времени для другой работы, а если вы не выполняете другую работу, вам вообще не нужно использовать прерывания - вы можете просто опросить счетчик часов; тогда для решения довольно тривиальной задачи все равно потребуется много процессора - да и ОСРВ тоже излишняя.
Лучший способ выполнить вашу задачу - использовать функцию таймера ШИМ (широтно-импульсная модуляция). После этого вы сможете точно регулировать яркость без дополнительных затрат на программное обеспечение; оставляя процессор заниматься более интересными делами.
Используя ШИМ, вы могли бы справиться с процессором с гораздо меньшей производительностью, если бы это было только светодиодное управление.
Если вы должны использовать прерывание / GPIO (например, ваш таймер не поддерживает генерацию ШИМ или светодиод не подключен к выводу, поддерживающему ШИМ), тогда было бы более эффективно установить таймер постепенно. Так, например, для mark: space 150: 105 вы должны установить таймер на 150 * 5 мкс (9,6 мс), при прерывании переключить GPIO, а затем установить таймер на 105 * 5 мкс (6,72 мс).
Основная проблема с вашим решением заключается в том, что обработчик прерывания не возвращает - прерывания должны выполняться до завершения и быть как можно более короткими и предпочтительно детерминированными по времени выполнения.
Без использования аппаратного ШИМ следующий фрагмент кода, вероятно, будет ближе к тому, что вам нужно:
#define PWM_QUANTA = 400 ; // 5us
static volatile uint8_t brightness = 150 ;
static Clock_Handle myClock ;
void setBrightness( uint8_t br )
{
brightness = br ;
}
void SetUp(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
GPIOPinTypeGPIOOutput(PORT_4, PIN_1);
Clock_Params clockParams;
Error_Block eb;
Error_init(&eb);
Clock_Params_init(&clockParams);
clockParams.period = brightness * PWM_QUANTA ;
clockParams.startFlag = TRUE;
myClock = Clock_create(myHandler1, 400, &clockParams, &eb);
if (myClock == NULL)
{
System_abort("Clock create failed");
}
}
void myHandler1(void)
{
static int pin_state = 1 ;
// Toggle pin state and timer period
if( pin_state == 0 )
{
pin_sate = 1 ;
Clock_setPeriod( myClock, brightness * PWM_QUANTA ) ;
}
else
{
pin_sate = 0 ;
Clock_setPeriod( myClock, (255 - brightness) * PWM_QUANTA ) ;
}
// Set pin state
GPIOPinWrite(PORT_4, PIN_1, pin_state) ;
}
person
Clifford
schedule
21.01.2017
uint8_t
, вам тоже не нужен% 256
. - person Clifford   schedule 21.01.2017