Страница 13 из 304
Добавлено: Чт фев 12, 2009 17:36:09
Shuriks
Хорошо , давай разберем на простом примере как-раз для одной секунды:
1.
Нам нужен кварц. Кварц желательно выбрать такой , который бы "делился" без остатка на один из коэффициентов деления таймера (коэффициент деления может быть: 8, 64, 256, 1024) . Очень хорошо для этих целей подходят т.н. "компьютерные" кварцы , например: 8,192 МГц ; 11,592 МГц .
Мы возьмем кварц с частотой : 8, 192 МГц .
2.
Выбираем коэффициент деления таймера. Лучше конечно выбирать коэффициент 64 и выше (256, 1024), если конечно позволяет логика программы.
3.
Считаем ! Чтобы получить сколько раз "выполнится" переполнение таймера 0 (Timer0) в секунду делим тактовую частоту (значение кварца) на коэффициент деления :
8192000 Гц/64 =128 000 , но переполнение для того и названого переполнение , что прерывание по переполнению будет вызвано , только тогда, когда произойдет переполнение специальной переменной-счетчика TCNT0 (для таймера 0 , из Bascom'а можно напрямую обращаться к ней по имени Timer0 , если нужно) и установиться специальный флаг переполнения , для Timer0 - это 256 (максимально возможное число для 8 бит + 1 ) , а для Timer1 - 65536 (16 бит) , т.е. полученное число надо поделить еще на 256. Итого :
128000/256 = 500 ... вот сколько всего прерываний по переполнению Таймера0 будет вызвано за 1 секунду.
4.
Реализация. Сначала конфигурируем Таймер 0 . Итак :
Код: Выделить всё
$crystal = 8192000
Config Timer0 = Timer, Prescale=64
'Но нам надо, чтобы наша процедура выполнялась всего раз в 1 секунду ... Пожалуйста ! Для этого вводим 'дополнительный счетчик.
Dim Ncount as Word
Ncount=0
'А вот процедура самого Таймера0 .
Tim_0:
Incr Ncount
If Ncount = 500 then
Ncount=0
' а далее ваше тело процедуры
end if
Return
Примечания :
Чтобы это все получить не в разах , а в секундах ... Соответственно надо поделить время на количество. Например : 1 сек = 1000 мс / 500 = 2 мс ... Это время через которое , будет происходить прерывание таймера .. А можно и сразу посчитать , берем коэффициент деления таймера / частоту
кварца в кГц * 256 , в виде формулы :
t = Kдел / Fтак * 256 , время получается в миллисекундах ..
На этом все

Если что непонятно - спрашивай ...
Добавлено: Чт фев 12, 2009 21:07:44
smac
Shuriks писал(а):Хорошо , давай разберем на простом примере как-раз для одной секунды:
Отличный пост. Предлагаю прибить к шапке форма под заголовком "Работа с таймерами в AVR и не только" если это будет сделано обязуюсь написать второй пост про режим CTC, в подобном стиле.
З.Ы.только баскомовский (или что там за язык) пример не буду делать ибо не пишу на нем.
Добавлено: Чт фев 12, 2009 21:36:28
Shuriks
Спасибо
Smac !!!

А по поводу Bascom'а - я пишу на нем потому что мне - это удобно .. Но конечно я по-любому делаю вставки на ассемблере , т.к. не может быть языка высокого уровня для МК ... Смотришь потом на программу , от Bascom'а остались только программные конструкции (if .. then ... a=a+1 и т.д.)
А по поводу режима СТС обязательно напиши ... Думаю всем будет интересно .. и познавательно

Каюсь , представление имею .. но конкретно не использовал - пока не использовал .. Дальше звука пока у меня не пошло ...

Добавлено: Вс фев 15, 2009 00:02:47
max50
Здравствуйте!
Вопрос такой:
как заставить МК при появлении условия считать время?
Заранее спасибо!
Использование режима CTC (по просьбе Shuriks)
Добавлено: Вс фев 15, 2009 04:24:29
smac
Итак у нас есть кварц такой какой есть. Допустим 4 МГц. На примере получения счетчика секунд рассмотрим работу 8-ми битного таймера в режиме CTC (Clear Tiner on Compare). Кратко можно объяснить работы в этом режиме так: на таймер подаются тактовые импульсы, которые он считает. При совпадении числа в регистре таймера TCNTn с числом в регистре сравнения OCRn происходит следующее: таймер автоматически очищается (TCNTn=0); значение OCRn остается прежним, если пользовательская программа его не изменила; таймер продолжает счет с 0. Далее цикл повторяется до бесконечности (пока не перенастроят таймер, не снимут питание и т. п.). В этом режиме частота прерываний по совпадению рассчитывается по формуле
Firq=Fclk/(N*(OCRn+1)), где Fclk - тактовая частота контроллера, N - значение предделителя OCRn - значение записываемое в регистр сравнения (для разных таймеров может варьироваться, например OCR2, OCR1A ...).
Этап первый - расчеты
Имеем частоту 4 000 000 Гц. Задача подобрать делитель N из имеющегося ряда так, чтобы при делении частоты на делитель получалось целое число. Это число - частота тактирования таймера -
Ft=Fclk/N. Для наших значений получаем:
4 000 000 (тактовая частота)/256(делитель) = 15625 (Гц) - частота тактирования таймера.
Теперь рассчитаем значение регистра сравнения, для получения максимальной точности необходимо также выбирать это значение таким чтобы при делении получившейся на входе таймера частоты на выбираемое значение плюс 1 получалось целое число - это число - частота появления прерываний по сравнению Firq=Ft/(OCRn+1).
Для наших чисел получим 15625 (Гц)/125=125(Гц), отсюда OCRn+1=125, т.е. OCRn=124.
На значение регистра сравнения накладывается также условие, исходящее из разрядности таймера, т. е. нужное нам число не должно быть больше (2^n)-1, где n-разрядность таймера. Для таймера 0 разрядность 8, следовательно выбираемое число не должно быть больше 255. Чем ближе значение к (2^n)-1, тем лучше, т. к. при этом реже будет вызываться прерывание и потребуется меньше процессорного времени на отработку временнЫх интервалов.
Итак мы получили частоту появления прерываний по совпадению 125 Гц.
Теперь в обработчике прерывания нужно организовать переменную, назовем ее cmp_cntr нужной разрядности, которая будет декрементироваться при каждом вызове обработчика прерывания по совпадению таймера. Начальное значение переменной должно быть равно 125 (для времени 1 с), равенство переменной нулю будет говорить о том, что отсчитан нужный временной промежуток, естественно после того как переменная станет равно 0, ей нужно снова присвоить начальное значение.
Общая формула для интервала времени, получаемого при описаном подходе в секундах
t=(N*(OCRn+1)*cmp_cntr)/Fclk, где Fclk - тактовая частота контроллера, Гц; N- значение предделителя таймера,
OCRn - число, находящееся в соответсвующем регистре, cmp_cntr - переменная, декрементируемая в прерываниях по совпадению.
Этап второй - техническая реализация Поскольку техническая реалиция зависит от языка программирования, я ее приводит не буду, дабы не разводить еще большего офтопа (ну не знаю я баскома вообще, С плохонько, если будет надо на АСМ выложу) и вообще что-то устал я писать, может кто-нибудь возьмется пример кода написать, если что я подскажу. Надеюсь что гнев модераторов за уже разведенный офтоп будет не слишком сильным...
Добавлено: Вс фев 15, 2009 22:20:04
Shuriks
Молодец
Smac !!!

Так держать ...
От себя лишь добавлю, что в МК есть специальный вывод OCn который можно настроить так (в конфигурации таймера) , что при возникновение прерывания COMPARE1n (в синтаксисе Bascom'а или OC1n - ассемблер) этот вывод будет автоматически переключаться каждый период "туда-обратно" . Причем !!! Работа этого вывода не будет зависить прописали мы обработу прерывания или нет ... Вот такой вот полезный режим таймера

Замечу что этот режим применяется в: генерации различной частоты (например звука) , а также в режимах PWM.
как заставить МК при появлении условия считать время?
Элементарно ! .. При возникновении какого-либо условия запускаем таймер командой
Start Timer0 (или TimerN , где N-номер таймера) , в обработке прерывания таймера по переполнению увеличиваем переменную-счетчик . По "исчезновению" условия останавливаем таймер командой
Stop Timer0 (или TimerN). После этого смотрим на переменную-счетчик и вычисляем время.
Добавлено: Сб фев 21, 2009 12:54:33
Gryphon
Здравствуйте! Может мне кто-либо соизволит ответить, как управлять TDA8425, а то я замучился искать похожие проекты.
Добавлено: Сб фев 21, 2009 23:47:58
pomidor
сим соизволяю.
http://dal.sci-lib.com/word038097.html
но, вообще-то i2c он и в Африке он же.
А чем Баширов 'Применение микроконтроллеров в звуковой технике' плоха (книжка)? Если что, гугль в помощь!
Добавлено: Вс фев 22, 2009 12:03:49
Тихан
Почему только когда кнопка нажата кнопки выполняется какойто световой эффект, а как только я отпускаю кнопку он перестаёт рабоотать хотя у меня переменная изменена(скажем
переменная s у меня при нажатии кнопки становится s=1
???????
Кто подскажет?
Добавлено: Вс фев 22, 2009 15:34:02
smac
Тихан писал(а):...
Кто подскажет?
По такому отрывку кода вряд-ли кто-то кроме телепатов что-то подскажет. Первый вопрос - защита от дребезга есть? А вообще, что гадать, код в студию!
Добавлено: Вс фев 22, 2009 15:41:22
Тихан
Вот код: это мой вариант интелектной мышки на АВР.
Добавлено: Вс фев 22, 2009 19:49:55
smac
Тихан писал(а):Вот код: это мой вариант интелектной мышки на АВР.
Вообще я наверное сгоряча написал про код в студию, не посмотрев на название темы, я в баскоме не разбираюсь на самом деле, но позволю себе два замечания.
1 не заметил в коде, где переменной P присваивается начальное значение.
2. Код абсолютно некомментированный, я думаю даже знаток баскома вряд ли захочет в нем разбираться.
Добавлено: Вс фев 22, 2009 20:25:20
Тихан
Разобрался в чем дело.Спасибо!
Добавлено: Ср мар 04, 2009 12:49:19
Тихан
Помогите! Посмотрите прогу управления ТДА8425!Правильный хоть мыслей ход у меня?
Мне дорого покупать ЛСД и потому собрал динам. индик.
И как делать функции MUTE и др.?
воть код
http://www.sharemania.ru/0255401
Добавлено: Чт мар 05, 2009 16:47:44
omike
Всем привет! Вопрос к Shuriks ! А как в баскоме сгенерить частоту при помощи таимера (меандр порядка 100 кгц),работаем с atmega8 от внутр. кварца 1мгц.Заранее спасибо!

Добавлено: Сб мар 07, 2009 11:01:38
Shuriks
to
Omike .. Извините , что не сразу Вам ответил ... Очень занят , запускаю серву Hitec HS-422 на Bascom'е

На ваш вопрос , отвечу чуть позже с рабочим примером и объяснениями ..
Добавлено: Сб мар 07, 2009 22:22:17
omike
Спасибо !жду ,этот басик даже оч не плох жаль что литературы по нему маловато

Добавлено: Вс мар 08, 2009 14:19:44
Тихан
А куда надо подкючать R/W у ЖКИ?
И надо ли его подключать вобще?
А то он запустился а ничего не отображает.А R/W не подключал.
Добавлено: Вс мар 08, 2009 16:13:20
Секретный кот
Тихан писал(а):А куда надо подкючать R/W у ЖКИ?
И надо ли его подключать вобще?
Надо, т.к. этот вывод определяет направление передачи данных. BASCOM чтение из индикатора не использует, так что смело вешайте этот пин на землю.
Добавлено: Вт мар 10, 2009 13:57:35
Деня
Еще с ЖКИшкой можно работать как с внешней памятью
я на 128меге такое практиковал получается.