В своем "Ресивере..." [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 микросхемы).
Теперь, собственно, про управление. Для начала
определимся с тем, что и как мы будем делать. Собственно, у меня в
"Ресивере..." тюнер работает только в "буржуйском"
диапазоне 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
1. Харций Д. Ресивер с цифровой обработкой сигнала. "Радиохобби”, 2004, №1 с. 48.
2. Datasheet на микросхему LM7001 на сайте ф. Sanyo
3. Datasheet на микросхему LM7001, лежащий у меня на сайте
4. Справочный листок. - ж. Радио, 2003, №4 стр. 49,50
5. Копия "справочного листка" из ж. Радио