Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega8 + ad77705
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
simsim
подскажите плиз как правильно сконфигурировать 7705 для измерения напряжения 50 раз в секунду. и будет ли вообще работать 7705 с таким кварцем? и с мегой на 1Мгц...
примеров видел много,но ни один не работает...нужен код на Си...что лучше - через стандартный SPI или своими циклами ?
CODE
DDRB = ((1<<MOSI)|(1<<SCLK)|(1<<SS));

//Enable SPI, Select Master, SCLK idles high,
//Sample on rising edge Setup on falling edge,
//SCLK=F_CPU/4
SPCR =0x52; //((1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA));

//Serially reset the Chip
SPDR = 0xFF;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Serially reset the Chip
SPDR = 0xFF;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Serially reset the Chip
SPDR = 0xFF;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Serially reset the Chip
SPDR = 0xFF;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Serially reset the Chip
SPDR = 0xFF;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));


//Send to Comm Reg: Next Write Clk
SPDR = 0b00100000; //0x20

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Send to ClkReg: Clock Bits and Update rate
SPDR = 0x18; //0b00011000;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Send to Comm Reg: write setup
SPDR = 0b00010000; //0x10

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

//Send to Setup: FSYNC, Gain, Conditions, Self Calibration
SPDR = 0b01000100;

//Wait for transfer
while(!(SPSR & (1<<SPIF)));

while(1)
{
//Is DDRY pin low/data ready?

//Send to Comm: next read Data
SPDR = 0b00111000; // 0x38

//Wait for transfer
while(!(SPSR & (1<<SPIF)));
DDRB=0x10;
DDRB.5=1;
CLK=1;
while(DRDY);
delay_us(us1);
CLK=0; delay_us(us1);
while(i<16)
{
CLK=1;delay_us(us1);
adc_rez[i]='0';
if(D_OUT==1) adc_rez[i]='1';
CLK=0;delay_us(us1);
i++;
}
simsim
схема
simsim
или - будет работать такой код ?
у меня не работает, пробую считать регистры,пишет ff...
CODE
write7705(unsigned char u8)
{ unsigned char j=0;
CS=CLK=1;
delay_us(us1);
CS=0;
while(j<8)
{
delay_us(us1);
CLK=0;
delay_us(us1);
if (u8 &(1<<(7-j))) D_IN=1; else D_IN=0;
CLK=1;
j++;
}
delay_us(us1);
CS=1;
}

unsigned read7705(void)
{ unsigned char j=0;
unsigned result=0;
CS=CLK=1;
delay_us(us1);
while(DRDY);
delay_us(us1);
CS=0;
while(j<16)
{
delay_us(us1);
CLK=0;
delay_us(us1);
CLK=1;
delay_us(us1);
adc_rez[j]='0';
if (D_OUT) {adc_rez[j]='1'; result=result+pow(2,15-j);}
j++;
}
CS=1;
return result;
}
aesok
Цитата(simsim @ Jan 19 2009, 22:26) *
Код
unsigned read7705(void)
{ unsigned char j=0;    
unsigned result=0;
.....
while(j<16)
{  
.....
  if (D_OUT) {adc_rez[j]='1'; result=result+pow(2,15-j);}  
  j++;
}    
}


bb-offtopic.gif ON
Оригинальнейший способ преобразования последоватольности бит в число. Способ-чемпион по скорости и размеру!

Почитайте в Вашей книге по С, про операторы сдвига. Если лень читать:

Код
00094 u08 i2cGetbyte(UINT last)
00095 {
00096     int i;
00097     u08 c,b = 0;
00098        
......
00101
00102     for(i=7;i>=0;i--)
00103     {
00104         HDEL;
00105         I2C_SCL_HI;             // clock HI
00106         c = inb(SDAPIN) & (1<<SDA);  
00107         b <<= 1;
00108         if(c) b |= 1;
00109         HDEL;
00110         I2C_SCL_LO;             // clock LO
00111     }
....



bb-offtopic.gif OFF

Анатолий.
simsim
пробую так...
сделал обнуление D_IN..
сделал сдвиг как научили...
тоже не работает
CODE
void write7705(unsigned char u8)
{ unsigned char j=0;
CS=CLK=1; D_IN=0;
delay_us(us1);
CS=0;
while(j<8)
{
delay_us(us1);
CLK=0;D_IN=0;
if (u8 &(1<<(7-j))) D_IN=1;
delay_us(us1);
CLK=1;
j++;
}
delay_us(us1);
CS=1;
}

unsigned read7705(void)
{ unsigned char j=0;
unsigned result=0;
CS=CLK=1;
delay_us(us1);
while(DRDY);
delay_us(us1);
CS=0;
while(j<16)
{
delay_us(us1);
CLK=0;
delay_us(us1);
adc_rez[j]='0';
result<<=1;
if (D_OUT==1) {adc_rez[j]='1'; result|=1;}
CLK=1;
j++;
}
CS=1;
return result;
}
Сергей Борщ
Цитата(simsim @ Jan 20 2009, 16:59) *
пробую так...
Покажите, как у вас описаны CS, CLK, D_IN, DRDY?
simsim
Цитата(Сергей Борщ @ Jan 20 2009, 19:22) *
Покажите, как у вас описаны CS, CLK, D_IN, DRDY?

Код
#define CS      PORTB.2
#define CLK     PORTB.5
#define DRDY    PINB.0
#define D_IN    PORTB.3
#define D_OUT   PINB.4
demiurg_spb
Цитата(simsim @ Jan 20 2009, 20:07) *
Код
#define CS      PORTB.2
#define CLK     PORTB.5
#define DRDY    PINB.0
#define D_IN    PORTB.3
#define D_OUT   PINB.4
Наверное надо поменять местами D_IN и D_OUT,
если рассматривать функционал ножек со стороны контроллера, как это обычно делается...
Код
#define D_OUT    PORTB.3  // MOSI
#define D_IN   PINB.4  // MISO
simsim
Цитата(demiurg_spb @ Jan 21 2009, 13:31) *
Наверное надо поменять местами D_IN и D_OUT,
если рассматривать функционал ножек со стороны контроллера, как это обычно делается...
Код
#define D_OUT    PORTB.3  // MOSI
#define D_IN   PINB.4  // MISO

D_IN,D_OUT это функционал 7705, все подключено правильно.
пробую записать и прочитать Clock registr. i=FF
write7705(20);
write7705(1C);
write7705(28);
i=read7705();
Сергей Борщ
Цитата(simsim @ Jan 21 2009, 11:58) *
пробую записать и прочитать Clock registr. i=FF
Отключите CS от 7705, замкните D_IN и D_OUT. Получаете ли при этом эхо? Если да - проверяйте, что генерится и доходит до 7705  CLK и CS.
simsim
ну и головняк эта 7705...
с 7816 работал нормально,но 12бит не хватает...
заказал 8320, а 7705 на помойку , хоть и интересно почему не заработала...

Цитата(Сергей Борщ @ Jan 21 2009, 15:25) *
Отключите CS от 7705, замкните D_IN и D_OUT. Получаете ли при этом эхо? Если да - проверяйте, что генерится и доходит до 7705  CLK и CS.

раньше CS сидела на земле. мож дело в кварце? 4Мгц много. но регистры должны читаться все-равно ? кварц только для преобразования нужен?
MrYuran
Цитата
write7705(20);
write7705(1C);
write7705(28);

чё, прямо вот так?
а может, надо было 0х20, 0х1с и 0х28?
или компилятор шибко умный, сам допрёт?
С 7705 у нас люди работают нормально, нареканий нет, за исключением низкой скорости
Цитата
unsigned read7705(void)

??? unsigned чего?
Сергей Борщ
Цитата(simsim @ Jan 21 2009, 14:38) *
заказал 8320, а 7705 на помойку , хоть и интересно почему не заработала...
Вот так всегда. Виноваты кто угодно - микросхема,  компилятор, но не кривые руки.
Цитата(simsim @ Jan 21 2009, 14:38) *
раньше CS сидела на земле. мож дело в кварце?
А может это в даташите написано?
simsim
Цитата(MrYuran @ Jan 21 2009, 16:46) *
чё, прямо вот так?
а может, надо было 0х20, 0х1с и 0х28?
или компилятор шибко умный, сам допрёт?
С 7705 у нас люди работают нормально, нареканий нет, за исключением низкой скорости

??? unsigned чего?

конечно же пишу 0х...
unsigned - 0...65535 в CVAVR...
поделитесь плиз процедурками чтения и записи в нее?
rezident
Цитата(MrYuran @ Jan 21 2009, 17:46) *
??? unsigned чего?
По-умолчанию в Си принимается тип int. Раз написано unsigned, то значит unsigned int. Вы же наверняка не пишете полностью unsigned long int, ограничиваясь unsigned long, не так ли? wink.gif
simsim
посадил RESET 7705 на мегу...
нашел готовый код http://user.chol.com/~ascbbs/ccscdrv2/AD7705.C
помогло... smile3046.gif
Clock reg = 0x1d
Сергей Борщ
Цитата(simsim @ Jan 21 2009, 19:49) *
нашел готовый код http://user.chol.com/~ascbbs/ccscdrv2/AD7705.C
Цитата
This source code may only be used by licensed users of the CCS C ////
//// compiler.
Вы являетесь лицензированным пользователем CSS?
Цитата(simsim @ Jan 21 2009, 19:49) *
помогло... smile3046.gif
Значит, в своем коде из десятка строк так и не разобрались. А когда понадобится другую микросхему подключать, снова чужой код искать будете?

Код
shift_left(&data,1,0)void setup_adc_device(int calmode, int gainsetting, int operation, int rate)
  {
   ......

  write_adc_byte( calmode|gainsetting|operation);//Setup Register info here
Мда, образец эффективности  crying.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.