Управление синтезатором частоты AD9958

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

 

Управление идёт через атмегу 168 программку я написал вроде компилется без ошибок.

Суть в том что по формуле расчитывается некое число Ftw (десятичное), по которому и определяется нужная частота у синтезатора далее это число должно переводиться в двоичный 32 разрядный код и выдавяться на соот ножку синтезатора. Соот при этом ввод частоты идёт через виртуальный ком порт кот тут же описан (с этим проблем не возникло). Вопрос вот в чём:

1.расчитанное число Ftw будет итерпретироваться как двоичное если оно word?

2.какой оператор выдёт расчитаный двоичный код Ftw ввиде сигнала на соот порт (предположительно shiftOut но могу ошибаться)?

int CSLK = 2;
int CS = 3;
int Sdio = 4;
word Ftw;

void setup()
{
Serial.begin(9600);
pinMode(Sdio, OUTPUT);
pinMode(CSLK, OUTPUT);
pinMode(CS, OUTPUT);

}
void loop()
{
Serial.print ("Enter Fout(kHz):");
while (Serial.available()<5) {};
float Fout = Serial.parseInt();//для кГц

Serial.println (Fout);
Ftw = Fout*pow(2, 32) /50000000;//Для кГц
Serial.print ("load Ftw:");
Serial.println (Ftw);
Serial.println ();

if (0<=Ftw && Ftw<=pow (2, 32))
{Serial.println ("Loading");
}

else
{Serial.println ("Error");}
Serial.println ();
}

///////////////////////// AD9958 ///////////////////////

void loadFtw (word dataFtw)
{
digitalWrite (CS, HIGH);
digitalWrite (CS, LOW);
delay (0.001);
digitalWrite (CS, LOW);
delay (0.2);

{
digitalWrite (CSLK, LOW);
delay (0.001);
for(int i=0; i<=32; i=i++)
{
digitalWrite (CSLK, HIGH);
delay (0.0022);
digitalWrite (CSLK, LOW);
delay (0.0016);
}
}

{shiftOut (Sdio, CSLK, MSBFIRST, 00000001);
shiftOut (Sdio, CSLK, MSBFIRST, Ftw);

}

}

maksim
Offline
Зарегистрирован: 12.02.2012

Как минимум вам надо научиться пользоваться дуиновскими функциями.
Почитайте delay() и ознакомьтесь Программирование.

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Причём тут Делай().... ?!

 

maksim
Offline
Зарегистрирован: 12.02.2012

Pavel_1282 пишет:

Причём тут Делай().... ?!

Хз, сама то функция не причем. А вот вы не умеете пользоваться этой функцией.

Останавливает выполнение программы на заданное в параметре количество миллисекунд

Параметры
ms: количество миллисекунд, на которое приостанавливается выполнение программы. (unsigned long)

Описание типа
Unsigned long используется для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 (2^32 - 1) изанимает 32 бита (4 байта) в памяти.

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Я помойму не спрашивал про задержку и хранение целый положительных чисел!

Спрашивал след:

1.расчитанное число Ftw будет итерпретироваться как двоичное если оно word?

maksim
Offline
Зарегистрирован: 12.02.2012

Pavel_1282 пишет:

Я помойму не спрашивал ...

Вы как пациент, который пришел к стоматологу с больным зубом и открытым переломом руки. Вам стоматолог говорит: "Человек, у вас кость из руки торчит!" А вы в ответ: "Я помойму не жаловался на руку, лечите зуб!"

Во-первых, все данные в МК хранятся, обрабатываются и передаются в двоичном виде. 

Во-вторых, ваш вопрос исходя из выше сказанного если его перевести на молоко будет звучать так: "Два литра молока будут молоком если его налить в двухлитровую банку?" Что ответите на такой вопрос?

Ну а в-третьих, о числах - зачем вы сохраняете результат вычислений с типом float* в word если word может хранить только 16 бит данных, когда вам как вы пишите нужно отправить 32 бита?

* и зачем вы вообще в данном случае пользуетесь типом float ?

 

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

[/quote]

Ну а в-третьих, о числах - зачем вы сохраняете результат вычислений с типом float* в word если word может хранить только 16 бит данных, когда вам как вы пишите нужно отправить 32 бита?

* и зачем вы вообще в данном случае пользуетесь типом float ?

 

[/quote]

Отвечаю: значение реальной частоты в кГц (Fout) кот должен вырабатывать ситезатор ее мы вводим с консоли ну или из "монитора порта" это будет частота от 0-500 МГц (500000 кГц) поэт Float подходит больше всего.

А то что касается про 32 бита (4 байта) в которых должно быть значение Ftw немного изучив понял что оптимално использовать long.  ИХМО

maksim
Offline
Зарегистрирован: 12.02.2012

Pavel_1282 пишет:

ее мы вводим с консоли ну или из "монитора порта" это будет частота от 0-500 МГц (500000 кГц) поэт Float подходит больше всего.

В каком месте оно подходит? Вы разницу понимаете между вещественными и целыми числами?
И, кстати, 
parseInt() возвращает long.

long Stream::parseInt(char skipChar)
{
  boolean isNegative = false;
  long value = 0;
  int c;
....
  return value;
}

 

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Я всё понимаю и разницу в том числе. Для работы с частотой больше подходит именно float (именно в нашем случае) поскольку частота может иметь и дробное значение скажем 55000, 5 кГц  

maksim
Offline
Зарегистрирован: 12.02.2012

И что? Вы же все равно в итоге сохраняеете все в word или long все что после запятой будет "обрезано", а в монитор вы 55000,5 тоже отправить не сможете, так как parseInt() так же обрежет или проигнорирует. Так в каком месте тип float подходит? И зачем вы его используете?