Перейти к содержанию

Код На Си Для Генерации Манчестера В Rfid Эмуляторе


supercelt

Рекомендуемые сообщения

Здрасьте!

Задание было такое. организовать генерацию манчестерского кода на atmega16 для стандарта RFID меток 125 кГц EM4100 (RF 64).

Исходные данные которые надо закодировать в манчестер это - 1110 и по кругу.

Я написал код, всё работает прекрасно скрин с протеуса прилагается

abc5587c666d.png

Манчестер код - красная диаграмма. Жёлтая - это несущая частота. Должна быть 125 кгц, но я уменьшил до 15 что бы чётче было в протеусе. Для тех кто мало ли не знает что такое RF64 - это значит что один бит данных метки передаётся за 64 такта несущей частоты.

Хочу задать вопрос Вам, программистам с большим опытом. Посмотрите мой код пожалуйста. Вот он вроде и работает, но всё ли я верно сделал?. Может есть какие-то приёмы что бы сделать по короче по легче. и тд.?

//##################################################################################################################
//Так как Proteus 8 очень плохо моделирует при высоких частотах, то задана проверочная частота счётчика 15.625 kHz,
//вместо 125 kHz!
//Программа расчитана для стандарта EM4100A6CB2RC (Кодировка Manchester. Cycle/bit 64). Это значит что
//один бит данных занимает 64 периода сигнала на катушке.
//##################################################################################################################
#define F_CPU 8000000 //Частота камня
#include <avr/io.h>
#include <avr/interrupt.h>
volatile static char bit_rate_counter = 0; //переменная считает количество положительных тактов счётчика
unsigned char data[] = {1,1,1,0}; //массив с выходным двоичным кодом который надо передать
unsigned char i = 0; //переменная для выборки из массива data нужного элемента в нужном месте
volatile unsigned char pass = 0; //переменная нужна что бы программа в цикле лишний раз не заходила в условие if(bit_rate_counter == 8 && pass == 1)
ISR(TIMER0_COMP_vect){ //вектор прерывания по совпадению
if(PINB & (1 << 3)){ //если на пине 3 порта В устанолена 1
bit_rate_counter ++; //увеличиваем счётчик положительных тактов счётчика на 1
if(bit_rate_counter == 32){ //если число положительных тактов = 32
pass = 1; //то ставим флаг что бы разрежить программе зайти в условие if(bit_rate_counter == 32 && pass == 1)
}
}
}
int main(void)
{
DDRC |= (1 << 0); //0 пин порта С работает на выход
PORTC &= ~(1 << 0); //Ставил лог. 0 на 0 пин порта С
DDRB |= (1 << 3); //3 пин порта В работает на выход
PORTB &= ~(1 << 3); //ставим лог. 0 на 3 пин порта В
DDRA |= (1 << 0); //Порт А работает на выход
PORTA &= ~(1 << 0); //ставим лог. 0 на 0 пин порта А
OCR0 = 3; //Задаём частоту счётчика. При предделителе 1/64 и OCR = 3 Частота будет 15.625 kHz
TCCR0 |= (0 << WGM00)|(1 << WGM01); //Режим работы таймера-счётчика0 - сброс при совпадении (СТС)
TCCR0 |= (0 << CS02)|(1 << CS01)|(1 << CS00); //предделитель частоты 1\64
TCCR0 |= (0 << COM01)|(1 << COM00); //Смена сигнала на PB3 - Toggle
TIMSK |= (1 << OCIE0); //Разрешаем уходить в прерывание при совпадении TCNT0 и OCR
asm("sei"); //Разрешаем прерывания глобально
while(1) //Бесконечный цикл
{
 //asm("nop");
if(bit_rate_counter == 64){ //если число положительных тактов = 64
bit_rate_counter = 0; //Обнуляем счётчик положительных тактов
}
if(bit_rate_counter == 0){ //Если число положительных тактов = 0
if(data[i] == 1){ // Если в данных, в i бите единица
 PORTC |= (1 << 0); //подаем на порт С 0 пин - 1
 PORTA |= (1 << 0); //подаем на порт А 0 пин - 1
 } else { //если в данных в i бите не единица то есть ноль
 PORTC &= ~(1 << 0); //подаем на порт С 0 пин - 0
 PORTA &= ~(1 << 0); //подаем на порт С 0 пин - 0
}
}
if(bit_rate_counter == 32 && pass == 1){ //если число положительных тактов = 32 и сработало прерывание, которое установило флаг 1
if(data[i] == 1){ //Если в данных, в i бите единица
 PORTA &= ~(1 << 0); //подаем на порт А 0 пин - 0
} else { //если в данных в i бите не единица то есть ноль
 PORTA |= (1 << 0); //подаем на порт А 0 пин - 1
}
i++; //увеличиваем i на 1, для того что бы при следующем заходе брать следующий бит данных
if(i == 4){ //если биты данных закончились. А их всего 4, то
i = 0; //Обнуляем счётчик битов. При следующем заходе код будет передаваться заново.
}
pass = 0; //Обнуляем флаг, что бы программа сюда не заходила до следующего прерывания
}
}
}
//Все глобальные переменные, используемые в ISR, надо снабжать атрибутом "volatile".
//Прога выводит манчестер кода 1110

post-23236-0-77624500-1438615817_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Манчестер код - красная диаграмма. Жёлтая - это несущая частота. Должна быть 125 кгц, но я уменьшил до 15 что бы чётче было в протеусе.
мне кажется или получен инверсный код???

300px-Manchester-code.png

и почему несущая отдельно от кода???

и уменьшать частоту в протезе не нужно... вместо осциллографа пользуйтесь графом ЛОГИЧЕСКИЙ АНАЛИЗАТОР левой панели инструментов http://kazus.ru/forums/showthread.php?t=13198&page=3 с 22поста...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

а, теперь понял. Я бы так сделал, если бы протеус умел эмулировать поднесение метки к катушке. Поэтому я беру уже детектированный сигнал и подаю его прямо на порт. Всё равно детекцией будет заниматься аналоговая обвеска. Во всяком случае в примерах все так делали где я смотрел

А в целом код норм? не громоздкий?

Изменено пользователем supercelt
Ссылка на комментарий
Поделиться на другие сайты

на второй мк который тут не указан. Второй мк должен просто прочитать манчестер и вывести исходный код. Поэтому мне и надо что бы приёмник давал просто манчестер без несущей частоты

Ссылка на комментарий
Поделиться на другие сайты

а что мешает ее генерировать прямо в МК и выдавать код уже с несущей?

для этого достаточно включить ШИМ , настроить его на частоту 125кГц

в прерывании по постлелителю 1:32 переключать скважность ШИМа 0% или 35% тем самым формируя передачи полубитов для лог.1 или лог.0

Ссылка на комментарий
Поделиться на другие сайты

Чёт я не понял про шим. Если шим это значит TCCR0 (3 и 6 бит ставим в 1). В этом режиме вроде можно OCR регулировать скважность, а период будет постоянным. Если даже выбрать макс частоту камня 16мгц, то 16000000/256 тиков счётчика TCNT0 = 62.500 кгц. Не дотягивает до нужных 125

Изменено пользователем supercelt
Ссылка на комментарий
Поделиться на другие сайты

так счетчик не обязательно должен считать до 256

не знаю как это реализовано в АВРх, в ПИКах изменением счетчика можно регулировать период ШИМа просто с повышением частоты уменьшаться разрядность ШИМа, думаю в АВРх тоже самое... почитайте доки

Ссылка на комментарий
Поделиться на другие сайты

Я это читал. Особо не помогло. Вычитал в какой-то статье что частотой шима можно управлять уменьшая верхний предел счётчика tcnt0. А вот как это сделать нигде не сказано

Ссылка на комментарий
Поделиться на другие сайты

Настраивание таймер на сброс при совпадении, в регистр сравнения пишите число меньше чем 255. Настраиваете ножку чтоб меняла свое значение на противоположное при совпадении счетного регистра с регистром сравнения. Теперь давайте посчитаем какая частота у вас будет при 8 МГц и если в регистр сравнения будет записано число например 20, правильно уже 400кГц.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

это не совсем то что нужно... как я понял в АВР нет возможности установить разрядность ШИМа меньше 8

и при этом получить прерывание от таймера через 16 периодов ШИМа ....

отсюда невозможно получить

Для тех кто мало ли не знает что такое RF64 - это значит что один бит данных метки передаётся за 64 такта несущей частоты.
Ссылка на комментарий
Поделиться на другие сайты

Тут нужны гуру. Так далеко я еще не копал

Знаю точно Геннадий копает в данный момент rfid у него можно спросить как это дело прикручивается.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Зайдите в ветку AVR или мк для начинающих. Он там в темах частенько фигурирует. Ща попробую с телефона ссылку на него вставить

http://forum.cxem.net/index.php?showuser=16151

Вот он

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...