'--------------------------------------------------------------
' (c) 1999 By Kulish Mikhail
'--------------------------------------------------------------
' Монитор микросхемы прямого частотного синтеза AD9850
' с последовательной загрузкой данных. Кварц = 64 МГц
' Обеспечивает ввод значения частоты в килигерцах
' с помощью эмулятора терминала с клавиатуры компьютера
'--------------------------------------------------------------
N_inp Alias Scon.0 'бит "Есть ввод" (RI)
'---------------------
Dim Temp As Byte : Dim Rang As Byte 'временные данные
Dim Tmp As Byte 'временные данные
'---------------------
Dim R_bd As Long '32-разр. двоичный код загрузки
'---------------------
Dim R_frq As Single 'регистр значения частоты
Dim R_fld As Single 'регистр* кода загрузки
Dim Templ As Single
'---------------------
'подключение синтезатора AD9850
B_data Alias P3.3 : B_clk Alias P3.2 : B_fqud Alias P3.1 : B_res Alias P3.4
Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0
'---------------------
' TIMER2 в режиме 16-бит. таймера с внутр. тактир. для синхронизации UART
Config Timer2 = Timer , Gate = Internal , Mode = 2
$baud = 9600 'скорость 9.6 кБ
$crystal = 12000000 'при кварце 12 МГц
'---------------------
'назначение режимов прерываний
On Timer0 Timer_0_int Nosave 'вектор прерывания
Enable Timer0 'разрешить прерывания таймера 0
Enable Interrupts 'вообще разрешить прерывания
Th0 = &HD8 : Tl0 = &HFD 'чтобы прерыв. наступила не позже 10 мс
'------------------------------------------
'очистка памяти
Clr_mem:
$asm
Mov R0 , #&hff ;так оформляется ассемблерная вставка
Clrmem:
Mov @r0 , #0
Djnz R0 , Clrmem
$end Asm
'------------------------------------------
'подготовить линии управления к работе
'можно записывать операторы в одну строку
Reset B_data : Reset B_clk : Reset B_fqud : Reset B_res
'---------------------
'главный цикл
Mc:
Do
Idle 'останов пока не разбудит прерывание
'---------------------
If N_inp = 1 Then 'если что-то принято?
N_inp = 0 'очистим без анализа
Waitms 100 'ждем 100 миллисекунд
Input “Enter f(kHz)=” , R_frq 'ввод частоты
'чтобы получить код загрузки умножим на число:
R_fld = R_frq * 67109 ' 2^32 / Fclk = 4294967296 / 6400 kHz
R_bd = R_fld 'преобр. в целое 32-разр. число
Gosub Sload_9850 'загрузка новых данных
Print “OK” 'подтверждение установки частоты
End If
'---------------------
Loop
'------------------------------------------
'подпрограммы загрузки данных в синтезатор
Sload_9850:
Set B_fqud : Reset B_fqud 'сбросить интерфейс
Set B_clk : Reset B_clk 'защелкнуть код последовательного режима
Set B_fqud : Reset B_fqud 'разрешить последовательный режим
'выдвинуть данные из R_bd в режиме 3 (мл. сначала , _/\_)
Shiftout B_data , B_clk , R_bd , 3
'выдвинуть последний байт с режимом и фазой
Temp = 0 : Shiftout B_data , B_clk , Temp , 3
Set B_fqud : Reset B_fqud 'исполнять загруженные данные
Return
'---------------------------------------------------
'обработка прерывания таймера 0
Timer_0_int:
Th0 = &HD8 : Tl0 = &HFD
Return
'------------------------------------------