Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ad7730
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
shuric80
Здравствуйте. кто нибудь сталкивался с такой проблемой...при попытки прочитать регистры состояния ad7730 +AT91sam7s256 . выдает на все запросы-- 0xFFFF. Осцилографом проверял , данные приходят на АЦП-на выходе. проскакивают импульсы, очень похоже на нагрузке как емкостни. (эспоненциалные). длина соединительных поводов 20 см. частота тактирования 500 кГц.питание АЦП 5в(и аналоговой и цифровой части). микроконтроллера 3.3 В. сигнал CS снимал так и МК так и на землю вешал. POL- вешал и на землю и на питание -тоже самое.
Евгений Германович
Цитата(shuric80 @ Apr 15 2009, 09:42) *
Здравствуйте. кто нибудь сталкивался с такой проблемой...при попытки прочитать регистры состояния ad7730 +AT91sam7s256 . выдает на все запросы-- 0xFFFF. Осцилографом проверял , данные приходят на АЦП-на выходе. проскакивают импульсы, очень похоже на нагрузке как емкостни. (эспоненциалные). длина соединительных поводов 20 см. частота тактирования 500 кГц.питание АЦП 5в(и аналоговой и цифровой части). микроконтроллера 3.3 В. сигнал CS снимал так и МК так и на землю вешал. POL- вешал и на землю и на питание -тоже самое.

Вы напрямую соединяете проц и ацп?У них разные питания.По моему это неправильно.
Вы не можете прочитать только регистры состояния или ничего не можете?
shuric80
сейчас я запитал цифровую часть 3.3 вольта. аналоговая 5в. прочитать ни чего не могу. на запрос чтерия любого lрегистра, выдает одно и тоже(FFFF). может там на уровне железа?? подтягивать сигнальные линии резисторами по питанию нужно?
Herz
А как SPI настроен? Изложенному на стр. 35 - 36 даташита соответствует?
shuric80
да. сооотвествует. пробывал пример алгоритма предложенного в даташите..тот же результат.

кварц на одной ноге постоянка ( MCLK IN) . на второй есть генерация (MCLK OUT). так должно быть??
xemul
Проверьте состояние CS' (д.б. 0) и RESET' (д.б. 1) у 7730. Иначе, естественно, на клоки по SPI он не отзовется.
Генерёжку на MCLK_IN Вы, скорее всего, срываете щупом осциллографа, если щуп без делителя.
shuric80
reset "1"-заведен на +питания. cs-сначало вешал на сооотвествующую ногу контроллера.потом посадил на землю.

SYNC- тоже на питании сидит..

такое ощущения что я неправильно организую посылку команды чтения-записи. там ведь идет так. команда (допустим 0x11. чтение данных) потом пустой (0xff) так?? или по другому?
Евгений Германович
Попробуйте отсоединить вых данных от ацп и посадить его на землю,запустите вашу программу и посмотрите что будет.
Только не перепутайте.Откл провод от ножки ацп и провод на землю.
Вы земли аналоговую и цифровую соединили?
Описание не смотрел-допустима ли разница в аналоговом и цифровом питании.
shuric80
провод вешал на землю и на питание-выдавало (0х00 и 0xFF) .работает значит spi контроллера. пускал данные по кольцу. замыкал вых данные и входные на контроллере.все в порядке идут нормально. земли соедены. на выходе ad7730 присутствует лог "1" . думаю..может микрушка не работает?
Евгений Германович
А может вы команды неправильно подаете?
Вы разводку проверяли?
А временные параметры вы выдерживаете при чтении?
Tanya
Цитата(shuric80 @ Apr 16 2009, 09:43) *
на выходе ad7730 присутствует лог "1" . думаю..может микрушка не работает?


А не Вы ли ранее писали, что импульсы на выходе видели?
shuric80
постоянная присутсвует, и иногда дергается.точно не разбереш импульсы есть или нет-осцилограф старый. если по выходу контроллера проще (зациклил вывод данных) и смотри . по входу сложнее гораздо. точно не могу определить.
насчет команды...делал так . write_spi ( 0x11) команда чтения. регистра данных , затем любой другой байт .write_spi( 0xFFFF).

разводка на макетке.
Евгений Германович
Цитата(shuric80 @ Apr 17 2009, 09:40) *
постоянная присутсвует, и иногда дергается.точно не разбереш импульсы есть или нет-осцилограф старый. если по выходу контроллера проще (зациклил вывод данных) и смотри . по входу сложнее гораздо. точно не могу определить.
насчет команды...делал так . write_spi ( 0x11) команда чтения. регистра данных , затем любой другой байт .write_spi( 0xFFFF).

разводка на макетке.

Попробуйте самостоятельно написать ввод и вывод.
И ещё посадите вход ацп на землю.В сыхода,при правильной работе должны читаться 0.Их осцилом видно.
shuric80
подключил другое ацп с spi...тоже самое. значит ошибки в настройке контроллера. данные по кругу гоняет.но в внешнию железку не загоняет.
shuric80
опять подскажите. контроллер настроил, spi работает. микросхему ad7730 новую поставил. в результате при опросе всех читаемых регистров, выдает 0х00, 0xeb. и прочее. код как бы меняется. но по цикличном опросе. значения "сдвигаются"-по регистарамм. предпологаю что неправильно задаю команды.. алгоритмично делаю так
cs=0;
write_spi(cod);
write_spi(0x00);
write_spi(0x00);
read_spi;
read_spi;
cs=1;
вроде ни чего сложного, но не работает.
когда меняю длину поссылки на 8 или 16 бит---все значения выдает по нулям--это видно и на осцилографе.
можете посоветовать что нибудь??
Herz
Так ведь запись и чтение в SPI выполняются одновременно. Как у Вас организованы функции записи/чтения - непонятно. Что пишется в АЦП при чтении? Там, кажется, нужно удерживать DIN высоким.
shuric80
сейчас кидаю коды чтения регистров, из даташита( 0x10....0x17). а как на аппаратном spi-счиатывать одновременно? din-можно удерживать посылая (0xff)??
shuric80
так тоже не получается....что-то идет. а что нинаю. ..просьба. можете дать кусочек кода для работы с ad7730, как пример. в инете мало что нашел
Herz
Цитата(shuric80 @ Apr 23 2009, 09:42) *
сейчас кидаю коды чтения регистров, из даташита( 0x10....0x17). а как на аппаратном spi-счиатывать одновременно? din-можно удерживать посылая (0xff)??

Очень просто - буфер-то кольцевой. Действительно, нужно посылать единицы.

Цитата(shuric80 @ Apr 23 2009, 10:45) *
так тоже не получается....что-то идет. а что нинаю. ..просьба. можете дать кусочек кода для работы с ad7730, как пример. в инете мало что нашел

С ad7730 не работал, а для AD7738 (принцип, думаю, тот же) делал примерно так:

CODE
/*--------------функция обмена байтом по SPI----------------*/
unsigned char WriteSPI(unsigned char ByteToSend)
{
unsigned char TempVariable;
BF = 0;
TempVariable = SSPBUF; // Reads from SSPBUF, ensures BF bit is clear before
SSPBUF = ByteToSend; // sending the next byte.
while(!BF); // Wait until the transmission is complete.
return SSPBUF; // The data received should be valid.
}

/*----------функция сброса внешнего АЦП-----------------*/
void Reset7738 (void)
{
CSA=0; // выбор кристалла для внешнего АЦП
DelayUs(2);
WriteSPI(0); //
WriteSPI(0xFF); //
WriteSPI(0xFF); //
WriteSPI(0xFF); //
WriteSPI(0xFF); //
CSA=1; // отключить внешний АЦП
DelayMs(1);
}

/*-------функция записи байта в регистр AD7738----------*/
/* (ADREG - адрес регистра, DATA - данные) */

void WR_to_ADC (ADREG, DATA)
unsigned char ADREG, DATA;
{
CSA=0; // выбор кристалла для внешнего АЦП
DelayUs(2);
WriteSPI(ADREG); //
WriteSPI(DATA); //
CSA=1; // отключить внешний АЦП
DelayMs(1);
}

/*-----функция чтения выбранного регистра AD7738-------*/
/* (ADREG - адрес регистра, ln - длина данных в байтах)*/

unsigned int READ_ADC (ADREG, ln)
unsigned char ADREG, ln;
{
unsigned int BUFDAT; // 16-bit data buffer
CSA=0; // выбор кристалла для внешнего АЦП
DelayUs(2);
BUFDAT=0; // очистить буфер
WriteSPI(ADREG+0x40); // установить бит чтения
BUFDAT=WriteSPI(0); // читать при низком DIN первый байт
if (ln==2) // если данные 16-разрядные
{
BUFDAT=BUFDAT<<8; // сдвинуть байт в старший
BUFDAT=BUFDAT+WriteSPI(0); // и дописать в буфер младший байт
}
CSA=1; // отключить внешний АЦП
DelayUs(2);
return BUFDAT;
}
Евгений Германович
Я извиняюсь но где вы обнаружили,что это SPI,я для 7710 писал считывание и запись сам.Вы уверены,что используя стандартные функции вы не нарушаете временные диаграммы???
или не уверены?
shuric80
не очень уверен. я сигнал cs-от ноги отдельно вывел. и программно щелкаю. сам spi завел на другое ацп для теста-там работало нормально.
Евгений Германович
На другое-это другого типа?
shuric80
попала из запасов mcp3204 (простенькая ацп с спи) подключил.понастраивал.заработало. разобрался с настройками spi на контроллере. были сомнения по его работе.
shuric80
Herz, большое спсибо за пример. завтра попробую на основе вашего написать.
shuric80
не работает. выдает код какой то один и тот же. как будто 2 знака последних в буфере выходном засели и выдает их. замкнул ноги ацп между собой-а считываемые данные не изменились.
Herz
Цитата(shuric80 @ Apr 24 2009, 13:08) *
не работает. выдает код какой то один и тот же. как будто 2 знака последних в буфере выходном засели и выдает их. замкнул ноги ацп между собой-а считываемые данные не изменились.

А что с формой импульсов? Не завалены фронты? Скорость какая? Снизьте до минимума на время проверки.
shuric80
частота тактовых импульсов spi сейчас стоит 1 МГц. фронты не завалены. сейчас попробую паузы понаставить.
Herz
Цитата(shuric80 @ Apr 24 2009, 15:40) *
частота тактовых импульсов spi сейчас стоит 1 МГц. фронты не завалены. сейчас попробую паузы понаставить.

SPI программный, что ли? Мегагерц - многовато, конечно, для начала.
shuric80
SPI аппаратный. Сигнал-СS отдельно дергаю. а какую частоту выставить? пробовал 500 кГц. тоже самое.
shuric80
по даташиту чтобы просмотреть содержимое регистра данных нужно послать его адрес 0x12- . ??? выдает данные. повторяющиеся. вроде буффер выходной на АЦП или на spi -неочищается и выдает одно и тоже..
777777
Для начала: для обращения к регистрам у меня написан такой файл (не нашел как сюда загрузить файл, поэтому втыкаю его в текст):
CODE
//
// Чтение/запись по SPI
//

.global ReadStatus

ReadStatus: ldi r18, 0x10

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f

ret

// Data

.global ReadData

ReadData: ldi r18, 0x11

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

/* mov r25, r1 // 3

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0
*/
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r25, 0x0f // 2

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 1

subi r25, 0x80

ret

// Mode

.global ReadMode, WriteMode

ReadMode: ldi r18, 0x12

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r25, 0x0f

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f

ret

WriteMode: ldi r18, 0x02

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r25
sbis 0x0e, 7
rjmp .-4

out 0x0f, r24
sbis 0x0e, 7
rjmp .-4

ret

// Filter

.global ReadFilter, WriteFilter

ReadFilter: ldi r18, 0x13

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

mov r25, r1 // 3

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0

ret

WriteFilter:ldi r18, 0x03

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r24
sbis 0x0e, 7
rjmp .-4

out 0x0f, r23
sbis 0x0e, 7
rjmp .-4

out 0x0f, r22
sbis 0x0e, 7
rjmp .-4


ret

// DAC

.global ReadDAC, WriteDAC

ReadDAC: ldi r18, 0x14

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2

ret

WriteDAC: ldi r18, 0x04

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r24
sbis 0x0e, 7
rjmp .-4

ret

// Offset

.global ReadOffset, WriteOffset

ReadOffset: ldi r18, 0x15

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

mov r25, r1 // 3

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0

ret

WriteOffset:ldi r18, 0x05

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r24
sbis 0x0e, 7
rjmp .-4

out 0x0f, r23
sbis 0x0e, 7
rjmp .-4

out 0x0f, r22
sbis 0x0e, 7
rjmp .-4


ret

// Gain

.global ReadGain, WriteGain

ReadGain: ldi r18, 0x16

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

mov r25, r1 // 3

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1

out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0

ret

WriteGain: ldi r18, 0x06

out 0x0f, r18
sbis 0x0e, 7
rjmp .-4

out 0x0f, r24
sbis 0x0e, 7
rjmp .-4

out 0x0f, r23
sbis 0x0e, 7
rjmp .-4

out 0x0f, r22
sbis 0x0e, 7
rjmp .-4


ret[/code]
Прототипы в h-файле:
[code]// AdcComm.h

uint8_t ReadStatus();

#define NOREF 0x10 // No reference voltage
#define STBY 0x20 // Standby mode
#define STDY 0x40 // Steady
#define RDY 0x80 // Ready

/////////////////////////////////////////////////////////////////////////////

//long ReadData();
int ReadData();

/////////////////////////////////////////////////////////////////////////////

int ReadMode();
void WriteMode(int);

#define BO 0x0004 // BurnoutCurrent
#define CLKDIS 0x0008 // Master clock disable
#define RANGE10 0x0000 // Input range
#define RANGE20 0x0010
#define RANGE40 0x0020
#define RANGE80 0x0030
#define HIREF 0x0080 // High reference (5V)
#define WL 0x0100 // Word length (1-24 bit)
#define DO 9 // Digital output bits position
#define DEN 0x0800 // Digital output enable
#define UNI 0x1000 // 1 - unipolar
#define MD_IDLE 0x0000 // Idle mode
#define MD_CC 0x2000 // Continuous conversion
#define MD_SC 0x4000 // Single conversion
#define MD_STBY 0x6000 // Standby
#define MD_IC0 0x8000 // Internal zero-scale calibration
#define MD_ICF 0xa000 // Internal full-scale calibration
#define MD_SC0 0xc000 // System zero-scale calibration
#define MD_SCF 0xe000 // System full-scale calibration

/////////////////////////////////////////////////////////////////////////////

long ReadFilter();
void WriteFilter(long);

#define CHOP 0x000010 // Chop enable
#define AC 0x000020 // AC excitation
#define FAST 0x000100 // FASTStep mode
#define SKIP 0x000200 // FIR filter skip

/////////////////////////////////////////////////////////////////////////////

uint8_t ReadDAC();
void WriteDAC(uint8_t);

long ReadOffset();
void WriteOffset(long);

long ReadGain();
void WriteGain(long);

Схема примерно такая:
Нажмите для просмотра прикрепленного файла


CS у меня постоянно выбран, SPI программируется так:
SPCR = _BV(SPE) | _BV(MSTR) | 0x0;
Дальнейшая работа такая:
WriteFilter((1791L<<12)|CHOP|AC|15); // 57 Гц (1791), CHOP, AC, задержка 15
WriteDAC(ReadEE(DAC_EE));
WriteOffset(ReadEE4(OFFSET_EE));
WriteGain(ReadEE4(GAIN_EE));
WriteMode(MD_CC|REF|BO|Range); // запуск АЦП
ReadEE - это считывание калибровок и прочей фигни из EEPROM
После этого в прерывании считываются значения путем обращения ReadData()
777777
Да, еще при старте проц делает ему программный сброс. Кстати, он инверсный, ты это учел?
sptes
Всем привет, я пишу на mikro C for AVR. Не использую SPI интерфейс.
Помогите разобрать правильный ли код и в чём моя ошибка:

CODE
#include <built_in.h>

//AD7730
sbit RESET_Port_7730 at PortC2_Bit; // 0 - active, 1 - deactive
sbit RESET_OPREDEL_7730 at DDC2_Bit;

sbit CS_Port_7730 at PortC3_bit;
sbit CS_OPREDEL_7730 at DDC3_bit;

sbit RDY_Port_7730 at PortC4_bit;
volatile sbit RDY_Pin_7730 at PinC4_bit;
sbit RDY_OPREDEL_7730 at DDC4_bit;

sbit DOUT_Port_7730 at PortC5_bit;
sbit DOUT_Pin_7730 at PinC5_bit;
sbit DOUT_OPREDEL_7730 at DDC5_bit;

sbit DIN_Port_7730 at PortC6_bit;
sbit DIN_OPREDEL_7730 at DDC6_bit;

sbit SCLK_Port_7730 at PortC7_bit;
sbit SCLK_OPREDEL_7730 at DDC7_bit;

bit RP_7730_0; bit RP_7730_1; bit RP_7730_2; bit RP_7730_3; bit RP_7730_4; bit RP_7730_5; bit RP_7730_6; bit RP_7730_7;
bit RP_7730_8; bit RP_7730_9; bit RP_7730_10; bit RP_7730_11; bit RP_7730_12; bit RP_7730_13; bit RP_7730_14; bit RP_7730_15;
bit RP_7730_16; bit RP_7730_17; bit RP_7730_18; bit RP_7730_19; bit RP_7730_20; bit RP_7730_21; bit RP_7730_22; bit RP_7730_23;

unsigned long Cod7730 = 0;
unsigned long Cod7730TX[11];
//

#define SCLK_ON 1
#define SCLK_OFF 0

void Initial()
{
DDRA = 0b00000000;
PORTA = 0b11111111;

DDRB = 0b00000000;
PORTB = 0b11111111;

DDRC = 0b00000000;
PORTC = 0b11111111;

DDRD = 0b00000000;
PORTD = 0b11111101;

delay_ms(100);

RESET_Port_7730=0; // ACTIVE RESET
RESET_OPREDEL_7730=1;
CS_Port_7730=1;
CS_OPREDEL_7730=1;
RDY_Port_7730=1;
RDY_OPREDEL_7730=0;
DOUT_Port_7730=1;
DOUT_OPREDEL_7730=0;
DIN_Port_7730=1;
DIN_OPREDEL_7730=1;
SCLK_Port_7730=SCLK_OFF;
SCLK_OPREDEL_7730=1;
}

Delay_WriteStart() { delay_us(4); }
Delay_WriteStop() { delay_us(2); }

Delay_ReadStart() { delay_us(4); }
Delay_ReadStop() { delay_us(2); }

void WriteAD7730(char count)//////////////////////////////////////////////////////////////
{
CS_Port_7730=0;
delay_us(11);

DIN_Port_7730 = RP_7730_0; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_1; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_2; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_3; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_4; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_5; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_6; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_7; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();

if(count==16 || count==24)
{
DIN_Port_7730 = RP_7730_8; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_9; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_10; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_11; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_12; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_13; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_14; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_15; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
}

if(count==24)
{
DIN_Port_7730 = RP_7730_16; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_17; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_18; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_19; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_20; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_21; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_22; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
DIN_Port_7730 = RP_7730_23; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop();
}

delay_us(16);
CS_Port_7730=1;

DIN_Port_7730 = 1;
}///////////////////////////////////////////////////////////////////////////////

void ReadAD7730()///////////////////////////////////////////////////////////////
{
char yu = 1; char TextADCA = 0; char TextADCB = 0; char TextADCD = 0;

Cod7730 = 0;

while (RDY_Pin_7730==1) { } Delay_us(5);

CS_Port_7730=0;
delay_us(4);

SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCD = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
for (yu = 1; yu <= 7; yu++)
{
SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCD = (TextADCD << 1) + DOUT_Pin_7730;
Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
}

SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCB = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
for (yu = 1; yu <= 7; yu++)
{
SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCB = (TextADCB << 1) + DOUT_Pin_7730;
Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
}

SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCA = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
for (yu = 1; yu <= 7; yu++)
{
SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCA = (TextADCA << 1) + DOUT_Pin_7730;
Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12);
}

delay_us(8);
CS_Port_7730=1;

Higher(Cod7730) = TextADCD; Hi(Cod7730) = TextADCB; Lo(Cod7730) = TextADCA;
}///////////////////////////////////////////////////////////////////////////////


void main()
{
Initial();
delay_ms(100);
RESET_Port_7730=1; // Cancel RESET
delay_ms(100);

while(1)
{
// FILTER
RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=1;
WriteAD7730(8);
RP_7730_0=1; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=0;
RP_7730_8=0; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=0; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0;
RP_7730_16=0; RP_7730_17=0; RP_7730_18=0; RP_7730_19=1; RP_7730_20=0; RP_7730_21=0; RP_7730_22=0; RP_7730_23=0;
WriteAD7730(24);

// DAC
RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=1; RP_7730_6=0; RP_7730_7=0;
WriteAD7730(8);
RP_7730_0=0; RP_7730_1=0; RP_7730_2=1; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=1;
WriteAD7730(8);

// MODE
RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=0;
WriteAD7730(8);
RP_7730_0=1; RP_7730_1=0; RP_7730_2=1; RP_7730_3=1; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1;
RP_7730_8=1; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=1; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0;
WriteAD7730(16);

while (RDY_Pin_7730==1) { }

// MODE
RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=0;
WriteAD7730(8);
RP_7730_0=1; RP_7730_1=1; RP_7730_2=0; RP_7730_3=1; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1;
RP_7730_8=1; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=1; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0;
WriteAD7730(16);

while (RDY_Pin_7730==1) { }

// READ ADC
RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1;
WriteAD7730(8);
ReadAD7730();
longwordtostr(Cod7730,Cod7730TX);
//UART1_Write_Text(Cod7730TX);
//UART1_Write_Text("&");

}
}


Во-первых, drdy долгое время не уходил в 0, а на cs я в самом начале подавал 0. Тогда drdy всегда был 1, но калибровка шла, точнее биты правильно устанавливались. Теперь же, когда я изменил биты в mode регистр(вроде CLKDIS), то drdy приходится ждать долго, бывает от 2 до 10 секунд на переход в 0. Это нормально?
Во-вторых, все биты вроде как правильно устанавливаются, за исключением - калибровки. В режиме mode кроме первых, отвечающих за калибровку все устанавливаются, а вот 3-три первых ни в какую. В чём моя ошибка?
USE CODEBOX instead of CODE в случае длинной программы. Т.
Модератор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.