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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ATmega8 SPI ADS1242, Работа с SPI
aesok
сообщение Jan 22 2008, 19:23
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(proba @ Jan 22 2008, 22:19) *
{
unsigned char a;
....
a = 6;
while (a--); // delay @ 4MHz
....
}


Этот код не являеться задержкой на оптимизируещем С компиляторе.

Анатолий.
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 22 2008, 19:30
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Отвечу выборочно:

Цитата(URANst @ Jan 22 2008, 22:06) *
Подскажите как описать задержку.
Я делаю так:
Код
#include <avr/delay.h> или #include <util/delay.h>
_delay_loop_2(100) ? - 100 в каких единицах ?
_delay_us(50);

Во первых, именно так (во всяком случае, в верссии 1.4.3)
Код
#include <util/delay.h>


_delay_loop_2(N) соответствует задержке в 4N тактов процессора, плюс задержка на инициализацию цикла. Таким образом, при частоте кварца контроллера 16МГц, _delay_loop_2(4) даст задержку в одну микросекунду. Советую прочитать внимательно документацию, во избежании непредвиденных эфектов.
Go to the top of the page
 
+Quote Post
proba
сообщение Jan 23 2008, 08:48
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



Цитата(aesok @ Jan 22 2008, 23:23) *
Этот код не являеться задержкой на оптимизируещем С компиляторе.

Анатолий.


и Вы используюте максимальную оптимизацию даже на этапе началного дебаггинга ?
умныи читател понимает что в этих местах надо делать задержки , каким образом это выгядит в оконечном коде, не важно.
Go to the top of the page
 
+Quote Post
URANst
сообщение Jan 23 2008, 09:18
Сообщение #19


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Код
Написал вот такой код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define UBRRVAL 47

#define SPI_PORT PORTB
#define SPI_DDR DDRB

#define MOSI_P PB3
#define MISO_P PB4
#define SCK_P PB5
#define SS_P PB2

#define SELECT() SPI_PORT &= ~(1 << SS_P)
#define DESELECT() SPI_PORT |= (1 << SS_P)

unsigned char command,statbuf,buf;

void delay (unsigned int d,char s) {
    unsigned int i;
    if (s=='u') {
        for(i=0;i<d;i++) _delay_us(1);
    }
        if (s=='m') {
        for(i=0;i<d;i++) _delay_ms(1);
    }
}

void USART_init(void) {
    
    UBRRL=UBRRVAL;            
    UBRRH=(UBRRVAL>>8);    
    UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);    
    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
}
void USART_Transmit(unsigned char data) {

    while ( !( UCSRA & (1<<UDRE)) ) {};
    UDR = data;
}

void SPI_init(void) {

    SPI_DDR = (1 << MOSI_P)|(1 << SCK_P)|(1 << SS_P);
    SPI_PORT = (1 << SS_P);
    SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR1)|(1 << SPR0); // F_CPU/128
    
}
/*
unsigned char spi_shift_byte(unsigned char data) {
    
    SPDR = data;
    while(!(SPSR & (1 << SPIF)));    
    return SPDR;
}

unsigned char RREG(unsigned char start_address) {
    unsigned char buffer;
    SELECT();
    spi_shift_byte(0x10 | (start_address)); // 0001 rrrr
    spi_shift_byte(0x01); // xxxx nnnn, почему "минус 1" - написано в документации
    _delay_loop_2(250);
    buffer = spi_shift_byte(0xAA); // Читаем count регистров в массив buffer
    DESELECT();
    return buffer;
}

void WREG(unsigned char address, unsigned char value) {
    SELECT();
    spi_shift_byte(0x50 | (address)); // 0101 rrrr
    spi_shift_byte(0x00); // xxxx nnn, почему "минус 1" - написано в документации
    spi_shift_byte(value); // Передаем count значений из массива buffer
    DESELECT();
}
*/
ISR (USART_RXC_vect) {
    
    while ( !(UCSRA & (1<<RXC)) );
    buf=UDR;
    statbuf=0x01;
}

void processing (void) {

    unsigned char SPI_buf,SPI_buf1;
    
    if ((statbuf==0x01) && (command==0x00)) {
            command=buf;
            buf=0x00;
            statbuf=0x00;
    }
    if  (command!=0x00) {
        switch (command) {
                case 0x31: {
                            USART_Transmit(0x01);
                            command=0x00;
                            break;    
                }
                case 0x32: {
                            
                                                
                                                
                                                /*
                                                SELECT();
                                                    SPDR = 0x50;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x01;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x03;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x03;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                DESELECT();
                                                */
                                                
                                                
                                                SELECT();
                                                
                                                SPDR = 0x10;
                                                while(!(SPSR & (1 << SPIF)));
                                                delay(5,'u');
                                                SPDR = 0x01;
                                                while(!(SPSR & (1 << SPIF)));
                                                delay(250,'u');
                                                SPDR = 0xAB;
                                                while(!(SPSR & (1 << SPIF)));
                                                SPI_buf=SPDR;
                                                delay(5,'u');
                                                SPDR = 0xAB;
                                                while(!(SPSR & (1 << SPIF)));
                                                SPI_buf1=SPDR;
                                                delay(5,'u');
                                                
                                                
                                                DESELECT();
                                                
                                                
                                                USART_Transmit(SPI_buf);
                                                USART_Transmit(SPI_buf1);
                                                SPI_buf=0x00;    
                                                SPI_buf1=0x00;
                                                buf=0x00;
                                                statbuf=0x00;
                                                command=0x00;
                            break;                    
                }
                
                default: {
                           command=0x00;
                           break;
                          }
        }                  
    
    }
}


int main (void) {

    USART_init();
    SPI_init();
    sei();

    while (1) {
        processing ();

    }
}

Задержки работают
Читаю постоянно то 0x00 0x80 то 0x80 0x80
proba ! а какие вы делали настройки SPI контроллера ?
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 23 2008, 09:34
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(URANst @ Jan 23 2008, 12:18) *
Код
unsigned char RREG(unsigned char start_address) {
    unsigned char buffer;
    SELECT();
    spi_shift_byte(0x10 | (start_address)); // 0001 rrrr
    spi_shift_byte(0x01); // xxxx nnnn, почему "минус 1" - написано в документации
    _delay_loop_2(250);
    buffer = spi_shift_byte(0xAA); // Читаем count регистров в массив buffer
    DESELECT();
    return buffer;
}


Строчкой "spi_shift_byte(0x01)" вы даете команду чтения двух регистров, но потом строчкой "buffer = spi_shift_byte(0xAA)" читаете всего один.
Go to the top of the page
 
+Quote Post
URANst
сообщение Jan 23 2008, 10:15
Сообщение #21


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Извините не удалил это функции.
Я их пока не использую.
Для работы пишу сразу в case 32:

Что то вроде и читается но не несовсем то что нужно ? Во засел.

Уважаемый proba покажите плиз кусок схемы с применением этой ацп и код для контроллера на .с, а то засада, а вы победиили эту ацп. URAnstin@mail.ru
Go to the top of the page
 
+Quote Post
proba
сообщение Jan 23 2008, 10:33
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



Цитата(URANst @ Jan 23 2008, 13:18) *
Задержки работают
Читаю постоянно то 0x00 0x80 то 0x80 0x80
proba ! а какие вы делали настройки SPI контроллера ?

я уже сказал настроики SPI. нет особо времени глубоко смотрет Ваш код но вроде там нет проверки флага готовности ацп.
Go to the top of the page
 
+Quote Post
URANst
сообщение Jan 23 2008, 11:35
Сообщение #23


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



ВЫ имеете ввиду DRDY ? Поправте меня если я не правильно понял, но это флаг устанавливается тогда , когда данные оцифрованы и записаны в регистры данных и готовы к чтению ?
Если ВЫ имеете ввиду не этот флаг, то тогда какой ?

И еще вопрос MISO контроллера нужно настраивать как вход с подтяжкой pull-up ?
Могут ли быть глюки с моей АЦП если не подключены выводы на которые должен подаваться аналоговый сигнал (щас они у меня в воздухе висят) ?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 23 2008, 20:50
Сообщение #24


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Иногда проблемы возникают из-за инициализации SPI (всего 4 режима). Вы уверены в правильной инициализации?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
URANst
сообщение Jan 24 2008, 07:13
Сообщение #25


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



УРААААААААА !!!!!
Да действительно вся проблема была в том, что для данная АЦП работает в режиме SPI mode 1 (SPOL=0, SPHA=1).
Вот что делает невнимательность !
Всем большое спасибо за советы и помощь !!!
Go to the top of the page
 
+Quote Post
URANst
сообщение Jan 31 2008, 10:02
Сообщение #26


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Возникло еще парочку вопросов. Когда выставляю оцифровку для униполярного сигнала (бит 6 регистра ACR), то выдаваемое значение в два раза больше настоящего, при биполярном режиме выдает то что надо, сигнал измеряю постоянный, че такое ?
Для чего и когда нужно применять команду DSYNC и нужно ли вообще.
Правильно ли я понимаю, что при включенном буффере макс. входное напряжение Vcc-1.5 ? и как это обойти , если с датчика у меня нормированный сигнал 0-5 V.
Могут ли выставляться разные коээфициенты после внутренней коллибровки, или у меня что , если у меня , то что может быть неправильно ?
Напомню что все вопросы о АЦП ADS1242. Даташит в первом посте.
Go to the top of the page
 
+Quote Post
kostik2
сообщение Apr 19 2009, 07:11
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



пытаюсь работать с ads1243ipwt квару ads 4.9152, кварц M64 - 11.0592

spi_init();
LED1_ON;
dl=1000;
Del();
while(1)
{
ADC_CS_ON;
while(PING & BIT(2)){};//wait ready
LED1_OFF;
SPI_Write_Byte(0x11);
SPI_Write_Byte(0x00);
a=26; while(a--){};//~22MKS
SPI_Write_Byte(0x00);
a=26; while(a--){};
ADC_CS_OFF;
TxData1(0x77);
TxData1(SPDR);
while(1)
{
LED2_ON;
}
}
ВЫДАЕТ 0

spcr=0x56;

могет кто скинет схему как подключали ads1243 на kostiapan@mail.ru
Go to the top of the page
 
+Quote Post

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

 


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


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