ATTiny1606 Прерывание таймера TCA0 не срабатывает

Скорее я не вижу ошибки или в компиляторе есть ошибка ;-). Я пытаюсь использовать 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;
}

Прерывания никогда не вызываются. Даже если я включу задержку (я знаю, что этого никогда не следует делать) в целях тестирования, программа все равно будет работать. Так может быть я забыл установить какой-то бит в регистрах управления или что мне не хватает?

Откуда вы знаете, что прерывания никогда не срабатывают? Если у вас нет логического анализатора или осциллографа, измените выбор часов на TCA_SINGLE_CLKSEL_DIV1024_gc и подключите светодиод к PA6 (если вы еще этого не сделали), чтобы вы могли визуально наблюдать за ним.

hcheung 21.03.2024 12:47

Нет сигнала на PA6 или любом другом выходе, который я настроил. Я также пробовал разные прескалеры и настройки!

sunriax 21.03.2024 21:16

Вы настроили PA6 как выход с помощью PORTA.DIR = PIN6_bm;? или предоставьте полный код конфигурации.

hcheung 22.03.2024 01:18

@hcheung Спасибо за помощь. Все было настроено правильно.

sunriax 22.03.2024 08:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извините, что беспокою вас, но из-за ошибки конфигурации прерывания не были установлены правильно во время компиляции. Проблема была не в препроцессоре, компиляторе или чем-то еще. Проблема заключалась в том, что пользователь находился перед экраном. После долгой отладки кода и сборки я обнаружил ошибку в своей конфигурации:

Когда я создавал проект, я выбрал не тот микроконтроллер (ATTiny406 вместо ATTiny1606). Какой беспорядок! Теперь все работает нормально и прерывания вызываются правильно.

Я не буду удалять вопрос. Возможно, это поможет кому-то с той же ошибкой!

Большое спасибо за помощь @hcheung

Другие вопросы по теме