dim3740
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 109
|
|
1 | |
Прерывания по таймеру Т1 в Atmega812.11.2014, 16:40. Просмотров 3370. Ответов 6
Метки нет Все метки)
(
Нужно на одном таймере Т1 (16 бит) в Atmega8 получить 2 разных вектора А и В прерывания. Даташит: «В режиме Normal блоки сравнения OCR1A и OCR1B могут использоваться для генерации прерываний…». Т.е. надо разрешить эти прерывания и задать величины сравнения. Но мой МК не «видит» этого и прерывается только на ТОР. Меня устроил бы и режим СТС, но, вообще непонятно… ибо он же сбрасывает счет по достижении более раннего, скажем, А, и если В уставка больше, то до нее никогда счетчик не досчитает(((. В сети примеры нашел только по Т0/2.
0
|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
12.11.2014, 16:40 |
Ответы с готовыми решениями:
6
Не срабатывают внешние прерывания INT0/INT1 в Atmega8 Не работают прерывания по таймеру ATtiny13a Разница между ATMEGA8-16AI и ATMEGA8-16AU Прерывания по таймеру Прерывания по таймеру в PLC 1200 |
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
|
|
12.11.2014, 17:08 | 2 |
Код выкладывайте.
Скорей всего Вы не разрешили эти прерывания.
0
|
dim3740
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 109
|
||||||
13.11.2014, 04:19 [ТС] | 3 | |||||
еще посмотрите, плз, м.б. надо/важно побайтно уставки записывать?
Вопрос решился предварительным сбросом Т1 в перед запуском в функции ISR (INT_vect). Т.е: думаю, что запуск таймера не инициализирует его, он может приостанавливаться/возобновляться. После выхода на обработчик прерывания сравнения, счетчик продолжал счет, потом в него заносилась снова уставка, но его состояние в этот момент могло быть любым. Но остается вопрос (теоретический) - как можно применять режим СТС одновременно для А и В, если более ранний вектор ОБНУЛЯЕТ счет полностью, т.е. и для канала В?
0
|
Voland_
1689 / 1034 / 97
Регистрация: 04.01.2010
Сообщений: 3,483
|
|
13.11.2014, 11:22 | 4 |
Вопрос не совсем корректный, т.к. СТС работает только в регистром А, обнуляя счетчик при его достижении. Как он (даже логически) может работатб с Б, если он его не касается?
Но... подобный вопрос можно решить алгоритмически. Вам только нужно будет использовать одно прерывание СТС, постоянно считать сколько ждать тактов до следующего прерывания и какое именно прерывание должно произойти... На пальцах можно объяснить так: например, А = 5, В = 8. Последний такт сработки А и В = 0. 1) Считаем до А. По сработке анализируем и определяем (по счетчикам сработки), что сработало прерывание А. Расчитываем следующую сработку для А = 5 и для В - (8-0)-5 =3. Соответственно, выставляем время сработки = 3. Выставляем текущее время сработки для А=0 (т.к. он только что сработал), для В=5. 2) Следующая сработка. Теперь логикой определяем, что сработало по событию "В", сбрасываем его счетчик, и инриминируем последний такт сработки для А. Снова вычисляем время следующей сработки = 2 (расчетом следующей сработки для каждого канала А,В... и выбором минимального). И т.д. ЗЫ: таким нехитрым способом можно делать на одном таймере хоть 100500 асинхронных процессов, но это требует некоторых временнЫх затрат.
1
|
dim3740
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 109
|
|
13.11.2014, 11:54 [ТС] | 5 |
Что СТС только с А - это для меня новость. Посмотрю повнимательнее...
0
|
Voland_
1689 / 1034 / 97
Регистрация: 04.01.2010
Сообщений: 3,483
|
|
13.11.2014, 13:17 | 6 |
Да дело ж не в этом! Ну как вы себе представляете счетчик, считающий одновременно до 5 и до 8? Он, например, может считать до 8 в режиме CTC (когда в А будет 8), и быть настроенным при этом на прерывание при равенстве 5 для канала В. В этом случае, вы получите два прерывания. Но период их следования будет все равно общим.
1
|
dim3740
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 109
|
|
13.11.2014, 13:28 [ТС] | 7 |
Именно. Я тоже не представляю. Вывод: на два регистра сранения можно два вектора прерывния, при этом, если применяем режим стс, то на другой регистр возможно только иный вектор прерывания. Это логично, но почему я не вижу это в даташите(((
0
|
13.11.2014, 13:28 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
13.11.2014, 13:28 |
Прерывания по таймеру на Arduino Due (Atmel SAM3X8E) [Вопрос] Перехват прерывания прямым доступом к вектору прерывания Вычислить адрес вектора прерывания по номеру прерывания. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |