Работа с SPI (генератор AD9833)

smd
Offline
Зарегистрирован: 20.04.2016

Добрый день. Подскажите как разобраться в связке arduino - ad9833
Как передовать нужные биты, какой код при этом должен быть. 
Из интерфейса 6 кнопок которыми нужно менять настройки модуля AD9833 (отображается на дисплее lcd 16x2)

Стартовый скетч для проверки модуля был отсюда https://tsibrov.blogspot.com/2018/06/ad9833.html

#include <SPI.h>

void setup() {
  SPI.begin();
  WriteAD9833(0x2100); //0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(0x50C7); //0101 0000 1100 0111 - Freq0 LSB (4295)
  WriteAD9833(0x4000); //0100 0000 0000 0000 - Freq0 MSB (0)
  WriteAD9833(0xC000); //1100 0000 0000 0000 - Phase0 (0)
  WriteAD9833(0x2000); //0010 0000 0000 0000 - Exit Reset
}

void WriteAD9833(uint16_t Data){
  SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE2));
  digitalWrite(SS, LOW);
  delayMicroseconds(1);
  SPI.transfer16(Data);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();
}

void loop() {
  WriteAD9833(0x2000); //0010 0000 0000 0000 - Синусоидальный сигнал
  delay(5000);
  WriteAD9833(0x2002); //0010 0000 0000 0010 - MODE=1 - Треугольный
  delay(5000);
  WriteAD9833(0x2020); //0010 0000 0010 0000 - OPBITEN=1 - Прямоугольный (MSB/2)
  delay(5000);
  WriteAD9833(0x2028); //0010 0000 0010 1000 - OPBITEN=1, DIV2=1 - Прямоугольный (MSB)
  delay(5000);
 }

Какую литературу почитать или статьи для новичка

 

 

 

 

 

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Даташит на свой модуль читай

smd
Offline
Зарегистрирован: 20.04.2016

Мы имеем 16 бит.  3-тий и 8-ой биты устанавливаем как 1. (что содержит данная комбинация бит пока не будем рассматривать)

WriteAD9833(0x2100); //0010 0001 0000 0000

Вызываем функцию WriteAD9833( ) и передаем ей значение  0x2100

Так вот как фраза 0010 0001 0000 0000 превращается в 0x2100  ?

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

smd разные основания счисления

smd
Offline
Зарегистрирован: 20.04.2016

Komandir пишет:

smd разные основания счисления

0010 0001 0000 0000   двоичная ?

 0x2100  шестнадцатеричная ?

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

smd пишет:

3-тий и 8-ой биты устанавливаем как 1.

//0010 0001 0000 0000

Цифры в числах считаются справа.

smd
Offline
Зарегистрирован: 20.04.2016

0x - используется для обозначения системы исчисления ?

 

при переводе 0010000100000000 двоичной системы в  шестнадцатиричную  получается 2100

rkit
Offline
Зарегистрирован: 23.11.2016

Короче начинать надо с учебника по информатике, потом учебник по программированию, а потом уже и до даташитов руки дойдут.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

smd пишет:

при переводе 0010000100000000 двоичной системы в  шестнадцатиричную  получается 2100

это ОЧЕВИДНО !!!

smd
Offline
Зарегистрирован: 20.04.2016

rkit пишет:

Короче начинать надо с учебника по информатике, потом учебник по программированию, а потом уже и до даташитов руки дойдут.

На какие стоит обратить внимание ?

 

Так все же означает 0х перед 16ричным числом ?

 

Нужно же с какого то даташина начинать изучение.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

smd пишет:

Так все же означает 0х перед 16ричным числом ?

 

Нужно же с какого то даташина начинать изучение.

0x и означает 16-тиричное число. 

Найди и прочитай Кернигана и Ритчи, 80% таких вопросов сами собой отвалятся, как хвост у ящерецы. 

А до "даташынов"  тебе еще как до Китаю раком. 

smd
Offline
Зарегистрирован: 20.04.2016

DetSimen пишет:

Найди и прочитай Кернигана и Ритчи, 80% таких вопросов сами собой отвалятся, как хвост у ящерецы. 

А до "даташынов"  тебе еще как до Китаю раком. 

Полностью согласен.
 С чего по проще начать знакомство с SPI ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

скачай Саймон Монк, "Программируем Ардуино", скачай на телефон/планшет, читай в сортире вместо дезодоранта.  Многое почерпнешь с самых основ. 

rkit
Offline
Зарегистрирован: 23.11.2016

Полностью согласен, но делать не буду

smd
Offline
Зарегистрирован: 20.04.2016

rkit пишет:

Полностью согласен, но делать не буду

Можно ведь совмещать чтение с практикой. Тем более книга на 2-3 дня чтения

smd
Offline
Зарегистрирован: 20.04.2016

Давайте писать по теме.   
 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Покуда у тебя знаний столько, сколько счас - пиши, не пиши, - толку не будет

b707
Offline
Зарегистрирован: 26.05.2017

smd пишет:

Давайте писать по теме.   
 

а мы разве "по теме" не закончили?

smd
Offline
Зарегистрирован: 20.04.2016

Давайте если возможно конкретно по вопросам. 

WriteAD9833(0x2100); //0010 0001 0000 0000 - Reset + DB28  

после этого можем установить частоты передав 2 16-битных слова  Сначала в младший регистр, затем в старший.

WriteAD9833(0x50C7); //0101 0000 1100 0111 - Freq0 LSB (4295)   
  WriteAD9833(0x4000); //0100 0000 0000 0000 - Freq0 MSB (0)  

если к примеру частота 10кгц то будет 0110 0111 0001 0000 

WriteAD9833(B0110 0111 0001 0000);  
WriteAD9833(B0100 0000 0000 0000); 

И далее снимает reset

WriteAD9833(B0010 0000 0000 0000); //0010 0000 0000 0000 - Exit Reset

 

 

 

smd
Offline
Зарегистрирован: 20.04.2016

smd пишет:

Давайте если возможно конкретно по вопросам.  Понятно что специально изучать даташит мало кто то будет, но все же.

Сброс регистра управления.

WriteAD9833(0x2100); //0010 0001 0000 0000 - Reset + DB28  

после этого можем установить частоты передав 2 16-битных слова  Сначала в младший регистр, затем в старший.

WriteAD9833(0x50C7); //0101 0000 1100 0111 - Freq0 LSB (4295)   
  WriteAD9833(0x4000); //0100 0000 0000 0000 - Freq0 MSB (0)  

если к примеру частота 10кгц то будет 0110 0111 0001 0000 

WriteAD9833(B0110 0111 0001 0000);  
WriteAD9833(B0100 0000 0000 0000); 

И далее снимает reset

WriteAD9833(B0010 0000 0000 0000); //0010 0000 0000 0000 - Exit Reset

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

и в чем вопрос?

smd
Offline
Зарегистрирован: 20.04.2016

b707 пишет:

и в чем вопрос?

Правильно я понимаю или нет

 

b707
Offline
Зарегистрирован: 26.05.2017

smd пишет:

если к примеру частота 10кгц то будет 0110 0111 0001 0000 

WriteAD9833(B0110 0111 0001 0000);  
WriteAD9833(B0100 0000 0000 0000); 

вот это значение как считали?

smd
Offline
Зарегистрирован: 20.04.2016

 

10000 в десятичной это  10 0111 0001 0000  в двоичной 

дописывает слева 01  до 16 символов  и получаем

0110 0111 0001 0000   или В 0110 0111 0001 0000

Так как число помещается в младший регистр то в старший идут нули. но слева остается 01

 

 


b707
Offline
Зарегистрирован: 26.05.2017

smd пишет:

 

10000 в десятичной это  10 0111 0001 0000  в двоичной

 

вы статью по своей собственной ссылке из первого сообщения читали? - В регистр синтезатора грузится вовсе не частота в явном виде, а некое значение. рассчитанное из этой частоы. В статье приведена формула. как это значение рассчитать. Например, чтобы запустить генератор на частоте 400 Гц. в его регистр загружают вовсе не 400,  а число  4295

smd
Offline
Зарегистрирован: 20.04.2016

точно, выпустил из вида.

Применя формулу нужно передать число 1 1010 0011 0110 1110     тогда разбивая по регистрам что получится ?

1010 0011 0110 1110 и  0000 0000 0000 0001  ?

В примере

WriteAD9833(0x50C7); //0101 0000 1100 0111 - Freq0 LSB (4295)
  WriteAD9833(0x4000); //0100 0000 0000 0000 - Freq0 MSB (0)

В MSB передают  0100 0000 0000 0000

что означает 1-ка если 4295 уместилось в младший регистр ?

b707
Offline
Зарегистрирован: 26.05.2017

smd пишет:

В примере

WriteAD9833(0x50C7); //0101 0000 1100 0111 - Freq0 LSB (4295)
  WriteAD9833(0x4000); //0100 0000 0000 0000 - Freq0 MSB (0)

В MSB передают  0100 0000 0000 0000

что означает 1-ка если 4295 уместилось в младший регистр ?

и опять ответ есть в статье