aesok 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба { unsigned char a; .... a = 6; while (a--); // delay @ 4MHz .... } Этот код не являеться задержкой на оптимизируещем С компиляторе. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба Отвечу выборочно: Подскажите как описать задержку. Я делаю так: #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) даст задержку в одну микросекунду. Советую прочитать внимательно документацию, во избежании непредвиденных эфектов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
proba 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Этот код не являеться задержкой на оптимизируещем С компиляторе. Анатолий. и Вы используюте максимальную оптимизацию даже на этапе началного дебаггинга ? умныи читател понимает что в этих местах надо делать задержки , каким образом это выгядит в оконечном коде, не важно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Написал вот такой код: #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 контроллера ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба 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)" читаете всего один. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Извините не удалил это функции. Я их пока не использую. Для работы пишу сразу в case 32: Что то вроде и читается но не несовсем то что нужно ? Во засел. Уважаемый proba покажите плиз кусок схемы с применением этой ацп и код для контроллера на .с, а то засада, а вы победиили эту ацп. [email protected] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
proba 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Задержки работают Читаю постоянно то 0x00 0x80 то 0x80 0x80 proba ! а какие вы делали настройки SPI контроллера ? я уже сказал настроики SPI. нет особо времени глубоко смотрет Ваш код но вроде там нет проверки флага готовности ацп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба ВЫ имеете ввиду DRDY ? Поправте меня если я не правильно понял, но это флаг устанавливается тогда , когда данные оцифрованы и записаны в регистры данных и готовы к чтению ? Если ВЫ имеете ввиду не этот флаг, то тогда какой ? И еще вопрос MISO контроллера нужно настраивать как вход с подтяжкой pull-up ? Могут ли быть глюки с моей АЦП если не подключены выводы на которые должен подаваться аналоговый сигнал (щас они у меня в воздухе висят) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Иногда проблемы возникают из-за инициализации SPI (всего 4 режима). Вы уверены в правильной инициализации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 24 января, 2008 Опубликовано 24 января, 2008 · Жалоба УРААААААААА !!!!! Да действительно вся проблема была в том, что для данная АЦП работает в режиме SPI mode 1 (SPOL=0, SPHA=1). Вот что делает невнимательность ! Всем большое спасибо за советы и помощь !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 31 января, 2008 Опубликовано 31 января, 2008 · Жалоба Возникло еще парочку вопросов. Когда выставляю оцифровку для униполярного сигнала (бит 6 регистра ACR), то выдаваемое значение в два раза больше настоящего, при биполярном режиме выдает то что надо, сигнал измеряю постоянный, че такое ? Для чего и когда нужно применять команду DSYNC и нужно ли вообще. Правильно ли я понимаю, что при включенном буффере макс. входное напряжение Vcc-1.5 ? и как это обойти , если с датчика у меня нормированный сигнал 0-5 V. Могут ли выставляться разные коээфициенты после внутренней коллибровки, или у меня что , если у меня , то что может быть неправильно ? Напомню что все вопросы о АЦП ADS1242. Даташит в первом посте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostik2 0 19 апреля, 2009 Опубликовано 19 апреля, 2009 · Жалоба пытаюсь работать с 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] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться