Перейти к содержанию

Управление Dds Синтезатором


Valimor

Рекомендуемые сообщения

Есть задача с помощью микроконтроллера семейства PIC запрограммировать DDS синтезатор AD9914 на синтез определенной частоты(1ГГц), опыта программирования синтезаторов у меня еще не было, так что если кто-нибудь общий принцип действий опишет или на книжку покажет был бы благодарен

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Он на инглише, а я хоть и читаю вполне свободно, но все-таки в голове лучше укладывается, когда на русском изучаю

Изменено пользователем Valimor
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 1 месяц спустя...

Возвращаясь к теме: кто программировал эту ad-шку, написал программу на ассемблере на PIC18F458 для считывания значений регистров этого синтезатора, и вроде все правильно однако получить правильные данные никак не получается. Вот куму интересно программа:

list p=18f458
#include <p18f458.inc>
; CONFIG1H
 CONFIG  OSC = HS			  ; Oscillator Selection bits (HS oscillator)
 CONFIG  OSCS = OFF		    ; Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))
; CONFIG2L
 CONFIG  PWRT = OFF		   ; Power-up Timer Enable bit (PWRT disabled)
 CONFIG  BOR = ON			 ; Brown-out Reset Enable bit (Brown-out Reset disabled)
 CONFIG  BORV = 25			 ; Brown-out Reset Voltage bits (VBOR set to 2.5V)
; CONFIG2H
 CONFIG  WDT = OFF			 ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
 CONFIG  WDTPS = 128		   ; Watchdog Timer Postscale Select bits (1:128)
; CONFIG4L
 CONFIG  STVR = ON			 ; Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause Reset)
 CONFIG  LVP = off			  ; Low-Voltage ICSP Enable bit (Low-Voltage ICSP enabled)
; CONFIG5L
 CONFIG  CP0 = OFF			 ; Code Protection bit (Block 0 (000200-001FFFh) not code protected)
 CONFIG  CP1 = OFF			 ; Code Protection bit (Block 1 (002000-003FFFh) not code protected)
 CONFIG  CP2 = OFF			 ; Code Protection bit (Block 2 (004000-005FFFh) not code protected)
 CONFIG  CP3 = OFF			 ; Code Protection bit (Block 3 (006000-007FFFh) not code protected)
; CONFIG5H
 CONFIG  CPB = OFF			 ; Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected)
 CONFIG  CPD = OFF			 ; Data EEPROM Code Protection bit (Data EEPROM not code protected)
; CONFIG6L
 CONFIG  WRT0 = OFF		    ; Write Protection bit (Block 0 (000200-001FFFh) not write protected)
 CONFIG  WRT1 = OFF		    ; Write Protection bit (Block 1 (002000-003FFFh) not write protected)
 CONFIG  WRT2 = OFF		    ; Write Protection bit (Block 2 (004000-005FFFh) not write protected)
 CONFIG  WRT3 = OFF		    ; Write Protection bit (Block 3 (006000-007FFFh) not write protected)
; CONFIG6H
 CONFIG  WRTC = OFF		    ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected)
 CONFIG  WRTB = OFF		    ; Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected)
 CONFIG  WRTD = OFF		    ; Data EEPROM Write Protection bit (Data EEPROM not write protected)
; CONFIG7L
 CONFIG  EBTR0 = OFF		   ; Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks)
 CONFIG  EBTR1 = OFF		   ; Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks)
 CONFIG  EBTR2 = OFF		   ; Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks)
 CONFIG  EBTR3 = OFF		   ; Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks)
; CONFIG7H
 CONFIG  EBTRB = OFF		   ; Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)
CBLOCK 20h
COUNTER :3
ADF_INF :3
TX_ADR :1
TX_INF :3
RX_ADR :1
RX_INF :4
TEST_REG :1
TEST_ADR :1
TEST_HRAN :7
endc
CBLOCK 90h
Data0 :1 ;здесь будем хранить адрес операнда Data2
Data1 :4
Data2 :4
Data3 :4
Data4 :4
endc
org 0
goto Main
Main ; - initialize AD9914
clrf LATA ; очищаем порт А
movlw b'01111100'
movwf TRISA ; ставим А0 А1 на выход, эти выходы подключаются к входа AD9914
  ; А0 = IO_UPDATE
  ; A1 = MASTER_RESET
clrf LATC  ; очищаем порт С
movlw b'11010000'  ;С0 = ??
 ;С1 = DDS_SYNCIO
 ;С2 = DDS_CS
 ;С3 = DDS_SCK
 ;С5 = DDS_SDIO
movwf TRISC
bsf PORTC,2; DDS_CS=1
bsf TRISE,2; stavim na rabotu na vhod
; - сброс в значению по умолчанию AD9914
bcf PORTA,1   ;MRST=0
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bsf PORTA,1   ;MRST=1
bcf PORTA,1   ;MRST=0
bsf PORTC,2   ;DDS_CS=1
bcf PORTA,0   ;IO_UPD=0
bcf PORTC,1   ;DDS_SYNCIO=0
bcf PORTC,3   ;DDS_SCLK=0
; - сброс в значению по умолчанию AD9914
; -------- задержка на 100мс: 255*255*10*160нс = 100 мс
movlw .255
movwf COUNTER
movwf COUNTER+1
movlw .255
movwf COUNTER+2
Delay1 decfsz COUNTER,1
goto Delay1
movlw .255
movwf COUNTER
decfsz COUNTER+1,1
goto Delay1
movlw .10
movwf COUNTER
movwf COUNTER+1
decfsz COUNTER+2,1
goto Delay1
; -------- задержка на 100мс
movlw 0x02 ;хочу прочитать что в регистре CFR3
  ; по умолчанию после сброса значение в регистре должно быть 0x0000191С
movwf RX_ADR ;
movlw Data2 ; берем адрес регистра
  ;сюда будем 32 - бита которые получим от синтезатора
movwf Data0 ;и пишем его адрес сюда
  ;поскольку у нас 32 бита данных, что есть 4 байта
  ; используем косвенную адресация через регистр FSR0L
  ; на а начала массива мы поместили сюда, чтобы ссылаться с него
bcf PORTC,2; DDS_CS=0 выбираем синтезатор нулем
bsf PORTC,5 ;DDS_SDIO = 1  посылаем бит i7 равный 1,
  ; что значит мы будем проводить операцию чтения
bsf PORTC,3 ;DDS_SCLK = 1; бит записывается в буфер по подъему синхроимпульса SCLK
bcf PORTC,3 ;DDS_SCLK = 0 //ustanavlivaem bit I7
bsf PORTC,3 ;DDS_SCLK = 1
bcf PORTC,3 ;DDS_SCLK = 0 //ustanavlivaem bit I6
bsf PORTC,3 ;DDS_SCLK = 1
movlw .6  ; 2 бита послали осталось 6 бит адреса регистра
movwf COUNTER,1 ; pзаписали шестреку в счетчик
movlw b'00100000' ; для того чтобы побидно считать регистр RX_ADR где у меня записан
 ; адрес регистра будем сравнивать его с регистром TEST_REG последовательно
 ; сдвигая его значение вправо т.е. сначала 00100000 затем 00010000,
 ;потом 00001000 и т.д. сравнивая с помощью операции И
Read4
movwf TEST_REG,1 ;перетаскиваем зачение в регистр
andwf RX_ADR,0
btfss STATUS,2  ; если результат предыдущей операции 0 то делаем переход Null_READ_ADR
goto One_Read_ADR ; иначе One_Read_ADR
 ; вот так и проверяем все данные побитого
goto Null_Read_ADR
One_Read_ADR bsf PORTC,5; DDS_SDIO = 1 ;
goto Read_End_ADR
Null_Read_ADR bcf PORTC,5; DDS_SDIO = 0
Read_End_ADR bcf PORTC,3 ;DDS_SCLK = 0
bsf PORTC,3 ;DDS_SCLK = 0
bcf PORTC,3 ;DDS_SCLK = 1
movf TEST_REG,0 ;берем зачение из регистра TEST_REG
RRNCF WREG,0 ; смещаем вправо на 1 разрад
decf COUNTER ; декрементируем счетчик
btfss STATUS,2 ; счетчик равен 0 то пропускаем следующую строку и идем дальше
goto Read4
clrf PORTC ; очищаем порт С
bsf TRISC,5 ; устанавливаем С5 = DDS_SDIO на вход
movlw .32
movwf COUNTER,1
movlw 0x0
movwf TEST_ADR,1 ;//с помощью косвенной адресации и этого регистра будем переключать байт
movlw 0x80
movwf TEST_REG,1 ; сравниваем с ним
bsf PORTC,3;DDS_SCLK = 1 ; получаембит по падению синхроимпульса
Read5
bcf PORTC,3;DDS_SCLK = 0 по этому импульсу получили бит
  ;который пришул по DDS_SDIO то есть на порт С5
bsf PORTC,3;DDS_SCLK = 1
btfsc PORTC,5 ; проверем что получили единицу или ноль
goto One_Read
goto END_READ ; если ноль то идем сюда
One_Read
movf Data0,0; берем адрес операнда
addwf TEST_ADR,0 ; суммируем с TEST_ADR
movwf FSR0L ; kidaem v FSR0L
movf TEST_REG,0
iorwf INDF0,0 ; логическое ИЛИ
movwf INDF0,1 ; сохраем в адресу хранящемуся INDF0
END_READ RRCF TEST_REG,1; сдвигаем на разряд вправо
bcf TEST_REG,7; вообще не знаю почему, но при симуляции программы в MP_LAB_IDE
   ; первый сдвиг вправо дает не 0x40, а 0xC0, но потом работает нормально
btfsc STATUS,2; если TEST_REG равен нулю, т.е. мы просчитали 8 бит, то
bsf TEST_REG,7; ставим 8 бит в TEST_REG в единицу т.е. TEST_REG = 0x80
btfsc STATUS,2; флаг Z до сих пор стоит, предыдущаю инструкцию на него не влияет
incf TEST_ADR,1; переключаемся на следующий байт() инкрементирем смещение
decfsz COUNTER
goto Read5
bsf PORTC,2; DDS_CS = 1
clrf LATC
bcf TRISC,5; снова ставим на работу на выход
; - просто бесконечный цикл
ter bsf PORTC,2; DDS_CS = 1
nop
nop
goto ter
; - просто бесконечный цикл
return 0
;***************************Main

end

Ссылка на комментарий
Поделиться на другие сайты

блин, никак не удается решить проблему с этим синтезатором. Не удалось правильно его запрограммировать, пока пробую написать программу для чтения внутренних регистров, чтобы хотя бы знать что не так записалось, но тоже как то не ахти. Вообщем помощь бы не помешала.

Может кто подскажет правильный алгоритм считывания данных в синхронном режиме. Пока использую этот:

1. Сигналом MRST сбросил все значения регистров в дефолтные

2. Выбрал сигналом CS = 0 микросхему ad9914

3. Затем начал передачу байта инструкции:

I7 = 1 на чтение

I6 = x не важно

I5 - I0 - адрес регистра

Все по возрастающему фронту SCLK( 8 бит = 8 фронтов импульса SCLK)

4. Затем считываю данные по алгоритму:

SCLK = 1

SCLK = 0 ; здесь по идее должен отправиться 1 бит от ad-ешки, по даташиту отправляются по падающему фронту импульса

Считываю с выхода SDIO ;здесь я этот бит должен принять

Сохраняю этот бит в файловых регистрах и 4 пункт по кругу пока не получу все 32 бита.

Вроде все по даташиту, но проблема в том, что с выхода SDIO на микроконтроллер ничего не приходит.

Ну или алгоритм записи значений в во внутренние регистры если кто расспишет, тоже было бы неплохо

Изменено пользователем Valimor
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...