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

|
Для работы в качестве таймера или часов с будильником, видел много схем, где МК должен работать на частоте, кратной 1МГц.(потом как-то понижают до 1Гц) А для установки через соm-порт необходима частота 7.3728МГц (рекомендованная стандартом RS-232). Как совмещают оба (обязательных(?)) условия? И, если делают по другому, то как сделать таймер с установкой времени срабатывания через com-порт?
|
|
|
|
|
Jan 6 2007, 21:47
|

Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 6 2007, 22:26
|
Группа: Новичок
Сообщений: 2
Регистрация: 6-01-07
Пользователь №: 24 158

|
WHALE, а можно поподробней разжевать, плиз! У меня Atmega8515. В доке написано, что работает на частоте до 8МГц. Внешний кварц подключают к ножкам XTAL1 и XTAL2. Я не понял, если подключить кварц с частотой 7.3728МГц, для com-порта, то как из него же получить частоту для таймера?
|
|
|
|
|
Jan 6 2007, 23:02
|
Гуру
     
Группа: Свой
Сообщений: 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 и получаете свой герц. То бишь секунду.
|
|
|
|
|
Jan 7 2007, 00:19
|

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

|
Цитата(SasaVitebsk @ Jan 6 2007, 23:02)  Один кварц как правило не используется, так как однокристалка с таким кварцом будет много "жрать" и потребуется внешнее питание. Если же это Вас не пугает, то тоже ничего страшного нет. Например с кварцем 7372800 устанавливаете предделитель 1024. Получаете частоту 7200. Запускаете таймер в режиме CTC. А в OCR загружаете 7199 и получаете свой герц. То бишь секунду.  Крайне не рекомендую использовать 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 для отсчета времени, то время будет неточным.
|
|
|
|
|
Jan 7 2007, 02:34
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Спасибо defunct, а я это просмотрел. Смотрю а у меня часы за час на 1.5 секунды уходят.  Думаю что за шляпа. Но для меня это не имеет значения, так как раз в минуту время с реальным синхронизируется, а там всё класс. Так я не предал этому значения. Хотя по идее точность должна была незначительно отличаться, так как она определяется точностью кварца. Теперь понятно, где у них прокол. Ну тут можно конечно коррекцией попробовать, но конечно более правильно, всётаки использовать RTC.
|
|
|
|
|
Jan 7 2007, 02:48
|

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

|
Цитата(SasaVitebsk @ Jan 7 2007, 02:34)  Ну тут можно конечно коррекцией попробовать, но конечно более правильно, всётаки использовать RTC. Попробуйте просто увеличить на единичку значение OCR, если взять Ваш предыдущий пример: Цитата Получаете частоту 7200. Запускаете таймер в режиме CTC. А в OCR загружаете 7199 и получаете свой герц. То бишь секунду. То в OCR писать не 7199, а 7200.  Уже не будет все так сильно уплывать.
|
|
|
|
|
Jan 7 2007, 03:32
|
дятел
    
Группа: Свой
Сообщений: 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), никаких указаний на то что счетчик прескейлера чего-то может недосчитать там нет.
|
|
|
|
|
Jan 7 2007, 12:15
|

кекс
     
Группа: Свой
Сообщений: 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)
|
|
|
|
|
Jan 7 2007, 14:01
|
дятел
    
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Jan 8 2007, 06:35
|

кекс
     
Группа: Свой
Сообщений: 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, Сорри что сбил с толку, это было неумышлено.  Просто при решении одной из задач, разница в работе CTC "запала" и с тех времен, чтобы не путаться, там где нужна была точность использовал всегда прескейлер 1 ;>
|
|
|
|
|
Jan 8 2007, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Jan 8 2007, 07:35)  Посыпаю голову пеплом.. Вы абсолютно правы. Спасибо за информацию! Проверил в железе (m8) - действительно сброс таймера и переход на вектор прерывания осуществляется в последнем такте предделителя. 2 Sasha Vitebsk, Сорри что сбил с толку, это было неумышлено.  Просто при решении одной из задач, разница в работе CTC "запала" и с тех времен, чтобы не путаться, там где нужна была точность использовал всегда прескейлер 1 ;> Вы меня не сбили с толку. Сам собьюсь. У меня эта секунда высчитывается в цикле регенерации, - 48 раз переписывается OCR а потом програмно делится на 75. Проверил - смотрю уходят внутренние часы, но мне это не важно, так как раз в минуту они синхронизируются с внешними на М8, а там всё класс пол секунды в сутки. А хомут вычислить не так просто. Ну я и плюнул на это дело. Точность частоты регенерации экрана меня не беспокоит.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|