|
AD7476 и ATmega32, Подключение ADC по SPI интерфейсу |
|
|
|
Aug 21 2008, 21:23
|

Участник

Группа: Новичок
Сообщений: 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. Могут ли возникнуть с этим проблемы? На всякий случай отрубаю его от схемы перед подачей сигнала на АЦП. Спасибо, Сергей.
|
|
|
|
|
 |
Ответов
|
Aug 23 2008, 18:23
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(GDI @ Aug 22 2008, 18:16)  Примерно так: Код //... adc_in = (short)SPDR << 8; //... adc_in |= SPDR; А почему бы не вот так? Код //... *(((unsigned char *) &adc_in) + 1) = SPDR; //... *((unsigned char *) &adc_in) = SPDR;
|
|
|
|
|
Aug 24 2008, 08:12
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(SysRq @ Aug 23 2008, 22:23)  А почему бы не вот так? Код //... *(((unsigned char *) &adc_in) + 1) = SPDR; //... *((unsigned char *) &adc_in) = SPDR; Потому что контроллеры и процессоры бывают как Little-Endian, так и Big-Endian, а Ваш вариант этого совсем не учитывает - следовательно это unsafe:). Посмотрите для самообразования: Порядок байтов — Википедия
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 25 2008, 06:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(SysRq @ Aug 24 2008, 15:55)  Ну само собой! При попытке чего-то оптимизировать теряем в универсальности..  Что называется, почувствуйте разницу. Я не думал что будет ТАКОЕ: gcc 4.1.2 Os Код volatile unsigned short a; volatile unsigned short b; volatile unsigned short с;
a = (unsigned short)SPDR<<8; // Hi b6: 8f b1 in r24, 0x0f; 15 b8: 99 27 eor r25, r25 ba: 98 2f mov r25, r24 bc: 88 27 eor r24, r24 be: 9e 83 std Y+6, r25; 0x06 c0: 8d 83 std Y+5, r24; 0x05 a |= SPDR; // Low c2: 2d 81 ldd r18, Y+5; 0x05 c4: 3e 81 ldd r19, Y+6; 0x06 c6: 8f b1 in r24, 0x0f; 15 c8: 99 27 eor r25, r25 ca: 28 2b or r18, r24 cc: 39 2b or r19, r25 ce: 3e 83 std Y+6, r19; 0x06 d0: 2d 83 std Y+5, r18; 0x05
*((unsigned char*)&b + 1) = SPDR; // Hi d2: 8f b1 in r24, 0x0f; 15 d4: 8a 83 std Y+2, r24; 0x02 *((unsigned char*)&b + 0) = SPDR; // Low d6: 8f b1 in r24, 0x0f; 15 d8: 89 83 std Y+1, r24; 0x01
c = a+b; da: 8d 81 ldd r24, Y+5; 0x05 dc: 9e 81 ldd r25, Y+6; 0x06 de: 29 81 ldd r18, Y+1; 0x01 e0: 3a 81 ldd r19, Y+2; 0x02 e2: 82 0f add r24, r18 e4: 93 1f adc r25, r19 e6: 9c 83 std Y+4, r25; 0x04 e8: 8b 83 std Y+3, r24; 0x03 Так будет лучше, но.... gcc 4.3.0 Os Код a = (unsigned short)SPDR<<8; // Hi b0: 2f b1 in r18, 0x0f; 15 b2: 92 2f mov r25, r18 b4: 80 e0 ldi r24, 0x00; 0 b6: 9a 83 std Y+2, r25; 0x02 b8: 89 83 std Y+1, r24; 0x01 a |= SPDR; // Low ba: 29 81 ldd r18, Y+1; 0x01 bc: 3a 81 ldd r19, Y+2; 0x02 be: 8f b1 in r24, 0x0f; 15 c0: 90 e0 ldi r25, 0x00; 0 c2: 82 2b or r24, r18 c4: 93 2b or r25, r19 c6: 9a 83 std Y+2, r25; 0x02 c8: 89 83 std Y+1, r24; 0x01
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
B_Sergey_N AD7476 и ATmega32 Aug 21 2008, 21:23 aesok Цитата(B_Sergey_N @ Aug 22 2008, 01:23) З... Aug 21 2008, 21:35 Genadi Zawidowski попробуйте, для начала, поуправлять АЦП "в ру... Aug 22 2008, 13:08 GDI Цитатаif (SPDR <= 256)
Это условие никогда не в... Aug 22 2008, 14:16 B_Sergey_N Заработало!!! Всем спасибо, особенно G... Aug 23 2008, 00:39 GDI ЦитатаНо я так и не могу понять, зачем перед тем к... Aug 25 2008, 06:33 B_Sergey_N Цитата(GDI @ Aug 25 2008, 10:33) МК у вас... Aug 25 2008, 08:51 B_Sergey_N Хорошо, спасибо большое за подсказки.
Возник тепе... Aug 31 2008, 10:47 Dmitry_Od Понадобится самому организовывать протокол передач... Aug 31 2008, 11:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|