Навеяно постом №18_Помогите реализовать частотомер на arduino
Кто-то может ответить (у меня в этом направлении опыта нет): Возможно ли измерить подряд длительность 64 импульсов, по результатам сформировать 64 булевых переменных? Уже спрашивал выше, ответа нет. Если б такая возможность была, то дальше путём нехитрых действий получили бы желаемый результат.
Отправлено спустя 1 минуту 25 секунд:
[ref]Fuji1604[/ref], спасибо за информацию для размышлений.
Однопроводный интерфейс.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Однопроводный интерфейс.
Нашёл то, что искал: Блок приема-передачи данных по протоколу 2262 и 1527
Скорость передачи чуть меньше желаемой, но путём редактирования блоков удалось увеличить в 5 раз.
Теперь вырисовалась проблема: Есть 2 вида блоков- с использованием библиотеки TimerOne, и с использованием библиотеки RCSwitch.
С первой всё работает отлично на ардуино, но при попытке скомпилировать на Атмегу8 выдаёт ошибку
[spoiler][/spoiler]
Со второй библиотекой блоки приёма не работают у меня (проверял с двумя ардуинами, отправка работает, компилируется и для Атмеги8 в том числе).
Кто подскажет решение одной или другой проблемы?
Спасибо [ref]Boroda[/ref] за отличные блоки!
Скорость передачи чуть меньше желаемой, но путём редактирования блоков удалось увеличить в 5 раз.
Теперь вырисовалась проблема: Есть 2 вида блоков- с использованием библиотеки TimerOne, и с использованием библиотеки RCSwitch.
С первой всё работает отлично на ардуино, но при попытке скомпилировать на Атмегу8 выдаёт ошибку
[spoiler]
Код: Выделить всё
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 в том числе).
Кто подскажет решение одной или другой проблемы?
Спасибо [ref]Boroda[/ref] за отличные блоки!

-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Однопроводный интерфейс.
[spoiler]
На основе блоков от 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 раз в секунду. [ref=#ff8000]Sancho[/ref], посмотрите, пожалуйста.[spoiler]
[/spoiler]
Прошу протестировать и высказать своё мнение. Очень хотелось бы увидеть циклограмму передачи с таймингами, может кто снимет анализатором?
И, кстати, может кто подскажет по проблемам, упомянутым в предыдущем посте?
[/spoiler]На основе блоков от 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 раз в секунду. [ref=#ff8000]Sancho[/ref], посмотрите, пожалуйста.[spoiler]
Прошу протестировать и высказать своё мнение. Очень хотелось бы увидеть циклограмму передачи с таймингами, может кто снимет анализатором?
И, кстати, может кто подскажет по проблемам, упомянутым в предыдущем посте?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость