реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Прием данных на Атмеге, Как правильно это организовать
Vny4ek
сообщение Nov 19 2008, 09:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Здрастье, есть у меня такая проблема.
Атмега, и приемник на 433Мгц ну от сигналки. Вот на ножку чипа приходит сигнал с приемника. Подскажите как выглядеть будет программа что бы просто записать принятые данные в виде единиц и нулей. Пакет приходит так:
"
Вся передача опирается на элемнтарный отрезок времени названный Те и равный обычно 400мкс. (документацией нормирован разброс от 280мкс до 620мкс).

Итак передаваемый пакет:
Он состоит из преамбулы (длиться 23Те, и нужна для того, чтоб оторвать приемник сиги от сладостного прослушивания помех), за ней следует заголовок пакета (header) – равен 10Те, и нужен для того чтоб проц в сиге смог определить длительность Те у принимаемого пакета данных… Затем идут собственно данные (66 бит или 198Те), и наконец Guard Time – время для того чтобы сига переварила принятое (39Те).


Теперь о передаче данных.. бит передается за время равное 3Те.. В течении 1-го Те передается обязательно высокий уровень (красная часть), 2-е Те это собственно значение передаваемого бита (только инвертированное, те лог1 = низкий уровень, а лог0 соответственно = высокий уровень) – синяя часть.. И наконец в течении 3-го Те передается обязательный низкий уровень (зеленая часть)..

"

ВОТ! хочется попроще и оптимальный прием пакета
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 19 2008, 09:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Vny4ek @ Nov 19 2008, 13:26) *
Здрастье, есть у меня такая проблема...

Проблема у Вас какая - не хочется программировать? biggrin.gif
Есть два варианта:
1. легкий : подсказываю - можно обнаружить начало передачи по тайм-ауту, использовать таймер в режиме захвата, записать все интервалы переходов в массив и их спокойненько обработать после приема посылки.
2. жесткий: вообще-то у меня и исходники есть, на которые я потратил некоторое время...


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Nov 19 2008, 09:58
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



нет проблема не в этом. Хочется просто не догоню как начать, мало опыта, а для ознакомления исходниками не поделитесь? Если конечно на С они а если для Кодвижена то вообще самолет!!!

Сообщение отредактировал Vny4ek - Nov 19 2008, 10:03
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 19 2008, 10:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Vny4ek @ Nov 19 2008, 13:58) *
а для ознакомления исходниками не поделитесь?

Нет, не поделюсь. Я только со своими дипломниками исходниками делюсь smile.gif
Спрашивайте конкретно - буду отвечать. А так... у меня проблема...дайте исходники - вы ничему и не научитесь.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Nov 19 2008, 11:02
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



ок, если можно по подробней с чего начать, программу
Go to the top of the page
 
+Quote Post
vvvvv
сообщение Nov 19 2008, 11:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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 значит это помеха или срыв пакета, проц уходит опять на начало, в ожидание новой преамбулы нового пакета.
Единственное замечание, без цифрового осциллографа это будет очень трудно сделать.
Исходников не жалко, но там совсем другой протокол, скорее запутает.
Начинай писать прямо свое по вышеописанному алгоритму. Сработает точно.
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Nov 19 2008, 11:11
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



СПАСИБО большое! То что надо, я потихоньку начинаю, писать, если что подскажете по ходу. Толковый ответ!
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Nov 25 2008, 14:14
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



будьте добры ткните носом в апноут, желательно что бы я понял что в кодвижене надо делать. Спасибо!

Сообщение отредактировал Vny4ek - Nov 25 2008, 14:26
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Apr 28 2009, 13:55
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Уважаемые, подскажите, обязательно ли в данном примере использовать таймер? (опыта с ними пока мало) может кто поможет начинающему "vvvvv" написал все внятно но многое у меня из за синтаксиса чтоли не проходит, будьте добры помогите начать. Причем я не прошу сделать за меня, я прошу помочь разобраться.

Сообщение отредактировал Vny4ek - Apr 28 2009, 13:56
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 29 2009, 08:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А что тут непонятного?
Инициализация таймера например normal-Fclk/1. Это зависит от частоты процессора. То есть надо посчитать сколько будет занимать один твой Те в "тиках" таймера.
Для указанного и проца mega8 инициализация будет такой:

TCCR1B=1;

Чтение в прирывании:

i = TCNT1;

При том что i - 16 бит без знака.

Для вычисления длины импульса надо учитывать кольцо. То есть учитывать то обстоятельство, что после значения таймера 65535 следует значение 0.

Допустим предыдущее знаение будет i1. Длина импульса результирующая l (16 бит со знаком), тогда вычисление следующее:

l=i-i1; // вычесть из текущего значения таймера предыдущее
if(l<0)l+=65536; // учесть перехлёст
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 29 2009, 09:25
Сообщение #11



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Майкрочип описАл процесс приема Keeloq не в одном даташите (естесно, под PIC'и, но с достаточным количеством комментариев).
http://www.google.com/search?hl=ru&rls...BC%D0%B0+Keeloq
в одной из первых найденных ссылок
http://www.microchip.ru/phorum/read.php?f=...23&t=141823
достаточно информации для размышления.
Я бы не стал углубляться в идею работать по прерыванию от приемника - не будете вылезать из прерываний, а толку получится чуть.
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Apr 29 2009, 12:39
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



to:SasaVitebsk спасибо большое, я потихоньку начинаю понимать, давайте я начну делать а если Вам не сложно вы поправите и скажете где ошибся
to:xemul да я видел апноут, причем принять пакет с ним у меня успешно получается, но там не считается насколько мне известно точно время одного TE, а мне это важно т.к. он может отличаться, да и опять же цель самому (пусть и кривовато) разобраться и научиться. спасибо за помощь.
И что значит не углублятся в прерывания? Можно ли мою задачу решить без использования таковых? ну например используя оператор if (PINA.0==1) {запуск отсчета счтиающего длительность импульса} или я не прав? без прерываний тут не обойтись?
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 29 2009, 14:59
Сообщение #13



*****

Группа: Свой
Сообщений: 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.
Дальше можно по аппноту, но лучше переложить аппнот на использование прерываний.
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение May 2 2009, 10:41
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Я уже не первый день не могу никак освоить эти таймеры, будьте добры доступным языком объясните пожалуйста, книги я читал, но там либо нет таких задач, либо ассемблер.
Сейчас я не пойму как при изменении уровня из 0 в 1 и через некторое время снова в 0, (____|---?---|____)запустить таймер, который измерит длинну импульса (пусть даже в такатх процессора,а не в секунадх). Пожалуйста подскажите наиболее доступно, т.к. я начинающий. Если кто-нибудь даст ссылку или выложит учебник с примерами в кодвижене буду ОЧЕНЬ благодарен.
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение May 3 2009, 08:08
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Ребят, ну подскажите пожалуйста.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016