Перейти к содержанию
    

Помогите пожалуйста настроить таймер в Attiny1607, новое поколение выпущенное Microchip.

Я хочу настроить таймер TCA 16bit на период 0.2мс(5КГц) в режиме частоты(frequency mode).
Я расчитываю CMP0 по формуле из даташита.

N = 16
CMP0 = 20000KHz/(2*N * 5KHz)-1 = 124 = 0x7C
Но при таких настройках таймер работает не правильно. Я подбирала по осциллограме с ножки PB0(WO0), получилось, что для настройки периода 0.2мс CMP0 = 0x14
Таймер настраивала так:

TCA0.SINGLE.CTRLA = 0x00;
TCA0.SINGLE.CMP0 = 0x14;
TCA0.SINGLE.CTRLB = 0x10|TCA_SINGLE_WGMODE_FRQ_gc;
TCA0.SINGLE.CTRLD = 0x00;
TCA0.SINGLE.CTRLECLR = 0x00;
TCA0.SINGLE.EVCTRL = 0x00;
TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm |TCA_SINGLE_CMP0_bm;
TCA0.SINGLE.CNT = 0;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV16_gc;
TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm;

В чем может быть проблема, как вы думаете?

А еще есть вторая проблема, с перываниями.
Я хочу настроить прерывание с частотой 2мс. Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. Зато срабатывает ISR (TCA0_OVF_vect) с периодом ~0,05м :shok:
Помогите пожалуйста разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С этим МК не работал, но попробую предположить.
Если по каким-то причинам входная частота все-таки не 20МГц, надо выяснить, какая.
Fout = 5000 = x / (2 * 16 * (0x14 + 1)), где x - входная частота тактирования модуля TCA. Значит, она равна 3.36МГц.
Судя по документации (см. раздел 10.3.3 Main Clock After Reset), делаю вывод, что Вы вовсе не настраивали тактирование.
А значит, оно там штатное: 20МГц внутреннего генератора делится на 6 (~3.3МГц) - это и есть сигнал на всю периферию, в том числе TCA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

С этим МК не работал, но попробую предположить.
Если по каким-то причинам входная частота все-таки не 20МГц, надо выяснить, какая.
Fout = 5000 = x / (2 * 16 * (0x14 + 1)), где x - входная частота тактирования модуля TCA. Значит, она равна 3.36МГц.
Судя по документации (см. раздел 10.3.3 Main Clock After Reset), делаю вывод, что Вы вовсе не настраивали тактирование.
А значит, оно там штатное: 20МГц внутреннего генератора делится на 6 (~3.3МГц) - это и есть сигнал на всю периферию, в том числе TCA.

Спасибо огромное! Именно в этом было дело!

А насчет проблемы с прерываниями есть какие-нибудь идеи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, Lilia сказал:

А насчет проблемы с прерываниями есть какие-нибудь идеи?

А что с ними? Я не понял в чем конкретный вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

А что с ними? Я не понял в чем конкретный вопрос.

Срабатывает прерывание OVF, со стабильной не зависящим от CMP0 частотой, выше чем 5КГц, на которые я настроила таймер.

Как я понимаю мне для 5 КГц нужно TCA0_CMP0_vect, но оно не срабатывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Lilia сказал:

Срабатывает прерывание OVF, со стабильной не зависящим от CMP0 частотой, выше чем 5КГц, на которые я настроила таймер.

Ну измерьте, с какой?

16 минут назад, Lilia сказал:

Как я понимаю мне для 5 КГц нужно TCA0_CMP0_vect, но оно не срабатывает.

В том режиме, в котором Вы настроили таймер (режим частоты), не работает модуль сравнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как измеряете?
Вы же сами сказали, что настраиваете таймер в режиме FRQ.
Согласно документации, в этом режиме значение TOP (число, до которого считает таймер), определяется регистром CMPn.
Когда счетчик сравняется с TOP, на следующем цикле будет формироваться сигнал UPDATE, который обнулит счетчик CNT.
Здесь же (когда CNT достигает TOP и выдается UPDATE) выдается сигнал OVF, который является источником запроса на прерывание.

К сожалению, даташит очень криво описывает поведение флагов OVF и CMP, и об этом стоит лишь догадываться.
Однако, глянем в таблицы Table 20-7.Timer Waveform Generation Mode и Table 20-3/4. Available Interrupt Vectors and Sources in Normal Mode.
Там вскользь можно понять, что в режиме FRQ событие MATCH (CMP) равносильно OVF. Что и подтверждается вашими потугами с железкой.
Кстати, имейте ввиду, что, в зависимости от размера Flash Вашего МК, вектора имеют различный размер. В проекте нужно правильно выбрать МК.

P.S. Сдался Вам этот FRQ-режим... Хотите прерывания с периодами 0.2мс и 2мс?
Настройте таймер в режиме Single-slop PWM, задайте PER для получения 2мс, а CMPn - для получения 0.2мс.
Теперь обработчик прерывания CMPn будет вызываться через каждые 0.2мс, а OVF - через каждые 2мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, Arlleex said:

задайте PER для получения 2мс, а CMPn - для получения 0.2мс. Теперь обработчик прерывания CMPn будет вызываться через каждые 0.2мс, а OVF - через каждые 2мс

Возможно я ошибаюсь, т.к. не работал с новыми Attiny, но по-моему оба прерывания будут с одинаковым периодом 2мс, только сдвинуты на 0.2мс или на 1.8мс, смотря в какую сторону считать.

Можно настроить таймер на быстрое прерывание 0.2мс и каждое 10-е прерывание вызывать другой процесс, который нужен с периодом 2мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, ae_ сказал:

Возможно я ошибаюсь, т.к. не работал с новыми Attiny...

А, пардон, затупил я немножечко:wink: Вы правы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все работает.:yahoo: Спасибо большое :)

В режиме FRQ , прерывание действительно OVF. Надо было было его еще квитировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Подскажите пожалуйста как attiny1607 инициализировать на вход. На входе ножки порта А стоит кнопка. На выходе порта В на ножке светодиод. Задача при нажатии кнопки зажечь диод. В даташите про DDRA как в обычных avr типа атмега 8 нету ничего. Пишу в атмелстудии. Инклуд i/o подключен, как настроить не пойму. Помогите пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0x0400 PORTA Port A Configuration

16.3.1 Initialization After Reset, all standard function device I/O pads are connected to the port with outputs tri-stated and input buffers enabled, even if there is no clock running.

На вход оно из коробки настроено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, son313 said:

Подскажите пожалуйста как attiny1607 инициализировать на вход.

Глава 16 в DS - всё о портах. Глава 7.1 - адреса, где они лежат

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь, теперь разобраля с портами. А то прям в ступор какойто вошел. Еще вопрос. У меня в целом задача под attiny1607 на вход ножки порта А подать сигнал 64 Гц и на выходе порта В на ножке получить 1 если частота 64 и больше и 0 если частота меньше 64. Как это реализовать на этом микроконтроллере?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...