Перейти к содержанию
    

{

unsigned char a;

....

a = 6;

while (a--); // delay @ 4MHz

....

}

 

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Подскажите как описать задержку.

Я делаю так:

#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) даст задержку в одну микросекунду. Советую прочитать внимательно документацию, во избежании непредвиденных эфектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

 

и Вы используюте максимальную оптимизацию даже на этапе началного дебаггинга ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал вот такой код:
#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 контроллера ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)" читаете всего один.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините не удалил это функции.

Я их пока не использую.

Для работы пишу сразу в case 32:

 

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

 

Уважаемый proba покажите плиз кусок схемы с применением этой ацп и код для контроллера на .с, а то засада, а вы победиили эту ацп. [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задержки работают

Читаю постоянно то 0x00 0x80 то 0x80 0x80

proba ! а какие вы делали настройки SPI контроллера ?

я уже сказал настроики SPI. нет особо времени глубоко смотрет Ваш код но вроде там нет проверки флага готовности ацп.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если ВЫ имеете ввиду не этот флаг, то тогда какой ?

 

И еще вопрос MISO контроллера нужно настраивать как вход с подтяжкой pull-up ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

УРААААААААА !!!!!

Да действительно вся проблема была в том, что для данная АЦП работает в режиме SPI mode 1 (SPOL=0, SPHA=1).

Вот что делает невнимательность !

Всем большое спасибо за советы и помощь !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возникло еще парочку вопросов. Когда выставляю оцифровку для униполярного сигнала (бит 6 регистра ACR), то выдаваемое значение в два раза больше настоящего, при биполярном режиме выдает то что надо, сигнал измеряю постоянный, че такое ?

Для чего и когда нужно применять команду DSYNC и нужно ли вообще.

Правильно ли я понимаю, что при включенном буффере макс. входное напряжение Vcc-1.5 ? и как это обойти , если с датчика у меня нормированный сигнал 0-5 V.

Могут ли выставляться разные коээфициенты после внутренней коллибровки, или у меня что , если у меня , то что может быть неправильно ?

Напомню что все вопросы о АЦП ADS1242. Даташит в первом посте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пытаюсь работать с 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 на [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...