Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расчет таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kich
Народ подскажите как правильно расчитать таймер для Atmega.
Kovrov
А так и считайте, учитывая частоту процессора...
мне удобней всего опираться на время одного такта
например 16мгц=62,5 нс
таймер с делителем 1/8 = 1 такт такого таймера будет 62,5*8=500 нс
и так далее.
KisaLove
А если надо быстро подсчитать коэфициенты (разные варианты), то я использую скаченную недавно по каким-то пробегавшим здесь ссылкам программу. Выбираешь тактовую частоту МК, нужную частоту таймера и берешь коэфициенты, которые тебе даются (и для 8-разрядных таймеров и для 16-ти).
(поклал к себе, так как исходный сайт не нашел sad.gif
h_p://avr.kisa.ru/AndyRate.zip
ILYCHOFF
Цитата(kich @ May 25 2006, 13:24) *
Народ подскажите как правильно расчитать таймер для Atmega.


Как поставлена задача? Что вы хотите получить от таймера? Какой контроллер планируете использовать?
BVU
Цитата(kich @ May 25 2006, 13:24) *
Народ подскажите как правильно расчитать таймер для Atmega.

Лучше всего об этом почитать в DataSheet на конкретный контроллер. Как правило подобные методики там приводятся. Конкретная точность - зависит от выбранной частоты тактирования (частота кварц. резонатора/генератора).
Atashi
Жаль, что постановка задачи неконкретная.
Может, нужно просто задержки где-то сделать - тогда немецкая AVRdelayLoop вполне прокатит, ничего считать не надо.
Если же просто таймер настроить (как генератор итп) - можно
использовать заготовки в CodeVision... А если серьезное что - придется думать и считать, и тогда - то, что было предложено выше.
Жизнь...
Artur Nikitin
Задача такая:
проц атмега163, кварц 4МГц (Т4.000)
Если задать таймеру (не важно какому) частоту, равную частоте процессора и при каждом прерывании менять значение ножки с 1 на 0 и наоборот (меандр), то по идее длительность импульса должна быть равной 1/4000000=250нс. Смотрю осциллографом, длительность импульса примерно 70мс. Шо це такое?
Abakt
Советую использовать мастер настройки МК по примеру - pid.by.ru/z6.htm

вот картинка - диалог настройки таймера :



Аналогичный мастер имеется в CVAVR
http://www.roboforum.ru/viewtopic.htm?p=11560

по моему и в новом WinAVR есть что-то подобное.
Nanobyte
Вот простая программа, сам постоянно ей пользуюсь. В ней есть ещё и расчёты с плавающей точкой.
Нажмите для просмотра прикрепленного файла

PS Дежа-вю какое-то. Снова AVR123 ?
Палыч
Цитата(Artur Nikitin @ Feb 20 2007, 15:40) *
Если задать таймеру (не важно какому) частоту, равную частоте процессора и при каждом прерывании менять значение ножки с 1 на 0 и наоборот (меандр), то по идее длительность импульса должна быть равной 1/4000000=250нс. Смотрю осциллографом, длительность импульса примерно 70мс. Шо це такое?


Это - время выполнения процедуры обработки прерывания

Цитата(kich @ May 25 2006, 09:24) *
Народ подскажите как правильно расчитать таймер для Atmega.


В ImageCraft C Compiler тоже есть калькулятор настроек. Его можно запускать автономно (отдельно от IDE)

Нажмите для просмотра прикрепленного файла
Artur Nikitin
Нашел причину, но пока не понял как ее устранить. Дело в том, что по умолчанию контроллер работает от внутреннего генератора (1МГц). Чтобы его изменить на внешний, нужно изменить в фузах CKSEL. В книге Евстифеева на 204 стр. написано, что в модели 163 оптимизация кварцевого резонатора отсутствует, а различные установки вышеуказанных ячеек определяют только длительность задержки сброса.
Так как всетаки работать от внешнего 4-мегагерцового генератора?
Сергей Борщ
Цитата(Artur Nikitin @ Feb 20 2007, 14:40) *
Задача такая:
проц атмега163, кварц 4МГц (Т4.000)
Если задать таймеру (не важно какому) частоту, равную частоте процессора и при каждом прерывании менять значение ножки с 1 на 0 и наоборот (меандр), то по идее длительность импульса должна быть равной 1/4000000=250нс. Смотрю осциллографом, длительность импульса примерно 70мс. Шо це такое?
Прерывание происходит при каждом переполнении таймера. Поэтому если таймер 8-битный, то длительность импульса будет 1/4000000*256 = 64мкс, что вы и наблюдаете.

Ой, или это я ошибся, 64мкс не похоже на 70 мс....

Цитата(Artur Nikitin @ Feb 20 2007, 16:20) *
Дело в том, что по умолчанию контроллер работает от внутреннего генератора (1МГц). Чтобы его изменить на внешний, нужно изменить в фузах CKSEL. В книге Евстифеева на 204 стр. написано, что в модели 163 оптимизация кварцевого резонатора отсутствует, а различные установки вышеуказанных ячеек определяют только длительность задержки сброса.
А в даташите написано, что комбинация 0100-0010 соответствует внутреннему генератору, а 1111-1010 внешнему кварцу/резонатору. Я бы в данном случае верил даташиту - производителю виднее.
Artur Nikitin
Цитата
Ой, или это я ошибся, 64мкс не похоже на 70 мс....


65мс получается при генераторе 1МГц (внутрненний). Похоже все дело в фузах

1110 - Ceramic Resonator, fast rising power
наверно так надо?
Сергей Борщ
Цитата(Artur Nikitin @ Feb 20 2007, 16:34) *
65мс получается при генераторе 1МГц (внутрненний). Похоже все дело в фузах
значит у вас еще включен предделитель (0.065/ (1 / 1000000 * 256)) = ~256 или вы смотрите таймер1 (который 16-битный), тогда да, 1/1000000 * 65536 = 0,065536, как раз ваши 65мс. Еще раз обращаю внимание - прерывание происходит не по каждому тику, а только при переполнении таймера.

Цитата(Artur Nikitin @ Feb 20 2007, 16:34) *
1110 - Ceramic Resonator, fast rising power
наверно так надо?
Ну если у вас питание нарастает быстро, то так. А если вам не принципиально - стартанет сразу или через 100мс - ставьте 1010 и забудьте.
Artur Nikitin
Осталось только теперь заставить при программировании прописывать фузы. В наследство достался бат-файл, который сам все пишет. Использую альтера байт бластер
GDI
чтобы получить быстрый меандр надо использовать выход OCP любого таймера и правильно настроить схему сравнения и режим таймера, тогда и никакие прерывания не потребуются, и контроллер не будет отвлекаться, все будет работать аппаратно.
Сергей Борщ
Цитата(Artur Nikitin @ Feb 20 2007, 16:45) *
Осталось только теперь заставить при программировании прописывать фузы. В наследство достался бат-файл, который сам все пишет. Использую альтера байт бластер
А какую программу программатора вызывает бат-файл? Если там avreal32, то в опции -f добавьте (измените) -fCKSEL=A
Artur Nikitin
Цитата(GDI @ Feb 20 2007, 18:03) *
чтобы получить быстрый меандр надо использовать выход OCP любого таймера и правильно настроить схему сравнения и режим таймера, тогда и никакие прерывания не потребуются, и контроллер не будет отвлекаться, все будет работать аппаратно.


Выводы уже заняты под порты общего назначения (плата уже разведена), приходится делать на прерывании. Хочу сделать на таймере1, настройки следующие:
TCCR1A= 0x00;
TCCR1B= 0x01;
OCR1AH= 0x00;
OCR1AL= 0x05;

TIMSK_OCIE1A = 1; //разрешение прерывания по совпадению А

#pragma vector = TIMER1_CAPT1_vect
__interrupt void TM1_CP1(void)
{
PORTD_PORTD7 = !PORTD_PORTD7;
TCNT1 = 0;
}

по переполнению работало, по совпадению что то не вижу частоты на ножке
Artur Nikitin
Цитата(Сергей Борщ @ Feb 20 2007, 18:07) *
А какую программу программатора вызывает бат-файл? Если там avreal32, то в опции -f добавьте (измените) -fCKSEL=A

Да, авреал, добавил фузы в конце. Т.к. по умолчанию проц работает от 1МГц, а кварц 4МГц, то после установления фузы все должно заработать в 4 раза быстрее (например светодиод должен моргать быстрее, т.к. мигает по таймеру), но ентого не наблюдается cranky.gif
Сергей Борщ
Цитата(Artur Nikitin @ Feb 21 2007, 08:58) *
по переполнению работало, по совпадению что то не вижу частоты на ножке
Вы не на то прерывание повисли. CAPTURE - это захват, копирование значения таймера в регистры OCR в момент прихода внешнего сигнала. Вам нужет вектор COMPARE. Это во-первых. Во-вторых используйте режим CTC или FAST PWM таймера - тогда он будет сбрасываться автоматически.
Код
TCCR1A = (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(0<<WGM10);
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);

OCR1A = 5;
TIMSK = (0<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(1<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(0<<TOIE0);


#pragma vector = TIMER1_COMPA_vect
__interrupt void handler(void) {
    PORTD ^= (1<<7);
}


Цитата(Artur Nikitin @ Feb 21 2007, 09:27) *
Да, авреал, добавил фузы в конце. Т.к. по умолчанию проц работает от 1МГц, а кварц 4МГц, то после установления фузы все должно заработать в 4 раза быстрее (например светодиод должен моргать быстрее, т.к. мигает по таймеру), но ентого не наблюдается cranky.gif
Закоротите кварц пинцетом. Если все остановится - меняйте кварц, он у вас не той системы (рассчитан на работу с третьей гармоникой). Если будет продолжать работать - разбирайтесь с фузами. Считайте их, сравните.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.