Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26

LazerTAG. Связь нескольких МК по SPI

20.09.2013, 00:34. Показов 6311. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый.

упрощенно задача выглядит следующе
есть 3 микроконтролла, например ATMega8
их нужно соединить для передачи "слов" последовательно
1=>2=>3, то есть на прямую с 1 на 3 передать нельзя, только через 2!

для передачи данных взял протокол SPI, вроде все логично закодил, но наверное чего то напутал с регистрами
MK1 (мастер):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <mega8.h>
#include <delay.h>
#include <stdlib.h>
 
// SPI functions
#include <spi.h>
 
// Declare your global variables here
 
void main(void)
{
// Declare your local variables here
 
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=1 State0=0
PORTB=0x02;
DDRB=0x2F;
 
PORTC=0x03;
DDRC=0x00;
 
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x52;
SPSR=0x00;
delay_ms(300); // ждем пока все подгрузятся
 
while (1){
    PORTB.2=0; //Переключаемся на ведомого 0
    
    spi((char)rand()%256);  //Отсылаем ему некую строку
     
    delay_ms(100); //ждем
    spi((char)0);  //Отсылаем ему 0, чтобы он выключил светодиод
    delay_ms(100); //ждем
    PORTB.2=1; //Делаем ведомого 0 не активным
}
 
}

MK2
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <mega8.h>
#include <spi.h>
 
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
    unsigned char data;
   
    data=SPDR;    //читаем приходящие байты
    PORTD = data;
    
    // SPI config send
    SPCR=0x52;
    SPSR=0x00;
 
    
 
    PORTB.7=0; //Переключаемся на ведомого 0    
    spi(data); // срем
    PORTB.7=1; //Делаем ведомого 0 не активным                 
    
    // SPI config get
    SPCR=0xC2;
    SPSR=0x00;
    
      
    
 
}
 
// Declare your global variables here
 
void main(void)
{
// Declare your local variables here
 
// Input/Output Ports initialization
// Port B initialization
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
// Func7=out Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In 
PORTB=0x00;
DDRB=0x90;
 
 
PORTD=0x00;
DDRD=0xFF;
 
// SPI initialization
// SPI Type: Slave
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xC2;
SPSR=0x00;
 
// Clear the SPI interrupt flag
/*
#asm
in   r30,spsr
in   r30,spdr
#endasm
*/
 
// Global enable interrupts
#asm("sei")
 
while (1)
      {
      // Place your code here
 
      }
}


MK3
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <mega8.h>
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
    unsigned char data;
   
    data=SPDR;    //читаем приходящие байты
    PORTD = data;
    /*
    
    if(data=='1') //если пришла 1, включить светодиод
    {
        PORTD=0xFF;
    }
    if(data=='0') //если пришел 0, выключить светодиод
    {
        PORTD=0x00;
    } 
    */
}
 
// Declare your global variables here
 
void main(void)
{
// Declare your local variables here
 
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x10;
 
PORTD=0x00;
DDRD=0xFF;
 
// SPI initialization
// SPI Type: Slave
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xC2;
SPSR=0x00;
 
// Clear the SPI interrupt flag
/*
#asm
in   r30,spsr
in   r30,spdr
#endasm
*/
 
// Global enable interrupts
#asm("sei")
 
while (1)
      {
      // Place your code here
 
      }
}


судя из результата в протеусе, данные с МК1 поступают на МК2 (выводятся на порт D) но как их теперь передать на МК3, непонятно в чем баг.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2013, 00:34
Ответы с готовыми решениями:

Связь AD7714 по SPI
Прошу помощи, пытаюсь связаться с ad7714 по spi и получается непонятная ситуация: 1. На ноге drdy всегда находится логический ноль(а...

Связь двух контроллеров по SPI.
у меня есть драйвер на Miko168. мне понадобилось связать две платы вместе. из свободных имеющихся интерфейсов есть только SPI. думаю...

Связь по SPI с низковольтным АЦП
Здравствуй форум! Такая проблема: контроллер и АЦП должны общаться по интерфейсу SPI. Но, контроллер имеет питание 5 В, а АЦП включено...

33
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 09:57  [ТС]
как то все смотрят, смотрят, но походу никто не в курсе.

в продолжение темы, на протеусе мне удалось это дело таки запустить поменяв местами 2 строчки в прошивке МК2 (при этом оно не должно было работать, но в эмуляторе заработало)
C
1
2
3
4
    
PORTB.7=1; //Делаем ведомого 0 не активным                 
spi(data); // срем
PORTB.7=0; //Переключаемся на ведомого 0
то есть активируем не 0, а 1 (хотя по документации всегда 0)

но понаблюдав за схемой, я понял что для моих задач этот протокол не перспективен (не зря везде пишут что мастер в системе только 1), так как в случае одновременной передачи с нескольких контролов поймать ошибку не получится,

будем разбираться с I2S
0
20.09.2013, 13:55

Не по теме:

...насчет перспектив, зачем вам городить на плате 3 МК? Одним ваши дела не сделаются? Причины: ножек мало, мощности? Это все решаемо гораздо проще организации связи по SPI, ПЛИС ставим и забываем. SPI выгоден при навесных платах над базовой - связи с индикаторами, модулем ввода-вывода.

Если они удаленно все, так тем паче SPI для этих целей не гоже. RS-485/422 пользуйте с модбасом, также возможен и мультимастер-режим. И экономия проводов к тому же на гораздо большую дальность при высокой помехозащищенности.

0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 14:50  [ТС]
raxp, вопрос по теме, тут скорее моя ошибка я не вкурил всех особенностей/возможностей SPI

опишу задачку детальней:
будет несколько блоков, каждый из которых будет заниматься приемом,расшифровкой ИК сигнала и передачей далее данных
то есть в теории на каждый такой блок нужен МК со свето датчиокм+...
изначально я думал сделать "последовательное" соединение контролов,
при котором МК поймавший сигнал передавал бы его следующему контролу, и так до тех пор пока не дойдем до главного обработчика, но понаблюдав понял что так как шина единая, и велика вероятность приема сигнала на несколько датчиков одновременно, то очень вероятен сбой передачи данных. подумал о смене протокола на I2S, но я при его разборе, так и не понял, передача там идет по внешнему прерыванию, или контрол постоянно мониторит шину.

потом прикинул, а ведь по SPI передача возможно в 2 направления, тоесть возможна ситуация когда некий мастер будет опрашивать все датчики, а уже потом сбрасывать эти данные на главный обработчик.

если есть пример кода в котором указано как настроить Slave на передачу данных на мастера, был бы благодарен
+ интересно ATMega8 поддерживает только стандартную распиновку MSIO-MSIO, MOSI-MOSI, или возможна последовательная распиновка при которой мастер подает одновременный сигнал на всем клиентам на SS а те в свою очередь передают данные друг другу, при этом распиновка MSIO-MOSI

п.с. уважуха дочитавшим))
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 15:16
http://www.atmega8.ru/wiki/view/doc.26.html

будет несколько блоков, каждый из которых будет заниматься приемом,расшифровкой ИК сигнала и передачей далее данных
то есть в теории на каждый такой блок нужен МК со свето датчиокм+...
ретрансляция ИК с пульта в другую комнату? Зачем? Это решается тоже иными способами. Опишите полнее задачу.
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 15:33  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Опишите полнее задачу.
хочу сделать оборудование для ЛазерТага
коммерческие изделие по цене очень кусаются. а задача внешне решаема.

Добавлено через 14 минут
Цитата Сообщение от raxp Посмотреть сообщение
http://www.atmega8.ru/wiki/view/doc.26.html
там в примере при отправке данных происходит насколько я понял ожидание окончания передачи, с последующим возвратом записанного внешнему обработчики (для проверки), а вот зачем при получении сначало регистр забивается 1-цами, а потом читаются данные не понятно, это для чистоты данных?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 16:40
ЛазерТага
так, и зачем тут несколько МК, что мешает датчики подключить к одному? Да и такое количество проводов в динамичной по сути игре крайне ненадежно.
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 16:55  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
так, и зачем тут несколько МК, что мешает датчики подключить к одному? Да и такое количество проводов в динамичной по сути игре крайне ненадежно.
все просто, как опрашивать 1м котролом 1 датчик а потом данные передавать во вне я могу закодить, а вот как 1м контролом снимать показания с нескольких датчиков я не знаю

по поводу количества проводов, имхо от того что это будет 1 МК но с тем же количеством фотодатчиков шлейфов меньше не станет

минусом моей идеи является относительно высокое энергопотребление, но на начальном этапе надо это заставить работать, а уже потом заниматься оптимизацией (когда руки заточатся)
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 17:07
Т.е. как не знаете, у вас фотодатчик - фотодиод/фототранзистор/фоторезистор/интегральный с встроенным фильтром, требующим питания? Подключен к одному из портов, работаем как с дискретным входом. Что мешает остальные датчики подключить к оставшимся пинам порта и считывать? Ничего не мешает.

по поводу количества проводов, имхо от того что это будет 1 МК но с тем же количеством фотодатчиков шлейфов меньше не станет
фотодатчику нужно два провода, всего. А тянуть сеть из четырех проводов плюс питание к каждому блоку меньше что-ли?
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 17:26  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Подключен к одному из портов, работаем как с дискретным входом.
может я чего то не догоняю, но излучатель подает цифровой сигнал, в котором закодированы данные о силе оружия, игроке, ......
если датчики будет подключены к пинам, то мне придется кодить анализатор для каждого пина, что с родни разработке "велосипеда" протокола. не очень хочется.
или тут используется уже что то стандартное?

Добавлено через 9 минут
я тут про UART дочитался, тоесть насколько я Вас понял, передатчик по этому протоколу передает данные, приемник их ловит, но вот тут тот же вопрос, как настроить прием на несколько пинов,

или можно сильно не париться, и повесить весь прием фотодатчиков на 1 пин?!
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 17:51
может я чего то не догоняю, но излучатель подает цифровой сигнал, в котором закодированы данные о силе оружия, игроке, ......
если датчики будет подключены к пинам
а сейчас они куда подключены? Один на прерывание, второй на RX при задействовании UART. Логично бы все повесить на прерывание, но и обычный порт подойдет. А про велосипеды это вы зря.

как настроить прием на несколько пинов
взять МК с несколькими UART или программный UART http://chipenable.ru/index.php... a-ch1.html
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 20:58  [ТС]
а сейчас они куда подключены?
сейчас никуда.

идею в том что несколько датчиков в любой момент если и ловят сигнал то 1 и тот же, и возможно что без сильного сдвига по времени. а значит в теории их можно посылать на единый пин RX?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 21:09
...не совсем понятно, что вы имеете ввиду. В моем понимании, датчики расположены на разных топологически частях тела реципиента (голове там, спине, животу, мягкой части ) и засветка может прийти тоже с разных мест и в разное время, но ведь может и в одной точке и даже от разных противников. Как отличить, что "выстрел" пошел по спине, а не животу, если сигнал пойдет на один и тот же порт? Таки нужны разные.
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 21:30  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
и засветка может прийти тоже с разных мест и в разное время, но ведь может и в одной точке и даже от разных противников. Как отличить, что "выстрел" пошел по спине, а не животу, если сигнал пойдет на один и тот же порт? Таки нужны разные.
не совсем, обычно вешается 2-4 датчика на голову, и все, датчики на туловище вешаются только в очень дорогих комплектах, а с учетом размеров светового пятна от источника, датчиков на голове достаточно.
тоесть предположительно это 3 датчика насположенные по "экватору" головы)

и очень мало вероятно что в 1го человека в 1 миг будет более 1 попадания (надеюсь)).
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 21:37
...ну, на самом-то деле, если на голове несколько датчиков и попадание в любой из них считается за "попадание в голову", то их по сути можно параллелить, а значит для МК это будет один датчик и один порт. То, что могут прийти с разных засветок в голову разные сигналы в один момент времени является коллизией в этом случае.
1
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 22:00  [ТС]
raxp, может подскажите что гуглить если для ИК приемника например заюзать TSOP22..., то что можно для передатчика?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 22:20
...дык:
TSOP2230 30 kHZ
TSOP2233 33 kHZ
TSOP2236 36 kHZ
TSOP2237 36.7 kHZ
TSOP2238 38 kHZ
TSOP2240 40 kHZ
TSOP2256 56 kHZ
Cоответственно выбранному выбираем частоту несущей для модуляции.
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
20.09.2013, 22:29  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
TSOP2230 30 kHZ
TSOP2233 33 kHZ
TSOP2236 36 kHZ
TSOP2237 36.7 kHZ
TSOP2238 38 kHZ
TSOP2240 40 kHZ
TSOP2256 56 kHZ
это приемники, а мне передатчики, но уже нашел что обычно под них юзают TSAL....

вопрос, а можно ли при использовании aTMega8 обойтись ее штатным модулятором частоты, или все же стоит разориться и на кварц для модуляции ИК сигнала?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.09.2013, 22:45
Не модулятором, а внутренним RC-генератором. Cкорее стоит разориться.
0
1 / 1 / 0
Регистрация: 21.06.2013
Сообщений: 26
21.09.2013, 10:13  [ТС]
а может знаете, чем можно в протеусе эмулировать связку фотоизлучателя и фотодатчика (TSOP2256), для максимально близкой эмуляции
в протеусе нашел оптокупер или Оптрон (PC817) но это не полная эмуляция, так как в TSOP2256 фотодатчике вшита пачка встроенных микроэлементов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2013, 10:13
Помогаю со студенческими работами здесь

Связь ATTiny2313 с термодатчиком по SPI интерфейсу
Добрый вечер. Стоит задача, считывания данных температур с термодатчика по SPI интерфейсу. (термоатчик AD7814 и контроллер ATtiny2313,...

STM32F4-Discovery (Keil). Связь по USART и SPI
Доброго времени суток. Сразу скажу, что опыта в работе с МК не много и потому не бить сильно:) В данный момент на руках имеется...

Подскажите "секрет" подключения нескольких SPI устройств
Есть ли &quot;секрет&quot; подключения нескольких SPI устройств к контроллеру? Подключаю SD карту и дисплей LS020 по SPI - схема ниже. По...

SD Card в режиме SPI, проблема с записью нескольких блоков
Здравствуйте, коллеги. Помогите пожалуйста с проблемой. Имеется карта Kingston 8GB. Работаю в режиме SPI. Инициализация проходит...

Связь нескольких сущностей
Всем привет, нужна помощь, совет как лучше решить такую задачку.. Делаю с помощью Doctrine всё, если на примере этого подсказать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru