|
ATmega8 SPI ADS1242, Работа с SPI |
|
|
|
Jan 22 2008, 19:23
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(proba @ Jan 22 2008, 22:19)  { unsigned char a; .... a = 6; while (a--); // delay @ 4MHz .... } Этот код не являеться задержкой на оптимизируещем С компиляторе. Анатолий.
|
|
|
|
|
Jan 22 2008, 19:30
|

Местный
  
Группа: Свой
Сообщений: 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) даст задержку в одну микросекунду. Советую прочитать внимательно документацию, во избежании непредвиденных эфектов.
|
|
|
|
|
Jan 23 2008, 08:48
|
Местный
  
Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526

|
Цитата(aesok @ Jan 22 2008, 23:23)  Этот код не являеться задержкой на оптимизируещем С компиляторе.
Анатолий. и Вы используюте максимальную оптимизацию даже на этапе началного дебаггинга ? умныи читател понимает что в этих местах надо делать задержки , каким образом это выгядит в оконечном коде, не важно.
|
|
|
|
|
Jan 23 2008, 09:18
|
Частый гость
 
Группа: Новичок
Сообщений: 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 контроллера ?
|
|
|
|
|
Jan 23 2008, 09:34
|

Местный
  
Группа: Свой
Сообщений: 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)" читаете всего один.
|
|
|
|
|
Jan 23 2008, 10:33
|
Местный
  
Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526

|
Цитата(URANst @ Jan 23 2008, 13:18)  Задержки работают Читаю постоянно то 0x00 0x80 то 0x80 0x80 proba ! а какие вы делали настройки SPI контроллера ? я уже сказал настроики SPI. нет особо времени глубоко смотрет Ваш код но вроде там нет проверки флага готовности ацп.
|
|
|
|
|
Jan 31 2008, 10:02
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912

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

Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|