Всем радиоаматорам гип-гип-УРА!
Ребята, помогите разобраться с управлением DDS-ки AD9835 - собираю синтезатор по схеме Сергея(4Z5KY) - http://cqham.ru/image4/swl_synt_big.gif ,но управлять хочу по USB с использованием PIC18F2550.
Так вот. Пол годика назад экспериментировал с AD9850. Результат моих творений - http://amatar.by/news-view-468.html
Код в USER.C следующий:
Код:
void ServiceRequests(void)
{
if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))
{
switch(dataPacket.CMD) // команда 0x01 - первый байт, 0x02 - второй байт, ... , 0x05 - пятый байт
{
case PKTBYTE:
UsartFunc(dataPacket.ID1);
UsartFunc(dataPacket.ID2);
UsartFunc(dataPacket.ID3);
UsartFunc(dataPacket.ID4);
UsartFunc(dataPacket.ID5);
mLED_1 = 1; // произвести запись в DDS (порт RC0 в "1" _-)
mLED_1 = 0; // перевести порт RC0 в "0" -_
break;
}//end switch
}//end if
}//end ServiceRequests
void UsartFunc(unsigned char dataByte) // dataByte - байт переданных данных
{
static byte i;
for(i = 0; i < 8; i++){
mLED_3 = UBit(dataByte, i); // перевести RC2 в состояние i-того бита байта переданных данных
mLED_2 = 1; // сигнал CLOCK в "1" _-
mLED_2 = 0; // сигнал CLOCK в "0" -_
}
}// end UsartFunc
BOOL UBit(unsigned char byteB, unsigned char bit0)
{
if(((byteB >> bit0) & 1) > 0)
{
return 1;
}else{
return 0;
}
}
Но то для AD9850... Всё работает на ура для алгоритма:
Для AD9835 данные передаются двумя байтами, но подаём их сзаду наперёд))) :
поэтому переработал код таким образом:
Код:
void ServiceRequests(void)
{
if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))
{
switch(dataPacket.CMD)
{
case PKTBYTE:
mLED_1 = 0;
UsartFunc(dataPacket.ID1);
UsartFunc(dataPacket.ID2);
mLED_1 = 1;
break;
}//end switch
}//end if
}//end ServiceRequests
void UsartFunc(unsigned char dataByte) // dataByte - байт переданных данных
{
static byte i;
for(i = 7; i >= 0; i--){
mLED_3 = UBit(dataByte, i);
mLED_2 = 0;
mLED_2 = 1;
}
}// end UsartFunc
BOOL UBit(unsigned char byteB, unsigned char bit0)
{
if(((byteB >> bit0) & 1) > 0)
{
return 0;
}else{
return 1;
}
}
Для AD9835:
mLED_1 - сигнал FSYNC
mLED_2 - сигнал SCLK
mLED_3 - сигнал SDATA
Однако ничего DDS-ка не выдаёт, когда отправляю эти два байта(прога под PC, каждый байт изменяю независимо друг от друга)
В некоторые моменты времени, особенно когда активно меняю второй байт(трэкбаром меняю значение), появляется сигнал, который потом можно менять первым байтом(меняется по непонятной тенденции).
Уверен, что ошибка где-то в коде для PIC. Ткине, пожалуйста, носом меня, - где я что не так делаю???