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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Секретный кот
Поставщик валерьянки для Кота
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки
Контактная информация:

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

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

Коллеги, есть небольшой вопросик.
Уже многие годы сижу на 1.11.9.8, довольно много наработал на этой версии. Неоднократно делал попытки перейти на более новую версию, но что-то "не срастается". В частности, обнаружил, что после компиляции в версии 2.0.Х.Х перестают работать все команды вида

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

printbin x
, программа в этих местах просто зависает. Кто-нибудь сталкивался с таким? Я чего-то не учёл или это пока не замеченный баг компилятора, кочующий из версии в версию?
Даже остановленные часы два раза в сутки показывают правильное время.
Hot
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пн май 25, 2015 21:29:15
Откуда: Владимир

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

Сообщение Hot »

коты !!
есть вопросик- как заставить DS1307 работать в 12 часовом режиме?

I2cstart
I2cwbyte &HD0
I2cwbyte &H02
I2cwbyte &B0100000
I2cstop


что я делаю не так?
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Вроде все правильно, мне лениво много букоф в коде, поэтому пишу

I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte 64
I2cstop

До сих пор работает.
Hot
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пн май 25, 2015 21:29:15
Откуда: Владимир

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

Сообщение Hot »

vem566 писал(а):Вроде все правильно, мне лениво много букоф в коде, поэтому пишу

I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte 64
I2cstop

До сих пор работает.



пасиба, работает
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Спешка, однако...
Hot писал(а):I2cstart
I2cwbyte &HD0
I2cwbyte &H02
I2cwbyte &B0100000 <-- это 7 бит, а не 8.
I2cstop


Нужно было просто добавить еще один ноль конец.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Позанудничаю: это первый бит, а не седьмой (и уж тем более не восьмой). Счет идет от старшего значащего, к младшему. 76543210. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

edm2007 писал(а):Позанудничаю
Давай, давай.
Вообще то это указывалось количество, а не номер бита. И в единицу должен стать шестой бит. Если посмотреть два предыдущих сообщения более внимательно.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну хорошо-хорошо. Верю. :)) Не так понял просто. А на деле вопрошающий действительно невнимателен был, довольно частая ошибка. И тут в том же шестнадцатеричном (десятичном) виде хоть и менее наглядно, но ошибиться шанс меньше, думается мне. Больше осознанных действий, все же...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Бывает. :beer:
А про ошибку, так сейчас редко кто свободно владеет двоичным кодом. Многие программисты встают в позу усиленного мозгового вычисления 2^12. Даже на форуме, судя по сообщениям, 2^16 остается тайной работы часовых кварцев.
Аватара пользователя
jumbo
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вт фев 03, 2009 11:06:33

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

Сообщение jumbo »

Есть такая схема (во вложении), должно работать так: при отпускании кнопки должен мигать светодиод и играть звук, длительностью одна минута, после этого программа должна переходить в начало опроса кнопки. Как сделать чтобы светодиод и звук работали одновременно, и как написать чтобы мигание и звук продолжались только 1 минуту. Вот что удалось написать самому. Спасибо.

$regfile = "attiny13.dat"
$crystal = 8000000

Config Pinb.3 = Input
Config Portb.2 = Output

Do

If Pinb.3 = 0 Then Portb.2 = 0
If Pinb.3 = 1 Then Portb.2 = 1
If Portb.2 = 1 Then Goto Metka1

Loop

Metka1:

Waitms 1000
If Portb.2 = 1 Then Portb.2 = 0
Waitms 1000
If Portb.2 = 0 Then Portb.2 = 1
Waitms 1000


Sound , Portb.0 , 65 , 1274 'C2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 87 , 954 'F2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 98 , 850 'G2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 87 , 954 'F2(1/16)
Sound , Portb.0 , 117 , 715 'Ais2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 110 , 758 'A2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 98 , 850 'G2(1/16)
Waitms 125 'P(1/16)
Sound , Portb.0 , 110 , 758 'A2(1/16)
Sound , Portb.0 , 87 , 954 'F2(1/16)
Waitms 125 'P(1/16)
Wait 2

End
Вложения
sxema.jpg
(22.46 КБ) 371 скачивание
нужно не только знать, но и уметь это объяснить
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Исходник писать не буду. А реализация простая.
После нажатия кнопки ждем её отпускания, выставляем флаг, что музыка идет. Запускаем музыку.
запускаем таймер. Когда таймер отсчитает секунду - сбрасываем флаг.
Возможно множество вариаций алгоритма, но смысл в том, что бы таймер в фоновом режиме считал время.
Аватара пользователя
jumbo
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вт фев 03, 2009 11:06:33

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

Сообщение jumbo »

зачем ждать отпускания кнопки ? выставляем флаг ? какой?? запускаем таймер, вопрос тот же какой ? почему сбасывать флаг после секунды ? извините за вопросы это первый проэкт :oops:
нужно не только знать, но и уметь это объяснить
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

jumbo писал(а):при отпускании кнопки
Это кто писал?
Контроллер, эта такая штука, которая работает непрерывно. Поэтому ему лучше знать, что музыка играет, и что нужно дождаться когда пройдет секунда по внутреннему таймеру. В качество флага использовать любую переменную типа "байт".
1 = включена музыка, 0 = выключена. Опять же ситуация: когда играет музыка нажать кнопку что будет(должно) быть?
Наплевать? Или начать сначала? Или заткнуться? Какая реакция контроллера должна быть? Ну это так, для примера.
Про таймеры подробно расписано в даташите на контроллер. Он (даташит) должен быть "настольной книгой", особенно при первых про[b[/b]ктах. И примеров с описанием как их использовать навалом.
Аватара пользователя
jumbo
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вт фев 03, 2009 11:06:33

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

Сообщение jumbo »

все равно не понял как заставить играть музыку и моргать светодиодом одновременно :shock:

а если таймер для проигрования мелодии не использовать а написать цикл типа FOR ?
нужно не только знать, но и уметь это объяснить
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Пробуй. Только что будет внутри этого цикла? А мигать светодиодом будет тот же таймер. Почитай все же даташит. Поймешь, что таймер можно заставить "тикать" с любой частотой. Если с частотой 0.5 герца, то каждое срабатывание будет переворачивать выход на светодиод, а через 120 срабатываний прекратит музыку.
Аватара пользователя
jumbo
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вт фев 03, 2009 11:06:33

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

Сообщение jumbo »

а чтобы мигал светодиод я таймер не использовал

Metka1:

Waitms 1000
If Portb.2 = 1 Then Portb.2 = 0
Waitms 1000
If Portb.2 = 0 Then Portb.2 = 1
Waitms 1000
Goto Metka1

вот только колличество миганий как задать не знаю
нужно не только знать, но и уметь это объяснить
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Для смены состояния на противоположное:

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

Toggle Portb.2


И отдайте уже задачу мигания таймеру, а то на таких огромных задержках МК глохнет и слепнет. Это очень нерационально.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
jumbo
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вт фев 03, 2009 11:06:33

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

Сообщение jumbo »

типа так ?

Metka1:
Toggle Portb.2
Waitms 1000
Toggle Portb.2
Waitms 1000
Goto Metka1


можете пример написать как отдать задачу таймеру ?
нужно не только знать, но и уметь это объяснить
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Как уже выше сказали - загляните в даташит на свой МК и посмотрите какие есть у него таймеры. Также, там сможете найти информацию по их настройке и применению.
Аппаратные таймеры считают время в фоновом режиме, вызывая обработчик прерываний по окончанию отсчёта. Им пофигу на основную программу и задержки типа Waitms в ней.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

jumbo писал(а):можете пример написать как отдать задачу таймеру ?


Я-то могу, вот только Вам-то оно вряд ли поможет. Например, как вариант на самом простом таймере:

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

$regfile = "m8def.dat"                                      ' тип МК
$crystal = 4000000                                          ' тактовая частота МК

'----------

Config Portd.0 = Output                                     ' пин порта для светодиода - выход
Reset Portd.0                                               ' пока светодиод погашен

'----------

Config Timer0 = Timer , Prescale = 1024                     ' таймер 0 по переполнению каждые 1/4000000Гц * 256 * 1024 = 65,536 мс
On Ovf0 Blink_led                                           ' вектор прерывания по переполнению

Enable Interrupts                                           ' глобальное разрешение прерываний
Enable Ovf0                                                 ' и по переполнению таймера в частности

'----------

Dim Count_timer As Byte                                     ' счетчик переполнений таймера

'----------

Do                                                          ' пустой цикл

Loop

'----------

Blink_led:                                                  ' обработчик прерывания таймера

Incr Count_timer                                            ' инкремент счетчика переполнений

If Count_timer = 7 Then                                     ' если насчитали нужное время

   Count_timer = 0                                          ' сбрасываем счетчик
   Toggle Portd.0                                           ' инвертируем состояние светодиода

End If

Return                                                      ' выход из прерывания   


Обратите внимание, здесь основной цикл Do ... Loop совершенно пустой, контроллер в нем топчется без дела. А в то же время таймер 0 молотит, и при переполнении счетного регистра (каждые 65,536 мс) программа уходит по вектору переполнения таймера. Где ведется подсчет этих переполнений, и при наборе нужного количества, светодиод меняет состояние на противоположное. Мигает, проще говоря. Сам. :tea:

Вы мне вопрос, и я Вам тоже: с какой частотой (хотя бы примерно) мигает светодиод в данном примере?

P.S. Это один из вариантов реализации на таймере. Можно изящнее, но боюсь, совсем непонятно будет...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

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