AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
29.10.2016, 12:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,049
Сказал спасибо: 3,040
Сказали Спасибо 3,209 раз(а) в 2,179 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Вот теперь думаю, смогут нормально существовать на одной SPI шине
|
Сигналы !CS (и т.п.) у ведомых ИМС в помощь. Не надо ничего разделять.
|
|
|
|
29.10.2016, 12:22
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
ForcePoint,
Подскажите пожалуйста, что такое ИМС?
Спасибо!
|
|
|
|
29.10.2016, 12:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,441
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Работа с AD7799
ИнтегральнаяМикроСхема
|
|
|
|
29.10.2016, 17:50
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Вот теперь думаю, смогут нормально существовать на одной SPI шине AD7799 и Wiznet W5500? Или лучше их разделить, AD7799 на программный, а Wiznet W5500 на аппаратный?
|
Не советую. Будут конфликты. А параллелить MISO и линию прерывания вообще плохая идея особенно если Вы хотите на SPI "повесить" еще что-то.
|
|
|
|
29.10.2016, 19:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,049
Сказал спасибо: 3,040
Сказали Спасибо 3,209 раз(а) в 2,179 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от AlexPi
|
Не советую. Будут конфликты. А параллелить MISO и линию прерывания вообще плохая идея особенно если Вы хотите на SPI "повесить" еще что-то.
|
На вкус и цвет, конечно, но... "Она полквартала удовлетворяет, а его нет!?"
Upd: Без хитровыкрученного прерывания, конечно, но ADS7841 (MAX1247) + DAC7611 + AT45DB на шине SPI у ATmega162 жили хорошо и дружно. Причём 45-я при 3.3 вольта, а остальные при 5 вольт.
Последний раз редактировалось ForcePoint; 29.10.2016 в 19:44.
|
|
|
|
29.10.2016, 23:39
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Re: Работа с AD7799
Я, честно говоря, не пойму, зачем из-за АППАРАТНОГО выхода готовности преобразования копья ломать? Неужели ТС попросил помочь "выжать" по-максимуму заявленные 470 SPS? В большинстве случаев (при частоте опроса АЦП 1-100 Гц) вполне достаточно СОФТОВО опросить бит готовности данных по интерфейсу, тем более, что чаще всего после съёма данных следует переключение на следующий канал, что и так не позволит развить макс. скорострельность. Не стоит также забывать, что макс. точность и макс. подавление помех 50/60 Гц обеспечиваются на битрейте 4,7-10 SPS. Так что спокойно можно объединять на одной шине "коня и трепетную лань" с помощью CS.
P.S. А вот отслеживание аппаратного выхода ~RDY требует постоянно опущенного в "0" сигнала CS_ADC, что чаще всего мешает вешать на шину другие АЦП&other
Последний раз редактировалось varostov; 29.10.2016 в 23:47.
|
|
|
|
30.10.2016, 22:17
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от varostov
|
P.S. А вот отслеживание аппаратного выхода ~RDY требует постоянно опущенного в "0" сигнала CS_ADC, что чаще всего мешает вешать на шину другие АЦП&other
|
Так вот и я о том же. А делать это придется для достижения максимального разрешения АЦП. В задаче ТС на сколько я понял важно именно разрешение и точность. Любые довески параллельно АЦП будут мешать. Проверенно на личном опыте и не только моем.
|
|
|
|
30.10.2016, 22:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,049
Сказал спасибо: 3,040
Сказали Спасибо 3,209 раз(а) в 2,179 сообщении(ях)
|
Re: Работа с AD7799
Глядя по диагонали на datasheet - действительно можно читать флаг готовности через регистр состояния АЦП. Таким образом вопрос переводится в плоскость "насколько быстро ТС желает раскочегарить АЦП", о чем упомянул уже varostov.
Сообщение от AlexPi
|
А делать это придется для достижения максимального разрешения АЦП. В задаче ТС на сколько я понял важно именно разрешение и точность.
|
Имеется в виду временн ое разрешение?
|
|
|
|
31.10.2016, 14:35
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Здравствуйте!
Решил попробовать реализовать программный SPI, только вот не все мне очевидно в этом вопросе.
Вот набросал:
1. Настройка портов, тут думаю проблем нет.
Код:
|
// Распиновка программного SPI МК AtMega328p.
#define SPI_SCLK 5 // PB5(Нога 19)
#define SPI_DIN 4 // PB4(Нога 18)
#define SPI_DOUT 3 // PB3(Нога 17)
#define SPI_CS 2 // PB2(Нога 16)
//Конфигурация портов//
// SPI_DOUT, SPI_SCLK, SPI_CS - Выходы
// SPI_DIN - Вход
DDRB |= (1‹‹ SPI_DOUT)|(1‹‹ SPI_SCLK)|(1‹‹ SPI_CS)|(0‹‹ SPI_DIN);
// SPI_DOUT, SPI_SCLK, SPI_CS - Формируем сигнал высокого уровня
// SPI_DIN - Включаем внутренью подтяжку на порт PB4(Нога 18)
PORTB |= (1‹‹ SPI_DOUT)|(1‹‹ SPI_SCLK)|(1‹‹ SPI_CS)|(1‹‹ SPI_DIN); |
2. Функция передачи 1 бита, тут куча проблем.
Код:
|
void SPI_Soft_Write(char byte){
for (char i=0; i‹8; i++) {
if (byte & 0x80) // Старший бит вперед
{
PORTB |= (1‹‹ SPI_DIN);
}
else
{
PORTB &= (1‹‹ SPI_DIN);
}
byte ‹‹= 1;
}
} |
Я так понимаю что, в функции SPI_Soft_Write еще надо как то управлять линией SCLK и при этом соблюсти тайминги и режим?
Спасибо!
Последний раз редактировалось Mr.Denis; 31.10.2016 в 14:39.
|
|
|
|
31.10.2016, 16:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
В зависимости от режима SPI (один из вариантов):
PHP код:
|
void spi_putchar(unsigned char c) { unsigned char i; SPI_PORT &= ~SPI_CS; delay_us(1); for(i=8; i; i--) { SPI_PORT |= SPI_CLK; delay_us(10); if(c & 0x80) SPI_PORT |= SPI_OUT; else SPI_PORT &= ~SPI_OUT; SPI_PORT &= ~SPI_CLK; delay_us(10); c ‹‹= 1; } SPI_PORT |= SPI_CS; }
|
Писал от руки, возможны ошибки.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:14.
|
|