Страница 246 из 304

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

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

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

printbin x
, программа в этих местах просто зависает. Кто-нибудь сталкивался с таким? Я чего-то не учёл или это пока не замеченный баг компилятора, кочующий из версии в версию?

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. :tea:

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
Бывает. :beer:
А про ошибку, так сейчас редко кто свободно владеет двоичным кодом. Многие программисты встают в позу усиленного мозгового вычисления 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
зачем ждать отпускания кнопки ? выставляем флаг ? какой?? запускаем таймер, вопрос тот же какой ? почему сбасывать флаг после секунды ? извините за вопросы это первый проэкт :oops:

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

Добавлено: Вс фев 28, 2016 21:14:23
vem566
jumbo писал(а):при отпускании кнопки
Это кто писал?
Контроллер, эта такая штука, которая работает непрерывно. Поэтому ему лучше знать, что музыка играет, и что нужно дождаться когда пройдет секунда по внутреннему таймеру. В качество флага использовать любую переменную типа "байт".
1 = включена музыка, 0 = выключена. Опять же ситуация: когда играет музыка нажать кнопку что будет(должно) быть?
Наплевать? Или начать сначала? Или заткнуться? Какая реакция контроллера должна быть? Ну это так, для примера.
Про таймеры подробно расписано в даташите на контроллер. Он (даташит) должен быть "настольной книгой", особенно при первых про[b[/b]ктах. И примеров с описанием как их использовать навалом.

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

Добавлено: Вс фев 28, 2016 21:25:50
jumbo
все равно не понял как заставить играть музыку и моргать светодиодом одновременно :shock:

а если таймер для проигрования мелодии не использовать а написать цикл типа 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
Для смены состояния на противоположное:

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

Toggle Portb.2
И отдайте уже задачу мигания таймеру, а то на таких огромных задержках МК глохнет и слепнет. Это очень нерационально.

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 мс) программа уходит по вектору переполнения таймера. Где ведется подсчет этих переполнений, и при наборе нужного количества, светодиод меняет состояние на противоположное. Мигает, проще говоря. Сам. :tea:

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

P.S. Это один из вариантов реализации на таймере. Можно изящнее, но боюсь, совсем непонятно будет...