Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.10.2008, 16:32
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Пишу прогу частотомера на at90s2313
Вродебы ничего сложного но показания почемуто плавают.Вот пример проги и прикрепленный проект в протезе. Может кто подскажет в чем бок
unsigned int rez,rez1;
char a,n;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR1B=0x00; // остановка таймера 1
TCCR0B=0x00;
rez=TCNT1;
}
void main(void)
{
TIMSK=0x02; // разрешаем прерывание по переполнению Т0
DDRB=0xFF;
DDRD=15;
TCCR0B=0x0; // остановка таймера 0
#asm("sei") // разрешаем прерывания
while (1)
{
TCNT1H=0x00; // обнуление регистра результата старшего
TCNT1L=0x00; // обнуление регистра результата младшего
TCCR0B=0b100;
TCNT0=128; // задержка на 10 мс
TCCR1B=0x07; // запуск таймера 1 (таймер считает по спадающему фронту)
a=200; // индикация результата
while (a)
{
indikaciya(rez,1);
a--;
delay_ms(2);
}
};
Прикрепленный файл: 2710587.rar
|
|
|
|
03.10.2008, 17:57
|
|
Прописка
Регистрация: 07.10.2006
Сообщений: 108
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Вот простой рабочий пример
Прикрепленный файл: 3978869.zip
|
|
|
|
03.10.2008, 17:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Оригинальный подход, не спорю... а что мешает индикатору показать показания до окончания подсчета ???
Ну, сработало прерывание, поставьте флажок на разрешение индикации, что-ли. В основном цикле проверяйте его и пока он не взведется, показывать нули. Как-то так...
|
|
|
|
04.10.2008, 00:04
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Сообщение от urry
|
Оригинальный подход, не спорю... а что мешает индикатору показать показания до окончания подсчета ???
Ну, сработало прерывание, поставьте флажок на разрешение индикации, что-ли. В основном цикле проверяйте его и пока он не взведется, показывать нули. Как-то так...
|
Делал как говорите вот прога но всеравно показания плавают (частота678.9 кГц а показывает 676.7-677.8) но за ответ спасибо:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR1B=0x00; // остановка таймера 1
TCCR0B=0x00;
rez=TCNT1;
n=0; // разрешаем индикацию
}
void main(void)
{
TIMSK=0x02; // разрешаем прерывание по переполнению Т0
DDRB=0xFF;
DDRD=15;
TCCR0B=0x0; // остановка таймера 0
#asm("sei") // разрешаем прерывания
while (1)
{
TCNT1H=0x00; // обнуление регистра результата старшего
TCNT1L=0x00; // обнуление регистра результата младшего
TCCR0B=0b100;
TCNT0=128; // задержка на 10 мс
TCCR1B=0x07; // запуск таймера 1 (таймер считает по спадающему фронту)
n=1;
while(n);
a=200; // индикация результата
while (a)
{
indikaciya(rez,1);
a--;
delay_ms(2);
}
};
|
|
|
|
04.10.2008, 00:15
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Сообщение от AlexTA
|
Вот простой рабочий пример
|
Большое спасибо за ответ, но меня смущает строка delay_ms(1000); поскольку эта функция имеет погрешность(сам лично проверял)[/b]
Прикрепленный файл: 3978869.zip
|
|
|
|
04.10.2008, 10:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Продолжаем разговор (С) Карлсон
А теперь засинхронизируйте начало временного отсчета с входным импульсом - т.е прерывание по входу запускает таймер. У Вас в предыдущем варианте таймер времени начинает считать независимо от того, пришел импульс или нет - а это погрешность, изменяемая в пределах периода и от Вас не зависит.
|
|
|
|
05.10.2008, 20:38
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Сообщение от urry
|
Продолжаем разговор (С) Карлсон
А теперь засинхронизируйте начало временного отсчета с входным импульсом - т.е прерывание по входу запускает таймер. У Вас в предыдущем варианте таймер времени начинает считать независимо от того, пришел импульс или нет - а это погрешность, изменяемая в пределах периода и от Вас не зависит.
|
TCCR0B=0b100; // 1 такт
TCNT0=128; // 1 такт задержка на 10 мс
TCCR1B=0x07; // запуск таймера 1 (таймер считает по спадающему фронту)
1) Но ведь проходит всего два такта а при частоте кварца 3.27 MГц это приблизительно 2/3 мкс и потом начинается подсчет так что при частоте измеряемого сигнала 1МГц это будет +-один импульс максимум, а у меня частота в примере 678.9кГц и плавает не на еденици а на десятки
но может я чегото не учитваю.
2) А как засинхронизировать? Чтобы входной импульс запускал отсчет времени (прерывание по входу запускает)его надо подать на INT0 или INT1 я правильно понимаю, или можно както по другому?
|
|
|
|
05.10.2008, 22:49
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
urry большое спасибо за подсказку, почитал документацию, и все сделал (нашел нужное прерывание), все получилось
И еще раз большое спасибо
Доведу прогу до ума и выложу весь проект, может комуто тоже понадобится.
|
|
|
|
06.10.2008, 03:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от fiksx
|
Доведу прогу до ума и выложу весь проект, может комуто тоже понадобится.
|
Дык он особо высоко мерять не будет... У AVR входы таймера синхронизируются с тактовой частоты. Лучше PIC для частостомера. до 100-130 мегагерц моно выжать.
|
|
|
|
06.10.2008, 19:46
|
|
Прописка
Регистрация: 08.10.2005
Адрес: Одесса
Сообщений: 117
Сказал спасибо: 22
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Сообщение от picavr
|
Сообщение от fiksx
|
Доведу прогу до ума и выложу весь проект, может комуто тоже понадобится.
|
Дык он особо высоко мерять не будет... У AVR входы таймера синхронизируются с тактовой частоты. Лучше PIC для частостомера. до 100-130 мегагерц моно выжать.
|
Согласен, но я с ПИКами не дружу, да и 100-130 мегагерц это не каждый экземпляр сможет, а в атмеле я просто добавлю делитель по входу на 100, и все. Но за совет спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:15.
|
|