Однопроводный интерфейс.

Передача переменных по одному проводу.

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Однопроводный интерфейс.

#21

Сообщение seri0shka » 22.01.2019{, 13:57}

Навеяно постом №18_Помогите реализовать частотомер на arduino
Кто-то может ответить (у меня в этом направлении опыта нет): Возможно ли измерить подряд длительность 64 импульсов, по результатам сформировать 64 булевых переменных? Уже спрашивал выше, ответа нет. Если б такая возможность была, то дальше путём нехитрых действий получили бы желаемый результат.

Отправлено спустя 1 минуту 25 секунд:
Fuji1604, спасибо за информацию для размышлений.

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Однопроводный интерфейс.

#22

Сообщение seri0shka » 03.02.2019{, 14:45}

Нашёл то, что искал: Блок приема-передачи данных по протоколу 2262 и 1527
Скорость передачи чуть меньше желаемой, но путём редактирования блоков удалось увеличить в 5 раз.
Теперь вырисовалась проблема: Есть 2 вида блоков- с использованием библиотеки TimerOne, и с использованием библиотеки RCSwitch.
С первой всё работает отлично на ардуино, но при попытке скомпилировать на Атмегу8 выдаёт ошибку
СпойлерПоказать

Код: Выделить всё

Arduino: 1.8.0 (Windows 7), Плата:"ATmega8, 2.7v, Disabled (default), 16 MHz external"

Изменены опции сборки, пересобираем все
c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp: In member function 'void TimerOne::attachInterrupt(void (*)(), long int)':

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:117:3: error: 'TIMSK1' was not declared in this scope

   TIMSK1 = _BV(TOIE1);                                     // sets the timer overflow interrupt enable bit

   ^

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp: In member function 'void TimerOne::detachInterrupt()':

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:125:3: error: 'TIMSK1' was not declared in this scope

   TIMSK1 &= ~_BV(TOIE1);                                   // clears the timer overflow interrupt enable bit 

   ^

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp: In member function 'void TimerOne::start()':

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:143:3: error: 'TIMSK1' was not declared in this scope

   TIMSK1 &= ~_BV(TOIE1);        // AR added 

   ^

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:144:3: error: 'GTCCR' was not declared in this scope

   GTCCR |= _BV(PSRSYNC);     // AR added - reset prescaler (NB: shared with all 16 bit timers);

   ^

In file included from c:\users\администратор\desktop\arduino flprog\---------flprog---------\flprog_2-3-2\flprog\idev1\hardware\tools\avr\avr\include\avr\io.h:99:0,

                 from c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.h:39,

                 from c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:39:

c:\Users\Администратор\Desktop\ARDUINO FLProg\---------FLProg---------\FLProg_2-3-2\FLProg\ideV1\libraries\TimerOne\TimerOne.cpp:144:16: error: 'PSRSYNC' was not declared in this scope

   GTCCR |= _BV(PSRSYNC);     // AR added - reset prescaler (NB: shared with all 16 bit timers);

                ^

exit status 1
Ошибка компиляции для платы ATmega8.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Со второй библиотекой блоки приёма не работают у меня (проверял с двумя ардуинами, отправка работает, компилируется и для Атмеги8 в том числе).

Кто подскажет решение одной или другой проблемы?
Спасибо Boroda за отличные блоки! :smile9:

seri0shka
Лейтенант
Сообщения: 391
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 22
Откуда: Кременчуг
Имя: Сергей

Однопроводный интерфейс.

#23

Сообщение seri0shka » 05.02.2019{, 22:16}

СпойлерПоказать
protokol-2262-1527-Test_2262_1527_TX-02.flp
(63.99 КБ) 47 скачиваний
protokol-2262-1527-Test_2262_1527_Rx-02.flp
(111.14 КБ) 58 скачиваний
На основе блоков от Boroda из предыдущего поста сделал блок отправки переменной и получения переменной. Скорость примерно в 10 раз больше, чем у исходных блоков, также убран служебный бит, блоки не совместимы с протоколом 2262. Позволяют передавать переменную в 24 бита от одной Ардуины к другой, ошибок нет даже при значительном отклонении частоты, можно использовать внутреннее тактирование (без кварца).
В экспериментальных блоках:
В передающем пока жёсткая привязка к пину 13, так как используются конструкции типа PORTB|=_BV(PB5) и PORTB &=~_BV(PB5) для увеличения скорости, но в принципе можно использовать ЛЮБОЙ цифровой выход. Подаваемое на вход число ULong не более 16777215 (24 бит единиц), так же легко можно увеличить до 32 бит редактированием обоих блоков.
В приёмном блоке используется пин 2 или пин 3 (в настройках блока), так как задействованы аппаратные прерывания.
Прикладываю два проекта для опытов- в одну ардуину загружаете ...TX-02 (непрерывная передача заданной переменной с пина 13), в другую ...Rx-02 (приём на пин 2, при правильных данных светится светик на 13 пине, полученную переменную пересылает в КОМпорт на скорости 38400 для наглядности). Ну и пин 13 от передающей соединяете с пином 2 принимающей.
Хотелось бы ещё модифицировать блоки для возможности менять передающий пин и количество передаваемых бит, а в идеале чтоб на входы передающего подавалось и с выходов принимающего снималось произвольное количество байт, с передающим у меня получается, с приёмным сам не могу. Технически без ошибок возможна передача десятка байт за одну передачу, но при нынешней реализации максимум 4 байта (ULong). Время посылки 200 мкс*количество бит (сейчас 200*24=4800 мкс=4,8 мс). То есть без проблем можно обновлять данные больше 100 раз в секунду. Sancho, посмотрите, пожалуйста.
СпойлерПоказать
Изображение
Прошу протестировать и высказать своё мнение. Очень хотелось бы увидеть циклограмму передачи с таймингами, может кто снимет анализатором?
И, кстати, может кто подскажет по проблемам, упомянутым в предыдущем посте?

Ответить

Вернуться в «Помогите, а то я "нимагу"»