AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.10.2016, 18:04
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 22 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от AlexPi
|
Так вот и я о том же. А делать это придется для достижения максимального разрешения АЦП. В задаче ТС на сколько я понял важно именно разрешение и точность.
|
Эм-м-м... Скажите, бога ради, почему разрешение и точность должно зависеть от способа определения готовности данных ПОСЛЕ ПРЕОБРАЗОВАНИЯ. Как я уже писал, единственный случай, когда нужен аппаратный ~RDY - это режимы наивысших скоростей преобразования, дабы по прерыванию (а часто и с помощью DMA) автоматически заполнять буфер измерений, не отвлекая процессор. А разрешение и точность зависят прежде всего от установленной скорости преобразования и коэффициента усиления PGA, при этом безразлично, каким способом опрашивается АЦП.
Даташит в помощь:
To TC: всегда лучше использовать аппаратный узел (SPI, I2C, UART), если они есть, конечно.
Последний раз редактировалось varostov; 31.10.2016 в 18:08.
|
|
|
Сказали "Спасибо" varostov
|
|
|
31.10.2016, 18:55
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от varostov
|
To TC: всегда лучше использовать аппаратный узел (SPI, I2C, UART), если они есть, конечно.
|
Спасибо за совет, безусловно аппаратный, есть аппаратный! Но решил попробовать разобраться с программным SPI.
Godzilla82,
Спасибо!
Посмотрите пожалуйста, код в котором вроде как учтены временные рамки рекомендованные в даташите и режим работы SPI:
Код:
|
void spi_putchar(unsigned char c)
{
unsigned char i;
delay_us(10);
PORTB &= ~(1 ‹‹ SPI_CS);
for(i=8; i; i--)
{
PORTB &= ~(1 ‹‹ SPI_SCLK);
delay_us(100);
if(c & 0x80) PORTB |= (1 ‹‹ SPI_DOUT);
else PORTB &= ~(1 ‹‹ SPI_DOUT);
PORTB |= (1 ‹‹ SPI_SCLK);
delay_us(100);
c ‹‹= 1;
}
PORTB |= (1 ‹‹ SPI_CS);
} |
Спасибо!
|
|
|
|
31.10.2016, 21:21
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Изменил код, посмотрите пожалуйста, может вот так правильнее?
Код:
|
void spi_putchar(unsigned char c)
{
unsigned char i;
delay_us(10);
PORTB &= ~(1 ‹‹ SPI_CS);
for(i=8; i; i--)
{
PORTB &= ~(1 ‹‹ SPI_SCLK);
if(c & 0x80) PORTB |= (1 ‹‹ SPI_DOUT);
else PORTB &= ~(1 ‹‹ SPI_DOUT);
delay_us(100);
PORTB |= (1 ‹‹ SPI_SCLK);
delay_us(100);
c ‹‹= 1;
}
PORTB |= (1 ‹‹ SPI_CS);
} |
Спасибо!
Последний раз редактировалось Mr.Denis; 31.10.2016 в 21:30.
|
|
|
|
31.10.2016, 21:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
Обычно по фронту CLK происходит считывание данных (кстати, по какому?). То есть, менять состояние CLK надо после установки данных.
Задержка после спада CS не нужна.
В вашем варианте без передачи данных линия CLK находится в 1. Это правильно?
В даташите максимальная частота SPI 5 Мгц. При задержках 100 мкс частота получается 5 кГц.
Последний раз редактировалось Godzilla82; 31.10.2016 в 21:49.
|
|
|
|
31.10.2016, 21:53
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Godzilla82
|
Обычно по фронту CLK происходит считывание данных (кстати, по какому?)
|
Вот что нашел на просторах интернета (Не реклама!): http://avr.ru/ready/signal/dacnadc/ad7799
Сообщение от Godzilla82
|
При задержках 100 мкс частота получается 5 кГц.
|
100 мкс, тоже взял из даташита. Если я правильно понял, то 100 это минимальная ширина импульса который должен быть. Это написано на 6 странице.
Сообщение от Godzilla82
|
В вашем варианте без передачи данных линия CLK находится в 1. Это правильно?
|
Если режим работы SPI MODE 3, то теоретически правильно.
З.Ы. Сталкиваюсь с SPI, и тем более программным в первые.
Спасибо!
|
|
|
|
31.10.2016, 22:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Вот что нашел на просторах интернета
|
Ну это только самому проверять.
Сообщение от Mr.Denis
|
100 это минимальная ширина импульса
|
Между мкс и нс - разница три порядка.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
01.11.2016, 00:40
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Godzilla82
|
В даташите максимальная частота SPI 5 Мгц. При задержках 100 мкс частота получается 5 кГц.
|
Вы этот вывод сделали из значения минимальной ширины импульса равной в 100 нс, или нашли где написанно?
Сообщение от Godzilla82
|
Ну это только самому проверять.
|
Буду пробывать, железа пока нет, но думаю в ближайшее время появится, а пока буду пробывать теорию понять.
Сообщение от Godzilla82
|
Между мкс и нс - разница три порядка.
|
Вот это я и проморгал, спасибо огромное за то, что открыли глаза!)
Завтра попробую написать функцию приема данных.
Спасибо!
|
|
|
|
01.11.2016, 16:59
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Здравствуйте!
Написал функцию приема данных. Посмотрите пожалуйста:
Код:
|
unsigned char spi_read(void)
{
unsigned char i, data=0;
for(i=0; i‹8; i++)
{
data ‹‹= 1;
PORTB &= ~(1 ‹‹ SPI_SCLK);
if (PINB4 == 1) { data |= 0x01;}
delayMicroseconds(10);
PORTB |= (1 ‹‹ SPI_SCLK);
delayMicroseconds(10);
}
return data;
} |
Это похоже на правду?
Спасибо!
|
|
|
|
01.11.2016, 17:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,072
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Это похоже на правду?
|
Не совсем.
Код:
|
unsigned char spi_read(void)
{
unsigned char i, data=0;
for(i=0; i‹8; i++)
{
data ‹‹= 1;
PORTB &= ~(1 ‹‹ SPI_SCLK);
if (PINB4 == 1) { data |= 0x01;} // Перенести собственно чтение отсюда...
delayMicroseconds(10);
PORTB |= (1 ‹‹ SPI_SCLK);
if (PINB4 == 1) { data |= 0x01;} // ... вот сюда.
delayMicroseconds(10); // Ну и обе задержки - совершенно конские
}
return data;
} |
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
01.11.2016, 17:54
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
ForcePoint,
Спасибо!
To ALL,
Получается 2 функции:
Запись
Код:
|
void spi_write(unsigned char c)
{
unsigned char i;
for(i=8; i; i--)
{
PORTB &= ~(1 ‹‹ SPI_SCLK);
delayMicroseconds(2);
if(c & 0x80) PORTB |= (1 ‹‹ SPI_DOUT);
else PORTB &= ~(1 ‹‹ SPI_DOUT);
PORTB |= (1 ‹‹ SPI_SCLK);
delayMicroseconds(2);
c ‹‹= 1;
}
} |
Чтение
Код:
|
unsigned char spi_read(void)
{
unsigned char i, data=0;
for(i=0; i‹8; i++)
{
data ‹‹= 1;
PORTB &= ~(1 ‹‹ SPI_SCLK);
delayMicroseconds(2);
PORTB |= (1 ‹‹ SPI_SCLK);
if (PINB4 == 1) { data |= 0x01;}
delayMicroseconds(2);
}
return data;
} |
И работаю я сними так:
Код:
|
// Передать 8-bit
PORTB &= ~(1 ‹‹ SPI_CS);
spi_write(0x80);
PORTB |= (1 ‹‹ SPI_CS);
// Передать 16-bit
PORTB &= ~(1 ‹‹ SPI_CS);
spi_write(0x80);
spi_write(0x80);
PORTB |= (1 ‹‹ SPI_CS);
//Читать 8-bit в переменную data
PORTB &= ~(1 ‹‹ SPI_CS);
unsigned char data;
data = spi_read();
PORTB |= (1 ‹‹ SPI_CS);
//Читать 16-bit в переменную data
PORTB &= ~(1 ‹‹ SPI_CS);
unsigned short int data;
unsigned char lowbyte, highbyte;
lowbyte = spi_read();
highbyte = spi_read();
data = lowbyte + highbyte;
PORTB |= (1 ‹‹ SPI_CS); |
Подскажите пожалуйста правильно я понимаю?
P/S. Проверить не могу, железа нет пока еще.
Спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:07.
|
|