Свежие обсуждения
Микроконтроллеры

Помогите разобраться с двумя таймерами ATMega16

1 2 3

Попробовал 0x0B. Стало получше, но не до конца, заметно "плавание". Думал тоже что из-за обработчиков, но потом оставил кусок из всей программы, упростил его и... тоже самое. вот незадача то. Так обработчик в полной программе занимает 0,03мс. Это много?

 

Если стало получше, то очень плохо. На какой частоте сейчас работает Mega?

 

1 МГц. Можно вам весь проект на почту или сюда скинуть, может грабли глобальные, а я не вижу? Это мой первый проект на МК такой, который в железе задумывался.

 

Да нет, диагноз в принципе понятен . Попробуйте следующее:
1. Разгоните Мегу до 8 Мгц (естественно, увеличив коэффициенты деления прескалера для таймеров в 8 раз).
2. Попробуйте переменную t объявить register. Эта опция, к сожалению, в разных системах программирования записывается по разному, а я пишу только в WinAVR GCC, так что как ее записать у Вас, не знаю
3. Попробуйте поиграться с оптимизацией. Мне, например, не совсем понятно, почему компилер в обработчике прерываний вместо команд push и pop сгенерировал код для работы с регистром Y.
4. Самый худший вариант - перейти на ассемблер

 

Спасибо за помощь, буду пробовать. Так всё серьёзно значит, 3 таймера в меге, но из-за малой частоты меги и(или) "странностей" компилятора можно пользоваться только двумя (первый с двумя другими не конфликтует)? Ещё заметил, если прескалер у таймера 2 поставить в 1024, то тоже лучше. Вообще частота маленькая генерации по сравнению с тактовой, а такие проблемы, не понимаю этого.

 

chav1961: 4. Самый худший вариант - перейти на ассемблер То что я смог написать на С врядли на асме смогу сейчас, разве что через год мучений (ну мне б хоть на С сначала сделать то что задумал).

 

chav1961: Попробуйте поиграться с оптимизацией. Да вообще её выключу наверное.

 

Когда частота программно генерируемых сигналов сравнима с тактовой частотой, требуется очень аккуратное программирование. Возможно, имело смысл вообще отказаться от прерываний, а использовать поллинг. А оптимизацию надо, наоборот, включить (лучше всего "s"): на языке С код без оптимизации - это такой ужас...

 

Про поллинг ещё ни в одной книге не встречал из тех что читал по Си. В переводе это опрос, а как он заменит прерывания от таймера, таймер вообще не нужен? Но у меня низкие частоты генерируются. Получается как-будто прерывания "налазят друг на друга", а не обрабатываются по очереди, вызывая лишь небольшую задержку между сигналами по Т0 и Т2.

 

Таймеры опрос не заменит, но его можно "заточить" так, чтобы он ничего лишнего не делал. Вообще это - чисто ассемблерные фенечки, думаю, вам они пока ни к чему