Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 21:36

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Распознавание RFID
СообщениеДобавлено: 18 авг 2014, 23:51 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
Доброго времени суток!
Делаю один девайс, в котором нужно считывать RFID карты (125 кгц), аналоговую часть взял здесь http://www.serasidis.gr/circuits/RFID_r ... reader.htm, вместо тиньки стоит атмега8. На сайте есть и код, но там сделано тупо в цикле, а мне нужно на прерываниях.
Застрял в самом начале. Проблема в том, что я не могу понять, как вычислить период, так как из-за большой скорость передачи данных (в отличии от RC5) я осцилом не могу увидеть, что там карта передает в начале. Теоретически, вот начало (потому что много единичек): (смотрите пикчу ниже).
На желтые и зеленые линии прошу не обращать внимания, это я дорисовал. Во первых, интересует, почему на первых восьми столбиках ширина активного уровня короче, чем ширина не активного?
Во вторых, какая должна быть длина низкого уровня между двумя первыми столбиками? У меня получилось чуть больше 500 мкс, это правильно? Дело в том, что моя прога в начале определяет длину периода (1 бита) и она почему то получается 1500 мкс, но я хз, что микроконтроллер поймал.
Вот кусок кода:
Код:
#define sbi(reg,bit) (reg |= (1<<bit))
#define cbi(reg,bit) (reg &= ~(1<<bit))
#define ibi(reg,bit) (reg ^= (1<<bit))
#define CheckBit(reg,bit) (reg&(1<<bit))

#define   SET_CAPT_ON(l)   {l ? sbi(TCCR1B, ICES1) : cbi(TCCR1B, ICES1);}
#define CAPT_ON (CheckBit(TCCR1B, ICES1))

#define   SET_COMP_INTERRUPT_ENABLED(l)   {l ? sbi(TIMSK, OCIE1A) : cbi(TIMSK, OCIE1A);}

void RFID_Init(void)
{
   cbi(DDRB, 0); cbi(PORTB, 0);   // icp to input

   RFID.bcounter = 0;
   RFID.receiving = false;
   RFID.period = 0;
   RFID.haveData = false;

   SET_COMP_INTERRUPT_ENABLED(0);
   OCR1A = 0;

   //Если ICESn =0, то падающий фронт приводит к захвату,  ICESn = 1, то нарастающий фронт.
   TCCR1B = _BV(ICNC1) | _BV(CS10);
   SET_CAPT_ON(0);
   TIMSK |= _BV(TICIE1);

   SET_CAPT_ON(1);   // включаем захват по наростающему. В результате, прерывание будет вызвано когда будет передана первая половина первого бита (1).
}

void RFID_Start(void)
{
   RFID.bcounter = 0;
   RFID.receiving = false;
   RFID.period = 0;
   RFID.haveData = false;
   SET_CAPT_ON(0);
}

ISR(TIMER1_CAPT_vect)
{
   if (RFID.haveData) return;

   volatile uint16_t   capture = ICR1;

   if (!RFID.period) {
      if (CAPT_ON) RFID.period = capture;   // save period

      ibi(TCCR1B, ICES1); // capture on different level
      return;
   }
   // период получен, первый бит теперь отсутствует, от стартовых остались только 8

   itoa(RFID.period, RFID.buffer, 10);
   RFID.bcounter = strlen(RFID.buffer);
   RFID.haveData = true;
}

Если кто то выложит рабочий код приема RFID, работающего на прерываниях, буду сильно благодарен)))))


Вложения:
Снимок4.png
Снимок4.png [ 10.74 Кб | Просмотров: 8064 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 00:09 
Заглядывает иногда

Зарегистрирован: 29 май 2013, 16:45
Сообщения: 172
Ну, на прерываниях так: устанавливаете прерывание по восходящему фронту сигнала, в этом прерывании запускаете таймер.
По прерыванию таймера (сравнение) производите чтение ноги с сигналом, и вуаля - вот он бит.

Может я не совсем понимаю Вашу проблему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 00:19 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
когда сигнала от карты нет, на выходе той аналоговой схемы (что по ссылке) положительный сигнал. Как я понимаю, когда идут данные с карты, выход прижимается к земле на 1 период (см осциллограмму). Если сигнал сначала будет положительный и я включу прерывание по нарастающему, то не сработает ли сразу прерывание?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 00:46 
Заглядывает иногда

Зарегистрирован: 29 май 2013, 16:45
Сообщения: 172
BrMisha писал(а):
когда сигнала от карты нет, на выходе той аналоговой схемы (что по ссылке) положительный сигнал. Как я понимаю, когда идут данные с карты, выход прижимается к земле на 1 период (см осциллограмму). Если сигнал сначала будет положительный и я включу прерывание по нарастающему, то не сработает ли сразу прерывание?


Если прерывание по нарастающему, то зачем ему срабатывать по спадающему?
Включите прерывание, будет спад, потом фронт и вот тогда и сработает.

А еще хорошо-бы пока уровень высокий на протяжении некоторого времени смотреть за ним (уровнем) и если колебаний нет, а времени прошло много (скажем столько сколько идут 10 бит), то это пауза, сбрасываем счетчик бит и готовимся принять новую посылку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 00:55 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
ОК, тогда остался самый главный вопрос, из-за которого и создавал тему. Как определить длину периода?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 01:08 
Заглядывает иногда

Зарегистрирован: 29 май 2013, 16:45
Сообщения: 172
BrMisha писал(а):
ОК, тогда остался самый главный вопрос, из-за которого и создавал тему. Как определить длину периода?


Я же написал :)
По фронту запускаете таймер, время таймера выбираете так, чтобы оно было больше короткого импульса, но меньше длинного.
Когда таймер отсчитает, снимаете данные с ноги (смотрите 1 на ней или 0), если за время работы таймера успел спад произойти, то прочитается 0, и значит импульс был короткий.
Если не успел спад произойти до отсчета таймера, то прочитается 1 - длинный импульс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 01:15 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
Именно так и я хотел сначала сделать. Но ведь у манчестерского кодирования самая главная особенность в том, что он позволяет делать синхронизацию на каждом бите. Если просто забивать в код длину периода, то эта возможность отпадает(((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 06:33 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
ZEvS писал(а):
По фронту запускаете таймер, время таймера выбираете так, чтобы оно было больше короткого импульса, но меньше длинного.

таймер надо ставить так, чтобы время было более длинного периода и разрядности хватало различить короткий и длинный импульс. переполнение таймера - ошибка приема (таймаут).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 10:08 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
Тут еще посмотри, мож яснее станет... http://asis-kbr.ru/forum/viewtopic.php?f=11&t=162


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 10:55 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
А зачем так? Ведь можно просто измерять скважность каждого импульса. Скажем, для работы с zacwire я так и делал: таймер по переднему фронту импульса заполняет очередной бит данных, сбрасывается и проводит следующее измерение. Последний бит там все равно был не нужен, поэтому проблем не было. Если нужен и последний импульс, можно еще прерывание по переполнению счетчика завести.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 15:35 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
Мне тоже последний бит не нужен.
А что значит по переднему фронту импульса?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 15:57 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Манчестер может самосинхронизироваться только по "широкому" импульсу. Если идет меандр с удвоенной частотой, то нельзя определить, передаются нули или единицы. Как только пришел широкий импульс, то это автоматически означает, что оба его фронта - это переходы внутри битов, от этого и пляшется вся синхронизация.

Рекомендую прочитать атмеловский аппнот Manchester Coding Basics
там и по прерываниям и по выборкам расписываются алгоритмы.

PS. Для stm32 есть режим работы таймера "PWM capture", когда захватывается целиком период импульса. Соответственно в аппноте есть реализация декодирования манчестера им.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 16:05 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
BrMisha писал(а):
А что значит по переднему фронту импульса?

Если основной уровень сигнала — ноль, то передний фронт — переход с 0 на 1. Соответственно, настраиваем таймер так, чтобы переход 0→1 вызывал прерывание + сбрасывание счетчиков; переход 1→0 будет вызывать запоминание текущего значения счетчика во вспомогательном регистре. Соответственно, по прерыванию мы имеем 2 регистра: значение счетчика таймера на момент прерывания (т.е. длительность импульса между переходами 0→1), а также значение счетчика в момент перехода 1→0. Делим первое на второе и получаем значение коэффициента заполнения, D. Ну и обычно, если D < 0.35, мы имеем нулевой бит, а если D > 0.65 — единичный. Бит запоминаем, пока не накопится нужное количество, либо пока не прекратится передача данных.

Если же основной уровень сигнала — единица, то передним фронтом будет переход 1→0. Соответствующим образом таймер и настраиваем.

К сожалению, без обработчика прерываний (чистым DMA) здесь не обойтись...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 17:15 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
А что такое 0.35 и 0.65?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 17:37 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
время в попугаях


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 17:49 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
Да я догадался, что время)) Интересует, откуда оно взято.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 18:18 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
BrMisha писал(а):
А что такое 0.35 и 0.65?

Эдди скорее всего не про манчестер говорил. Любит недочитать начальное сообщение.

PS. точно, это он про свою zacwire вспоминал ))
Start bit => 50% duty cycle used to set up strobe time
Logic 1 => 75% duty cycle
Logic 0 => 25% duty cycle


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 19:30 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Цитата:
PS. точно, это он про свою zacwire вспоминал ))

Ага. А если другие длительности — соответствующим образом пороги выставляем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 19:37 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Eddy_Em писал(а):
Цитата:
PS. точно, это он про свою zacwire вспоминал ))

Ага. А если другие длительности — соответствующим образом пороги выставляем.

Это если биты кодируются разным заполнением. Для манчестера, увы, не канает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 19:49 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Почему же? Очень даже канает: если заполнение < 0.35, пишем 2 бита: 1 и 0; если заполнение > 0.65, пишем два бита: 0 и 1; иначе — повторяем последний бит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 21:16 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
ну как минимум один вариант пропустил


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 21:32 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Steel.ne писал(а):
ну как минимум один вариант пропустил

Какой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 21:39 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Два длинных жеж. Заполнение 50%, но не повторение последнего бита. И лень все варианты прогонять, но у тебя где-то прокол с синхрой должен еще получиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 19 авг 2014, 22:39 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
А, и действительно. Но если еще и контролировать длительность импульсов, все будет ОК. Главное — иметь представление о примерной длительности.

В любом случае, этот вариант будет работать, в отличие от варианта с сэмплированием по таймеру (т.к. из-за отсутствия синхронизации в конце-концов эти сэмплы будут черт-те откуда браться!).

Все-таки, очень идиотская вещь это манчестерское кодирование: геморрой один, никак не оправданный! Тот же zacwire намного проще, а первый синхроимпульс с 50%-м заполнением позволяет реализовать любой из вариантов: хоть скважность мерить, хоть длительность импульсов!

Но я бы не так кодировал радиоканал: я бы просто передавал постоянно меандр 0xAA, а единицы и нули кодировал бы, скажем, 0x0F и 0xF0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Распознавание RFID
СообщениеДобавлено: 20 авг 2014, 00:06 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
Eddy_Em писал(а):
Все-таки, очень идиотская вещь это манчестерское кодирование: геморрой один, никак не оправданный!
Ну вы блин даете... сударь...
Помоему манчестер это самый классный метод кодирования, для передачи в сложных средах (радиоканал, ик, некварцованные точки связи и т.д.)
Вспомните кривой писк на магнитофонах для загрузки программ в спектрумы... это манчестер... все работало...
Вспомните современный LAN... краем уха слышал что там тоже манчестер...


Чет вы там с декодированием слишком мудрите... там все просто делается... вот как я декодировал...

1) Входим в обработчик прерывания при любом перепаде, хоть из 0 в 1, хоть из 1 в 0...
2) Выключаем внешнее прерывание на период длиной в 3\4 слота бита.
Вложение:
pic1.png
pic1.png [ 53.33 Кб | Просмотров: 7697 ]


3) Проверка на корректность длительности замера
Если замер не попадает в окно допустимых значений - инициализируем прием сначала...
Вложение:
pic2.png
pic2.png [ 38.43 Кб | Просмотров: 7697 ]


4) Значение принятого бита (уровень в линии после прерывания) задвигаем в байт приемник ByteIn


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB