Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры

Войти
Регистрация
Восстановить пароль
 
 
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
#1

Организация 8 параллельных SPI каналов приема данных - Микроконтроллер

26.03.2017, 13:03. Просмотров 468. Ответов 27

Добрый день.
У меня есть 8 гироскопов, подключаю их сейчас к Ардуино. Канал SPI там один. Из-за этого скорость опроса всех датчиков падает с возможных 3600 Гц до 3 Гц.
Хочу организовать 8 параллельных SPI каналов, возможно даже не на Ардуино, чтобы просто параллельно слушать все данные.
Заказал CAN контроллеры MCP2515-I/SO MCP2515 для Arduino MEGA 2560 пока, предполагаю, что раз там 4 канала UART, то с по помощью него число каналов можно увеличить до 4. Но где-то внутри понимаю, что это не совсем оптимально.

Подскажите пожалуйста, в каком направлении вообще стоит смотреть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2017, 13:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Организация 8 параллельных SPI каналов приема данных (Микроконтроллер):

Организация приема байт на PortB (ASM, ATMega16) - Atmega AVR микроконтроллер
Помогите пожалуйста с кодом. AVRStidio, Ассемблер. Задание Организовать прием семи байт данных в полудуплексном режиме с порта PORTB...

Фильтр приема данных - Микроконтроллер
Добрый день, к МК по UART подключено устройство от которого по запросу приходят следующего вида сообщения: #HEADER,<NUM>,<TYPE>\r\n ...

Подскажите алгоритм приема данных - Atmega AVR микроконтроллер
У меня есть небольшой радиомодуль который цифрует эфир и выдает серию ноликов и единичек. <Изображение удалено> Посылки короткие,...

SPI обновление данных - Atmega AVR микроконтроллер
Всем доброго времени суток.. Помогите разобраться Есть два мк (мега8), соединяются по интерфейсу spi Один мк (мастер) всё время...

ATmega128. Пересылка данных с USART в SPI - Atmega AVR микроконтроллер
Доброго времени суток, мне требуется реализовать пересылку символов с USART в SPI, на контроллере ATmega128. Кто может объясните как мне...

Помогите реализовать передачу данных по UART или SPI - Atmega AVR микроконтроллер
Доброго времени суток, обращаюсь к вам форумчане за помощью. Требуется передать число с переменной с одного мк на другой мк и записать его...

27
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 12:31  [ТС] #16
Цитата Сообщение от Витальич Посмотреть сообщение
правда я не смотрел время цикла измерения, но Вы пишите 3600 Гц, значит 3600/8 = 450 Гц
пока гироскоп не выбрать, он не работает получается? не понял расчета Гц.

Добавлено через 1 минуту
может проще программный SPI реализовать?
Вы с этим сталкивались?
0
Витальич
1232 / 1143 / 165
Регистрация: 02.12.2013
Сообщений: 4,724
27.03.2017, 12:55 #17
Программный на такое количество можно, но я бы не стал, лучше разобраться почему у Вас не работает это подключение. Я в четырех проводах часто ошибаюсь, обычно MOSI MISO путаю.
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
не понял расчета Гц.
откуда Вы взяли цифру 3600, я плясал от неё
0
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 12:58  [ТС] #18
Цитата Сообщение от Витальич Посмотреть сообщение
Программный на такое количество можно, но я бы не стал, лучше разобраться почему у Вас не работает это подключение. Я в четырех проводах часто ошибаюсь, обычно MOSI MISO путаю.
у меня данные совсем не идут, если я путаю их
Цитата Сообщение от Витальич Посмотреть сообщение
откуда Вы взяли цифру 3600
это из документации. я не про это число, а про рассчет, почему такая именно логика?
0
Витальич
1232 / 1143 / 165
Регистрация: 02.12.2013
Сообщений: 4,724
27.03.2017, 13:05 #19
Мы опрашиваем гироскопы последовательно, значит что бы опросить 8 гироскопов у нас это займет в восемь раз больше времени вот и поделил.
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
у меня данные совсем не идут, если я путаю их
начните с двух и что не идут данные? Тактирующий сигнал есть? Вы гироскоп данные идут?
0
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 13:21  [ТС] #20
Цитата Сообщение от Витальич Посмотреть сообщение
Мы опрашиваем гироскопы последовательно, значит что бы опросить 8 гироскопов у нас это займет в восемь раз больше времени вот и поделил.
Если не выключать канал SPI каждый раз, а переключать CS, то измерения гироскопы продолжат как я понял. просто не будут передавать данные. Или нет?

Цитата Сообщение от Витальич Посмотреть сообщение
Вы гироскоп данные идут?
данные идут корректно, меня скорость их получения не устраивает.
если я подключаю один гироскоп - все прекрасно.
если 2 и более - мне приходится сейчас включать-переподключать шину SPI под новый CS.
Это не правильно, но это сейчас работает лучше, чем иные идеи.

данные не идут, если перепутать MISO с MOSI и наоборот.
а так они прекрасно идут.

Добавлено через 3 минуты
расскажите про программный SPI пожалуйста
0
ValeryS
Модератор
6786 / 5194 / 497
Регистрация: 14.02.2011
Сообщений: 17,432
27.03.2017, 13:34 #21
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
мне приходится сейчас включать-переподключать шину SPI под новый CS.
а это зачем?
0
Витальич
1232 / 1143 / 165
Регистрация: 02.12.2013
Сообщений: 4,724
27.03.2017, 13:38 #22
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Или нет?
это надо читать документацию
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
мне приходится сейчас включать-переподключать шину SPI под новый CS
как Вы это делаете? не пойму откуда такая потеря в скорости?
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
расскажите про программный SPI пожалуйста
http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR320.htm
0
ValeryS
Модератор
6786 / 5194 / 497
Регистрация: 14.02.2011
Сообщений: 17,432
27.03.2017, 13:40 #23
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
расскажите про программный SPI пожалуйста
а че там рассказывать

вот псевдокод
Код
for(unsigned int i=0x80;i!=0;i>>=1)
{
delay();
CLK=1;
if(data&i)
 MOSI=1;
else
 MOSI=0;

delay();
CLK=0;

}
1
Voland_
1458 / 968 / 92
Регистрация: 04.01.2010
Сообщений: 3,153
27.03.2017, 18:52 #24
Заглянул я в скетч, подозреваю, что проблема в производительности. У вас же происходят вычисления с плавающей запятой, а они ппц какие ресурсоемкие на AVR. Так что предлагаю во-первых, проверить ваш код без float'ов, ограничившись просто чтением. А там уже будем посмотреть.
1
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 19:20  [ТС] #25
Цитата Сообщение от ValeryS Посмотреть сообщение
а это зачем?
потому что иначе инициализируется первый списке датчик и все данные с него идут (какой бы CS не выбрал позднее)

Цитата Сообщение от Витальич Посмотреть сообщение
как Вы это делаете? не пойму откуда такая потеря в скорости?
при каждом запуске канала датчик тратит 20 мс на старт

Цитата Сообщение от ValeryS Посмотреть сообщение
вот псевдокод
немного осмыслю и напишу
Цитата Сообщение от Voland_ Посмотреть сообщение
Заглянул я в скетч, подозреваю, что проблема в производительности
абсолютно верно

Цитата Сообщение от Voland_ Посмотреть сообщение
У вас же происходят вычисления с плавающей запятой, а они ппц какие ресурсоемкие на AVR. Так что предлагаю во-первых, проверить ваш код без float'ов,
в данном случае это не критично, проблема в организации канала, что на каждый датчик сейчас инициализирую шину SPI отдельно и закрываю.
Хочу один раз каждому датчику инициализировать свой канал, потом просто собирать данные.
Это делается при запуске один раз по хорошему, мне пришлось в цикл это вынести. отсюда и потери.
с float проблема очень легко решается, путем переноса только сырых данных и вычислениях уже на сервере.

Добавлено через 8 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
for(unsigned int i=0x80;i!=0;i>>=1)
Это мы собираем данные из регистра до тех пор пока не получили от канала синхронизации CLK - "0"?

Цитата Сообщение от ValeryS Посмотреть сообщение
delay();
CLK=1;
if(data&i)
MOSI=1;
else
MOSI=0;
delay();
Зачем delay в начале и в конце?

Цитата Сообщение от ValeryS Посмотреть сообщение
CLK=1;
if(data&i)
MOSI=1;
else
MOSI=0;
delay();
CLK=0;
Это мы разграничиваем такты синхронизации?

Цитата Сообщение от ValeryS Посмотреть сообщение
if(data&i)
Это если в канале есть данные?

Извините, если вопросы кажутся глупыми, я просто пытаюсь понять

Добавлено через 7 минут
с shiftIn() функцией кто-нибудь сталкивался в ардуино?
0
ValeryS
Модератор
6786 / 5194 / 497
Регистрация: 14.02.2011
Сообщений: 17,432
27.03.2017, 19:32 #26
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
потому что иначе инициализируется первый списке датчик и все данные с него идут (какой бы CS не выбрал позднее)
не может такого быть
CS Cristall Select Выбор кристалла, сиречь микросхемы
выбираешь первый кристалл инициализируешь
потом второй и т.д
только один раз в начале

а потом опрашиваешь их по очереди


Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Зачем delay в начале и в конце?
чтобы тактовая частота была похожа на меандр
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Это если в канале есть данные?
проверяем если бит равен 1 выставляем на ножке 1 если бит равен 0 выставляем 0
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Это мы собираем данные из регистра до тех пор пока не получили от канала синхронизации CLK - "0"?
нет проверяем байт побитово
1
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 19:38  [ТС] #27
Цитата Сообщение от ValeryS Посмотреть сообщение
не может такого быть
CS Cristall Select Выбор кристалла, сиречь микросхемы
выбираешь первый кристалл инициализируешь
потом второй и т.д
только один раз в начале
а потом опрашиваешь их по очереди
вы посеяли сомнения во мне, проверю еще раз.

надо осмыслить в начале, что Вы ответили по псевдокоду
0
kocmockocmoc
1 / 1 / 0
Регистрация: 07.12.2016
Сообщений: 31
30.03.2017, 18:53  [ТС] #28
Вы были правы.
Я все это время копался в библиотеке и datasheet к GY-BMI160 в поисках ответа: почему CS переключается неправильно?
Я нашел ответ: не знаю где именно, но существует зарезервированная переменная ss_spi_cs, которая одна единственная отвечает за текущий выбор, не давая больше никому.
Про неё я не нашел ровным счетом НИЧЕГО в интернете. Кроме пары ссылок на библиотеку в GitHub'e.
В Setup нужно все чипы инициализировать на одном и том же объекте BMI160.
В Loop'e потом просто менять значения в этой переменной.

прикладываю скетч и модифицированную библиотеку для тех, кто столкнется с подобной проблемой.
0
Вложения
Тип файла: rar multyplex_gyro.rar (1.2 Кб, 0 просмотров)
Тип файла: rar bibl.rar (8.5 Кб, 0 просмотров)
30.03.2017, 18:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2017, 18:53
Привет! Вот еще темы с ответами:

SPI -> 485->SPI - Микроконтроллер
Есть необходимость переводить SPI на 485 интерфейс. Хотел бы уточнить, драйвер 485 сажать напрямую к выводам SPI или через "что то"? Очень...

Организация параллельных процессов - Delphi
Мне нужно организовать 5 параллельных процессов, каждый длится от 1 до 5 секунд. И каждый процесс при запуске и при завершении выдает...

База данных с возможностью приема данных из файлов Excel - Delphi БД
Здравствуйте Уважаемые! В "Delphi для начинающих" по этому вопросу НИКТО не помог:( Может здесь я найду помощь? Подскажите, где...

Скрипт приема данных - PHP
Можно для примера,скрипт для приёма данных от программы. То есть залил например скрипт на хостинг ,с программы с делал пост запрос на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru