Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/36: Рейтинг темы: голосов - 36, средняя оценка - 4.86
Kmusmos
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
1

Оптимальный кварц и настройки таймера для точности 0,1 сек

25.11.2014, 23:57. Просмотров 6608. Ответов 12
Метки нет (Все метки)

Доброго времени суток. Необходимо сделать секундомер с точностью 0,1 сек. Читаю "Практическое программирование AVR на ассемблере" Ревича, он пишет, что часы с точностью 1 сек можно сделать на основе 16 разрядного Timer1. Надо взять кварц 4 Мгц, выставить предделитель 1/64, записать в регистр сравнения 62500, и обнулять по достижению этого числа. Тогда я получу прерывание от этого таймера равно раз в секунду. Какие кварц, предделитель, и число в регистре сравнения мне оптимальнее всего взять, чтобы достичь точности в 0,1 сек? Моя математика подсказывает, что можно все оставить как есть, только в регистр сравнения записать 6250. Может есть способ правильнее ? Почему Ревич стремился подбирать кварц и делитель такими, чтобы число в регистре сравнения было близким к максимальному значению 16 битного таймера (65536), или это просто случайность ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2014, 23:57
Ответы с готовыми решениями:

Кварц для таймера на AT89x51
По датащиту немного не понял, вроде на принципиальной схеме таймера нету инвертора: <Изображение...

Не работает 32к кварц в асинхронном режиме таймера
ATmega8A, таймер2 настроил на счет от внешнего кварца (32к с кондерами 22пФ): ASSR =...

Вывод таймера в формате мин.сек
Всем привет, у меня не большой вопрос мне нужно вывести отсчет таймера в таком формате: 20 мин 30...

Задержка без таймера на выходе atmega 8535 на 0,5 сек
.include"m8535def.inc" .cseg .org 0 ldi r16, 0xFF out DDRC, r16 ldi r16, 0x01 rol r16 rjmp...

SetExceptionMask настройки точности и не только
Доброго времени! Где подробнее можно узнать о работе данной ф-ии?...

12
SOKPOWIHIU
0 / 0 / 0
Регистрация: 11.07.2014
Сообщений: 116
26.11.2014, 00:28 2
Можете взять часовой кварц на 32768 Гц и не мучиться. Ревич хотел производительности и универсальности, но нужны они не всегда.
Тактовая частота 4 МГц. Предделитель 64 -> тактовая таймера 4 МГц/64=62500. Попробуйте подобрать другие предделитель и регистр сравнения, чтобы получилось точно.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
26.11.2014, 01:41 3
пример взять кварц со степенью двойки только с частотой выше чем у часового
например кварц на 16,384МГц. Ставите предделитель на 1024, а затем таймер в режиме CTC настраиваете на 160 отсчетов если хотите 0.01сек или на 1600 отсчетов если хотите 0.1сек
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.11.2014, 08:13 4
Си:
Код
//========================================================================
#define ST_TCNT         TCNT0
#define ST_TIMSK        TIMSK
#define ST_OCIE         OCIE0
#define ST_OCR          OCR0
#define ST_TCCR         TCCR0
#define CS0             CS00
#define CS1             CS01
#define CS2             CS02
//========================================================================

//========================================================================
void init_sys_timer (void)
{
sys_tick = 0;
ST_TCNT = 0;
ST_TIMSK |= 1<<ST_OCIE;
ST_OCR = 250;
ST_TCCR |= (1<<CS0) | (1<<CS1);
}
//---------------------------------------------------------------------------------------------

//========================================================================
#pragma vector = TIMER0_COMP_vect
__interrupt void Timer0Comp(void)
{
ST_OCR += 250;
sys_tick |= 1<<SYS_TICK_FLG;
}
//========================================================================
Прерывания каждые 1 мс. Можно сделать переменную, которая будет считать до 100 (0,1 с). Частота кварца 16 МГц. Для 8 МГц нужно поставить значение вместо 250 125.
Еще один способ. при частоте кварца 10 Мгц. Если не нужен 16-битный таймер, при 10 МГц время 1 такта составляет 100 наносекунд. Вычисляете, насколько вам нужно сделать задержку, загоняете это число в регистр сравнения 16 битного таймера.
0
Kmusmos
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
27.11.2014, 01:10 5
Цитата Сообщение от oxytt
пример взять кварц со степенью двойки только с частотой выше чем у часового
например кварц на 16,384МГц. Ставите предделитель на 1024, а затем таймер в режиме CTC настраиваете на 160 отсчетов если хотите 0.01сек или на 1600 отсчетов если хотите 0.1сек
Спасибо, очень понятно ответили.
А кварц на 32768 кГц мне не подходит, у меня usbasp на такой низкой частоте контроллер не видит, а перемычки лоуклок нет.
Демиург, спс за пример кода, хоть я и не сишник, может перепишу под себя.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
27.11.2014, 05:15 6
Асм:
Код
//========================================================================
.equ   XTAL   = 16000000
//========================================================================

//========================================================================
.equ ST_TCNT   = TCNT0
.equ ST_TIMSK   = TIMSK
.equ ST_OCIE   = OCIE0
.equ ST_OCR      = OCR0
.equ ST_TCCR   = TCCR0
.equ CS0      = CS00
.equ CS1      = CS01
.equ CS2      = CS02
//========================================================================

.cseg

//========================================================================
.macro   Init_System_Timer
clr      r16
out      ST_TCNT, r16
in      r16, ST_TIMSK
sbr      r16, 1<<ST_OCIE
out      ST_TIMSK, r16
outi   ST_OCR, (XTAL/64/1000)
in      r16, ST_TCCR
sbr      r16, 1<<CS0 | 1<<CS1
out      ST_TCCR, r16
.endmacro

.macro ReRun_Sys_Timer
in      r16,ST_OCR
subi   r16,-(XTAL/64/1000)
out      ST_OCR,r16
.endmacro
//========================================================================

//========================================================================
Sys_Timer_Comp:
push   r16
in      r16,SREG
push   r16

ReRun_Sys_Timer

sbr      FLAGS,1<<SYS_TICK_FLG

pop      r16
out      SREG,r16
pop      r16
reti
//========================================================================
0
sitirom366
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
27.11.2014, 06:36 7
Цитата Сообщение от Kmusmos
А кварц на 32768 кГц мне не подходит, у меня usbasp на такой низкой частоте контроллер не видит, а перемычки лоуклок нет.
таймер к внешнему клоку подключить а не все ядро
0
Kmusmos
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
27.11.2014, 11:45 8
Цитата Сообщение от sitirom366
Цитата Сообщение от Kmusmos
А кварц на 32768 кГц мне не подходит, у меня usbasp на такой низкой частоте контроллер не видит, а перемычки лоуклок нет.
таймер к внешнему клоку подключить а не все ядро
Спасибо, незнал что такое возможно. Ядро в таком случае тактируеться от внутреннего источника, я так понимаю.
2 Демиург: спасибо!!! Всегда интересно посмотреть на куски кода, написанные на разных языках, но выполняющих 1 функцию.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
27.11.2014, 11:49 9
Цитата Сообщение от sitirom366
таймер к внешнему клоку подключить а не все ядро
подключить то можно) но часовой кварц как не дели целые 0.1 секунда не получится
0
SOKPOWIHIU
0 / 0 / 0
Регистрация: 11.07.2014
Сообщений: 116
27.11.2014, 12:46 10
Ну неужели так сложно взять даташит и посидеть перед таблицей предделителей и посчитать параметры для любого кварца и любой частоты?
Например, тактирование от встроенного RC-генератора на 1 МГц (для таймера его точности не хватит). Подбираем предделитель, на выбор у нас есть 1, 8, 64, 256, 1024, что дает частоты тактирования таймера 1 Мгц, 125 кГц, 15625 Гц, 3906,25 Гц и 976,56 Гц. Очевидно, что если нужно точно 10 Гц (0.1 с), делители 64 и выше не подходят, берем 8, то есть частота таймера 125 кГц. Чтобы получить число для сравнения, делим тактовую частоту на желаемую, в соответствии с формулой из даташита (для CTC - f=F_CPU/(2*N*(1+X)), где f - результирующая частота, N - предделитель, X - модуль счета). При наших условиях получаем 10 Гц = 1 МГц / (2*8*(1+Х)) откуда X=6249. Это число больше 255, поэтому используем 16-битный таймер.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
27.11.2014, 13:03 11
И гуглом тоже сложно
http://www.b9.com/elect/avr/kavrcalc/index.html
0
SOKPOWIHIU
0 / 0 / 0
Регистрация: 11.07.2014
Сообщений: 116
27.11.2014, 13:22 12
Ох извращенцы. Особенно порадовало с UART (проще написать макрос, он сам все пересчитает если изменить скорость или частоту), watchdog (пересчитать вручную быстрее, чем искать эту прогу), ASCII (что мешает записать сразу как символ?), да и прочие не лучше. Вот с таймером единственное может быть полезно, хотя интереснее было бы чтобы оно само рассчитывало оптимальный предделитель и модуль счета.
0
okt
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 222
28.11.2014, 12:08 13
Kmusmos По мне, самый оптимальный кварц тот, который имеется в наличии. Код должен быть построен так, чтобы любой кварц выполнил поставленные условия.
Код
.include "m8515def.yms"

;.equ Fo=4609434; задаваемая пользователем частота кварца;
.equ Fo=16004790   ; задаваемая пользователем частота кварца
;.equ Fo=16000000   ; задаваемая пользователем частота кварца
.equ T100ms=Fo/10   ; интервал 100 мсек в тиках кварца

.cseg
.org 0
LDI   XH,HIGH(ROMEND)
LDI   XL,LOW(ROMEND)
RJMP   RESIT
;**********************************************************
.ORG   $4
TIMER1_COMPA:
SIT
RET
;*************************************************
.ORG   $6
TIMER1_OVER:
DEC   R20
BRNE   OVER_OUT
SBR   R16,$40         ;разрешить прерывание Timer1_COMPA
OUT   TIMSK,R16
OUT   TIFR,R16
SBR   R17,$08
OUT   TCCR1B,R17      ;  в режиме CTC
OVER_OUT:
RETI
;*************************************************

RESIT:
;   LDI   XH,HIGH(ROMEND)
;   LDI   XL,LOW(ROMEND)
OUT   SPH,XH
OUT   SPL,XL      ; инициализация стека
;*************************************************
GO:
LDI   R20,BYTE3(T100ms-1)
LDI   R21,BYTE2(T100ms-1)
LDI   R22,BYTE1(T100ms-1)
OUT   OCR1AH,R21
OUT   OCR1AL,R22

LDI   R16,$20
OUT   MCUCR,R16   ; режим SLEEP IDLE

CLT

LDI   R16,0b10000000
OUT   TIMSK,R16   ;разрешить прерывание переполнения Timer1
OUT   TIFR,R16

LDI   R17,$01      ; режим счёта Fo/1
OUT   TCCR1B,R17
OUT   DDRD,R17
CBI   PORTD,0

SEI          ; разрешение глобальных прерываний
WAIT:
SLEEP
BRTC   WAIT
CLT

SBI   PORTD,0

RJMP   GO
.EXIT
А вот так студия отрабатывает все последующие, после первого, интервалы 0,1 сек. для кварца, совсем не подходящего для предделителей и чисел сравнения.
0
28.11.2014, 12:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 12:08

STM32F107RCT6 Настройки таймера
Добрый день. У меня контроллер STM32F107RCT6. Настраиваю таймеры TIM1 и TIM2 для генерации частоты...

Внешний кварц для STM32F407VGT6
Добрый вечер. Друзья, кто из вас использует МК STM32F407xxx, поделитесь информацией по поводу...

необходим ли кварц для PCF8583?
насколько я понял из даташита, кварц в микруху уже встроен. но в то же время в интернетах множество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru