Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тактирование Atmega128.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Allexiy
Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)
2. Можно ли запрограммировать контроллер так, чтобы если нет частоты с внешней синхронизации, то он переключался бы на встроенный генератор. (Как это можно сделать)
defunct
Почему бы просто не использовать тактовую частоту процессора?
Ведь у таймера 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;
   }
}
Allexiy
Цитата(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 часов. По этому чем точнее измерение и меньше погрешность тем лучше.
Может есть еще какие идеи и предложения?
Igor26
У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.
VDG
Цитата(Igor26 @ Dec 2 2006, 10:37) *
У DS1307 есть вывод, который дергается раз в секунду(его сначала нужно "сконфигурить"). Заведите его на свободный INTx (если есть) и по прерыванию считайте время. У меня девайс, который год пролежал в столе, отстал за этот год по времени на пять минут.

smile.gif Человек же сказал - требование исключить все кварцы.
===
Судя по вопросу №2, предлагаю прежде всего начать с изучения архитектуры AVR.
Ответ - нельзя. Это устанавливается только фьюзами при программировании.
Allexiy
Цитата(VDG @ Dec 2 2006, 19:35) *
Цитата(Igor26 @ Dec 2 2006, 10:37) *

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

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


По поводу фьюзов в контроллере, я это знал - хотелось просто еще раз подтвердить свои знания (может чего нового изобрели). Просто меня ввел в заблуждение один товарищь, который сказал, что он сделал так: когда на контроллере нет внешнего синхросигнала он использует внутренний. Может конечно он имел ввиду, что когда нет внешнего сигнала, то он переключается на внутренний - внутри платы (к примеру логическая схема, зашитая в ПЛИС). Надо будет у него пораспрашивать.
Alex_Pol
Может речь шла об MSP? Он таким штукам обучен.
Allexiy
Цитата(Alex_Pol @ Dec 3 2006, 01:16) *
Может речь шла об MSP? Он таким штукам обучен.


Что за MSP?
vooon
Цитата(Allexiy @ Dec 3 2006, 12:09) *
Что за MSP?


Микроконтроллеры семейства MSP430 от Texas Instruments
ultra-low-power 16-bit RISC

http://focus.ti.com/mcu/docs/mcuprodovervi...mp;familyId=342
http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/index.htm

http://electronix.ru/forum/index.php?showforum=9
=GM=
Цитата(Allexiy @ Dec 1 2006, 22:49) *
Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)

Не знаю, почему нельзя подавать внешнюю синхронизацию на низкочастотный вход. В руководстве сказано, что не рекомендуется подавать и что вход оптимизирован под 32768Гц (читайте, под часовой кварц, чтобы не ставить кондюки).

Можно использовать частоты, близкие к 32768Гц, поделите 16МГц в ПЛИС на 512, получите 31250 Гц, что достаточно близко, период ровно 32 мкс. Удобно для измерения частоты(:-).
Allexiy
Цитата(=GM= @ Dec 5 2006, 16:03) *
Цитата(Allexiy @ Dec 1 2006, 22:49) *

Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)

Не знаю, почему нельзя подавать внешнюю синхронизацию на низкочастотный вход. В руководстве сказано, что не рекомендуется подавать и что вход оптимизирован под 32768Гц (читайте, под часовой кварц, чтобы не ставить кондюки).

Можно использовать частоты, близкие к 32768Гц, поделите 16МГц в ПЛИС на 512, получите 31250 Гц, что достаточно близко, период ровно 32 мкс. Удобно для измерения частоты(:-).

Меня и смутило то, что написано не рекомендуется. Поделить, подать и т.д. -это дело второе.
Если не рекомендуется, то вопрос, а что же может такого плохого произойти. Если только дело в кондерах, то это ерунда - чуть фронты сигнала изменятся.
Будет ли правилно, если к TOSC1 я подам небольшую частоту (к примеру 1024Гц), а TOSC2 - останется не подсоединенным и будет ли при этом все работать в штатном режиме?
=GM=
Цитата(Allexiy @ Dec 5 2006, 18:33) *
Цитата(=GM= @ Dec 5 2006, 16:03) *

Цитата(Allexiy @ Dec 1 2006, 22:49) *

Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)

Не знаю, почему нельзя подавать внешнюю синхронизацию на низкочастотный вход. В руководстве сказано, что не рекомендуется подавать и что вход оптимизирован под 32768Гц (читайте, под часовой кварц, чтобы не ставить кондюки).

Можно использовать частоты, близкие к 32768Гц, поделите 16МГц в ПЛИС на 512, получите 31250 Гц, что достаточно близко, период ровно 32 мкс. Удобно для измерения частоты(:-).

Меня и смутило то, что написано не рекомендуется. Поделить, подать и т.д. -это дело второе.
Если не рекомендуется, то вопрос, а что же может такого плохого произойти. Если только дело в кондерах, то это ерунда - чуть фронты сигнала изменятся.
Будет ли правильно, если к TOSC1 я подам небольшую частоту (к примеру 1024Гц), а TOSC2 - останется неподсоединенным и будет ли при этом все работать в штатном режиме?

На мой взгляд, конечно будет, особенно в вашем случае. Ну сами подумайте, там стоит просто усилитель, TOSC1 вход, TOSC2 выход, который легко генерит на частоте 32 кГц, вот и все. Проблема в том, что эта частота асинхронна по отношению к клоку (фронты не совпадают), поэтому когда вы пишете туда, могут быть всякие коллизии, но в вашем случае вы только читаете.
TomaT
Цитата(=GM= @ Dec 6 2006, 16:21) *
....
На мой взгляд, конечно будет, особенно в вашем случае. Ну сами подумайте, там стоит просто усилитель, TOSC1 вход, TOSC2 выход, который легко генерит на частоте 32 кГц, вот и все. Проблема в том, что эта частота асинхронна по отношению к клоку (фронты не совпадают), поэтому когда вы пишете туда, могут быть всякие коллизии, но в вашем случае вы только читаете.

Мало того, в этом случае (все клоки с ПЛИС,) все будет как раз синхронно.
Allexiy
Хорошо!
Так и попробую сделать. Всем спасибо за участие и помощь. a14.gif
Как соберу всю схему, так позже напишу о практических результатах.
chernenko
Цитата(Allexiy @ Dec 2 2006, 01:49) *
Есть рабочий проект на Атмеге 128 с использованием двух кварцев 14,745МГц и 32768Гц.
Низкочастотный кварц крутил таймер Т0 и по переполнению таймера (каждую 1сек) велся подсчет импульсов по трем каналам - мерил частоту. Все бы хорошо, но от кварцев сказали избавиться, а дают 48МГц на управление схемой. Сделав в ПЛИС делитель на 3, получил частоту 16МГц, которую и собираюсь использовать для внешней синхронизации контроллера. Далее поделив еще на 15625 получил 1024Гц, которые я и хотел использовать для отсчета времени, но прочитал, что нельзя подавать внешнюю синхронизацию на низкочастотный вход (ТОSС1, TOSC2). Вот и хотелось бы узнать:
1. Как можно завести эту частоту в таймер T0. (T1,T2,T3 - уже используются в этом проекте)
2. Можно ли запрограммировать контроллер так, чтобы если нет частоты с внешней синхронизации, то он переключался бы на встроенный генератор. (Как это можно сделать)



У меня в одном из проектов таймер запускал АЦП с частотой 36 Гц.

Предопределял одну минуту:
Код
#define TIME60S36HZ 2160 //60 сек. при дискретизации 36 Гц


А потом просто считал их:
Код
Time60S36HzCount++;
if (Time60S36HzCount == TIME60S36HZ)
  {
   //обработка события раз в минуту
  Time60S36HzCount = 0;
  }


Все очень просто. Требований к точности отсчета минуты были не высоки.
Allexiy
Цитата(Allexiy @ Dec 3 2006, 01:06) *
Цитата(VDG @ Dec 2 2006, 19:35) *

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

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

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


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

Оказалось все намного проще: на плате стоял фазовый детектор, который при отсутствии синхросигнала включал кварцевый генератор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.