Коллеги, есть небольшой вопросик.
Уже многие годы сижу на 1.11.9.8, довольно много наработал на этой версии. Неоднократно делал попытки перейти на более новую версию, но что-то "не срастается". В частности, обнаружил, что после компиляции в версии 2.0.Х.Х перестают работать все команды вида
, программа в этих местах просто зависает. Кто-нибудь сталкивался с таким? Я чего-то не учёл или это пока не замеченный баг компилятора, кочующий из версии в версию?
Даже остановленные часы два раза в сутки показывают правильное время.
Давай, давай.
Вообще то это указывалось количество, а не номер бита. И в единицу должен стать шестой бит. Если посмотреть два предыдущих сообщения более внимательно.
Ну хорошо-хорошо. Верю. Не так понял просто. А на деле вопрошающий действительно невнимателен был, довольно частая ошибка. И тут в том же шестнадцатеричном (десятичном) виде хоть и менее наглядно, но ошибиться шанс меньше, думается мне. Больше осознанных действий, все же...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Бывает.
А про ошибку, так сейчас редко кто свободно владеет двоичным кодом. Многие программисты встают в позу усиленного мозгового вычисления 2^12. Даже на форуме, судя по сообщениям, 2^16 остается тайной работы часовых кварцев.
Есть такая схема (во вложении), должно работать так: при отпускании кнопки должен мигать светодиод и играть звук, длительностью одна минута, после этого программа должна переходить в начало опроса кнопки. Как сделать чтобы светодиод и звук работали одновременно, и как написать чтобы мигание и звук продолжались только 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
Исходник писать не буду. А реализация простая.
После нажатия кнопки ждем её отпускания, выставляем флаг, что музыка идет. Запускаем музыку.
запускаем таймер. Когда таймер отсчитает секунду - сбрасываем флаг.
Возможно множество вариаций алгоритма, но смысл в том, что бы таймер в фоновом режиме считал время.
зачем ждать отпускания кнопки ? выставляем флаг ? какой?? запускаем таймер, вопрос тот же какой ? почему сбасывать флаг после секунды ? извините за вопросы это первый проэкт
Это кто писал?
Контроллер, эта такая штука, которая работает непрерывно. Поэтому ему лучше знать, что музыка играет, и что нужно дождаться когда пройдет секунда по внутреннему таймеру. В качество флага использовать любую переменную типа "байт".
1 = включена музыка, 0 = выключена. Опять же ситуация: когда играет музыка нажать кнопку что будет(должно) быть?
Наплевать? Или начать сначала? Или заткнуться? Какая реакция контроллера должна быть? Ну это так, для примера.
Про таймеры подробно расписано в даташите на контроллер. Он (даташит) должен быть "настольной книгой", особенно при первых про[b]Е[/b]ктах. И примеров с описанием как их использовать навалом.
Пробуй. Только что будет внутри этого цикла? А мигать светодиодом будет тот же таймер. Почитай все же даташит. Поймешь, что таймер можно заставить "тикать" с любой частотой. Если с частотой 0.5 герца, то каждое срабатывание будет переворачивать выход на светодиод, а через 120 срабатываний прекратит музыку.
Как уже выше сказали - загляните в даташит на свой МК и посмотрите какие есть у него таймеры. Также, там сможете найти информацию по их настройке и применению.
Аппаратные таймеры считают время в фоновом режиме, вызывая обработчик прерываний по окончанию отсчёта. Им пофигу на основную программу и задержки типа Waitms в ней.
$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. Это один из вариантов реализации на таймере. Можно изящнее, но боюсь, совсем непонятно будет...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон