таймер микроконтороллеров Avr

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июн 01, 2009 21:27:46

Сообщение Арсений »

Кто нибудь может помочь разобраться с таймером МК Avr (например у мк AT90S1200). Интересует как написать программу для запуска таймера, и измерения определенного интервала времени!
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

1. Вы выбрали дико устаревший МК
2. Воспользуйтесь поиском по форуму - таких тем куча!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow

Сообщение TechMike »

МК действительно старый, как запустить таймер написано в datasheet.

Вы его скачали, на чем пишите, какие ошибки возникают при компиляции?
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

Арсений,
Во-первых, опишите, что вы имеете виду под "измерения определенного интервала времени", а то масло масленое получается. Если этот интервал времени уже определён, то зачем его измерять?
Во-вторых, AT90S1200 уже очень старый МК, в нём даже нет прерывания таймера по совпадению с регистром сравнения, только по переполнению.
И в последних скажите хотя бы, под какой компилятор код то нужен?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июн 01, 2009 21:27:46

Сообщение Арсений »

AI_Disable писал(а):Арсений,
Во-первых, опишите, что вы имеете виду под "измерения определенного интервала времени", а то масло масленое получается. Если этот интервал времени уже определён, то зачем его измерять?
Во-вторых, AT90S1200 уже очень старый МК, в нём даже нет прерывания таймера по совпадению с регистром сравнения, только по переполнению.
И в последних скажите хотя бы, под какой компилятор код то нужен?
мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

Арсений писал(а): ... не обязательно чтобы мк был AT90S1200
Далеко не во всех аврках таймеры настраиваются одинаково. Для начала определитесь с контроллером.
Арсений писал(а): ...и не очень важно какой компилятор...
Не знаю как с ассмом, но вот в Си, например, важно. Вы же даже язык изначально не указали.
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow

Сообщение TechMike »

Арсений писал(а):
AI_Disable писал(а):Арсений,
мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)
Какие действия кроме измерения частоты должен делать МК?
Контактная информация:
Родился
Сообщения: 3
Зарегистрирован: Вт фев 01, 2011 10:26:28

Сообщение Vladimir.F »

Здравствуйте. Извините, если не туда залез, до этого в форумах никогда не писал. Решил новую тему не создавать.
У меня такая проблема: Timer0 на Atmega16 неправильно делит частоту. По моим подсчётам на выходе должно быть 40 Гц, а частотомер показывает 39.5 Гц. Timer1 считает правильно, но он занят другой частотой. Без использования задержки на 25 и StepCount тоже получается не правильная частота.
Вот код:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
const unsigned char tab[]={0x05,0x01,0x03,0x02,0x06,0x04};
unsigned char StepCount=0;
unsigned char tmr1=0;

ISR(TIMER0_OVF_vect)
{
StepCount++;
if(StepCount>5)StepCount=0;
TCNT0=0x06;
tmr1++;
if(tmr1==25)
{
tmr1=0;
PORTB=tab[StepCount];
}
}
int main (void)
{
DDRB = 0x07;
TCCR0 = 2;
TIFR = 0;
TIMSK = 0b001;
GICR = 0;
sei();
while(1);
}
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Vladimir.F писал(а):У меня такая проблема: Timer0 на Atmega16 неправильно делит частоту. По моим подсчётам на выходе должно быть 40 Гц, а частотомер показывает 39.5 Гц.
.. проще всего ИМХО посмотреть из за чего набегает ошибка и проверить свои подсчеты в симуляторе - AVR Studio вполне хватит.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Арсений писал(а):мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала).
для at90s1200 можно поступить следующим образом. Создаете обработчик прерывания для T0, который увеличивает значение переменной (допустим размером DWORD). Измеряемую частоту заводите на INT0. При изменении уровня на INT0 - читаете DWORD. Измеряемая частота = частоту переполнения T0 / DWORD . В более новых МК конечно проще применить режим совпадения.
Родился
Сообщения: 3
Зарегистрирован: Вт фев 01, 2011 10:26:28

Сообщение Vladimir.F »

Спасибо, буду разбираться. :dont_know:
Родился
Сообщения: 3
Зарегистрирован: Вт фев 01, 2011 10:26:28

Сообщение Vladimir.F »

Проблема решена, настроил таймер в режим СТС. :)
Встал на лапы
Аватара пользователя
Сообщения: 130
Зарегистрирован: Ср дек 29, 2010 17:30:34
Re:

Сообщение aleksey_gregul »

Арсений писал(а): мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)
Многие таймеры имеют т.н. вход захвата. (capture). Он специально предназначен для ИЗМЕРЕНИЯ временных интервалов.
По событию capture на аппаратном уровне состояние таймера очень быстро сохраняется в спец. регистре. и генерируется прерывание.
Почитайте про этот режим и все будет пучком!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»