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

 
 
> AD7476 и ATmega32, Подключение ADC по SPI интерфейсу
B_Sergey_N
сообщение Aug 21 2008, 21:23
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 28-07-08
Из: г. Санкт-Петербург
Пользователь №: 39 246



Всем привет.
Подключил АЦП 12 битовый к ATmega32 по SPI. Но никак не могу понять как принимать данные с АЦП.
У SPI есть 8-разрядный сдвиговый регистр, мне же надо принять сразу 12 (точнее 16, но первые 4 бита нули). Каким образом? Как двигать и записывать эти биты. Прикрепляю datasheet АЦП, может кто захочет взглянуть.

Инициализация SPI вроде правильна:
Код
// Установить PB5(MOSI), PB7(SCK) как выходы
DDRB    = (1<<PB5)|(1<<PB7)|(1<<PB4);
PORTB   = 0xFF;    

DDRC    = (1 << PC0);   // PС0(/СS) выход
PORTC  |= (1 << PC0);
        
// Включаю SPI в режиме мастер с SCK = CK/4 = 4МГц
        SPCR    = (1<<SPE)|(1<<MSTR)|(1<<CPOL);
        SPSR    = (1<<SPI2X);  // Удваиваю скорость до 8МГц


После этого написал так, светодиоды использ. для проверки.

Код
      
                while(1)
    {
    PORTC &= ~(1 << 0); // Включаю АЦП
    
    _delay_ms(1);
    
                //while(PINB6 == 0);
    
                while (!(SPSR & (1<<SPIF)));

    PORTC |= (1 << 0); // Отключил АЦП
                
                if (SPDR <= 256)
            {
                // Мигаю светодиодом
                
                _delay_ms(50);

                PORTA |= (1 << 1);
        
                _delay_ms(500);
        
                PORTA &= ~(1 << 1);
            }
            else
            {
                 // Подмигиваю
                
                _delay_ms(50);

                PORTA |= (1 << 2);
        
                _delay_ms(50);
        
                PORTA &= ~(1 << 2);
            }
                }



Знаю, что не правильно, поэтому спрашиваю. Буду очень признателен за помощь, а то уже не знаю сколько перечитал всего, так и не разобрался.
Было бы совсем не плохо, если бы выложили код.

А и еще, программатор подключен тоже по SPI. Могут ли возникнуть с этим проблемы? На всякий случай отрубаю его от схемы перед подачей сигнала на АЦП.

Спасибо, Сергей.
Прикрепленные файлы
Прикрепленный файл  ___AD7476_7477_7478.pdf ( 942.18 килобайт ) Кол-во скачиваний: 59
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Aug 22 2008, 13:08
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



попробуйте, для начала, поуправлять АЦП "в ручную" - подёргать битики SPI программно.

Вот пара моих кусочков кода для разных АЦП - по аналогии попробуйте...


Для ad7276:
Код
unsigned long BoardReadADC()
{    
    unsigned long val = 0;
    prog_select(targetadc1, 1);

    SCLK_SET();
    SCLK_CLR();

    for (int i = 0; i < 12; ++ i)
    {
        SCLK_SET();
        SCLK_CLR();

        unsigned v = (lpt_readb_status() & 0x08) == 0;
        val = (val << 1) | v;
    }

    prog_select(targetadc1, 0);
    return val;
}


Для ad7810

Код
void sclk_pulse(void)
{
    SCLK_CLR();
    SCLK_SET();
}

// ADC conversion start signal
void convstart_pulse(void)
{
    prog_select(targetadc1, 1);
    prog_select(targetadc1, 0);
}

unsigned ad7810_read(
    void //unsigned char target    /* addressing to chip */
    )
{    
    unsigned val = 0;
    // ADC conversion start signal
    convstart_pulse();
    //
    for (int i = 0; i < 10; ++ i)
    {
        unsigned v;
        sclk_pulse();
        //
        //v = (PIND & 0x08) != 0;
        v = (lpt_readb_status() & 0x08) == 0;
        val = (val * 2) | v;

    }
    //
    sclk_pulse();
    sclk_pulse();


    return val;
}
Go to the top of the page
 
+Quote Post



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

 


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


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