- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Занимательная электроника - Юрий Ревич
Шрифт:
Интервал:
Закладка:
Нам не надо, чтобы счет продолжался до бесконечности, и для этой цели служит команда brcc, которая относится к группе команд передачи управления (branch) и работает по очень простому правилу — если в момент ее исполнения бит переноса (он обозначается буквой С, от слова саnу, что и значит «перенос») равен нулю (clear, т. е. очищен), то далее выполняется возврат к команде по метке Delay. To есть название команды (brcc) расшифровывается так: branch if carry clear (перейти, если перенос очищен). В противном случае управление передается на следующую команду — выхода из процедуры ret, счет заканчивается.
Легко сообразить, что в момент выполнения команды brcc перенос станет равен единице только тогда, когда все регистры в предыдущем такте были равны нулю. Поэтому вся процедура работает так: перед ее началом в счетчики Razr0-Razr2 записывается некое заданное число, которое в каждом такте уменьшается на единицу, и вся процедура заканчивается при достижении нулевого значения во всех разрядах. Отсюда, зная тактовую частоту МК и время выполнения команд (по такту на вычитание и два такта на возврат к начальной метке), легко вывести формулу: записываемое в счетчики число N, соответствующее нужному интервалу времени T (с) при тактовой частоте F (Гц), рассчитывается, как T·F/(M + 2), где М — число регистров-счетчиков, в данном случае 3.
Число N в данном случае трехбайтовое. Старший байт записывается в Razr2, младший — в Razr0. При тактовой частоте 4 МГц мы можем получить задержку до 4,19 с, если запишем в регистры все единицы: число 16 777 215 = $FFFFFF. Если же нам требуется, например, задержка в 1 секунду, то придется записать число 800 000 или $0С3500, если в полсекунды — число 400 000 или $061А80.
Вооружившись этими знаниями, попробуем соорудить программу мигалки. Сначала давайте определимся с алгоритмом переключения из красного в зеленый. Наиболее универсальный метод здесь такой: каждый раз будем определять, в каком состоянии в данный момент находится светодиод (по состоянию какого-нибудь из задействованных выводов порта), и переключать его в противоположное. Это может выглядеть таким образом:
Не углубляясь в подробности, заметим, что такой алгоритм (он, конечно, не единственно возможный) будет устойчив к начальным условиям — в каком бы состоянии к моменту его начала ни находились биты 5 и 6 (даже если светодиод был совсем погашен), максимум через один цикл они придут в противоположное состояние, и мигание начнется. Теперь осталось соединить все это в законченную программу — повторять процедуру мигания через промежуток времени, определяемый процедурой Delay. Программа будет выглядеть таким образом:
О назначении первых двух операторов программы мы поговорим позднее. Rcall — команда вызова процедуры (в данном случае Delay). После этой команды всегда должна где-то встретиться команда ret (возврата из процедуры), иначе программа к основной последовательности операторов вернуться не «сумеет». Сама программа представляет собой бесконечный цикл, т. к. заканчивается оператором безусловного перехода обратно в начало (rjmp Migbegin). В данном случае мигание будет происходить с периодом в секунду (полсекунды красный, полсекунды зеленый), для другого периода нужно изменить записываемое в счетчики значение. Программа может служить хорошей основой для любимого развлечения радиолюбителей — конструирования елочных гирлянд.
* * *
Заметки на полях
Кстати, о елочных гирляндах. На мой вкус, самый приличный вариант построения такой гирлянды, который к тому же не встретишь в продаже, — это обеспечить вместо раздражающего мигания медленное изменение из одного цвета в другой. Его несложно построить, используя явление биений: если сложить два почти совпадающих по частоте колебания через элемент, например, «Исключающее ИЛИ», то на выходе возникнет колебание с меняющейся скважностью (см. рис. 15.8, а, аналогичный эффект можно получить и с другими логическими функциями). Если напряжение такой формы подать на лампочку, то высокочастотные составляющие не будут заметны, и лампочка станет медленно зажигаться и гаснуть. При очень близких, но все-таки не равных частотах, период биений может составить минуты, а если взять две разноцветных лампочки или светодиода и включить их в противофазе, то гирлянда начнет медленно менять цвет с одного на другой. Причем в качестве одной из частот удобно взять частоту электрической сети, которая никогда точно не равна 50 Гц.
Для осуществления этого проекта на дискетной логике пришлось бы городить довольно громоздкую схему на счетчиках с предзагрузкой, причем долго подгонять коэффициент деления так, чтобы смена цветов не была слишком быстрой. А вот с помощью контроллера такая задача решается, что называется, в пять секунд. Для одной лампочки или светодиода почти не нужно даже менять схему по сравнению с рис. 19.2 — достаточно подключить светоизлучающий элемент не непосредственно к выводу контроллера, а через ключевой транзистор. Коллекторную цепь его, в которую и будет включена лампочка или светодиод, при этом нужно питать от источника пульсирующего напряжения с частотой сети (от отдельной обмотки трансформатора через один диод, без сглаживания). А частоту на выводе МК, управляющую открыванием транзистора, подогнать примерно под 50 Гц (т. е. длительность задержки должна составить примерно 0,01 с, для чего в счетчики придется записать число около 8000, или, в шестнадцатеричной системе, 1F40h — как видите, можно сократить число регистров задержки до двух). Частоты станут складываться прямо на транзисторе — лампочка будет гореть только тогда, когда и на коллекторе, и на его базе одновременно присутствует высокий уровень напряжения. Чтобы сделать эффект более заметным, можно поиграть со значением скважности, т. е. ввести разные задержки для красного и зеленого состояний. Поскольку у нас уже имеется два управляемых в противофазе вывода, можно добиться переливания из одного цвета в другой, а если усложнить программу, подключив еще несколько выводов МК, то можно получить весьма сложные и красивые эффекты. И, что приятно, экспериментируя с такой схемой, почти не придется браться за паяльник.
Применение прерыванийДля того чтобы сделать все то же самое, но «по-настоящему», придется воспользоваться таймером, а значит — прерываниями. Заметим, что в большинстве проектов Arduino прерывания в явном виде не используются, что относится к одному из главных недостатков этой платформы. Наличие аппаратных прерываний — одно из главных преимуществ современных контроллеров, и если в Arduino мы этим подходом часто жертвуем ради простоты, то в обычном программировании такое недопустимо.
Если помните, я говорил, что при возникновении прерывания процессор обращается по некоторому фиксированному адресу. Для каждой модели МК количество и типы прерываний различаются, потому эти адреса фиксированы для каждой модели процессора. Это первые адреса памяти программ, начиная с адреса 0:0 и дальше, — столько адресов, сколько имеется прерываний.
В МК ATtiny2313 имеется 19 прерываний (в его классическом аналоге было всего 11), соответственно, они занимают первые 19 адресов памяти программ. Напомним: поскольку коды команд двухбайтовые, то память программ организована по 16-битовым словам, поэтому адреса в памяти программ означают адреса слов, а байтовый адрес будет в два раза больше (т. е. не 0, 1, 2…., а 0, 2, 4…). Это вас ни в коей мере не должно волновать, потому что абсолютные адреса вам отсчитывать не придется, — достаточно правильно оформить первые 19 строк кода, после секции всех определений. Поэтому использующая прерывания программа для ATtiny2313 всегда должна начинаться с последовательности команд, представляющих векторы прерываний, по следующему образцу:
* * *
Подробности
Если сравнить таблицы прерываний «классического» AT90S2313 и ATtiny2313, то окажется, что первые 11 векторов у них полностью совпадают. Отсутствующие в «классическом» аналоге остальные 8 векторов можно просто проигнорировать: если соответствующие прерывания не задействованы, то к ним никогда не произойдет обращения. По этой причине программы, написанные для AT90S2313, почти без оговорок совместимы с ATtiny2313 (не требуется даже заменять файл определений констант 2313def.inc). В дальнейшем мы будем без пояснений употреблять программы для обеих версий этого МК.
* * *
Здесь rjmp — знакомая нам команда безусловного перехода, a RESET, EXT_INTO и т. п. — метки в тексте программы, откуда начинается текст процедуры (подпрограммы) обработки прерывания. Метки могут быть обозначены и по-иному, тут полный произвол. Сам переход осуществляется автоматически, если в процессе выполнения программы возникнут условия для возникновения соответствующего прерывания, для чего и его отдельно, и прерывания вообще надо еще разрешить.