Видимо тут попутали предделитель и счётный регистр TCNT, вкупе с корявым алгоритмом.
Правильный счет времени на МК?
А что там может быть, если это противоречит логике?
Видимо тут попутали предделитель и счётный регистр TCNT, вкупе с корявым алгоритмом.
Видимо тут попутали предделитель и счётный регистр TCNT, вкупе с корявым алгоритмом.
- Реклама
- Сообщения: 1073
- Зарегистрирован: Вт май 22, 2012 19:29:06
Я делаю так таймер вызывает прерывания и счётчик, шагом на програмном уровне можно очень точно скорректировать точность хода.
1сек = 1000000мкс, счётчик прибавляет каждый такт нужное количество мкс (изменяя это количество и будет корректировка). Рекомендую юзать кварц 16мГц как это повысит частоту дискретизации и шаг корректировки. Фактически это делитель с переменным коэффициентом деления.
В принципе всё элементарно. Так же не следует забывать про частоту вызова счётчика что бы не перегрузить ядро, что бы свободное время оставалось всегда, например предделитель ставить 8 это для 8бит таймера!
1сек = 1000000мкс, счётчик прибавляет каждый такт нужное количество мкс (изменяя это количество и будет корректировка). Рекомендую юзать кварц 16мГц как это повысит частоту дискретизации и шаг корректировки. Фактически это делитель с переменным коэффициентом деления.
В принципе всё элементарно. Так же не следует забывать про частоту вызова счётчика что бы не перегрузить ядро, что бы свободное время оставалось всегда, например предделитель ставить 8 это для 8бит таймера!
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Народ, у меня снова проблема с таймером...
Чип - Attiny4313, среда разработки - BascomAVR.
Я использую вот такой код, который мне собственно и советовали:
Число 3906 получили из формулы: (частота кварца)/(значение предделителя*256). На кварце с частотой в 1МГц, отсчет времени вполне точно идет, почти секунда в секунду, но правда с небольшим отставанием. Т.к. получается число с остатком и это дает малую погрешность. В целом эффект отсчета секунды достигнут, претензий нет.
Теперь мне понадобилось использовать кварц на 4МГц. Исходя из формулы получаем нужное число для отсчета секунды равным 15625, т.е. целое число без какого либо остатка. В теории все должно работать очень четко, секунда в секунду. Но вот тут у меня и появляется проблема...
Если я выставляю значение кварца в программе $crystal = 4000000 и Timer_counter = 15625, то вместо одной секунды у меня считается четыре секунды, кошмар короче. Не знаю в чем проблема, может в настройках самого таймера? Делить число 15625 на 4, не выход из ситуации. Помогите плиззз!
Я использую вот такой код, который мне собственно и советовали:
Код: Выделить всё
$regfile = "attiny4313.dat"
$crystal = 1000000 //задали частоту кварца
//определяем таймер
Dim Timer_counter As Integer
Timer_counter = 3906
Config Timer0 = Timer , Prescale = 1
On Timer0 Proc_timer0:
Enable Interrupts
Enable Timer0
//блок обработки таймера
Proc_timer0:
If Timer_counter > 0 Then
Timer_counter = Timer_counter - 1
Else
Timer_counter = 3906 'прошла одна секунда
Flag_mode = 1
End If
Return
Теперь мне понадобилось использовать кварц на 4МГц. Исходя из формулы получаем нужное число для отсчета секунды равным 15625, т.е. целое число без какого либо остатка. В теории все должно работать очень четко, секунда в секунду. Но вот тут у меня и появляется проблема...
Ты в железе пробуй.
Ты задал частоту не в программе, а некую константу для расчетов других зависимых констант в исходнике, от нее счет твоих секунд НЕ ЗАВИСИТ. Чтобы в симуляторе отсчет шел 1 в 1 с реальным временем нужно изменить частоту "кварца" в самом симуляторе, а не только "на бумаге".
Ты задал частоту не в программе, а некую константу для расчетов других зависимых констант в исходнике, от нее счет твоих секунд НЕ ЗАВИСИТ. Чтобы в симуляторе отсчет шел 1 в 1 с реальным временем нужно изменить частоту "кварца" в самом симуляторе, а не только "на бумаге".
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Не совсем пойму о чем речь... У меня стоит реальное железо, собранное руками. Впаян кварц на 4МГц, в программе тоже частота указана $crystal = 4000000, нужное число посчитал по формуле, но эффекта это никакого не дает. Одна секунда растянулась на четыре.Alexeyslav писал(а):Ты в железе пробуй.
Ты задал частоту не в программе, а некую константу для расчетов других зависимых констант в исходнике, от нее счет твоих секунд НЕ ЗАВИСИТ. Чтобы в симуляторе отсчет шел 1 в 1 с реальным временем нужно изменить частоту "кварца" в самом симуляторе, а не только "на бумаге".
- Реклама
А у тебя точно фузы выставлены на внешний кварц? Мне кажется, он у тебя работает как и прежде... на встроенном генераторе.
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Эммм... пожалуй нет.)) Я просто не нашел в опциях BascomAVR где вообще можно фьюзы выставить.Alexeyslav писал(а):А у тебя точно фузы выставлены на внешний кварц? Мне кажется, он у тебя работает как и прежде... на встроенном генераторе.
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Вопрос к знатокам... В среде BascomAVR точно нельзя фьюзы выставлять или это я просто слепой и не нашел их? )))
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Забыл написать, версия BascomAVR 2.0.7.1
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.
Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.
Мне нужно подключить внешний кварц на 4МГц, помогите плиз...
Боюсь залочить МК.
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.
Мне нужно подключить внешний кварц на 4МГц, помогите плиз...
Ну так и выбери в списках внешний кварц. Там еще есть градация по частоте кварца, сверься по даташиту к какой градации относятся твои 4Мгц. Просто чем более высокочастотный режим выбираешь тем стабильнее работает генератор, но повышается потребление. Тут как бы это, кашу маслом не испортишь если нет требования к минимальному потреблению.
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Я просто не очень силен в этом, только начал изучать программирование на МК.
Мне легче, если в буквальном смысле носом ткнут...(
В даташите нашел сноску по настройке фьюзов:
Calibrated Internal RC Oscillator 4 MHz (see page 26) - 0010
В даташите нашел сноску по настройке фьюзов:
Calibrated Internal RC Oscillator 4 MHz (see page 26) - 0010
- Сообщения: 32
- Зарегистрирован: Чт мар 06, 2008 10:59:45
Всем спасибо!
Методом тыка нашел нужные фьюзы.
Если кому будет интересно, то в окне программирования в вкладке "Lock and Fuse bits" находим раздел - "Fusebits". В этом разделе три пункта, нас интересуют следующие настройки фьюзов:
FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)
Вроде все заработало как надо...
В работе посмотрю потом еще, как себя схема вести будет.
Методом тыка нашел нужные фьюзы.
FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)
Вроде все заработало как надо...


