|
Как программно загрузить частоту, ATmega8 в синтезатор частоты |
|
|
|
 |
Ответов
(1 - 3)
|
Sep 5 2006, 15:35
|

Местный
  
Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986

|
Для ADF4360 нет, зато есть для MC12202 на ассемблере: Код ;Set up PLL: ;make PLL DRATIO and MRATIO values and load PLL IC. ;Input: Frx - RX frequency, Hz ; const Fif - RX first IF frequency, Hz ; const Fosc - PLL oscillator frequency, Hz ; const Fc - reference frequency, Hz ; ;Frx = Fvco - Fif ;Fvco = Fc * MRATIO ;Fc = Fosc / DRATIO
SetPLL:
;DRATIO = Fosc / Fc
.equ DR = Fosc/Fc
ldi XL,DRATIO ldi temp,byte1(DR) st X+,temp ldi temp,byte2(DR) st X+,temp
;Fvco = Frx + Fif
ldi XL,Frx ld temp,X+ subi temp,byte1(-Fif) mov Res1,temp ld temp,X+ sbci temp,byte2(-Fif) mov Res2,temp ld temp,X+ sbci temp,byte3(-Fif) mov Res3,temp ld temp,X+ sbci temp,byte4(-Fif) mov Res4,temp
;MRATIO = Fvco / Fc
ldxy (Fc) mov Stp1,XL mov Stp2,XH mov Stp3,YL mov Stp4,YH rcall Div32 ;Res4:3:2:1 / Stp4:3:2:1 = Res4:3:2:1 ldi XL,MRATIO st X+,Res1 st X+,Res2 st X+,Res3
;load PLL IC:
rcall Wr_PLL ret
;Load Res4:3:2:1 from [X]:
LdRes: ld Res1,X+ ld Res2,X+ ld Res3,X+ ld Res4,X+ ret
;Motorola MC12202 synthesizer load: ; ;Input: DRATIO = 8..16383 (2 bytes) ; MRATIO = 1024..262143 (3 bytes) ;Out: C = 1 if error ; ; F_r, F_p = F_osc / DRATIO ; F_vco = F_r, F_p * MRATIO ; ;DRATIO -> R, MRATIO -> P,N,A ; ;Note: since A should be less then N there are ;missing codes in 1024..4095 MRATIO range. ;Missing codes are indicated with C = 1 (and ;synthesizer is not loaded). In the same manner ;is indicated out of range for DRATIO or MRATIO.
Wr_PLL: lds XL,MRATIO+1 lds XH,MRATIO+2
;Check MRATIO for 1024..262143
andi XL,0xfc or XL,XH brne Mlk ;error if MRATIO < 1024 (400H) sec ;set error flag ret ;return to the caller Mlk: andi XH,0xfc breq Mgk ;error if MRATIO > 262143 (3FFFFH) sec ;set error flag ret ;return to the caller
;Check MRATIO and choose P ;Prescaler = 128 if MRATIO > 16383 (N > 127) ;Prescaler = 64 if MRATIO < 16384 (N < 128) Mgk: lds XL,MRATIO+1 lds XH,MRATIO+2 andi XL,0xc0 or XL,XH in temp,SREG bst temp,1 ;T <- Z
;Prescaler = 128 flag T = 0, Prescaler = 64 flag T = 1 ;A_counter = (MRATIO MOD 128) for Prescaler = 128 ;A_counter = (MRATIO MOD 64) for Prescaler = 64 lds temp,MRATIO+0 andi temp,0x7f;if P = 128 A_counter = MRATIO+0 & 0x7f brtc P_128 andi temp,0x3f;if P = 64 A_counter = MRATIO+0 & 0x3f
P_128: lds XH, MRATIO+2 lds XL, MRATIO+1 lds Cnt,MRATIO+0
brts P_64 ror XH ;if P = 128 MRATIO >> 2 ror XL ror Cnt
P_64: ror XH ;if P = 64 MRATIO >> 1 ror XL ror Cnt
andi Cnt,0xe0 mov XH,XL mov XL,Cnt ;XH:XL = N18..N8,0,0,0,0,0 push XH ;_stack = 1 (N18..N11) push XL ;_stack = 2 (N10..N8,0,0,0,0,0)
;temp = A_counter, XH:XL = N18..N8,0,0,0,0,0 ;Check for A_counter < N
ldi Cnt,3 N_sh: rol XL ;N << rol XH brcs Aok ;jump if N > A_counter (N > 255) dec Cnt brne N_sh cp temp,XH brlo Aok ;error if A_counter >= N pop XL ;_stack = 1 pop XH ;_stack = 0 sec ;set error flag ret ;return to the caller ;Shift A_counter
Aok: clc ldi XL,0 ldi Cnt,2 A_sh: ror temp ror XL dec Cnt brne A_sh mov Cnt,XL ;temp:Cnt = A_counter >> 2
;Combine N18..N8 and A_counter
pop XL ;_stack = 1 (N10..N8,0,0,0,0,0) or XL,temp push XL ;_stack = 2 (N10..N8,A7..A3) push Cnt ;_stack = 3 (A2,A1,0,0,0,0,0,0)
;_stack[1]:_stack[2]:_stack[3] ready to load PROGRAMMABLE DIVIDER
lds XL,DRATIO+0 lds XH,DRATIO+1 ;Check DRATIO for 8..16383
andi XL,0xf8 or XL,XH brne Dlk ;error if DRATIO < 8 (08H) pop Cnt ;_stack = 2 pop XL ;_stack = 1 pop XH ;_stack = 0 sec ;set error flag ret ;return to the caller
Dlk: andi XH,0xc0 breq Dgk ;error if DRATIO > 16383 (3FFFH) pop Cnt ;_stack = 2 pop XL ;_stack = 1 pop XH ;_stack = 0 sec ;set error flag ret ;return to the caller ;Shift DRATIO and combine it with SW (T flag)
Dgk: lds XL,DRATIO+0 lds XH,DRATIO+1 sec rol XL rol XH bld XH,7 ;XH.7 <- T, XH:XL = SW,R14..R1,1
;XH:XL = SW,R14..R1,1 - ready to load PROGRAMMABLE REFERENCE DIVIDER
;Load PROGRAMMABLE REFERENCE DIVIDER
mov temp,XH ldi Cnt,8 ;bit count rcall Ld_PLL ;load SW,R14..R8 mov temp,XL ldi Cnt,8 ;bit count rcall Ld_PLL ;load R7..R1,1
sbi PORTD,LE nop cbi PORTD,LE
;Load PROGRAMMABLE DIVIDER
pop XL ;_stack = 2 (A2,A1,0) pop XH ;_stack = 1 (N10..N8,A7..A3) pop temp ;_stack = 0 (N18..N11) ldi Cnt,8 ;bit count rcall Ld_PLL ;load N18..N11 mov temp,XH ldi Cnt,8 ;bit count rcall Ld_PLL ;load N10..N8,A7..A3 mov temp,XL ldi Cnt,3 ;bit count rcall Ld_PLL ;load A2,A1,0
sbi PORTD,LE nop cbi PORTD,LE
clc ;clear error flag ret ;return to the caller
;Loads data to MC12202 via serial bus ;Input: temp - data, Cnt - bit count
Ld_PLL: rol temp brcc DATA0 sbi PORTD,DATA;DATA <- 1 rjmp DNE DATA0: cbi PORTD,DATA;DATA <- 0 nop DNE: sbi PORTD,CLK;CLK <- 1 nop cbi PORTD,CLK;CLK <- 0 dec Cnt brne Ld_PLL cbi PORTD,DATA;DATA <- 1 ret
--------------------
|
|
|
|
|
Sep 7 2006, 12:02
|
старушка-процентщица
   
Группа: Свой
Сообщений: 817
Регистрация: 8-03-06
Пользователь №: 15 067

|
Цитата(starii @ Sep 5 2006, 23:19)  Народ, помогите!!!!!!! Как программно загрузить частоту из ATmega8 в синтезатор частоты со встроенным ГУН-ом (к примеру ADF4360-7)............Заранее всем спасибо!!!!!!!! Учитывая искренность и продолжительность Вашего крика о помощи, хочу предложить следующий вариант решения этой задачи: 1. Выражение "программно загрузить частоту из" может подразумевать как минимум 2 варианта постановки задачи: 1.1 Загрузить из контроллера в синтезатор код какой-либо частоты. И всё. Строго говоря, Вы просите именно об этом. 1.2 Загружать из контроллера в синтезатор коды каких либо-частот, при этом конкретная частота может задаваться, например, клавиатурой, подключенной к контроллеру или аналогичным способом. По сложности эти варианты разные. 2. Прежде всего Вы должны знать следующее: 2.1 Загрузка кода частоты в синтезатор представляет собой формирование и собственно загрузку трех 24-битных слов (для последующих загрузок - одного 24-х битного слова). 2.2 Загрузка этих слов осуществляется посредством протокола SPI (MicroWire) , т.е по широкоизвестному протоколу с использованием CLOCK, DATA, LE (и SE). Думаю, что этот вопрос для Вас понятен, если непонятен, сначала надо разобраться с протоколом SPI. 3. Вы должны скачать с сайта http://www.analog.com Evlution Bord Softwre для ADF4360-XX (чуть более 7 Мб). Loop Filter Software можете не скачивать (разве что для общего развития), это не для ADF4360. Можно так-же не скачивать datasheet конкретного синтезатора: они (pdf) входят в состав указанного ПО. 4. Когда Вы установите Evlution Bord Softwre и воспользуетесь программой (нажмете "Registers"), Вы увидите содержимое тех самых трех 24-х разрядных слов, которые надо загрузить в синтезатор по указанному протоколу. 5. Это "содержимое" зависит от частоты, подлежащей стабилизации, опорной частоты и некоторых других характкристик синтезатора. Поэтому прийдется с этим немножко разобраться, например в обязательном порядке надо поставить в соответствующем окошке Вашу рабочую частоту, частоту опорного генератора, иначе синтезатор работать не будет! 6. Для самого простого решения Вашей задачи больше ничего не надо. Переписываете содержимое этих трех регистров, делаете простую программу их загрузки на ASMе и загружаете их в синтезатор! Все! Объём программы мизерный, справляется pic12. 7.Если Вам надо только это (при включении питания устройства запускать синтезатор на фиксированной частоте), можете на Delphi или С сделать программу для формирования программ на ASMе. Вводим в окошечки значения регистров, получаем программу на ASMе, далее Вам известно. 8. А вот если Вам надо действовать по варианту 1.2, тогда несколько сложнее. В этом случае надо будет прежде всего разобраться с содержимым каждого из регистров. Сложного там ничего нет, информации из datasheet вполне достаточно. Но тогда надо составить алгоритм "вычисления" содержимого каждого из регистров в зависимости от частоты при прочих равных условиях. Если Вы -"чистый"программист , могут быть проблемы с пониманием сущности терминов и правилом их использования. Но это -уже конкретные вопросы, Вы их можете задать потом. 9. Поэтому лучше всего воспользоваться такой возможностью программы ADF4360.exe и загрузить для начала синтезатор не из контроллера, а из программы через LPT порт. Только добившись устойчивой работы синтезатора, попытаться его загрузить от контроллера.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|