Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Здравствуйте, Мудрые коты! Решил переделать Китайскую кодовую панель с 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
А попробуйте инвертировать биты после компаратора IC2b (или провода перекинуть на нём). Может быть, поможет. Там ведь ничего сложного не было в декодировании.
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
У меня в схеме по сравнению с той, что я привел, отсутствует инвертор на транзисторе Т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 инвертировать, тоже не удача
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Вот сигнал на входе МК
Добавлено 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: Не может же быть не Манчестер?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
vash_sa, это манчестер, и код соответствует диаграмме - 1F003246EB. В первом сообщении da-nie приводил ссылку еще на одну тему http://kazus.ru/forums/showthread.php?t=101565 Ваша аналоговая часть очень похожа на оттуда . Вроде бы там был и исходник, может быть оттуда Вам будет проще приспособить?
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Уважаемые Коты, прошу прощения! Для выяснения некоторых азов буду нести элементарщину. Прошу сильно не бить, если мои рассуждения правильные, то кивайте, если - нет, то поправляйте.
Частота 125 кГц - период 8мкс. В 1 бит умещается - 64 периода несущей. Длительность формирования бита 8x64 = 512 мкс. Так? Соответственно, частота 1954 Гц. Отсюда строка в программе:
Из нее и получаем длительность периода в 62,5 или 64 в безразмерных величинах. При установке отступа до момента анализа перепада вверх (1) или вниз (0) используется следующая строка:
Код:
TCNT0 = 0x100 - (RFID_PERIOD_LEN * 3 / 4);//счетчик таймера настроить на 3/4 длины периода RFID бита данных
Так? Тогда, пару вопросов. Если так TCNT0 = 0x100, то какая частота будет? А так TCNT0 = 0x100 - RFID_PERIOD_LEN, какая?
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Получается код инверсный?
Добавлено 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 периода?? Где ошибка в моих рассуждениях??
Ну, сигнал на входе вы уже нашли. А вот сигнал на выходе нужно сделать самому - вывести значения получающихся бит на свободный порт. Затем записать синхронно обе осциллограммы (с двух входов осциллографа) и сравнить, верно ли проходит.
Цитата:
Предделитель 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 периода.
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Спасибо огромное! С праздником Вас! В связи с приведенными расчетами, получается, что таймер начинает считать с 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 помог спасибо ему огромное! Код по осциллограмме на выходе мы разобрали - это манчестерский инверсный код, соответствующий кодам написанным на метках.
Зарегистрирован: Чт сен 04, 2014 13:22:44 Сообщений: 50
Рейтинг сообщения:0
Код:
А в чём было дело?
Вначале неправильно настроил таймер. Есть отличие в настройках 8-ми битного таймера у AVR и у STM. А второе внешние прерывания для STM проблемная штука. Я писал прогу с использованием стандартной библиотеки, а там вопрос об отключении прерывания полностью игнорировали. И в результате отключение прерывания у меня не работало. Пришлось долго искать нужные биты управления. Литературы по stm8s крайне маловато. Даже в даташите эти биты не были расписаны. А ту строку с таймером, сделал так:
Подскажите пожалуйста решил сделать свой ридер на atmega8 и уже пожалел что не взял обвязку на транзисторах и фильтры за основу у вас(((,у вас сравниваются уровни напряжения после фильтров,можете подсказать будет ли работать вот эта схема https://www.rlocman.ru/shem/schematics.html?di=148455 и какой тут принцип?,я использую контроллер atmega8 решил как на схеме с attiny13 обвязку сделать,я так понял что тут через внешнее прерывания вычисляется номер карточки?, у меня все время на 7 ноге lm358 висит 4 вольта, на осциллографе оно постоянно висит даже если подношу карточку,пробовал витками катушки поиграться , бес толку.
Подскажите как это все настроить?,в точке D1C2 висит синус 125 кгц от задающего генератора, шим задал 125 кгц 50%. После демодулятора сигнала с амплитудной модуляцией в точке C1R5 висит напряжение,когда подношу карточку оно просто падает почти до нуля без всяких меандров , так должно быть?
Будет работать - её же только что vash_sa запускал. А вот принцип работы надо у автора спрашивать. Потому я и не смогу помочь настроить, что не знаю, как оно работает.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения