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

Код На Си Для Генерации Манчестера В 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 пользователей онлайн

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