Управление синтезатором частоты на LM7001

1-05-2013, 12:13 От: admin Посмотрели: 4833

Итак, Вы решили использовать в своем приемнике (конструкции) схему цифрового синтезатора частоты. Расписывать тут подробно теорию синтезатора частот я не планировал. Вкратце - синтезатор состоит из трех узлов: формирователя опорной частоты (состоящего из генератора и делителя), ГУН-а (гетеродина) плюс управляемого делителя его выходной частоты, и схемы сравнения этих частот (поделенных - ГУН-а и опорной). Перестройка синтезатора по частоте производится изменением в делителе частоты ГУН-а его коэффициента деления. Схема сравнения частот при этом управляет ГУН-ом таким образом, чтобы его выходная частота (поделенная на коэффициент) совпала со сформированной опорной. Кому нужно подробнее, за сим, извиняюсь, - "к учебникам"...

В своем "Ресивере..." [1] в качестве основы синтезатора я использовал специализированную микросхему LM7001 фирмы Sanyo в типовой схеме включения. Выбор на нее пал по банальной причине доступности (на радиорынке г. Запорожья !!!) и низкой цены (около $1). Можете почитать datasheet [2] или [3]на микросхему (лично я настоятельно советую сделать это очень внимательно). Если же у Вас проблемы с "родным" английским языком, существует про нее информация и на русском языке (правда, более краткая): см. [4] "Справочный листок. – ж. Радио, 2003, №4 стр. 49,50". Его копия [5] "открыто жила" и в Интернете (я правда не знаю про "легитимность" и "долгосрочность" этой ссылки)...

Управляется синтезатор командами, передаваемыми по последовательному интерфейсу. И если в Вашей конструкции предполагается, что синтезатор всегда формирует одну-единственную частоту, то тут еще может можно обойтись тремя регистрами с параллельным входом и последовательным выходом, но в случае необходимости перестройки частоты, без процессора управления, увы, не обойтись. Смотрите сами - ниже приведена структура управляющего слова:



Как видим, нам необходимо "послать" в ИМС три байта (24 бита), содержимое которых полностью определяет ее работу. Может быть, я назвал эти биты несколько вольготно, но, ИМХО, так попонятней будет... Пройдемся по содержимому "управляющего слова" немного подробней (но !!! самое полное изложение все-равно - только в [2...5] )...

Коэффициент деления делителя - (биты D0-D13) Это как раз и есть делитель - значение, на которое делится измеряемая частота ГУН-а перед сравнением с опорной. Изменяя коэффициент, управляют частотой, на которую настроен синтезатор. При работе в диапазоне FM (бит S установлен в "1"; сигнал от гетеродина поступает на вход FMIN микросхемы) используются все 14 бит (с D0 по D13), в диапазоне AM (бит S сброшен в "0"; сигнал от гетеродина поступает на вход АMIN микросхемы) - только с D4 по D13.

Биты тестирования ИМС - (биты T0,T1) как следует из названия, используются в техпроцессе производства для тестирования произведенных микросхем. В "нормальной" эксплуатации всегда должны быть установлены в "ноль".

Переключение диапазонов - (биты B0-B2 и BT). Биты B0-B2 не имеют никакого отношения к частоте, на которую настроен синтезатор, а всего лишь определяют выходные уровни на выводах ВО1-ВО3 микросхемы. Выводы эти предназначены для управления внешними элементами коммутации, переключающими поддиапазоны в гетеродине и/или цепях тюнера (например, входные и нагрузочные контуры УВЧ). Если же биты В0-В2 установлены в "ноль", то в этом случае выходные уровни на выводах ВО1-ВО3 микросхемы определяются значением битов R0-R2. Бит ВТ управляет подачей сигнала т.н. измерительной (Time Base) частоты на вывод ВО1 микросхемы. Когда бит ВТ сброшен в "ноль", состояние вывода ВО1 определяется значением битов В0-В2 (или битов R0-R2), если же он установлен в "1", на выводе ВО1 микросхемы присутствует меандр частотой 8 кГц.

Опорная частота - (биты R0-R2) позволяют выбрать опорную частоту поступающую на схему сравнения (из ряда: 1, 5, 9, 10, 25, 50 и 100 кГц), и, собственно, определяющую (равную) шаг перестройки синтезатора по частоте. Кроме того, если биты В0-В2 установлены в "ноль", то значения битов R0-R2 определяют также и выходные уровни на выводах ВО1-ВО3 микросхемы. По сути, эти биты устанавливают коэффициент деления сигнала кварцевого генератора внутри ИМС, а т.н. "шаг" по сути - частота, подаваемая на схему сравнения в качестве опорной.

Выбор входа - (бит S) переключение диапазона: FM (бит равен "1"; при этом сигнал от гетеродина должен поступать на вход FMIN микросхемы) или АМ (бит равен "0"; при этом сигнал от гетеродина должен поступать на вход АMIN микросхемы).



Еще одно необходимое отступление перед тем, как перейти к непосредственно процедурам управления. Про приемники. Точнее - про частоту, которую должен выдавать синтезатор частот. Итак, супергетеродинный приемник состоит из следующих узлов: УВЧ (может и отсутствовать), смеситель, гетеродин, УПЧ, детектор. На выходе детектора присутствует уже принятый сигнал, что с ним дальше делать - дело Ваше, тут я рассматривать не буду. Детектор тоже опустим. Начнем с того, что основное усиление супергетеродинного приемника происходит на промежуточной частоте и сосредоточено в УПЧ. Чтобы получить эту самую промежуточную частоту, в приемник установлены смеситель и гетеродин (роль которого в нашем случае выполняет тот самый синтезатор частот на LM7001). Промежуточная частота формируется на выходе смесителя и фактически является разностью частоты принимаемого сигнала и частоты гетеродина. Причем, вычитать можно как принимаемый сигнал из гетеродина (т.н. "верхняя настройка гетеродина"), так и гетеродин из принимаемого сигнала (т.н. "нижняя настройка гетеродина"). Неоднократно читал, что лучшим считается вариант с "верхней настройкой". Почему - всех доводов я уж и не помню, но там "что-то было про помехи"... Как следствие, выбрал я для себя "верхнюю настройку" гетеродина. При этом частота, на которой должен работать гетеродин будет выше частоты принимаемого сигнала на величину промежуточной частоты:

Fгет = Fсиг + Fпч




Теперь, собственно, про управление. Для начала определимся с тем, что и как мы будем делать. Собственно, у меня в "Ресивере..." тюнер работает только в "буржуйском" диапазоне FM. Других диапазонов нет, переключать их не нужно. Выходы ВО1-ВО3микросхемы никуда не подключены, управлять ими тоже - никакой необходимости. Следовательно, все биты R0-R2, B0-B2 и BT"управляющего слова" в моем случае сброшены в "ноль". Сигнал гетеродина подается на вход FMIN микросхемы. И как следствие - бит Sустановлен в "единицу". Итого, вроде как в бинарном виде последний (третий) байт будет выглядеть так B'00000001'. Только вот еще один нюанс - если внимательно посмотреть на последовательность "управляющего слова", то видно, что данные передаются младшим битом вперед (это видно по полю делителя). Следовательно, чтоб не мудрить с двумя байтами делителя, разворачивая их справа-налево, проще всего один раз в уме (или на бумажке) развернуть третий байт. Получаем B'10000000' или 0х80 (hex). Именно такое значение мы и видим в процедуре передачи "управляющегшо слова" (сначала передается два байта делителя).

Теперь разберемся с делителем. Собственно, делитель (число) это частное частоты гетеродина и опорной частоты (которая фактически равна шагу настройки):

 

DIVISOR = Fгет / Fопорн

Частота гетеродина нам уже почти известна. Берем нижнюю частоту диапазона FM (88 МГц) и суммируем (настройка-то "верхняя") с промежуточной частотой (у меня в тюнере 10,7 МГц). Получаем 98,7 МГц. Теперь прибавим промежуточную к верхней частоте диапазона FM (108 МГц) - "в ответе" 118,7 МГц. То есть, для приема радиостанций в диапазоне частот от 88 до 108 МГц нужно, чтобы гетеродин перестраивался в диапазоне от 98,7 до 118,7 МГц. Итак, что делить, у нас есть. Будем определяться с тем на что делить. В принципе, для FM можно использовать шаг настройки как 50, так и 100 кГц (использовать 25 кГц, думаю не стоит - ну зачем такая точность?). С другой стороны, по формуле

 

Nшагов= ((Fмакс - Fмин) / Fопорн) + 1

 

посчитаем число шагов необходимых для перестройки по всему диапазону FM (при шаге 50 кГц): ((108-88)/0,05)+1=401. Больше одного байта. Жалко! Если же использовать шаг настройки 100 кГц то получим всего ((108-88)/0,1)+1=201 шаг, это число прекрасно помещающается в один байт памяти. Вот это уже "ближе к народу". И, как бы оправдывая самого себя - а нужно ли настраиваться с точностью в 50 кГц? Порылся в памяти - все FM-станции, вещающие в Запорожье, рекламируя свою частоту, указывают только одну цифру после запятой. Следовательно, сетка частот с шагом в 100 кГц меня устраиват с головой. Вот и определились, на что делить - на 100 кГц. Подставив в приведенную выше формулу значения принимаемой и опорной частот (вторая, как мы помним, является одновременно и шагом настройки), получаем значение коэффициента деления. Проделав это дважды (для крайних частот FM-диапазона) мы получаем два коэффициента: минимальный - 987 (соответствует настройке применика на частоту 88,0 МГц), и максимальный - 1187 (принимаемая частота 108,0 МГц). Меняя этот коэффициент в пределах от 987 до 1187 и отсылая его в LM7001, мы сможем перестраивать приемник в диапазоне от 88 до 108 МГц. Что собственно, нам и требовалось...

Теперь еще одно обстоятельство. Раз уж мы будем использовать микропроцессор для управления, было бы очень неплохо хранить в его памяти несколько (а может и несколько десятков) станций. Что же в таком случае запоминать? Коэффициент деления (с его пределами от 987 до 1187) в один байт памяти не поместится, а использовать для хранения одной частоты аж две ячейки памяти - "жаба давит". Непосредственно частоту настройки (например, 101,8 МГц) тоже хранить как-то неудобно. Проще всего оказалось сохранять в памяти номер шага в сетке частот. Что это за номер такой? Да все просто - всего шагов в сетке у нас 201, 0-й шаг соответствует частоте 88,0 МГц, 1-й - 88,1 МГц и так далее. Можете посчитать сами (в уме, на бумажке, на калькуляторе) - 200-й шаг соответствует частоте 108,0 МГц. Так вот их "родимых", эти самые порядковые номера мы и будем сохранять.

Итак, мы определились - нам нужна одна переменная, назовем ее FREQVENCY.Назначим ей (а также другим, использованным в приводимых фрагментах программ переменным) адреса в ОЗУ микропроцессора. Управляя тюнером, нам нужно менять эту переменную в пределах от 0 до 200. Эту процедуру, я думаю, Вы напишите сами. Мы можем также в энергонезависимой памяти микропроцессора сохранить требуемое количество значенний этой переменной, представив их как память настроек на разные станции, и вызывая в случае необходимости. И это я оставлю на Вашей совести. Я опишу лишь три основных действия, которые необходимо выполнить, уже ПОСЛЕ того, как Вы изменили значение переменной FREQVENCY (или же считали ее из ЭНЗУ процессора), а именно: вычисление коэффициента для делителя ГУН-а, отправка "управляющего слова" на ИМС синтезатора и отображение принимаемой частоты (ну хоть на каком-нибудь дисплее). Собственно, приведенная ниже процедура FM_SET выполняет вызов именно трех необходимых нам подпрограмм:


;=============================================================================
; Full setting FM PLL Synthesizer
;=============================================================================

FM_SET

CALLFREQ_CONVERT ; Процедура преобразования частоты
CALL FREQ_SEND; Отправка частоты в синтезатор
CALL SHOW_FM; Показываем "FM", номер ячейки памяти и частоту настройки
RETURN ; возврат

Итак, мы ранее приняли, что у нас есть переменная FREQVENCY, значение которой изменяется в пределах от 0 до 200 и непосредственно определяет частоту, на которую наш синтезатор на LM7001 будет настраивать приемник. С другой стороны, нам необходимо получить значение делителя (DIVISOR), которое впослествии отсылается в микросхему синтезатора, определяя частоту, на которую настраивается гетеродин приемника. Так как для диапазона FM и "верхней" настройки гетеродина требуемое значение делителя находится в пределах от 987 до 1187, в один байт памяти микропроцессора оно не поместится. Как следствие - результат подпроцедуры преобразования размещается в двух регистрах памяти - DIVISOR_LOWи DIVISOR_HIGH. Собственно говоря, преобразование переменной FREQVENCYв значение делителя - это простое прибавление к переменной FREQVENCYчисла 987, которое по сути (для лучшей "доходчивости") является суммой числа 880 (пропорционального самой нижней частоте диапазона FM - 88,0 МГц) и числа 107 (оно определяется значением промежуточной частоты приемника, в нашем случае равной 10,7 МГц). Именно это сложение и выполняет первая часть подпроцедуры FREQ_CONVERT (до той части, которая начинается фразой SECOND PART). Так как децимальное число 987 в шестнадцатеричном виде выглядит как 0х03DB(hex), а наша переменная FREQVENCYменяется в пределах одного байта, то процедура сложения максимально упрощена - сначала в регистр DIVISOR_HIGH записывается значение 0х03(hex), а потом производится сложение текущего значения переменной FREQVENCY и числа 0хDB(hex) - получаем значение DIVISOR_LOW. Потом проверяется регистр STATUSна предмет того, был ли перенос (бит "С" - CARRY), и если "да", то содержимое регистра DIVISOR_HIGH увеличивается еще на единицу.


HINT: Если Вам нужно настраивать приемник на другую полосу частот, то нужно вычислить новое значение числа прибавляемого к переменной FREQVENCY. Тут всё просто - сначала берем начальную (нижнюю) частоту принимаемого диапазона в МГц и умножаем ее на 10 (как помните, мы приняли, что шаг перестройки по диапазону равен 100 кГц) - получаем "Х". Потом то же самое проделываем с промежуточной частотой (тоже умножаем на 10) - получаем "Y". Дальнейшее наше действие зависит от того, какую настройку гетеродина мы выберем - "нижнюю" или "верхнюю". В случае "нижней" настройки "Y" от "Х" нужно отнять, в случае "верхней" прибавить. Полученное число и будет тем самым значением, которое нужно будет прибавлять к переменной FREQVENCY. И не забывайте, что для требующегося Вам диапазона может измениться число шагов настройки n=(Fв-Fн)/0,1. Соответственно, изменяя переменную FREQVENCY, проверяйте, чтобы она находилась в пределах 0 < FREQVENCY < n ...


Вторая часть процедуры FREQ_CONVERT выполняет преобразование переменной FREQVENCYв четырехзначное число (точнее, в четыре цифры, сохраняющиеся в регистрах FOURTH_DIGIT, THIRD_DIGIT, SECOND_DIGIT и FIRST_DIGIT), которое впоследствии непосредственно индицируется дисплеем устройства. Почему четыре цифры? Три из них служат для отображения целого значения, а четвертое показывает десятые доли МГц (например, 104,5). Данная процедура использует другую подпроцедуру - BCD_CONVERT, преобразующую бинарное значение переменной FREQVENCY в децимальное число.


;=============================================================================
; Frequency conversion from abstract values 0~200 to divisor and display.
; FIRST PART - convert freqvency register to divisor values for PLL
; synthesizer stored in two parts: DIVISOR_LOW and DIVISOR_HIGH.
; DIVISOR=(FREQVENCY+880+107)
;=============================================================================
FREQ_CONVERT

MOVLW0x03
MOVWFDIVISOR_HIGH
MOVFFREQVENCY,W
ADDLW0xDB
MOVWFDIVISOR_LOW
BTFSCSTATUS,C
INCFDIVISOR_HIGH,F

;=============================================================================
; SECOND PART - converting FREQVENCY to four digit value for display
;=============================================================================

MOVFFFREQVENCY, TMP_VALUE
CALLBCD_CONVERT
CLRFFOURTH_DIGIT
MOVFDEC_ONES,W
ANDLW0x0F
MOVWFFIRST_DIGIT
SWAPFDEC_ONES,W
ANDLW0x0F
ADDLW0xFE
BTFSCSTATUS,C
GOTOCARRY_1
ADDLWD'10'
DECFHUNDREDS,F

CARRY_1

MOVWFSECOND_DIGIT
INCFHUNDREDS,W
ADDLW0xFE
BTFSCSTATUS,C
GOTOCARRY_2
ADDLWD'10'
DECFFOURTH_DIGIT,F

CARRY_2

MOVWFTHIRD_DIGIT
INCFFOURTH_DIGIT,F
RETURN

Следующая (приведенная ниже) процедура передает в LM7001 24-х битное слово управления (три байта), определяющие ее режим и частоту настройки. Перед ее запуском необходимо, чтобы в регистрах DIVISOR_LOWи DIVISOR_HIGH уже находилось вычисленное и преобразованное значение коэффициента деления. Сначала устанавливаем "1" на выводе СЕ (в данном примере - SSP_CE). Этим самым мы разрешаем LM7001 принимать поступающие в нее данные. Затем загружаем во временный регистр PLL_BYTE_TEMP байт данных, который необходимо передать, и вызываем подпроцедуру SEND_BYTE. Так мы поступаем три раза (как помните, нам ведь необходимо в LM7001 передать три байта). В начале подпроцедуры SEND_BYTE в другой временный регистр (COUNT) мы записываем "8" (число бит в байте). После этого начинаем содержимое регистра PLL_BYTE_TEMP "сдвигать вправо" (если Вы еще не забыли - данные на LM7001 подаются младшим байтом вперед). После каждого сдвига проверяем бит CARRY(С) регистра STATUS и соответствующее значение ("0" или "1") выставляем на выводе данных (в данном примере - SSP_DATA). После этого формируем сигнал строба на соответствующем выводе микроконтроллера (в данном примере - SSP_CLK). Сначала вызываем подпроцедуру DELAY_PLL, формирующую короткую задержку (длительность задержки определяется значением, записываемым в самом начале подпроцедуры DELAY_PLL во временный регистр COUNT_1). Затем ставим "1" на SSP_CLK, снова вызываем DELAY_PLL, после - ставим "0" на выводе SSP_CLK и еще раз вызываем DELAY_PLL. Таким образом мы получаем короткий строб на фоне импульса данных. "Изюминка" заключается в том, что и фронт импульса CLK и его спад происходят при устоявшихся данных на выводе DATA. Это позволяет процедуру SEND_BYTE использовать при выводе данных на устройства стробируемые как по фронту, так и по спаду синхроимпульса. Закончив передачу всех трех байт (24 бит), ставим "0" на выводе SSP_CE.


HINT: Если нужно использовать другой порт микроконтроллера (например, не С, а В), или же другие разряды порта, то нужно выполнить соответствующие изменения в приведенных ниже процедурах определения мнемонических имен.


;=============================================================================
; Передача управляющих команд в синтезатор частоты
;=============================================================================
FREQ_SEND

BSFSSP_CE
MOVFFDIVISOR_LOW, PLL_BYTE_TEMP
CALLSEND_BYTE
MOVFFDIVISOR_HIGH, PLL_BYTE_TEMP
CALLSEND_BYTE
MOVLW0x80 ; Третий байт "управляющего слова"
MOVWFPLL_BYTE_TEMP
CALLSEND_BYTE
BCFSSP_CE
RETURN

SEND_BYTE

MOVLW0x08
MOVWFCOUNT

SEND_BYTE_1

RRCFPLL_BYTE_TEMP,F
BNCBIT_0
BSFSSP_DATA

BIT_0

CALLDELAY_PLL
BSFSSP_CLK
CALLDELAY_PLL
BCFSSP_CLK
CALLDELAY_PLL
BCFSSP_DATA
DECFSZCOUNT
GOTOSEND_BYTE_1
RETURN

DELAY_PLL

MOVLW0x0F
MOVWFCOUNT_1

DEL

DECFSZCOUNT_1
GOTODEL
RETURN


Теперь (ниже) процедура вывода на дисплей - тут абсолютно ничего "военного". Естественно, перед ней должна быть выполнена процедура конвертации, которая в числе прочего сохраняет в регистрах FOURTH_DIGIT, THIRD_DIGIT, SECOND_DIGIT и FIRST_DIGIT числа для отображения частоты настройки на дисплее. Используемая ниже подпроцедура LCDPUTCHAR - это уже "слова из другой песни" (часть библиотеки по работе с ЖКИ-дисплеем). То есть, что мы делаем - берем символ "F" и посылаем на дисплей, потом - символ "М". Далее - берем переменную FM_NUMBER - в моей программе это собственно номер ячейки памяти, в которой хранится частота, на которую настроен приемник. Номера ячеек у меня с 1-й по 9-ю. Чтобы ЖКИ-дисплей (на чипе HD44780U или его "клонах") показал "1" на него нужно послать 0х31 (hex), для "2" - 0х32 (hex), и т. д. Как следствие, перед выводом каждой цифры стоит дополнительная команда ADDLW 0x30, вводящая требуемый офсет. Исключение составляет вывод содержимого регистра FOURTH_DIGIT, в котором хранится значение сотен МГц - при его отображении сначала производится проверка того, что оно не равно нулю. Если же сотни МГц все-таки равны нулю, то вместо них выводится пробел. Больше никаких "фичей" в этой процедуре нет. Итог (на ЖКИ-дисплее) выглядит примерно так:

FM2 101,8 MHz


;=============================================================================
; Showing "FM", number of selected FM memory and value of Frequency
;=============================================================================
SHOW_FM

MOVLW'F'
CALLLCDPUTCHAR
MOVLW'M'
CALLLCDPUTCHAR
MOVFFM_NUMBER,W
ADDLW0x30
CALLLCDPUTCHAR
MOVLW0x20
CALLLCDPUTCHAR
MOVFFOURTH_DIGIT,W
BTFSCSTATUS,Z
MOVLWD'239'
ADDLW0x30
CALLLCDPUTCHAR
MOVFTHIRD_DIGIT,W
ADDLW0x30
CALLLCDPUTCHAR
MOVFSECOND_DIGIT,W
ADDLW0x30
CALLLCDPUTCHAR
MOVLW','
CALLLCDPUTCHAR
MOVFFIRST_DIGIT,W
ADDLW0x030
CALLLCDPUTCHAR
MOVLW0x20
CALLLCDPUTCHAR
MOVLW'M'
CALLLCDPUTCHAR
MOVLW'H'
CALLLCDPUTCHAR
MOVLW'z'
CALLLCDPUTCHAR
RETURN

Ниже приведена подпроцедура преобразования бинарного значения, хранящегося в регистре TMP_VALUE в децимальное (например, для последующего вывода на дисплей). Я не писал эту подпроцедуру, а взял ее готовую в интернете. Перед ее запуском необходимо, чтобы в регистре TMP_VALUE уже находилось число, которое нужно преобразовать из бинарного в децимальное. Результат преобразования сохраняется в двух регистрах: HUNDREDS и DEC_ONES. В первом из них получаются "сотни" (0,1 или 2). Во втором - "десятки" и "единицы", причем, "десятки" находятся в сташих 4-х битах регистра DEC_ONES, а "единицы" - в младших.


;=============================================================================
; Binary to decimal convert I don't know, how it work, I took it from Internet
;=============================================================================
BCD_CONVERT

CLRFHUNDREDS
SWAPFTMP_VALUE,W
ADDWFTMP_VALUE, W
ANDLWB'00001111'
BTFSCSTATUS,DC
ADDLW0X16
BTFSCSTATUS,DC
ADDLW0X06
ADDLW0X06
BTFSSSTATUS,DC
ADDLW-0X06
BTFSCTMP_VALUE,4
ADDLW0X16-1+0X6
BTFSSSTATUS,DC
ADDLW-0X06
BTFSCTMP_VALUE,5
ADDLW0X30
BTFSCTMP_VALUE,6
ADDLW0X60
BTFSCTMP_VALUE,7
ADDLW0X20
ADDLW0X60
RLCFHUNDREDS,F
BTFSSHUNDREDS,0
ADDLW-0X60
MOVWFDEC_ONES
BTFSCTMP_VALUE,7
INCFHUNDREDS,F
RETURN

Вообще-то, приведенный ниже фрагмент является описанием используемых переменных (назначением адресов этим переменным в ОЗУ микропроцессора) и размещается в самом начале листинга программы. По сути каждая строка назначает одной переменной адрес ОЗУ, в которой та будет храниться. Например, строка "FM_NUMBER EQU 0x010" обозначает, что переменная FM_NUMBER будет храниться в ячейке ОЗУ с адресом 0x010(hex). Первые две переменные - FM_NUMBER и FREQVENCY - определяют, какая выбрана ячейка памяти и на какую частоту должен быть настроен приемник.


FM_NUMBEREQU 0x010 ; номер выранной ячейки памяти FM
FREQVENCYEQU 0x011 ; Текущее значение частоты приемника


Следующие шесть переменных - результат преобразований - первые две посылаются в LM7001 в качестве делителя, а последующие четыре выводятся на дисплей, показывая, на какую частоту настроен приемник.


DIVISOR_HIGHEQU 0x012 ; Старший байт делителя частоты приемника
DIVISOR_LOWEQU 0x013 ; Младший байт делителя частоты приемника
FIRST_DIGITEQU 0x014 ; Младший разряд при отображении частоты
SECOND_DIGITEQU 0x015 ; ....
THIRD_DIGITEQU 0x016 ; ....
FOURTH_DIGITEQU 0x017 ; Старший разряд при отображении частоты


Еще семь переменных, выполнющих вспомогательные функции.


HUNDREDSEQU 0x018 ; Регистр "сотен" результата децимального преобразования
DEC_ONESEQU 0x019 ; Регистр "десятков/единиц" результата децимального преобразования
TMP_VALUEEQU 0x01A ; Временный регистр
PLL_BYTE_TEMPEQU 0x01B ; Временный регистр
COUNTEQU 0x01C ; Счетчик
COUNT_1EQU 0x01D ; Счетчик
DELAYEQU 0x01E ; Счетчик


И напоследок, еще три строки, определяющие соответствие используемым в листинге мнемоническим именам конкретных битов в конкретных регистрах микропроцессора. Просто, удобнее один раз в начале программы выполнить такое присвоение имени, чем потом (в случае необходимости что-то изменить) рыскать по всему листингу. Например, Вам понадобилось вывод SSP_CLK подать не на порт С, разряд 0, а на порт А, разряд 3. Меняете в соответствующей строке имя порта, номер разряда и все.


#defineSSP_CLKPORTC,0
#defineSSP_DATA PORTC,1
#defineSSP_CE PORTC,2



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Управление синтезатором частоты на LM7001 все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930