|
mega8 + ad77705, нужен код |
|
|
|
Jan 19 2009, 16:02
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
подскажите плиз как правильно сконфигурировать 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++; }
|
|
|
|
|
Jan 19 2009, 17:28
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
схема
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 19 2009, 19:26
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
или - будет работать такой код ? у меня не работает, пробую считать регистры,пишет 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; }
|
|
|
|
|
Jan 20 2009, 08:19
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(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++; } }  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 } ....  OFF Анатолий.
|
|
|
|
|
Jan 20 2009, 14:59
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
пробую так... сделал обнуление 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; }
|
|
|
|
|
Jan 20 2009, 17:07
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
Цитата(Сергей Борщ @ 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
|
|
|
|
|
Jan 21 2009, 09:31
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(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
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 21 2009, 09:58
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
Цитата(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();
|
|
|
|
|
Jan 21 2009, 12:38
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
ну и головняк эта 7705... с 7816 работал нормально,но 12бит не хватает... заказал 8320, а 7705 на помойку , хоть и интересно почему не заработала... Цитата(Сергей Борщ @ Jan 21 2009, 15:25)  Отключите CS от 7705, замкните D_IN и D_OUT. Получаете ли при этом эхо? Если да - проверяйте, что генерится и доходит до 7705 CLK и CS. раньше CS сидела на земле. мож дело в кварце? 4Мгц много. но регистры должны читаться все-равно ? кварц только для преобразования нужен?
|
|
|
|
|
Jan 21 2009, 12:46
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата write7705(20); write7705(1C); write7705(28); чё, прямо вот так? а может, надо было 0х20, 0х1с и 0х28? или компилятор шибко умный, сам допрёт? С 7705 у нас люди работают нормально, нареканий нет, за исключением низкой скорости Цитата unsigned read7705(void) ??? unsigned чего?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jan 21 2009, 13:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(simsim @ Jan 21 2009, 14:38)  заказал 8320, а 7705 на помойку , хоть и интересно почему не заработала... Вот так всегда. Виноваты кто угодно - микросхема, компилятор, но не кривые руки. Цитата(simsim @ Jan 21 2009, 14:38)  раньше CS сидела на земле. мож дело в кварце? А может это в даташите написано?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 21 2009, 14:41
|
Участник

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801

|
Цитата(MrYuran @ Jan 21 2009, 16:46)  чё, прямо вот так? а может, надо было 0х20, 0х1с и 0х28? или компилятор шибко умный, сам допрёт? С 7705 у нас люди работают нормально, нареканий нет, за исключением низкой скорости
??? unsigned чего? конечно же пишу 0х... unsigned - 0...65535 в CVAVR... поделитесь плиз процедурками чтения и записи в нее?
|
|
|
|
|
Jan 21 2009, 15:06
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(MrYuran @ Jan 21 2009, 17:46)  ??? unsigned чего? По-умолчанию в Си принимается тип int. Раз написано unsigned, то значит unsigned int. Вы же наверняка не пишете полностью unsigned long int, ограничиваясь unsigned long, не так ли?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|