AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.11.2016, 10:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,049
Сказал спасибо: 3,040
Сказали Спасибо 3,209 раз(а) в 2,179 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Вы предполагаете что после каждого сброса CS все настройки АЦП обнуляются?
|
Документацию на АЦП я только просматривал, а не читал. Для первого раза - надо будет все команды произвести в одном цикле CS. Потом - достаточно опрашивать статус и читать данные. Содержимое всех управляющих регистров должно сохраняться, иначе - глупость получается.
Сообщение от Mr.Denis
|
Вы могли бы мне рассказать почему именно data = lowbyte + (highbyte ‹‹ 8 )?
Если я правильно понимаю, то операция highbyte ‹‹ 8 приведет к тому что highbyte=0?
|
Это сдвиг содержимого highbyte на 8 разрядов влево (или - умножение на 256). Таким образом значение highbyte попадёт в старшие биты data.
|
|
|
|
04.11.2016, 11:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от ForcePoint
|
Для первого раза - надо будет все команды произвести в одном цикле CS.
|
Все команды, относящиеся к одной элементарной операции (кроме режима непрерывного чтения):
1. CS = 0
2. запись регистра коммуникации
3. запись (чтение) выбранного регистра.
4. CS = 1
Сообщение от ForcePoint
|
Это сдвиг содержимого highbyte на 8 разрядов влево (или - умножение на 256). Таким образом значение highbyte попадёт в старшие биты data.
|
Ага, и результат нулем будет.
PHP код:
|
WORD = ((unsigned int)HIGH ‹‹ 8) + LOW;
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
04.11.2016, 11:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,441
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Работа с AD7799
При этой операции значение highbyte не изменяется. Просто оно сдвигается на 8 разрядов влево и записывается в старший байт 16 разрядного регистра.
Последний раз редактировалось baiderin; 16.11.2016 в 20:57.
Причина: ошибка в тексте
|
|
|
|
04.11.2016, 13:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от baiderin
|
оно сдвигается на 8 разрядов вправо и записывается в старший байт 16 разрядного регистра.
|
Оно сдвинется и станет 0. А потом уже запишется в старший байт.
|
|
|
|
04.11.2016, 13:40
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,087
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от baiderin
|
При этой операции значение highbyte неизменяется. Прсто оно сдвигается на 8 разрядов
|
Какая разрядность переменной? 8 бит? Если содержимое сдвинуть на 8 В ЛЮБУЮ сторону, что останется? Вам не кажется, что перед сдвигом надо добавить разрядов?
Вот только про дефолты не надо. У кого они работают, а у кого и нет. У одного так, у другого иначе. Работу с переменными надо проводить явно, без надежды на добрый компилятор.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 04.11.2016 в 13:43.
|
|
|
|
07.11.2016, 15:09
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Здравствуйте!
Вот до сих пор думаю, как лучше проверять готовность данных, считывать в регистре состояния бит RDY или же ногу DOUT/RDY параллельно завести на внешние прерывание? Вроде как с ногой DOUT/RDY более правильный вариант, но смущает что это одна нога, и как я понял CS всегда должен быть опущен. Хотя с другой стороны нет проблем опустить CS и ждать прерывания, так как у меня кроме AD7799 больше нету устройств на SPI.
Еще нашел немного информации о том, что обязательно нужно делать программную фильтрацию. Вроде как рекомендуют фильтр скользящего среднего. Вот возник вопрос, если я без фильтра хочу выводить результаты АЦП 4 раза в 1 секунду, то я должен выбрать скорость измерения 4,17 Гц? Если я хочу такую же скорость с фильтром, то тогда получается что нужно чаще производить измерения?
P.S. Жалко что железа пока нет, поэкспериментировать не на чем...(
Спасибо!
|
|
|
|
07.11.2016, 16:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Вот до сих пор думаю, как лучше проверять готовность данных
|
Да хоть опросом соответствующего регистра. При частоте SPI 250 кГц время опроса составит около 64 мкс.
Зато получите чистый SPI, без сюрпризов.
Можно и просто состояние ноги опрашивать. Прерывание я бы не стал делать. Лишнее усложнение программы.
Сообщение от Mr.Denis
|
если я без фильтра хочу выводить результаты АЦП 4 раза в 1 секунду, то я должен выбрать скорость измерения 4,17 Гц?
|
Для лучшей точности - да, 4,17 Гц. А так, опрашивать можно хоть с частотой 470 Гц.
Сообщение от Mr.Denis
|
Если я хочу такую же скорость с фильтром, то тогда получается что нужно чаще производить измерения?
|
Нет. Просто у вас в отдельной переменной будет храниться среднее от последних 4 измерений. Вы его можете опрашивать хоть с частотой 1000 Гц, меняться оно будет всё равно с частотой 4,17 Гц.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
07.11.2016, 16:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,049
Сказал спасибо: 3,040
Сказали Спасибо 3,209 раз(а) в 2,179 сообщении(ях)
|
Re: Работа с AD7799
Сообщение от Mr.Denis
|
Хотя с другой стороны нет проблем опустить CS и ждать прерывания, так как у меня кроме AD7799 больше нету устройств на SPI.
|
Уже-ж писали, что для контроля RDY надо держать CS в нуле. Так-что - что в лоб, что по лбу.
|
|
|
|
14.11.2016, 21:49
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Здравствуйте!
Купил железо, собрал плату.)
Через аппаратный SPI пытаюсь считать регистр идентификатора.
Код:
|
PORTB &= ~(1 ‹‹ SPI_CS);
spi_write(0x60);
Serial.println(spi_read()); // Serial.println(), функция Arduino Вывода в UART.
PORTB |= (1 ‹‹ SPI_CS); |
В общем выводит он мне по очереди 0x49 0x00 0x49 0x00 0x49 0x00 0x49 0x00 .... Подскажите пожалуйста какой он мне должен возвращать идентификатор? Если я правильно понял, то для AD7799 это 0xX9, но не совсем понятно что такое X, может быть это любое число?
Спасибо!
|
|
|
|
16.11.2016, 17:08
|
|
Временная регистрация
Регистрация: 24.08.2010
Сообщений: 74
Сказал спасибо: 41
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Работа с AD7799
Здравствуйте!
Помогите пожалуйста разобраться с чтением и данных, делаю вот так:
PHP код:
|
void main(void){
// Сбрасываю SPI AD7799
PORTB &= ~(1‹‹SPI_CS);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
PORTB |= (1‹‹SPI_CS);
//Настраиваю регистр MOD
PORTB &= ~(1‹‹SPI_CS);
SPI_WriteByte(0x08); // Выбираю запись в регистр MOD
SPI_WriteByte(0x00); // Выбираю "Режим непрерывного преобразования"
SPI_WriteByte(0x01); // Частота обновления 4,7Гц.
PORTB |= (1‹‹SPI_CS);
//Настраиваю регистр конфигурации
PORTB &= ~(1‹‹SPI_CS);
SPI_WriteByte(0x10); // Выбираю запись в регистр конфигурации
SPI_WriteByte(0x07); // Выбираю гейн 128,
SPI_WriteByte(0x01); // Выбираю 2 канал для отслеживания
PORTB |= (1‹‹SPI_CS);
while(1){
// Переменная для 24-bit значения
unsigned long result =0;
PORTB &= ~(1‹‹SPI_CS);
// Считываем регистр состояния
SPI_WriteByte(0x40);
// Проверяем бит RDY готовности данных
if(!(SPI_Read() & 0x80)){
// Читаем регистр дата
SPI_WriteByte(0x58);
// Считываем первые 8 бит и записываем в переменную
unsigned char a = SPI_Read();
// Считываем вторые 8 бит и записываем в переменную
SPI_WriteByte(0x00);
unsigned char b = SPI_Read();
// Считываем третие 8 бит и записываем в переменную
SPI_WriteByte(0x00);
unsigned char c = SPI_Read();
// Собираем все в одну переменную
result = ((unsigned long) a ‹‹ 16) + ((unsigned int) b ‹‹ 8) + c;
}
PORTB |= (1‹‹SPI_CS);
}
|
Подскажите пожалуйста, правильно я делаю или нет?
Выводит непонятные данные(((
Спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:13.
|
|