реклама на сайте
подробности

 
 
> Разбираюсь с ADS1255/1256., Помогите чем могите!
Filov
сообщение Jan 28 2008, 12:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Здравствуйте!

Хочу мерить напряжение с электронного умножителя (минимальное порядка 10^-7V) с частотой примерно 500-1000Hz. Выбрал в качестве АЦП ADS1255/1256.

Подключаю его к ATmega168 через USART в MSPIM. Т.к. основной SPI к сожалению занят. Для этого использую код из AppNote AVR317: Using the USART on the ATmega48/88/168 as a SPI master. Там как я понял организуется циклический буфер в который можно записывать данные и забирать оттуда данные, а он сам будет делать все остальное smile.gif.

DRDY от ADS1255 подключаю к INT1. Хочу заполнять массив по прерыванию INT1.


Делаю вот так:

*****main.c*****

Код
#define F_CPU 12500000UL  // 12.5 MHz

int main(void){

        /***init SPI as USART MSPIM and ~SS line ***/
        //Calculation of BRREG value. USART MSPIM:
        #define BPS 10000                                 //Desired bit rate for SPI communication.
        #define BRREG ((F_CPU/(2*BPS))-1)       // Calculated brreg value.
                                                                    //SPI clock t1: max = 4*tclock_ads1256 = 2 MHz
        init_usart_spi(0, BRREG);

        /***enable interrupt***/
        sei();

        /***enable ADS1256***/
        init_ads1256();

        while(1){.....}
}

** Инициализация ads1256

void init_ads1256(void){

        //***Initialise ADS1256
        char Byte=(WREG | 0x00);                //Starting at address 0x00,
        queue_byte(Byte);
        queue_byte(0x04);                       //write to a total of 5 registers (5 - 1 = 0x04)
        queue_byte(0x06);                       //STATUS register = 0x06
        queue_byte(0x01);                       //MUX register = 0x01
        queue_byte(0x01);                       //ADCON register = 0x01
        queue_byte(0xC1);                       //DRATE register = 0xC1
        queue_byte(0x00);                       //GPIO register = 0x00
        //ADS1256 Self Calibration
        queue_byte(SELFCAL);                    //Initiate self calibration
        _delay_ms(10);
//      do{char temp   =   PD3;} while((temp & 0x08) == 0x08);       //Wait for DRDY to go low
        //Set sample freq. to 500SPS

        //***Initialise External interrupt 1
        //PORTD3 is input by default
        //The low level of INT1 generates an interrupt request
        cbi(EICRA, ISC11);
        cbi(EICRA, ISC10);
        //enable INT1 interrupt
        sbi(EIMSK, INT1);

}


** Действия когда DRDY становится низким

//The following function will be called when analog conversion is done: DRDY connecting to PD3/INT1 is going low
ISR(INT1_vect) {

        //spi_send_mssp(_ADS1256_cmd_read_regs | _ADS1256_regs_io)
        queue_byte(RDATA);
        //spi_send_mssp(0)
        queue_byte(0);
        _delay_us(10);                 //*ADS1256 t6 VERY IMPORTANT* min_us=t6/F_ADS1256=50/7.68MHz=7us
        //spi_read_mssp(data)
        DAT[conv]=fetch_byte();
        DAT[conv+1]=fetch_byte();
        DAT[conv+2]=fetch_byte();
        conv=conv+3;
        //clear INT1 interrupt flag
        sbi(EIFR, INTF1);
}


файл USART in MSPIM в аттаче. там определяются функции init_usart_spi(), queue_byte(), fetch_byte()


Подскажите пожалуйста, все ли я делаю правильно? Будет ли такое вообще работать?

Сообщение отредактировал Filov - Jan 28 2008, 12:22
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 17:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016