Скорее я не вижу ошибки или в компиляторе есть ошибка ;-). Я пытаюсь использовать TCA0 на ATTiny1606, чтобы сгенерировать ШИМ и затемнить некоторые светодиоды. Проблема в том, что прерывания никогда не вызываются. Система работает на внутреннем генераторе с частотой 20 МГц и настроена правильно.
Конфигурация ТСА0
int main(void)
{
// ...
TCA0.SINGLE.PER = 0xFFFF;
TCA0.SINGLE.CMP0 = 0x1FFF;
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm | TCA_SINGLE_CMP0_bm;
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV2_gc | TCA_SINGLE_ENABLE_bm;
sei();
// ...
while (1)
{
// ...
}
}
Подпрограммы прерываний
ISR(TCA0_OVF_vect)
{
PORTA.OUTCLR = PIN6_bm;
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
ISR(TCA0_CMP0_vect)
{
PORTA.OUTSET = PIN6_bm;
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm;
}
Прерывания никогда не вызываются. Даже если я включу задержку (я знаю, что этого никогда не следует делать) в целях тестирования, программа все равно будет работать. Так может быть я забыл установить какой-то бит в регистрах управления или что мне не хватает?
Нет сигнала на PA6 или любом другом выходе, который я настроил. Я также пробовал разные прескалеры и настройки!
Вы настроили PA6 как выход с помощью PORTA.DIR = PIN6_bm;? или предоставьте полный код конфигурации.
@hcheung Спасибо за помощь. Все было настроено правильно.





Извините, что беспокою вас, но из-за ошибки конфигурации прерывания не были установлены правильно во время компиляции. Проблема была не в препроцессоре, компиляторе или чем-то еще. Проблема заключалась в том, что пользователь находился перед экраном. После долгой отладки кода и сборки я обнаружил ошибку в своей конфигурации:
Когда я создавал проект, я выбрал не тот микроконтроллер (ATTiny406 вместо ATTiny1606). Какой беспорядок! Теперь все работает нормально и прерывания вызываются правильно.
Я не буду удалять вопрос. Возможно, это поможет кому-то с той же ошибкой!
Большое спасибо за помощь @hcheung
Откуда вы знаете, что прерывания никогда не срабатывают? Если у вас нет логического анализатора или осциллографа, измените выбор часов на
TCA_SINGLE_CLKSEL_DIV1024_gcи подключите светодиод к PA6 (если вы еще этого не сделали), чтобы вы могли визуально наблюдать за ним.