Читаем Микроконтроллеры AVR: от простого к сложному полностью

.INCLUDE "2313def.inc"

.DEF Step=r20

.DEF Freqlndex=r21

.DEF FreqDelay=r22

.DEF SSREG=r23

.CSEG

.ORG 0

         rjmp Reset

.ORG OVFOaddr

         in SSREG,SREG

         dec FreqDelay

         out SREG,SSREG

         reti

Reset:

         ldi r30,$DF

     out SPL,r30

         ; Настройка направления работы линий порта В

         ldi r30,$08

         out DDRB,r30

         ; Режим работы таймера 0 с максимальным предварительным делением

         ; Здесь же разрешаем прерывания

         ldi г30,$05

         out TCCR0,r30

         ldi r30,$02

         out TIMSK,r30

         sei

         ; Режим работы таймера 1 на переключение внешнего вывода,

         ; выбор коэффициента предварительного деления тактовой частоты 1:1

         ; и автоматический сброс таймера при совпадении

     ldi r30,$40

     out TCCR1A,r30

     ldi r30,$09

     out TCCR1B,r30

         ; Установка номера шага на начало

         clr Step

ReadNote:; Чтение длительности и номера одной ноты

         ldi r31,High(2*ProgramTab); Freqlndex = Lo ProgramTab[Step]

         ldi r30,Low(2*ProgramTab); FreqDelay = Hi ProgramTab[Step]

         mov r0,Step; Step++

         lsl r0

         add r30,r0

         inc Step

         lpm

         mov Freqlndex,r0

         inc r30

         lpm

         sbrc r0,7

         rjmp SleepReset; Если старший бит установлен, то

         mov FreqDelay,r0; это означает, что мелодия закончилась

SetFreq:; Настройка таймера 1 на вывод частоты текущей ноты

         ldi r31,High(2*SoundTab); OCR1A = SoundTab[FreqIndex]

         ldi r30,Low(2*SoundTab)

         lsl Freqlndex

      add r30,FreqIndex

      lpm

      out OCR1AL,r0

         inc r30

       lpm

       out OCR1AH,r0

Wait: tst FreqDelay ; Ожидаем заданное время, пока проигрывается

          brne Walt; текущая нота

          rjmp ReadNote

SleepReset:

      ldi r30,$3F ; Подготовка к переходу в режим Power Down

     out MCUCR,r30

         sleep; Отключение микроконтроллера

         rjmp Reset; Эта команда в данной версии программы не должна исполняться никогда

.ORG $100

SoundTab:

; Таблица констант соответствующим нотам

; Желательно выровнять таблицу по границе 256 байтов, чтобы упростить программу, отказавшись от операций с 16-битовыми словами.

.DW 11364,10292,9322,8443,7647,6926,6273; 440 Гц — нота "ля"

.DW 5682,5146,4661,4222,3824,3463,3137: вторая октава

.DW 2841,2573,2330,2111,1912,1732,1568; третья октава

; При необходимости таблицу можно продолжить

ProgramTab:

; Таблица последовательности нот,

; формат таблицы: байт длительности/кода операции, байт номера частоты

; В этом примере записано проигрывание гаммы

.DW $1001, $1002, $1003, $1004, $1005, $1006, $1007

.DW $1008, $1009, $100А, $100В, $10 °C, $100D, $100Е

.DW S200D, $2006, $2009, $2007, $2005, $2003, $2001

.DW $8000

EXIT

Автор: Сафонников В. В. (E-mail: sw@ufanet.ru).

<p>6.13. Универсальный расширитель последовательного порта</p>

Назначение

Перейти на страницу:

Все книги серии Библиотека инженера

Похожие книги

Искусство схемотехники. Том 3 (Изд.4-е)
Искусство схемотехники. Том 3 (Изд.4-е)

Широко известная читателю по предыдущим изданиям монография известных американских специалистов посвящена быстро развивающимся областям электроники. В ней приведены наиболее интересные технические решения, а также анализируются ошибки разработчиков аппаратуры: внимание читателя сосредотачивается на тонких аспектах проектирования и применения электронных схем. На русском языке издается в трех томах. Том 3 содержит сведения о микропроцессорах, радиотехнических схемах, методах измерения и обработки сигналов, принципах конструирования аппаратуры и проектирования маломощных устройств, а также обширные приложения. Для специалистов в области электроники, автоматики, вычислительной техники, а также студентов соответствующих специальностей вузов и техникумов.

Пауль Хоровиц , Уинфилд Хилл

Техника / Радиоэлектроника