таймер микроконтороллеров Avr
- Сообщения: 25
- Зарегистрирован: Пн июн 01, 2009 21:27:46
Кто нибудь может помочь разобраться с таймером МК Avr (например у мк AT90S1200). Интересует как написать программу для запуска таймера, и измерения определенного интервала времени!
- Реклама
1. Вы выбрали дико устаревший МК
2. Воспользуйтесь поиском по форуму - таких тем куча!
2. Воспользуйтесь поиском по форуму - таких тем куча!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
МК действительно старый, как запустить таймер написано в datasheet.
Вы его скачали, на чем пишите, какие ошибки возникают при компиляции?
Вы его скачали, на чем пишите, какие ошибки возникают при компиляции?
Арсений,
Во-первых, опишите, что вы имеете виду под "измерения определенного интервала времени", а то масло масленое получается. Если этот интервал времени уже определён, то зачем его измерять?
Во-вторых, AT90S1200 уже очень старый МК, в нём даже нет прерывания таймера по совпадению с регистром сравнения, только по переполнению.
И в последних скажите хотя бы, под какой компилятор код то нужен?
Во-первых, опишите, что вы имеете виду под "измерения определенного интервала времени", а то масло масленое получается. Если этот интервал времени уже определён, то зачем его измерять?
Во-вторых, AT90S1200 уже очень старый МК, в нём даже нет прерывания таймера по совпадению с регистром сравнения, только по переполнению.
И в последних скажите хотя бы, под какой компилятор код то нужен?
- Сообщения: 25
- Зарегистрирован: Пн июн 01, 2009 21:27:46
мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)AI_Disable писал(а):Арсений,
Во-первых, опишите, что вы имеете виду под "измерения определенного интервала времени", а то масло масленое получается. Если этот интервал времени уже определён, то зачем его измерять?
Во-вторых, AT90S1200 уже очень старый МК, в нём даже нет прерывания таймера по совпадению с регистром сравнения, только по переполнению.
И в последних скажите хотя бы, под какой компилятор код то нужен?
- Реклама
Далеко не во всех аврках таймеры настраиваются одинаково. Для начала определитесь с контроллером.Арсений писал(а): ... не обязательно чтобы мк был AT90S1200
Не знаю как с ассмом, но вот в Си, например, важно. Вы же даже язык изначально не указали.Арсений писал(а): ...и не очень важно какой компилятор...
Какие действия кроме измерения частоты должен делать МК?Арсений писал(а):AI_Disable писал(а):Арсений,
мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)
- Сообщения: 3
- Зарегистрирован: Вт фев 01, 2011 10:26:28
Здравствуйте. Извините, если не туда залез, до этого в форумах никогда не писал. Решил новую тему не создавать.
У меня такая проблема: 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);
}
У меня такая проблема: 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
.. проще всего ИМХО посмотреть из за чего набегает ошибка и проверить свои подсчеты в симуляторе - AVR Studio вполне хватит.Vladimir.F писал(а):У меня такая проблема: Timer0 на Atmega16 неправильно делит частоту. По моим подсчётам на выходе должно быть 40 Гц, а частотомер показывает 39.5 Гц.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
для at90s1200 можно поступить следующим образом. Создаете обработчик прерывания для T0, который увеличивает значение переменной (допустим размером DWORD). Измеряемую частоту заводите на INT0. При изменении уровня на INT0 - читаете DWORD. Измеряемая частота = частоту переполнения T0 / DWORD . В более новых МК конечно проще применить режим совпадения.Арсений писал(а):мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала).
- Сообщения: 3
- Зарегистрирован: Вт фев 01, 2011 10:26:28
- Сообщения: 3
- Зарегистрирован: Вт фев 01, 2011 10:26:28
- Сообщения: 130
- Зарегистрирован: Ср дек 29, 2010 17:30:34
Многие таймеры имеют т.н. вход захвата. (capture). Он специально предназначен для ИЗМЕРЕНИЯ временных интервалов.Арсений писал(а): мне нужно измерить частоту в интервале 0.5- 4 Гц, я никак не могу разобраться с работой таймера (никак не могу понять как написать подпрограмму для подсчета интервала). И не обязательно чтобы мк был AT90S1200 и не очень важно какой компилятор.(главное что бы на ассемблере)
По событию capture на аппаратном уровне состояние таймера очень быстро сохраняется в спец. регистре. и генерируется прерывание.
Почитайте про этот режим и все будет пучком!


