Страница 246 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт фев 23, 2016 14:16:04
Секретный кот
Коллеги, есть небольшой вопросик.
Уже многие годы сижу на 1.11.9.8, довольно много наработал на этой версии. Неоднократно делал попытки перейти на более новую версию, но что-то "не срастается". В частности, обнаружил, что после компиляции в версии 2.0.Х.Х перестают работать все команды вида
, программа в этих местах просто зависает. Кто-нибудь сталкивался с таким? Я чего-то не учёл или это пока не замеченный баг компилятора, кочующий из версии в версию?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср фев 24, 2016 22:40:03
Hot
коты !!
есть вопросик- как заставить DS1307 работать в 12 часовом режиме?
I2cstart
I2cwbyte &HD0
I2cwbyte &H02
I2cwbyte &B0100000
I2cstop
что я делаю не так?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт фев 25, 2016 10:31:35
vem566
Вроде все правильно, мне лениво много букоф в коде, поэтому пишу
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte 64
I2cstop
До сих пор работает.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт фев 25, 2016 21:43:29
Hot
vem566 писал(а):Вроде все правильно, мне лениво много букоф в коде, поэтому пишу
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte 64
I2cstop
До сих пор работает.
пасиба, работает
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт фев 26, 2016 16:03:32
vem566
Спешка, однако...
Hot писал(а):I2cstart
I2cwbyte &HD0
I2cwbyte &H02
I2cwbyte &B0100000 <-- это 7 бит, а не 8.
I2cstop
Нужно было просто добавить еще один ноль конец.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт фев 26, 2016 16:06:12
edm2007
Позанудничаю: это первый бит, а не седьмой (и уж тем более не восьмой). Счет идет от старшего значащего, к младшему. 76543210.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт фев 26, 2016 16:12:57
vem566
edm2007 писал(а):Позанудничаю
Давай, давай.
Вообще то это указывалось количество, а не номер бита. И в единицу должен стать шестой бит. Если посмотреть два предыдущих сообщения более внимательно.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт фев 26, 2016 16:13:58
edm2007
Ну хорошо-хорошо. Верю.

Не так понял просто. А на деле вопрошающий действительно невнимателен был, довольно частая ошибка. И тут в том же шестнадцатеричном (десятичном) виде хоть и менее наглядно, но ошибиться шанс меньше, думается мне. Больше осознанных действий, все же...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт фев 26, 2016 16:24:13
vem566
Бывает.
А про ошибку, так сейчас редко кто свободно владеет двоичным кодом. Многие программисты встают в позу усиленного мозгового вычисления 2^12. Даже на форуме, судя по сообщениям, 2^16 остается тайной работы часовых кварцев.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс фев 28, 2016 19:28:40
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
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс фев 28, 2016 20:57:45
vem566
Исходник писать не буду. А реализация простая.
После нажатия кнопки ждем её отпускания, выставляем флаг, что музыка идет. Запускаем музыку.
запускаем таймер. Когда таймер отсчитает секунду - сбрасываем флаг.
Возможно множество вариаций алгоритма, но смысл в том, что бы таймер в фоновом режиме считал время.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс фев 28, 2016 21:06:33
jumbo
зачем ждать отпускания кнопки ? выставляем флаг ? какой?? запускаем таймер, вопрос тот же какой ? почему сбасывать флаг после секунды ? извините за вопросы это первый проэкт

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс фев 28, 2016 21:14:23
vem566
jumbo писал(а):при отпускании кнопки
Это кто писал?
Контроллер, эта такая штука, которая работает непрерывно. Поэтому ему лучше знать, что музыка играет, и что нужно дождаться когда пройдет секунда по внутреннему таймеру. В качество флага использовать любую переменную типа "байт".
1 = включена музыка, 0 = выключена. Опять же ситуация: когда играет музыка нажать кнопку что будет(должно) быть?
Наплевать? Или начать сначала? Или заткнуться? Какая реакция контроллера должна быть? Ну это так, для примера.
Про таймеры подробно расписано в даташите на контроллер. Он (даташит) должен быть "настольной книгой", особенно при первых про[b
]Е[/b]ктах. И примеров с описанием как их использовать навалом.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс фев 28, 2016 21:25:50
jumbo
все равно не понял как заставить играть музыку и моргать светодиодом одновременно
а если таймер для проигрования мелодии не использовать а написать цикл типа FOR ?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 09:06:22
vem566
Пробуй. Только что будет внутри этого цикла? А мигать светодиодом будет тот же таймер. Почитай все же даташит. Поймешь, что таймер можно заставить "тикать" с любой частотой. Если с частотой 0.5 герца, то каждое срабатывание будет переворачивать выход на светодиод, а через 120 срабатываний прекратит музыку.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 09:26:35
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
вот только колличество миганий как задать не знаю
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 12:21:44
edm2007
Для смены состояния на противоположное:
И отдайте уже задачу мигания таймеру, а то на таких огромных задержках МК глохнет и слепнет. Это очень нерационально.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 13:18:54
jumbo
типа так ?
Metka1:
Toggle Portb.2
Waitms 1000
Toggle Portb.2
Waitms 1000
Goto Metka1
можете пример написать как отдать задачу таймеру ?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 13:37:19
Аlex
Как уже выше сказали - загляните в даташит на свой МК и посмотрите какие есть у него таймеры. Также, там сможете найти информацию по их настройке и применению.
Аппаратные таймеры считают время в фоновом режиме, вызывая обработчик прерываний по окончанию отсчёта. Им пофигу на основную программу и задержки типа Waitms в ней.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн фев 29, 2016 14:43:43
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 мс) программа уходит по вектору переполнения таймера. Где ведется подсчет этих переполнений, и при наборе нужного количества, светодиод меняет состояние на противоположное. Мигает, проще говоря. Сам.
Вы мне вопрос, и я Вам тоже: с какой частотой (хотя бы примерно) мигает светодиод в данном примере?
P.S. Это один из вариантов реализации на таймере. Можно изящнее, но боюсь, совсем непонятно будет...