Юрий Ревич - Занимательная электроника
- Название:Занимательная электроника
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3479-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Юрий Ревич - Занимательная электроника краткое содержание
На практических примерах рассказано о том, как проектировать, отлаживать и изготавливать электронные устройства в домашних условиях. От физических основ электроники, описания устройства и принципов работы различных радиоэлектронных компонентов, советов по оборудованию домашней лаборатории автор переходит к конкретным аналоговым и цифровым схемам, включая устройства на основе микроконтроллеров. Приведены элементарные сведения по метрологии и теоретическим основам электроники. Дано множество практических рекомендаций: от принципов правильной организации электропитания до получения информации о приборах и приобретении компонентов применительно к российским условиям. Третье издание дополнено сведениями о популярной платформе Arduino, с которой любому радиолюбителю становятся доступными самые современные радиоэлектронные средства.
Для широкого круга радиолюбителей
Занимательная электроника - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
* * *
Заметки на полях
Кстати, а как остановить запущенный таймер, если это потребуется? Очень просто: если обнулить регистр TCCR1B (тот, в котором задается коэффициент деления тактовой частоты), то таймер остановится. Чтобы запустить его опять с коэффициентом 1/64, нужно снова записать в этот регистр значение 0b00000011.
* * *
Обратите внимание, что оператор reti (окончание обработки прерывания) при обработке прерывания таймера встречается дважды — это вполне нормальный прием, когда подпрограмма разветвляется. Можно, конечно, и пометить последний оператор reti меткой, и тогда текст процедуры стал бы неотличим от первого варианта, но так будет корректнее.
Обратите также внимание на форму записи ldi temp, (1 << TOIE1). Поскольку бит, обозначаемый как TOIE1, в регистре TIMSK имеет номер 7, то эта запись эквивалентна записи ldi temp,0b10000000 — можно писать и так, и так, и еще кучей разных способов. Например, для запуска таймера с коэффициентом 1/64 требуется, как видно из текста программы, установить младшие два бита регистра TCCR1B. Здесь мы устанавливаем их в temp напрямую, но поскольку эти биты называются CS11 и CS10, то можно записать так:
ldi temp, (1 << CS11) I (1 << CS10)
или даже так:
ldi temp, (3 << CS10)
Подробно этот способ записи приведен в описании AVR-ассемблера на сайте Atmel [35] Фирменное описание доступно по адресу: http://www.atmel.com/ru/ru/images/doc1022.pdf . Краткий перевод на русский можно найти, например, здесь: http://microcon.euro.ru/app/books/Asm_AVR_rus.pdf . Оба документа, к сожалению, устарели (они относятся к предыдущей версии avrasm32), хотя большая часть изложенных там сведений вполне пригодна и для современной версии. Подробное (хотя и не без досадных неточностей) описание современной версии AVR-ассемблера на русском языке можно найти в [22].
.
* * *
Подробности
В этой программе есть один тонкий момент, связанный с загрузкой счетных регистров таймера. При чтении и записи 16-разрядных регистров Timer 1 их содержимое может измениться в промежутке между чтением или записью отдельных 8-разрядных «половинок» (ведь, например, в данном случае таймер продолжает считать, пока идет обработка прерывания). Потому в 16-разрядных таймерах AVR предусмотрен специальный механизм чтения и записи таких регистров. При записи первым загружается значение старшего байта, которое автоматически помещается в некий (недоступный для программиста) буферный регистр. Затем, когда поступает команда на запись младшего байта, оба значения объединяются, и запись производится одновременно в обе «половинки» 16-разрядного регистра. Наоборот, при чтении первым должен быть прочитан младший байт, при этом значение старшего автоматически фиксируется помещением в тот же буферный регистр, и при следующей операции чтения старшего байта его значение извлекается оттуда. Таким образом и при чтении значения оба байта соответствуют одному и тому же моменту времени.
Повторим: для того, чтобы манипуляции со счетными регистрами были успешными, при чтении необходимо сначала прочесть младший байт TCNTxL, потом старший TCNTxH, при записи сначала записать старший байт TCNTxH, потом младший TCNTxL. Аналогичное правило действует для всех 16-разрядных регистров Timer 1, которые мы будем рассматривать далее, за исключением регистров управления TCCR1A и TCCR1B, которые по сути есть два раздельных регистра, а не один.
* * *
Напомним, что если вам попадется старый «классический» AT90S2313, то приведенную здесь программу можно использовать для него без изменений.
Способ отсчета времени с помощью прерывания таймера по сравнению более понятен и удобен, чем с предзагрузкой значений в счетный регистр, — хотя бы потому, что число, с которым сравнивается содержимое счетных регистров, можно загружать только один раз. Если потом запустить таймер, то больше об этом можно не думать — все будет происходить автоматически. Поскольку в Tiny2313 и большинстве моделей Mega (если не во всех) все таймеры, в том числе и 8-разрядные, имеют такой режим (в «классических» его имел только 16-разрядный Timer 1), то применение его тем более целесообразно.
* * *
Подробности
Прерывание по сравнению происходит в момент, когда счетчик досчитывает до наперед заданного значения, хранящегося в специальном регистре сравнения. Есть одна тонкость, связанная с этим режимом. Входной тактовый сигнал счетчика обычно делится в соответствии с заданным коэффициентом деления (в наших примерах это 1/64). Поэтому в нашем случае каждое состояние счетчика остается неизменным в течение 64 тактов процессора. Так в какой именно момент возникает прерывание — сразу, как только счетчик досчитал до заданного значения, или в момент, когда это заданное значение в счетчике должно уже смениться следующим? Если предположить, что в AVR все устроено, как на рис. 16.13, в, то имеет место первый случай — счетчик начинает новый отсчет с первого системного такта сразу после совпадения величин. Тогда состояния счетчика получаются неравноправными: все они длятся по 64 системных такта (в соответствии с выставленным коэффициентом предделителя), кроме последнего, который длится один системный такт независимо от коэффициента деления. Так это было устроено в «классической» серии AVR. А вот для счетчиков семейств Меда и Tiny все иначе: там событие совпадения наступает по последнему такту при совпадении, в момент, когда состояние счетчика должно уже смениться. Поэтому, если вы зададите в регистрах сравнения, к примеру, число 2, то при коэффициенте деления 1/64 Timer 1 в МК AT90S2313 отсчитает до возникновения прерывания 129 системных тактов (или примерно 2 такта входной частоты счетчика), а в МК ATtiny2313 — 192 системных такта (ровно 3 такта входной частоты). Таким образом, в первом случае коэффициент деления входной частоты таймера в режиме сравнения равен установленному числу N плюс один такт системного генератора, а во втором — числу N + 1.
* * *
Причем в этом режиме можно упростить программу предельно — один из выводов контроллера (при прерывании с применением регистра сравнения А это OC1A — вывод 15 для 2313) можно включить в режим автоматического переключения в момент совпадения, без дополнительного программного управления. Если больше ничего в момент совпадения делать не требуется, не нужно даже будет включать прерывание — переключение вывода происходит аппаратно. Нам здесь это не подходит, т. к. светодиод двухцветный, и все равно необходимо переключать две линии одновременно, а вот в следующей главе мы эту возможность используем.
Для того чтобы установить режим сравнения, нужно вместо прерывания по переполнению разрешить прерывание по сравнению А (бит OCIE1A в регистре TIMSK), a также установить значение в регистрах сравнения (OCR1AH и OCR1AL), с которым будет сравниваться содержимое счетчика. Нетрудно догадаться, что для цикла счета в полсекунды оно равно вычисленному нами ранее значению 31 250. При записи в эти регистры нужно помнить то, что было сказано ранее про обращение с 16-разрядными регистрами в таймерах.
Читать дальшеИнтервал:
Закладка: