реклама на сайте
подробности

 
 
> Тактирование Atmega128.
Allexiy
сообщение Dec 2 2006, 01:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 3-01-06
Пользователь №: 12 813



Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)
2. Можно ли запрограммировать контроллер так, чтобы если нет частоты с внешней синхронизации, то он переключался бы на встроенный генератор. (Как это можно сделать)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Dec 2 2006, 02:29
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Почему бы просто не использовать тактовую частоту процессора?
Ведь у таймера T0 есть режим OC CTC.
установите прескейлер 1024, запишите в OCR0 число 125, и по прерыванию T0 декрементируйте некоторую статическую переменную от 125 до 0. При достижении 0 - увеличивайте счетчик секунд, и обновляйте статическую переменную числом 125.

Код
...
  TIMSK |= (1 << OCIE0);
  OCR0 = 125;
  TCCR0 = (1 << WGM01) | 7;
...

#define RELOAD_VALUE  (125)

#pragma vector=TIMER0_COMP_vect
__interrupt void t0compHandler(void)
{
   static U8 cnt = RELOAD_VALUE;
   cnt--;
   if (!cnt)
   {
      cnt = RELOAD_VALUE;
      seconds += 1;
   }
}
Go to the top of the page
 
+Quote Post
Allexiy
сообщение Dec 2 2006, 03:35
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 3-01-06
Пользователь №: 12 813



Цитата(defunct @ Dec 2 2006, 02:29) *
Почему бы просто не использовать тактовую частоту процессора?
Ведь у таймера T0 есть режим OC CTC.
установите прескейлер 1024, запишите в OCR0 число 125, и по прерыванию T0 декрементируйте некоторую статическую переменную от 125 до 0. При достижении 0 - увеличивайте счетчик секунд, и обновляйте статическую переменную числом 125.

Код
...
  TIMSK |= (1 << OCIE0);
  OCR0 = 125;
  TCCR0 = (1 << WGM01) | 7;
...

#define RELOAD_VALUE  (125)

#pragma vector=TIMER0_COMP_vect
__interrupt void t0compHandler(void)
{
   static U8 cnt = RELOAD_VALUE;
   cnt--;
   if (!cnt)
   {
      cnt = RELOAD_VALUE;
      seconds += 1;
   }
}


Спасибо за помощь!
Можно и так, но не хотелось бы иметь прерывание с частотой 125Гц. В проекте и так их достаточно. Другое дело, когда оно медленное 1с, меньше вероятность пересечения событий. К тому же в контроллере это время еще считает наработку устройства до 100000 часов. По этому чем точнее измерение и меньше погрешность тем лучше.
Может есть еще какие идеи и предложения?
Go to the top of the page
 
+Quote Post
Igor26
сообщение Dec 2 2006, 09:37
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.
Go to the top of the page
 
+Quote Post
VDG
сообщение Dec 2 2006, 19:35
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Цитата(Igor26 @ Dec 2 2006, 10:37) *
У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.

smile.gif Человек же сказал - требование исключить все кварцы.
===
Судя по вопросу №2, предлагаю прежде всего начать с изучения архитектуры AVR.
Ответ - нельзя. Это устанавливается только фьюзами при программировании.


--------------------
Go to the top of the page
 
+Quote Post
Allexiy
сообщение Dec 3 2006, 01:06
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 3-01-06
Пользователь №: 12 813



Цитата(VDG @ Dec 2 2006, 19:35) *
Цитата(Igor26 @ Dec 2 2006, 10:37) *

У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.

smile.gif Человек же сказал - требование исключить все кварцы.
===
Судя по вопросу №2, предлагаю прежде всего начать с изучения архитектуры AVR.
Ответ - нельзя. Это устанавливается только фьюзами при программировании.


По поводу фьюзов в контроллере, я это знал - хотелось просто еще раз подтвердить свои знания (может чего нового изобрели). Просто меня ввел в заблуждение один товарищь, который сказал, что он сделал так: когда на контроллере нет внешнего синхросигнала он использует внутренний. Может конечно он имел ввиду, что когда нет внешнего сигнала, то он переключается на внутренний - внутри платы (к примеру логическая схема, зашитая в ПЛИС). Надо будет у него пораспрашивать.
Go to the top of the page
 
+Quote Post
Allexiy
сообщение Feb 11 2007, 23:18
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 3-01-06
Пользователь №: 12 813



Цитата(Allexiy @ Dec 3 2006, 01:06) *
Цитата(VDG @ Dec 2 2006, 19:35) *

Цитата(Igor26 @ Dec 2 2006, 10:37) *

У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.

smile.gif Человек же сказал - требование исключить все кварцы.
===
Судя по вопросу №2, предлагаю прежде всего начать с изучения архитектуры AVR.
Ответ - нельзя. Это устанавливается только фьюзами при программировании.


По поводу фьюзов в контроллере, я это знал - хотелось просто еще раз подтвердить свои знания (может чего нового изобрели). Просто меня ввел в заблуждение один товарищь, который сказал, что он сделал так: когда на контроллере нет внешнего синхросигнала он использует внутренний. Может конечно он имел ввиду, что когда нет внешнего сигнала, то он переключается на внутренний - внутри платы (к примеру логическая схема, зашитая в ПЛИС). Надо будет у него пораспрашивать.

Оказалось все намного проще: на плате стоял фазовый детектор, который при отсутствии синхросигнала включал кварцевый генератор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 19:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01534 секунд с 7
ELECTRONIX ©2004-2016