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

 
 
 
Reply to this topicStart new topic
> ATmega8 в качестве таймера и настройка с com-порта
nsasha
сообщение Jan 6 2007, 20:52
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 6-01-07
Пользователь №: 24 158



Для работы в качестве таймера или часов с будильником, видел много схем, где МК должен работать на частоте, кратной 1МГц.(потом как-то понижают до 1Гц)
А для установки через соm-порт необходима частота 7.3728МГц (рекомендованная стандартом RS-232).
Как совмещают оба (обязательных(?)) условия?
И, если делают по другому, то как сделать таймер с установкой времени срабатывания через com-порт?
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jan 6 2007, 21:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(nsasha @ Jan 6 2007, 20:52) *
Для работы в качестве таймера или часов с будильником, видел много схем, где МК должен работать на частоте, кратной 1МГц.(потом как-то понижают до 1Гц)

Обычно для этого используют кварцы с частотой,кратной 2,как правило-32768Гц.В АТMega для этого
используют специальный асинхронный режим таймера-в разных кристаллах или Т0 или Т2,при котором этот таймер тактируется не от системного,а от собственного кварца.Почитайте соответствующий раздел даташита на ваш кристал.Но это только для Мег, в тинях этого режима нет(в совсем новых-не в курсе)
А в качестве системного используйте подходящий для USART.Кстати,не обязательно 7.3728МГц,нужно
считать для используемой вами скорости.Рекомендуемое отклонение-не более 0,5%.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
nsasha
сообщение Jan 6 2007, 22:26
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 6-01-07
Пользователь №: 24 158



WHALE, а можно поподробней разжевать, плиз!
У меня Atmega8515. В доке написано, что работает на частоте до 8МГц. Внешний кварц подключают к ножкам XTAL1 и XTAL2. Я не понял, если подключить кварц с частотой 7.3728МГц, для com-порта, то как из него же получить частоту для таймера?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 6 2007, 23:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(nsasha @ Jan 6 2007, 23:26) *
WHALE, а можно поподробней разжевать, плиз!
У меня Atmega8515. В доке написано, что работает на частоте до 8МГц. Внешний кварц подключают к ножкам XTAL1 и XTAL2. Я не понял, если подключить кварц с частотой 7.3728МГц, для com-порта, то как из него же получить частоту для таймера?


ATM8515 не имеет часов реального времени. Для этого используется например ATM8/88/16 и другие. Вы там на первой странице даташита увидите такую строку:
"– Real Time Counter with Separate Oscillator".

Фузы программируются для работы от внутреннего генератора (для меги8/88) а кварц подпаивается часовой и используется только в часах. Для меги16 устанавливаются два кварца. Один можно поставить 7372800 к примеру, а второй часовой. Если у вас всёже один кварц (М8/М88) это тоже не беда, внутреннюю частоту можно "подстроить под нужную Вам с помощью специального фуз-регистра. Или использовать такую частоту общения с PC, чтобы ошибка не превышала допустимых 0.5%.

Один кварц как правило не используется, так как однокристалка с таким кварцом будет много "жрать" и потребуется внешнее питание. Если же это Вас не пугает, то тоже ничего страшного нет. Например с кварцем 7372800 устанавливаете предделитель 1024. Получаете частоту 7200. Запускаете таймер в режиме CTC. А в OCR загружаете 7199 и получаете свой герц. То бишь секунду.
smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 7 2007, 00:19
Сообщение #5


кекс
******

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



Цитата(SasaVitebsk @ Jan 6 2007, 23:02) *
Один кварц как правило не используется, так как однокристалка с таким кварцом будет много "жрать" и потребуется внешнее питание. Если же это Вас не пугает, то тоже ничего страшного нет. Например с кварцем 7372800 устанавливаете предделитель 1024. Получаете частоту 7200. Запускаете таймер в режиме CTC. А в OCR загружаете 7199 и получаете свой герц. То бишь секунду.
smile.gif

Крайне не рекомендую использовать CTC с предделителем не равным 1, для получения точных отсчетов.

В приведенной ниже выдержке из даташита:

Код
• Bit 3 – CTC1: Clear Timer/Counter1 on Compare Match
When the CTC1 control bit is set (one), the Timer/Counter1 is reset to $0000 in the clock
cycle after a compareA match. If the CTC1 control bit is cleared, Timer/Counter1 continues
counting and is unaffected by a compare match. Since the compare match is
detected in the CPU clock cycle following the match, this function will behave differently
when a prescaling higher than 1 is used for the timer. When a prescaling of 1 is used,
and the Compare A Register is set to C, the timer will count as follows if CTC1 is set:
... | C-2 | C-1 | C | 0 | 1 |...
When the prescaler is set to divide by 8, the timer will count like this:
... | C-2, C-2, C-2, C-2, C-2, C-2, C-2, C-2 | C-1, C-1, C-1, C-1, C-1, C-1, C-1, C-1 | C, 0,
0, 0, 0, 0, 0, 0 |...
In PWM mode, this bit has no effect.


можно заметить, что при достижении значения C (записанного в OCR) таймер отсчитывает всегда 1 такт, а не количество тактов установленное предделителем. Т.о. имеем абсолютную погрешностью минимум в 1 такт, максимум в (N тактов предделителя - 1). Если использовать режим CTC с предделителем не равным 1 для отсчета времени, то время будет неточным.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 7 2007, 02:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо defunct, а я это просмотрел. Смотрю а у меня часы за час на 1.5 секунды уходят. smile.gif Думаю что за шляпа. Но для меня это не имеет значения, так как раз в минуту время с реальным синхронизируется, а там всё класс. Так я не предал этому значения. Хотя по идее точность должна была незначительно отличаться, так как она определяется точностью кварца. Теперь понятно, где у них прокол.

Ну тут можно конечно коррекцией попробовать, но конечно более правильно, всётаки использовать RTC.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 7 2007, 02:48
Сообщение #7


кекс
******

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



Цитата(SasaVitebsk @ Jan 7 2007, 02:34) *
Ну тут можно конечно коррекцией попробовать, но конечно более правильно, всётаки использовать RTC.

Попробуйте просто увеличить на единичку значение OCR,
если взять Ваш предыдущий пример:
Цитата
Получаете частоту 7200. Запускаете таймер в режиме CTC. А в OCR загружаете 7199 и получаете свой герц. То бишь секунду.

То в OCR писать не 7199, а 7200. smile.gif
Уже не будет все так сильно уплывать.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 7 2007, 03:32
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jan 7 2007, 00:19) *
Крайне не рекомендую использовать CTC с предделителем не равным 1, для получения точных отсчетов.

В приведенной ниже выдержке из даташита:

Код
• Bit 3 – CTC1: Clear Timer/Counter1 on Compare Match
When the CTC1 control bit is set (one), the Timer/Counter1 is reset to $0000 in the clock
cycle after a compareA match. If the CTC1 control bit is cleared, Timer/Counter1 continues
counting and is unaffected by a compare match. Since the compare match is
detected in the CPU clock cycle following the match, this function will behave differently
when a prescaling higher than 1 is used for the timer. When a prescaling of 1 is used,
and the Compare A Register is set to C, the timer will count as follows if CTC1 is set:
... | C-2 | C-1 | C | 0 | 1 |...
When the prescaler is set to divide by 8, the timer will count like this:
... | C-2, C-2, C-2, C-2, C-2, C-2, C-2, C-2 | C-1, C-1, C-1, C-1, C-1, C-1, C-1, C-1 | C, 0,
0, 0, 0, 0, 0, 0 |...
In PWM mode, this bit has no effect.


можно заметить, что при достижении значения C (записанного в OCR) таймер отсчитывает всегда 1 такт, а не количество тактов установленное предделителем. Т.о. имеем абсолютную погрешностью минимум в 1 такт, максимум в (N тактов предделителя - 1). Если использовать режим CTC с предделителем не равным 1 для отсчета времени, то время будет неточным.


Уважаемый defunct
Боюсь что Вы вводите общественность в заблуждение.
Тот эфект который Вы описали был свойственен чипам AT90Sxxxx.
В чипах ATtiny и ATmega данный эфект не наблюдается.
Посмотрите временные диаграммы работы таймера1 ну например ATmega8,
они в даташите приведены для вариантов с делителем 8 и без делителя (1),
никаких указаний на то что счетчик прескейлера чего-то может недосчитать там нет.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 7 2007, 12:15
Сообщение #9


кекс
******

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



Цитата(singlskv @ Jan 7 2007, 03:32) *
Уважаемый defunct
Боюсь что Вы вводите общественность в заблуждение.
Тот эфект который Вы описали был свойственен чипам AT90Sxxxx.
В чипах ATtiny и ATmega данный эфект не наблюдается.
Посмотрите временные диаграммы работы таймера1 ну например ATmega8,
они в даташите приведены для вариантов с делителем 8 и без делителя (1),
никаких указаний на то что счетчик прескейлера чего-то может недосчитать там нет.

Боюсь, что да, только частично..
Прескейлер не будет сбрасываться, соответственно ничего лишнего таймер не посчитает.
Но, есть одно но.
Формулы для OCR будут различаться на 1.

Ну а упомянутая диаграмма в ДШ к чипу M8 весьма скупа (нет цифр)..
Следуя же цитате из того же ДШ к M8:

Код
In Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 12), the OCR1A or ICR1
Register are used to manipulate the counter resolution. In CTC mode the counter is
[b]cleared to zero when the counter value (TCNT1) matches either the OCR1A[/b] (WGM13:0
= 4) or the ICR1 (WGM13:0 = 12).

Формулы расчета коэффициента деления соответвенно будут такими:

- с предделителем >1 - N*(OCRxA), где N значение предделителя
- с предделителем =1 - 1*(OCRxA + 1)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 7 2007, 14:01
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Качаем с atmel.com документик:
AVR091: Replacing AT90S2313 by ATtiny2313

и внимательно читаем раздел
Improvements to
Timer/Counters and
Prescalers

Код
The relation between a Clear on Compare match and the internal counting of the
Timer/Counters has been changed. The Clear on Compare Match in the AT90S2313
clears the Timer/Counter after the first internal count matching the compare value,
whereas the ATtiny2313 clears Timer/Counter after the last internal count matching the
compare value. See Figure 1 and Figure 2 for details on clearing, flag setting, and pin
change. Example: OCR1x = 0x02 when prescaler is enabled (divide clock by 8).
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 8 2007, 06:35
Сообщение #11


кекс
******

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



Цитата(singlskv @ Jan 7 2007, 14:01) *
и внимательно читаем раздел
Improvements to
Timer/Counters and
Prescalers

Код
The relation between a Clear on Compare match and the internal counting of the
Timer/Counters has been changed. The Clear on Compare Match in the AT90S2313
clears the Timer/Counter after the first internal count matching the compare value,
whereas the ATtiny2313 clears Timer/Counter after the last internal count matching the
compare value. See Figure 1 and Figure 2 for details on clearing, flag setting, and pin
change. Example: OCR1x = 0x02 when prescaler is enabled (divide clock by 8).

Посыпаю голову пеплом..
Вы абсолютно правы. Спасибо за информацию!

Проверил в железе (m8) - действительно сброс таймера и переход на вектор прерывания осуществляется в последнем такте предделителя.

2 Sasha Vitebsk,
Сорри что сбил с толку, это было неумышлено. smile.gif
Просто при решении одной из задач, разница в работе CTC "запала" и с тех времен, чтобы не путаться, там где нужна была точность использовал всегда прескейлер 1 ;>
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 8 2007, 20:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Jan 8 2007, 07:35) *
Посыпаю голову пеплом..
Вы абсолютно правы. Спасибо за информацию!

Проверил в железе (m8) - действительно сброс таймера и переход на вектор прерывания осуществляется в последнем такте предделителя.

2 Sasha Vitebsk,
Сорри что сбил с толку, это было неумышлено. smile.gif
Просто при решении одной из задач, разница в работе CTC "запала" и с тех времен, чтобы не путаться, там где нужна была точность использовал всегда прескейлер 1 ;>


Вы меня не сбили с толку. Сам собьюсь. biggrin.gif

У меня эта секунда высчитывается в цикле регенерации, - 48 раз переписывается OCR а потом програмно делится на 75. Проверил - смотрю уходят внутренние часы, но мне это не важно, так как раз в минуту они синхронизируются с внешними на М8, а там всё класс пол секунды в сутки. А хомут вычислить не так просто. Ну я и плюнул на это дело. Точность частоты регенерации экрана меня не беспокоит.
Go to the top of the page
 
+Quote Post

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

 


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


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