Обсуждаем цифровые устройства...
Ответить

Re: Копировщик RFID-ключей T5557

Вт фев 20, 2018 12:17:25

Здравствуйте, Мудрые коты! Решил переделать Китайскую кодовую панель с RFID метками https://ru.aliexpress.com/item/Special- ... eLevelAB=4
под свои нужды. Мне надо, чтобы панель считывала ID RFID меток и просто кидала их в UART. Внутри панели стоит МК stm8s003f3 в 20-ти ножечном корпусе. Схема считывателя стандартная на LM258. Возбуждение катушки идет через 2 транзистора от 1 ноги МК. Возбуждение сделал от TIM2 в режиме pwm на 125 кГц. Вход в МК на 20 ногу. Пытался переделать программу, на которую ссылается автор темы ("я взял у ShadS ( http://forum.easyelectronics.ru/viewtop ... 5b#p352328 ).") Но что-то не получилось и не знаю куда копать. Первые 9 бит вроде проскакивает. А на всем остальном тормоз. В stm не так организованы внешние прерывания, как в avr. Может из-за этого. Если окно T периода увеличить с 64 до 150, то вроде байты на выход проскакивать начинают первый 0xC0 или 0xF0, а потом все остальные 0x00, 0x00,0x00. В приложение привожу эпюры сигналов в формате Saleae Logic.
Если найдется желающий помочь Бедному страннику по миру электронных головоломок, буду сильно признателен! Помогите, пожалуйста!
Вложения
125kz_RFID_reader.JPG
С незначительными изменениями схема аналоговой часть полностью совпадает с этой
(233.99 KiB) Скачиваний: 620
500 kHz, 0 M Samples [2].rar
(12.77 KiB) Скачиваний: 197

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 07:08:25

А попробуйте инвертировать биты после компаратора IC2b (или провода перекинуть на нём). Может быть, поможет. Там ведь ничего сложного не было в декодировании.

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 10:16:13

У меня в схеме по сравнению с той, что я привел, отсутствует инвертор на транзисторе Т2. Вы извините, но я не понял, что такое IC2b?

Добавлено after 10 minutes 35 seconds:
Поменял. Теперь не проходит проверку на четность 5 бит. И выкидывает в начало.

Добавлено after 45 minutes 42 seconds:
//char val = 0xff;
char val = 0x00;
if (RfidFlags & bLINE_VAL) //вспоминаем значение линии RFID_IN_LINE, запомненное перед вызовом прерывани¤
val = 0xff;

BitCounter++;
if ((TimerTemp > (RFID_PERIOD/2)) || (RfidFlags & bTIM0_OVF)){ //в рамках ли длительность бита
RfidFlags &= ~bTIM0_OVF;
BitCounter = 1; //если превышает, начать прием с начала
GroupNum = 0;
}

if (GroupNum == 0){
//if (val == 0){
if (val == 0xff){ //сбой, т.к. прин¤т 0, а должны прин¤тс¤ дев¤ть единиц
restart: BitCounter = 0; //начать прием сначала
GroupNum = 0;
return;
}

if (BitCounter >= 9){ //пилотна¤ часть закончилась
BitCounter = 0; //подготовка к приему данных
GroupNum = 1;
BitMask = 0x80;
ByteIn = 0;
ParityHor = 0;
ParityVert = 0;
}
return;
}

if (BitCounter == 5){ //прием контрольного 5-го бита
//прин¤ли бит четности первой тетрады
if (GroupNum < 6){
//группы 1-5 провер¤ем бит четности
if ((ParityHor && (val)) || ((!ParityHor) &&(!val))){
ParityHor = 0; //очистить бит четности дл¤ приема остальной части байта
return;
}
goto restart; //четность не соответствует
}
else{
//шеста¤ группа - биты четности верт колонок
if (ByteIn == ParityVert){ //проверка соответстви¤ вертикальных битов четности
for (uint8_t i=0; i<5; i++){//проверка на карту с нулевым номером (если нулевой - рестарт)
if (BufferInput [i]){
RfidFlags |= bDATA_ENBL; //установить флаг наличи¤ данных
break;
}
}
}
goto restart;
}
}

if (BitCounter == 10){ //прием контрольного 10-го бита четности
//прин¤ли бит четности второй тетрады
if ((ParityHor && (val)) || ((! ParityHor) &&(!val))){
ParityVert ^= (ByteIn & 0xf0); //вычисл¤ем биты четности по вертикали
ParityVert ^= (ByteIn << 4);
ParityHor = 0; //очистить бит четности дл¤ приема остальной части
if (RfidFlags & bDATA_ENBL) //проверка буфера на готовность прин¤ть данные
goto restart;
BufferInput [GroupNum-1] = ByteIn;//сохран¤ем прин¤тый байт в буфере
ByteIn = 0;
BitMask = 0x80;
GroupNum++;
BitCounter = 0;
return;
}
goto restart;
}

//если это не 5-й и не 10-й биты, то принимаем данные
if (!val){ //прием битов данных
ByteIn |= BitMask;
// UartTXSymb(ByteIn);
ParityHor ^= 0x01; //подсчет бита горизонтальной четности
}
BitMask >>= 1;

}

Кусок этого алгоритма не работает. И никак до меня не доходит в чем дело(((

Добавлено after 5 minutes 3 seconds:
9 бит проходит и с ключом и без
Думал что что после инверсии нужно и val инвертировать, тоже не удача

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 10:28:15

У меня в схеме по сравнению с той, что я привел, отсутствует инвертор на транзисторе Т2


А как у вас тогда компаратор работает? :roll:

Вы снимите осциллограмму сигнала после компаратора и после декодера манчестера и попытайтесь вручную её декодировать.

Там вот что:

Номер карты по нибблам AB CD EF GH IJ

1) Девять единиц в начале;
2) Ниббл A;
3) Чётность ниббла A (1 бит);
4) Ниббл B;
5) Чётность ниббла B (1 бит);
..
16) Ниббл I;
17) Чётность ниббла I (1 бит);
18) Ниббл J;
19) Чётность ниббла J (1 бит);

20) Ниббл чётности колонок для нибблов A B C D E F G H I J;
21) Бит 0.

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 17:28:18

Вот сигнал на входе МК

Добавлено after 1 hour 16 minutes 20 seconds:
Сделал схему аналоговой части.

Добавлено after 4 hours 7 minutes 33 seconds:
vash_sa писал(а):Вы снимите осциллограмму сигнала после компаратора и после декодера манчестера и попытайтесь вручную её декодировать.


Где эти точки в схеме?

Что-то с этим кодом какая-то засада.((((

Добавлено after 7 minutes 59 seconds:
Я насчитал 11 единиц вначале. Ключ 0003294955 или 0x3246EB или 0b 0011 0010 0100 0110 1110 1011.
Где этот код искать в осциллограмме. Полная жесть!! Как из этого частокола выковырять код?

Добавлено after 13 minutes 5 seconds:
Изображение

Добавлено after 15 minutes 2 seconds:
Не может же быть не Манчестер?
Вложения
Схема аналоговой части.JPG
(25.11 KiB) Скачиваний: 534
сцилограмма на вх.JPG
(28.28 KiB) Скачиваний: 537

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 20:38:57

vash_sa, это манчестер, и код соответствует диаграмме - 1F003246EB.
В первом сообщении da-nie приводил ссылку еще на одну тему http://kazus.ru/forums/showthread.php?t=101565
Ваша аналоговая часть очень похожа на оттуда :) . Вроде бы там был и исходник, может быть оттуда Вам будет проще приспособить?

Re: Копировщик RFID-ключей T5557

Ср фев 21, 2018 21:25:16

Спасибо за подсказку. но мне бы хотя бы разобраться как Вы по диаграмме распознали код. У меня пока не получается. Подскажите как это делается?

Добавлено after 1 minute:
На моей диаграмме в paint сделайте пометки, если Вам не сложно))

Добавлено after 56 seconds:
Заранее спасибо!

Re: Копировщик RFID-ключей T5557

Чт фев 22, 2018 10:45:24

Уважаемые Коты, прошу прощения! Для выяснения некоторых азов буду нести элементарщину. Прошу сильно не бить, если мои рассуждения правильные, то кивайте, если - нет, то поправляйте.

Частота 125 кГц - период 8мкс. В 1 бит умещается - 64 периода несущей. Длительность формирования бита 8x64 = 512 мкс. Так?
Соответственно, частота 1954 Гц. Отсюда строка в программе:
Код:
RFID_PERIOD_LEN         F_CPU / 64 / 2000/*частота контролера / предделитель / частота RFID сигнала*/

Из нее и получаем длительность периода в 62,5 или 64 в безразмерных величинах.
При установке отступа до момента анализа перепада вверх (1) или вниз (0) используется следующая строка:
Код:
TCNT0 = 0x100 - (RFID_PERIOD_LEN * 3 / 4);//счетчик таймера настроить на 3/4 длины периода RFID бита данных

Так? Тогда, пару вопросов. Если так TCNT0 = 0x100, то какая частота будет? А так TCNT0 = 0x100 - RFID_PERIOD_LEN, какая?

Re: Копировщик RFID-ключей T5557

Чт фев 22, 2018 11:01:36

Спасибо за подсказку. но мне бы хотя бы разобраться как Вы по диаграмме распознали код. У меня пока не получается. Подскажите как это делается?

Добавлено after 1 minute:
На моей диаграмме в paint сделайте пометки, если Вам не сложно))

Добавлено after 56 seconds:
Заранее спасибо!

Как-то так :idea:
untitled.png
(18.93 KiB) Скачиваний: 594

Re: Копировщик RFID-ключей T5557

Чт фев 22, 2018 12:53:15

Получается код инверсный?

Добавлено after 27 minutes 42 seconds:
Да, инверсный код 1F00324... прослеживается. Спасибо огромное!

Добавлено after 4 minutes 6 seconds:
Тепер буду думат как Декадыроват

Добавлено after 1 hour 13 minutes 14 seconds:
Предделитель 64. 8000000/64 = 125 кГц. Задержка на 1 тик счетчика 8 мкс. По этой формуле TCNT0 = 0x100 - (RFID_PERIOD_LEN * 3 / 4)
TCNT0 = 0x100 - 48 = 208. Т.е. на 208 отсчете сработает прерывание. 208 * 8 мкс = 1664 мкс задержка от предыдущего прерывания. Весь период, как рассчитано выше, 512 мкс. Как 1664 мкс может составлять 3/4 периода?? Где ошибка в моих рассуждениях??

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 08:39:33

Где эти точки в схеме?


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

Предделитель 64. 8000000/64 = 125 кГц. Задержка на 1 тик счетчика 8 мкс. По этой формуле TCNT0 = 0x100 - (RFID_PERIOD_LEN * 3 / 4) TCNT0 = 0x100 - 48 = 208.


Ох, уж эти настройки таймеров! :)
Если ничего не путаю: 1 такт таймера = 8 мкс. RFID_PERIOD_LEN=62.5. Отсюда TCNT0=256-62.5*3/4=256-46=210. То есть, интервал будет 46, а точнее 46.875 отсчётов таймера. 46.875*8 мкс= 375 мкс 3/4 периода.

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 12:27:10

Спасибо огромное! С праздником Вас! В связи с приведенными расчетами, получается, что таймер начинает считать с 210 отсчета и по 255.
Тогда TimerTemp = TCNT0; не может быть меньше 210. Это так?
Тогда вот эта строчка программы if ((TimerTemp > (RFID_PERIOD_LEN/2)) || (RfidFlags & bTIM0_OVF)) должна выполняться всегда и весь алгоритм должен на ней висеть. TimerTemp (210) > (RFID_PERIOD_LEN/2) (32). Если только в AVR счет не идет от остатка. Я не программировал в AVR, поэтому особенностей не знаю.

Добавлено after 4 minutes 24 seconds:
Ну, сигнал на входе вы уже нашли. А вот сигнал на выходе нужно сделать самому - вывести значения получающихся бит на свободный порт. Затем записать синхронно обе осциллограммы (с двух входов осциллографа) и сравнить, верно ли проходит.

С этим мы уже разобрались. Мне VGA77 помог спасибо ему огромное! Код по осциллограмме на выходе мы разобрали - это манчестерский инверсный код, соответствующий кодам написанным на метках.

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 13:20:39

Тогда TimerTemp = TCNT0; не может быть меньше 210.


Заинтриговали. :dont_know: Я уже запутался, как оно работает. :)

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 17:21:54

Да, я такой старый интриган. У Вас в коде тоже самое. Предлагаю экскурс в прошлое!

Добавлено after 22 minutes 26 seconds:
В отладчике запустите и проверьте величину TimerTemp

Добавлено after 12 minutes 16 seconds:
0x1F,0x00,0x32,0x46,0xEB,
Ну наконец-то

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 17:33:26

Ну наконец-то


А в чём было дело?

Предлагаю экскурс в прошлое!


Эту часть лучше у Shads спросить. :) Я принцип работы понял, а детально с настройками таймера не заморачивался.

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 18:36:19

Код:
А в чём было дело?

Вначале неправильно настроил таймер. Есть отличие в настройках 8-ми битного таймера у AVR и у STM. А второе внешние прерывания для STM проблемная штука. Я писал прогу с использованием стандартной библиотеки, а там вопрос об отключении прерывания полностью игнорировали. И в результате отключение прерывания у меня не работало. Пришлось долго искать нужные биты управления. Литературы по stm8s крайне маловато. Даже в даташите эти биты не были расписаны.
А ту строку с таймером, сделал так:
Код:
if ((TimerTemp > (0x100 - RFID_PERIOD_34 + RFID_PERIOD/2)) || (RfidFlags & bTIM0_OVF)){

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 18:46:23

Поздравляю! :)

А ту строку с таймером, сделал так:


А старая версия не работала?

Re: Копировщик RFID-ключей T5557

Пт фев 23, 2018 22:02:11

Поздравляю!

Это Вам и VGA77 огромное спасибо! Без ваших подсказок я бы еще долго ломал голову!
Код:
А старая версия не работала?

У меня почему-то не пошла. Может специфика настройки STM, не знаю.

Re: Копировщик RFID-ключей T5557

Вт фев 27, 2018 07:51:31

Подскажите пожалуйста решил сделать свой ридер на atmega8 и уже пожалел что не взял обвязку на транзисторах и фильтры за основу у вас(((,у вас сравниваются уровни напряжения после фильтров,можете подсказать будет ли работать вот эта схема https://www.rlocman.ru/shem/schematics.html?di=148455 и какой тут принцип?,я использую контроллер atmega8 решил как на схеме с attiny13 обвязку сделать,я так понял что тут через внешнее прерывания вычисляется номер карточки?, у меня все время на 7 ноге lm358 висит 4 вольта, на осциллографе оно постоянно висит даже если подношу карточку,пробовал витками катушки поиграться :(, бес толку.

Подскажите как это все настроить?,в точке D1C2 висит синус 125 кгц от задающего генератора, шим задал 125 кгц 50%. После демодулятора сигнала с амплитудной модуляцией в точке C1R5 висит напряжение,когда подношу карточку оно просто падает почти до нуля без всяких меандров , так должно быть?

Re: Копировщик RFID-ключей T5557

Вт фев 27, 2018 15:03:42

Будет работать - её же только что vash_sa запускал. :) А вот принцип работы надо у автора спрашивать. Потому я и не смогу помочь настроить, что не знаю, как оно работает.
Ответить