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


