|
Прием данных на Атмеге, Как правильно это организовать |
|
|
|
Nov 19 2008, 09:26
|
Частый гость
 
Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001

|
Здрастье, есть у меня такая проблема. Атмега, и приемник на 433Мгц ну от сигналки. Вот на ножку чипа приходит сигнал с приемника. Подскажите как выглядеть будет программа что бы просто записать принятые данные в виде единиц и нулей. Пакет приходит так: " Вся передача опирается на элемнтарный отрезок времени названный Те и равный обычно 400мкс. (документацией нормирован разброс от 280мкс до 620мкс). Итак передаваемый пакет: Он состоит из преамбулы (длиться 23Те, и нужна для того, чтоб оторвать приемник сиги от сладостного прослушивания помех), за ней следует заголовок пакета (header) – равен 10Те, и нужен для того чтоб проц в сиге смог определить длительность Те у принимаемого пакета данных… Затем идут собственно данные (66 бит или 198Те), и наконец Guard Time – время для того чтобы сига переварила принятое (39Те). Теперь о передаче данных.. бит передается за время равное 3Те.. В течении 1-го Те передается обязательно высокий уровень (красная часть), 2-е Те это собственно значение передаваемого бита (только инвертированное, те лог1 = низкий уровень, а лог0 соответственно = высокий уровень) – синяя часть.. И наконец в течении 3-го Те передается обязательный низкий уровень (зеленая часть).. " ВОТ! хочется попроще и оптимальный прием пакета
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 19 2008, 09:56
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Vny4ek @ Nov 19 2008, 13:26)  Здрастье, есть у меня такая проблема... Проблема у Вас какая - не хочется программировать? Есть два варианта: 1. легкий : подсказываю - можно обнаружить начало передачи по тайм-ауту, использовать таймер в режиме захвата, записать все интервалы переходов в массив и их спокойненько обработать после приема посылки. 2. жесткий: вообще-то у меня и исходники есть, на которые я потратил некоторое время...
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 19 2008, 11:03
|
Местный
  
Группа: Свой
Сообщений: 342
Регистрация: 21-06-04
Пользователь №: 85

|
Идея такая. Настраиваешь вход с радиоканала на прерывание по перепаду, неважно с нуля в единицу или наоборот. Настраиваешь таймер, лучше 16 битный, чтобы он постоянно по циклу считал. При изменении уровня на линии проц попадает в прерывание PCINT. Первым делом считываешь показание таймера, а сам таймер обнуляешь. Конечно в первом перепаде показания таймера от балды. Но вот во втором, ты уже попадешь в PCINT и таймер покажет длину импульса. Все есть длина импульса, осталось проверить наш это импульс или нет, т.е. ширина импульса скажем больше 0.5Te и меньше 1.5Te. Ведь преамбула с определенной частотойю, ширина импульса Te, верно? Далее если скажем есть 10 попаданий в размеры преамбулы, проц принимает решение, что идет преамбула. Все устанавливаем флаг, я в преамбуле. Далее, если слишком большая пауза, проц определяет срыв преамбулы, сбрасывается флаг преамбулы, проц опять в ожидании пакета. Если с преамбулой все ОК, проц ждет заголовок пакета. Как я понял заголовок пакета это пауза 10 Te. Т.е. при очередном PCINT в таймере лежит значение 10 Te. Проверяем что это значение в пределах 9Te и 11Te. Если да, значит пришел заголовок. Проц сбрасывает флаг преамбулы и устанавливает флаг приема данных. Теперь попадая в прерывание PCINT проц будет по этому флагу знать, что может быть длина импульса Te, а может быть 2Te, ведь это режим приема данных. Ну и все, теперь осталось проверять какая длительность после перепада из 0 в 1. Если =2Te значит пришел бит "0", если = Te пришел бит "1". Конечно после "0" будет перепад из 1 в 0 = Te, а после "1" перепад из 1 в 0 = 2Te, их проверяем и пропускаем, ждем перепада из 0 в 1. Если же очередная длительность больше 3Te, или меньше 0.5Te значит это помеха или срыв пакета, проц уходит опять на начало, в ожидание новой преамбулы нового пакета. Единственное замечание, без цифрового осциллографа это будет очень трудно сделать. Исходников не жалко, но там совсем другой протокол, скорее запутает. Начинай писать прямо свое по вышеописанному алгоритму. Сработает точно.
|
|
|
|
|
Apr 29 2009, 14:59
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Vny4ek @ Apr 29 2009, 16:39)  to:xemul да я видел апноут, причем принять пакет с ним у меня успешно получается, но там не считается насколько мне известно точно время одного TE, а мне это важно т.к. он может отличаться, да и опять же цель самому (пусть и кривовато) разобраться и научиться. Считается. Te = Th/10. Цитата И что значит не углублятся в прерывания? Можно ли мою задачу решить без использования таковых? ну например используя оператор if (PINA.0==1) {запуск отсчета счтиающего длительность импульса} или я не прав? без прерываний тут не обойтись? Достаточно прерывания от 8-битного таймера. Для ловли хидера настраиваете таймер на интервал TE_MIN/2, ждете -\____/ -, удовлетворяющий допускам на Th (по каждому прерыванию таймера if(!PINA.0) Th += TE_MIN/2; else Th = 0;), вычисляете Te. Дальше можно по аппноту, но лучше переложить аппнот на использование прерываний.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|