BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Вт дек 30, 2008 20:51: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 , время получается в миллисекундах ..

На этом все :) Если что непонятно - спрашивай ...
Последний раз редактировалось Shuriks Пт фев 13, 2009 13:49:00, всего редактировалось 1 раз.
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Shuriks писал(а):Хорошо , давай разберем на простом примере как-раз для одной секунды:
Отличный пост. Предлагаю прибить к шапке форма под заголовком "Работа с таймерами в AVR и не только" если это будет сделано обязуюсь написать второй пост про режим CTC, в подобном стиле.
З.Ы.только баскомовский (или что там за язык) пример не буду делать ибо не пишу на нем.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Вт дек 30, 2008 20:51:09
Откуда: Россия, г. Брянск

Сообщение Shuriks »

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

А по поводу режима СТС обязательно напиши ... Думаю всем будет интересно .. и познавательно :idea: Каюсь , представление имею .. но конкретно не использовал - пока не использовал .. Дальше звука пока у меня не пошло ... :))
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Сообщение max50 »

Здравствуйте!
Вопрос такой:
как заставить МК при появлении условия считать время?
Заранее спасибо!
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение 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 - переменная, декрементируемая в прерываниях по совпадению.
Этап второй - техническая реализация Поскольку техническая реалиция зависит от языка программирования, я ее приводит не буду, дабы не разводить еще большего офтопа (ну не знаю я баскома вообще, С плохонько, если будет надо на АСМ выложу) и вообще что-то устал я писать, может кто-нибудь возьмется пример кода написать, если что я подскажу. Надеюсь что гнев модераторов за уже разведенный офтоп будет не слишком сильным...
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Вт дек 30, 2008 20:51:09
Откуда: Россия, г. Брянск

Сообщение Shuriks »

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


Элементарно ! .. При возникновении какого-либо условия запускаем таймер командой Start Timer0 (или TimerN , где N-номер таймера) , в обработке прерывания таймера по переполнению увеличиваем переменную-счетчик . По "исчезновению" условия останавливаем таймер командой Stop Timer0 (или TimerN). После этого смотрим на переменную-счетчик и вычисляем время.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 152
Зарегистрирован: Пн ноя 03, 2008 12:08:42
Откуда: Владивосток

Сообщение Gryphon »

Здравствуйте! Может мне кто-либо соизволит ответить, как управлять TDA8425, а то я замучился искать похожие проекты.
Вы получаете от людей больше, если им противоречите
Контактная информация:
Открыл глаза
Сообщения: 70
Зарегистрирован: Сб дек 27, 2008 15:40:06

Сообщение pomidor »

сим соизволяю.
http://dal.sci-lib.com/word038097.html

но, вообще-то i2c он и в Африке он же.
А чем Баширов 'Применение микроконтроллеров в звуковой технике' плоха (книжка)? Если что, гугль в помощь!
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20

Сообщение Тихан »

Почему только когда кнопка нажата кнопки выполняется какойто световой эффект, а как только я отпускаю кнопку он перестаёт рабоотать хотя у меня переменная изменена(скажем

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

If s=1 then
...
свето эффект
...
end if
переменная s у меня при нажатии кнопки становится s=1
???????
Кто подскажет?
Съел сам, помоги соседу. Соседу мясо вредно:)
Контактная информация:
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Тихан писал(а):...
Кто подскажет?
По такому отрывку кода вряд-ли кто-то кроме телепатов что-то подскажет. Первый вопрос - защита от дребезга есть? А вообще, что гадать, код в студию!
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20

Сообщение Тихан »

Вот код: это мой вариант интелектной мышки на АВР.
Последний раз редактировалось Тихан Вс фев 22, 2009 20:24:51, всего редактировалось 1 раз.
Съел сам, помоги соседу. Соседу мясо вредно:)
Контактная информация:
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Тихан писал(а):Вот код: это мой вариант интелектной мышки на АВР.
Вообще я наверное сгоряча написал про код в студию, не посмотрев на название темы, я в баскоме не разбираюсь на самом деле, но позволю себе два замечания.
1 не заметил в коде, где переменной P присваивается начальное значение.
2. Код абсолютно некомментированный, я думаю даже знаток баскома вряд ли захочет в нем разбираться.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20

Сообщение Тихан »

Разобрался в чем дело.Спасибо!
Съел сам, помоги соседу. Соседу мясо вредно:)
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20

Сообщение Тихан »

Помогите! Посмотрите прогу управления ТДА8425!Правильный хоть мыслей ход у меня?
Мне дорого покупать ЛСД и потому собрал динам. индик.
И как делать функции MUTE и др.?

воть код http://www.sharemania.ru/0255401
Съел сам, помоги соседу. Соседу мясо вредно:)
Контактная информация:
Родился
Сообщения: 9
Зарегистрирован: Вт окт 02, 2007 21:27:15

Сообщение omike »

Всем привет! Вопрос к Shuriks ! А как в баскоме сгенерить частоту при помощи таимера (меандр порядка 100 кгц),работаем с atmega8 от внутр. кварца 1мгц.Заранее спасибо! :(
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Вт дек 30, 2008 20:51:09
Откуда: Россия, г. Брянск

Сообщение Shuriks »

to Omike .. Извините , что не сразу Вам ответил ... Очень занят , запускаю серву Hitec HS-422 на Bascom'е :)) На ваш вопрос , отвечу чуть позже с рабочим примером и объяснениями ..
Контактная информация:
Родился
Сообщения: 9
Зарегистрирован: Вт окт 02, 2007 21:27:15

Сообщение omike »

Спасибо !жду ,этот басик даже оч не плох жаль что литературы по нему маловато :cry:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20

Сообщение Тихан »

А куда надо подкючать R/W у ЖКИ?
И надо ли его подключать вобще?
А то он запустился а ничего не отображает.А R/W не подключал.
Съел сам, помоги соседу. Соседу мясо вредно:)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

Тихан писал(а):А куда надо подкючать R/W у ЖКИ?
И надо ли его подключать вобще?
Надо, т.к. этот вывод определяет направление передачи данных. BASCOM чтение из индикатора не использует, так что смело вешайте этот пин на землю.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Вс дек 07, 2008 00:45:10
Откуда: Задворки родины

Сообщение Деня »

Еще с ЖКИшкой можно работать как с внешней памятью
я на 128меге такое практиковал получается.
Ответить

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