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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Shuriks
Первый раз сказал Мяу!
Сообщения: 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 раз.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Shuriks писал(а):Хорошо , давай разберем на простом примере как-раз для одной секунды:

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

Сообщение Shuriks »

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

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

Сообщение max50 »

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

Использование режима CTC (по просьбе Shuriks)

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

Сообщение Shuriks »

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

как заставить МК при появлении условия считать время?


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

Сообщение Gryphon »

Здравствуйте! Может мне кто-либо соизволит ответить, как управлять TDA8425, а то я замучился искать похожие проекты.
Вы получаете от людей больше, если им противоречите
pomidor
Открыл глаза
Сообщения: 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
???????
Кто подскажет?
Съел сам, помоги соседу. Соседу мясо вредно:)
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Тихан писал(а):...
Кто подскажет?

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

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

Вот код: это мой вариант интелектной мышки на АВР.
Последний раз редактировалось Тихан Вс фев 22, 2009 20:24:51, всего редактировалось 1 раз.
Съел сам, помоги соседу. Соседу мясо вредно:)
smac
Мучитель микросхем
Сообщения: 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
Съел сам, помоги соседу. Соседу мясо вредно:)
omike
Родился
Сообщения: 9
Зарегистрирован: Вт окт 02, 2007 21:27:15

Сообщение omike »

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

Сообщение Shuriks »

to Omike .. Извините , что не сразу Вам ответил ... Очень занят , запускаю серву Hitec HS-422 на Bascom'е :)) На ваш вопрос , отвечу чуть позже с рабочим примером и объяснениями ..
omike
Родился
Сообщения: 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»