Следовательно режим с автоматической перезагрузкой (второй режим) не подойдет, т.к. в нем 8-ми разрядная сетка (максимальное количество машинных циклов 256). Поэтому выберем первый режим таймера-счетчика, который использует 16-ти разрядный счетный регистр. При этом перезагрузку 16-азрядного счетчика необходимо будет делать программно перед каждым циклом вычисления.
Запишем в память микроконтроллера число -400(10)=FE70(16)
Time0L <= 70h -Младший байт числа -400 в ДК
Time0H <= FEh -Старший байт числа -400 в ДК
2.3 Масштабирование коэффициентов и упрощение разностного уравнения
Для проектирования фильтра в ТЗ дано его разностное уравнение и соответствующие коэффициенты. Так как ячейка памяти может содержать 8ми разрядно двоичное число, причем старший разряд – знаковый, то необходимо провести округление коэффициентов фильтра до семи разрядов.
При помощи программы Matlab выберем способ округления. Для этого построим АЧХ фильтров при различном округлении (рис. 3) и сравним с АЧХ заданного фильтра. На основе сравнения выберем тот способ, который лучше удовлетворяет ТЗ и виду фильтра (ВЧ).
Возьмем способ округления – отбрасыванием дробной части ( зеленый график) (рис. 4).
рис. 3
рис. 4
Исходные коэффициенты (Dec) | Исходные коэффициенты (Bin) | Округленные коэффициенты* (Dec) | Округленные коэффициенты* (Bin) (ПК) | Округленные коэффициенты (Hex) | |
B1 | 0.023815103093366 | 0,00000110 | 3 | 00000011 | 03 |
B2 | 0.014780763864104 | 0,00000011 | 1 | 00000001 | 01 |
B3 | -0.067269084707391 | -0,00010001 | -8 | 10001000 | 88 |
B4 | 0.054715869201380 | 0,00001110 | 7 | 00000111 | 07 |
B5 | 0.089243271343775 | 0,00010110 | 11 | 00001011 | 0B |
B6 | -0.295613381939767 | -0,01001011 | -37 | 10100101 | A5 |
B7 | 0.394551759773816 | 0,01100101 | 50 | 00110010 | 32 |
B8 | -0.295613381939767 | -0,01001011 | -37 | 10100101 | A5 |
B9 | 0.089243271343775 | 0,00010110 | 11 | 00001011 | 0B |
B10 | 0.054715869201380 | 0,00001110 | 7 | 00000111 | 07 |
B11 | -0.067269084707391 | -0,00010001 | -8 | 00001000 | 88 |
B12 | 0.014780763864104 | 0,00000011 | 1 | 00000001 | 01 |
B13 | 0.023815103093366 | 0,00000110 | 3 | 00000011 | 03 |
Сумма модулей исходных коэффициентов:
1.48542670807338
Сумма модулей коэффициентов числителя:
1.43750000000000
В ТЗ дано следующее разностное уравнение:
,М=12
Т.к. заданные коэффициенты симметричны, то разностное уравнение можно преобразовать к следующему виду:
Такое преобразование разностного уравнения позволит сократить программу вычисления отсчета на 7 циклов.
Необходимо учесть, что в некоторых случая сумма двух отсчетов может переполнить 8ми разрядную сетку. Поэтому примем, что входные отсчеты по модулю меньше 0.5(10). Тогда сумма этих отсчетов не будет приводить к переполнению разрядной сетки.
2.4 Разработка и описание общего алгоритма функционирования устройства
Представим алгоритм функционирования фильтра следующим образом:
Аппаратно- реализуемые операции Программно- реализуемые операции
вкл. питания
сброс при включении питания
Запрос данных
Сигнал о готовности данных
Передача данных
Импульс считыванияВычисленный отсчет
Выходной аналоговый сигнал
При включении фильтра происходит формирование импульса сброса, который обнуляет счетчик команд и приводит фильтр к исходному состоянию.
При инициализации настраивается таймер счетчик, загружается PSW основной программы, очищаются память выделенная под остчеты, устанавливается вершина стека. Необходимо, чтобы программа инициализации начиналась с нулевого адреса (0000h).
Основная программа представляет собой бесконечный цикл
После идет программа вычисления отсчета. В которой предусмотрено: ввод данных (xn), их обработка, в соответствии с разностным уравнением, и вывод данных (yn).
2.5 Электрическая принципиальная схема фильтра.
По линии 1 происходит запуск внешнего устройства. Линия 2 служит для сообщения от внешнего устройства о готовности входных данных. По линии 4 подается импульс, который заставляет внешнее устройство подать готовые данные на вход микроконтроллера.
Между микроконтроллером и ЦАП существует 2 линии связи: линия номер 5 – служит для выдачи готовых данных с МК, а по линии 6 подается импульс, инициирующий чтение готовых данных ЦАП.
По линии 7 преобразованный в аналоговый сигнал поступает на «Преобразователь выходного сигнала», который преобразует сигнал к заданному виду.
В состав схемы, в соответствии с теоретическим заданием, входит микроконтроллер КР1830BE51 и ЦАП АD9708. Подсоединим к микроконтроллеру кварцевый резонатор с частотой 12 МГц, для задания тактовой частоты микроконтроллера. Для его сброса, к входу RST подсоединим RC-цепочку, которая при замыкании ключа будет формировать импульс сброса микропроцессора. Поставим между микроконтроллером и входным устройством буфер К555АП6, служащий для развязки данных, умощнения входного сигнала и повышения помехоустойчивости.
На выходе ЦАП будем использовать дифференциальное включение выходов ЦАП, при котором напряжение UДИФ = UOUT А – UOUT В изменяется в пределах от +0,5 В до -0,5 В. Что бы преобразовать выходное напряжение к заданному виду ((0… + 2,5)) необходимо подать напряжение смещения +1.75В и усилить выходной сигнал в 2.5 раза. Для этого используем ДУ AD8072.
Для повышения помехоустойчивости между входным внешним устройством и МК в линии ПУСК, ЧТЕНИЕ, ГОТОВ поставим триггеры Шмитта.
3. Разработка и отладка программы на языке ассемблера
Первым делом необходимо разработать секцию инициализации, которая обязательно должна начинаться с нулевого адреса. В секции инициализации предусмотрим следующие макросы:
InitSteck – инициализация стека, запись вершины стека
InitInt – инициализация прерываний, разрешение всех прерываний и прерываний от таймера счетчика, в частности.
InitTimer – инициализация таймера, выбор первого таймера/счетчика, выбор первого режима работы, запрет внешнего управления. Выбираем функцию таймера.
InitCoeff – инициализация коэффициентов, запись констант значений коэффициентов в память (при этом коэффициенты располагаются в памяти последовательно)
InitPSW – инициализация PSW основной программы и программы вычисления отсчетов. В память программы записываются соответствующие значения PSW.
ClearXn – инициализация отсчетов, очистка памяти выделенной под отсчеты.
ReloadTimer – инициализация таймера, остановка таймера, загрузка значений младшего и старшего байтов интервала дискредитации.
После инициализации идет основная программа.
MainProgramm – бесконечный цикл основной программы. Выход по прерыванию от TC0.
Дальше идет секция исполнения, в которой происходит обработка входных данных и вывод их на выходной порт.
RunACP - макрос запуска внешнего устройства. По линии P3.0 на соответствующий контакт устройства подается импульс нулевого уровня.
ReloadTimer – то же что и в секции инициализации
SavePSW – сохранение PSW основной программы и загрузка PSW рабочей программы.
CheckACP – проверка готовности данных от внешнего устройства. Если по линии P3.2 установлен 0, то данные готовы.
InputData – Ввод входных данных. Т.к. выводы внешнего входного устройство имеют третье состояние, то для того что бы данные попали на порт МК, необходимо по линии P3.1 сформировать импульс низкого уровня.
PrepareData – макрос, необходимый для упрощения разностного уравнения. Здесь происходит суммирование отсчетов стоящих у симметричных коэффициентов и запись суммы последовательно в память.
ComputeSample – макрос вычисления отсчета. Содержит в себе макрос очистки двухбайтовой суммы и макрос суммирования с ее накоплением.
ShiftL – сдвиг результата на 1 разряд влево.
OutputData – макрос вывода данных. Здесь результат переводится из дополнительного кода в прямой и затем старший байт отправляется на выходной порт. Формируется импульс по линии P1.0, для фиксации выходного отсчета на ЦАП.
PrepareCycl – последовательный сдвиг отсчетов в памяти.
ReloadPSW – запись PSW рабочий программы и восстановление PSW основной.
RETI – возвращение в основную программу.
Текст программы
*********************************************************************************
* Цифровой фильтр высокой частоты *
* Курсовой проект по дисциплине "Цифровые устройства и микропроцессоры" *
* Код F0b12_70 *
* Выполнил студент группы 410 Косс Андрей Владимирович *
* *
*********************************************************************************
SPACES ON ;Разрешить пробелы между операндами
FILLCHAR 00h ;Заполнить промежутки между секциями символами 00