
В виду некоторого оживления интереса к моему сигнализатору поклевки, давно гуляющего на просторах интернета, (сначала ryba45, потом ryba13) , решил продолжить возню. Тем более, что давно хотел испытать на практике некоторые свои соображения по поводу выдуманного мною (а может он и существует, но я об этом не знаю) самосинхронизирующегося протокола радиоканала. Для использования под простейшие радиомодули.
Что в результате получилось?
Поскольку сигналом с UART промодулировать
несущую радиомодулей не является делом эффективным, приходится использовать
манчестероподобные методы кодирования. Но в них есть одно ограничение, которое
захотелось обойти. Заранее нужно знать, на какой скорости идет передача. Обошел это
так:
Каждый бит передается импульсом и паузой.
Длительность импульса и длительность паузы несут информацию о том, какой бит (0 или
1 или синхросигнал) передаются. Временной интервал передачи бита условно
поделен на 5 интервалов. Если 1 интервал импульс а 4 интервала пауза,
то передается синхроимпульс вида 0. Чтобы исключить постоянную составляющую во
время синхронизации, есть синхроимпульс вида 1, в котором все наоборот. 4 интервала
импульс и 1 интервал пауза.
Эти синхроимпульсы передаются поочередно. Сколько их нужно, чтобы приемник надежно вышел
на режим, нужно еще исследовать. Но в моем, несколько модифицированном
приемнике, собранном по подобию http://vrtp.ru/index.php?act=categories&CODE=article&article=1418 с (сверхрегенератор тот же)

надежный выход на режим уже через
несколько милисекунд. При небольших скоростях, от пары сотен до тысяч бит в секунду было
достаточно 4 таких синхросигналов. Последним синхроимпульсом перед началом
передачи собственно байта, я принял, что должен быть синхроимпульс вида 1. Назовем
его старт. Логическая единица байта передается импульсом
в 3 интервала, пауза 2 интервала. Логический ноль байта передается импульсом в 2
интервала, пауза 3 интервала. После передачи всего байта передается
синхроимпульс вида 0. Назовем его стоп. Прием байта считается удачным, если мы приняли
правильный старт, 8 правильных информационных бита и правильный стоп. Если
нет - байт бракуется и опять прием с самого начала. Правильный старт,...
Такой способ по моему не требовательный к
стабильности тактовых генераторов и передатчика и приемника. Причем нам совсем
необязательно знать, на какой скорости идет передача. Если соотношения
импульсов и пауз выдержаны и не было помехи, он примется правильно. Единственное,
что важно, чтобы таймер приемника во время приема самого длинного сигнала (паузы
или импульса) не переполнился. И чтобы при приеме самого короткого сигнала он
успел насчитать хотя бы до единицы. Для этого нужно выбрать нужный прескалер.
Очень сильно упростить условия можно выбрав в качестве приемного таймера 16-битный
таймер. Но это несколько удлинит процедуры анализа принятой информации в
прерывании. Дойдут руки - попробую. Сейчас все оттестировано и отмакетировано с
8-битными таймерами. С моим комплектом радиомодулей на скоростях от
нескольких сот бит в секунду до выше тысячи, прием-передача правильная на
расстояниях от нескольких сантиметров до 90 метров. Правда, в диапазоне 433.92 в моих
условиях очень шумно. Поэтому часто происходят потери байтов из-за помех. Каждые
20-40 секунд в эфире что-то жужжыт.
Кроме того, возможно настроить приемник таким
образом, чтобы он считал за правильную передачу только такие пакеты,
которые передаются на конкретной скорости с заданным отклонением в одну и
другую сторону.
В моем случае, передатчиком была тинька13, тактируемая 1МГЦ от
внутреннего генератора. Приемником - тинька2313
тактируемая 8.2МГЦ от внутреннего генератора. После выхода генераторов на режим (секунда-две) ограничение
по скорости работало очень точно. Сбои в приеме начинались, если я задавал
отклонение от реальной скорости менее 2 процентов.
В общем, про систему передачи хватит.
Что собой представляет пейджер.
Стандартный радиомодуль подключенный к
тиньке2313. При сработке какого-то из сигнализаторов, пейджер продублирует своим
бузером сигналы с сигнализатора. После этого он на индикаторе будет моргать
заданное в программе количество раз номер сработавшего сигнализатора. Если
одновременно (в широком смысле слова) сработают несколько сигнализаторов, то он
продублирует их сигналы и на индикаторе будет последовательно вымаргивать их номера.
Если не закончено вымаргивание, а снова есть поклевка, независимо от номера
сработавшего сигнализатора, моргание начнется сначала. Если номер сработавшего еще
не принимался, он добавится в буфер для индикации. Таким образом, после
утихания сигнализаторов гарантировано пейджер выморгает заданное количество раз с
интервалом в 500мс.
Номера задаются при компиляции прошивки
сигнализаторов. Они могут быть в диапазоне от 0 до 15. Отображаются на индикаторе
следующим образом:
0 1 2 3 4 5 6 7 8 9 A b C d E F
Сигнализаторами они передаются одним байтом, у которого оба полубайта одинаковы и соответствуют номеру сигнализатора. Это еще
один из способов защиты от приема ложных сигналов от брелков
сигнализаций, работающих в этом диапазоне.
Буфер пейджера может принять до 4 сигналов с разных сигнализаторов. Это оэначает, что могут "одновременно" сработать 4 штуки. И они будут зафиксированы. Мне бы такой клев!
В комплекте есть исходник самого пейджера под
ИАР-компилятор.
Он конфигурируется при помощи директив #define
в файлике setting.h
Имеется возможность свободного выбора пинов для
бузера и семисегментного индикатора. Входом выбран пин PCINT0. Его
смена не предусмотрена. Но при желании это тоже возможно.
Также есть возможность определять тип подключенного индикатора - с общим анодом или катодом. Это позволяет подключать любые индикаторы хоть напрямую, хоть через буферные ключи. Я свой подключил напрямую. Но стоит помнить об ограничении тока потребления с каждого пина контроллера.
Можно использовать радиомодули с инверсией сигнала или без таковой. Обычно они с инверсией. Мой модифицированный без инверсии. И много других параметров определяются директивами #define.
Исходник подробно прокомментирован. Смотрите, модифицируйте...
Я не жмот. Расстраиваться от того, что их кто-то использует, не буду. Если они кому-то будут полезными, выпейте за меня рюмку чаю. Но если кому-то они покажутся гавнокодом, прошу воздержаться от эмоций.
Для правильной компиляции на вкладке
Options/C/C++ Compiler/Code в окошке Register utilisations резервируем все
12 регистров.
на вкладке options/General Options ставим
птичку Enable bit definitions...
Естественно, просим компилятор сгенерировать понятный вашему программатору выходной файл прошивки. У меня это intel standart. Оптимизация - по вкусу.
В комплекте лежит откомпилированная прошивка, которая полностью соответствует приложенной схеме. Радиоканал выбран с инверсией. Индикатор с общим анодом.
Сами радиомодули естественно можно использовать любые. Хоть самопальные, хоть покупные. Но не модемы. Лишь бы они работали на одинаковых частотах.
От мощности передатчика и чувствительности приемника будет зависеть дальность.
Про фьюзы...
Fuses
OSCCALs = 4D 4A -
Можно не трогать. В Вашем случае могут быть другими. Но если хотите точно подогнать частоту, можно поиграться.
_LOW = 0xE4
CKDIV = 1
- Пусть так будет. Если поставите 0, то будет работать не на 8МГЦ.
CKOUT = 1
SUT = 2
CKSEL = 4
- Работаем от внутреннего генератора.
_HIGH = 0xDF
DWEN = 1
EESAVE = 1
WDTON = 1
BODLEVEL = 7
RSTDISBL = 1 - Не трогать! Угробите контроллер. Снять можно только
параллельным.
_EXT = 0xFF
SELFPRGEN = 1
Версия 01 Поменял инициализацию портов. Был кратковременный перегруз выхода приемника.
Кроме того, спалил операционник в приемнике. Пришлось менять. Переделал саму схему усилителя.
Теперь выглядит так:

Из преимуществ, не требует пилота. Первый же импульс с усилителя в полную амплитуду, поскольку усиливает сигнал, приподнятый от земли (на С1 около 0.6в со свергрегенератора). Имеет большое входное сопротивление. По постоянному напряжению-повторитель напряжения. Компаратор со схемотехники Блейза. Среднюю точку на компаратор можно бы брать с С2, как в предыдущем варианте, но тогда усилитель превращается в своеобразный фильтр, подрезающий низкие частоты. На высоких скоростях это благо а на низких - зло. Тут надо будет подумать...
Скачать исходники, прошивку и печатную плату в формате LAY (Автор ПП: vetall81)
С уважением Грегуль Алексей (grezincmp@mail.ru)
Пришли свой проект и получи от 100 до 700 руб гонорара за него
Участвуй в новом конкурсе для радиолюбителей с 3 призами: цифровой осциллограф, USB-осциллограф и мультиметр