Правильный счет времени на МК?

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А что там может быть, если это противоречит логике?
Видимо тут попутали предделитель и счётный регистр TCNT, вкупе с корявым алгоритмом.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1073
Зарегистрирован: Вт май 22, 2012 19:29:06

Сообщение Foton-4n »

Я делаю так таймер вызывает прерывания и счётчик, шагом на програмном уровне можно очень точно скорректировать точность хода.
1сек = 1000000мкс, счётчик прибавляет каждый такт нужное количество мкс (изменяя это количество и будет корректировка). Рекомендую юзать кварц 16мГц как это повысит частоту дискретизации и шаг корректировки. Фактически это делитель с переменным коэффициентом деления.
В принципе всё элементарно. Так же не следует забывать про частоту вызова счётчика что бы не перегрузить ядро, что бы свободное время оставалось всегда, например предделитель ставить 8 это для 8бит таймера!
Реклама
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Народ, у меня снова проблема с таймером... :) Чип - Attiny4313, среда разработки - BascomAVR.

Я использую вот такой код, который мне собственно и советовали:

Код: Выделить всё

$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  
Число 3906 получили из формулы: (частота кварца)/(значение предделителя*256). На кварце с частотой в 1МГц, отсчет времени вполне точно идет, почти секунда в секунду, но правда с небольшим отставанием. Т.к. получается число с остатком и это дает малую погрешность. В целом эффект отсчета секунды достигнут, претензий нет.

Теперь мне понадобилось использовать кварц на 4МГц. Исходя из формулы получаем нужное число для отсчета секунды равным 15625, т.е. целое число без какого либо остатка. В теории все должно работать очень четко, секунда в секунду. Но вот тут у меня и появляется проблема... :( Если я выставляю значение кварца в программе $crystal = 4000000 и Timer_counter = 15625, то вместо одной секунды у меня считается четыре секунды, кошмар короче. Не знаю в чем проблема, может в настройках самого таймера? Делить число 15625 на 4, не выход из ситуации. Помогите плиззз!
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ты в железе пробуй.
Ты задал частоту не в программе, а некую константу для расчетов других зависимых констант в исходнике, от нее счет твоих секунд НЕ ЗАВИСИТ. Чтобы в симуляторе отсчет шел 1 в 1 с реальным временем нужно изменить частоту "кварца" в самом симуляторе, а не только "на бумаге".
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Alexeyslav писал(а):Ты в железе пробуй.
Ты задал частоту не в программе, а некую константу для расчетов других зависимых констант в исходнике, от нее счет твоих секунд НЕ ЗАВИСИТ. Чтобы в симуляторе отсчет шел 1 в 1 с реальным временем нужно изменить частоту "кварца" в самом симуляторе, а не только "на бумаге".
Не совсем пойму о чем речь... У меня стоит реальное железо, собранное руками. Впаян кварц на 4МГц, в программе тоже частота указана $crystal = 4000000, нужное число посчитал по формуле, но эффекта это никакого не дает. Одна секунда растянулась на четыре. :( Симуляторами никакими не пользуюсь, я не сторонник этого... Можно подробнее, что не так? :)
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А у тебя точно фузы выставлены на внешний кварц? Мне кажется, он у тебя работает как и прежде... на встроенном генераторе.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Alexeyslav писал(а):А у тебя точно фузы выставлены на внешний кварц? Мне кажется, он у тебя работает как и прежде... на встроенном генераторе.
Эммм... пожалуй нет.)) Я просто не нашел в опциях BascomAVR где вообще можно фьюзы выставить. :) Сейчас в инете наткнулся, что к основной проге должна идти утилита TWinAvr, она и работает с фьюзами. Только у меня ее почему-то нет... ( Но за подсказку все равно спасибо! :)
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Вопрос к знатокам... В среде BascomAVR точно нельзя фьюзы выставлять или это я просто слепой и не нашел их? )))
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Забыл написать, версия BascomAVR 2.0.7.1

Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка. :) Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.

Мне нужно подключить внешний кварц на 4МГц, помогите плиз... :( Боюсь залочить МК.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ну так и выбери в списках внешний кварц. Там еще есть градация по частоте кварца, сверься по даташиту к какой градации относятся твои 4Мгц. Просто чем более высокочастотный режим выбираешь тем стабильнее работает генератор, но повышается потребление. Тут как бы это, кашу маслом не испортишь если нет требования к минимальному потреблению.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Я просто не очень силен в этом, только начал изучать программирование на МК. :) Мне легче, если в буквальном смысле носом ткнут...(

В даташите нашел сноску по настройке фьюзов:
Calibrated Internal RC Oscillator 4 MHz (see page 26) - 0010
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

Сообщение dbf-334 »

Всем спасибо! :beer:

Методом тыка нашел нужные фьюзы. :) Если кому будет интересно, то в окне программирования в вкладке "Lock and Fuse bits" находим раздел - "Fusebits". В этом разделе три пункта, нас интересуют следующие настройки фьюзов:

FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)

Вроде все заработало как надо... :) В работе посмотрю потом еще, как себя схема вести будет.
Ответить

Вернуться в «AVR»