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

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

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

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

300px-Manchester-code.png

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

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

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

для этого достаточно включить ШИМ , настроить его на частоту 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 пользователей онлайн

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

    • @Armenn Хорошо. Сделал резистор на 5 Ом.  Результата два. 1. Если включить блок питания в сеть, а уже потом подключить резистор на 5 Ом в фиолетовый провод, тогда резистор просто будет греться.  2. Если подключить резистор на 5 Ом в фиолетовый провод, а уже потом включить блок питания в сеть, тогда случится следующее: лампочка предохранителя от КЗ засветится (через которую я подключаю БП в сеть), а блок питания начнет пищать. Заснял это на видео -   
    • Ну-вы и сравнили. Вот когда будете строить сварочный инвертор на такую частоту-то там нужно  будет учитывать скин эффект. А на частоты до 75кгц-можно забить, отбить и не принимать во внимание. Тем более-что все стараются аппараты до 200А строить. На кольце плотность тока до 15А на мм ^2, на Ш от 10А на  мм^2 А вентилятор-он все лишние тепло сдует ко льдам в Антарктиде. Проверьте монолит 2,12мм, я таким мотаю СТ. Интересно-что там с ним делается на частотах от 30 до 50кГц? Длинна провода примерно 2 метра-На сердечник Е70 влазит 18 витков
    • Добрый вечер всем!  Проблема следующая: Есть флешка с записанной файловой системой через USB MASS STORAGE DEVICES. При "втыкании"  в порт USB открывается на ПК диск с содержимым. Я подключил библиотеку Fatfs и прописал низкоуровневые функции чтения и записи в файле diskio.c Работаю с файлом так:   disk_initialize(SDFatFs.drv); if(f_mount(&SDFatFs,(TCHAR const*)USER_Path,0)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_f_mount!\r\n"); } else { if(f_open(&MyFile,"01.WAV",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File1!\r\n"); } else { Usart1_Send_String("open_File_OK1!\r\n"); } if(f_open(&MyFile,"01.wav",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File2!\r\n"); } else { Usart1_Send_String("open_File_OK2!\r\n"); UINT testBytes=0; f_read(&MyFile, buff1, 512, &testBytes); sprintf(buf1, "TestBytes=%d\r\n", testBytes); Usart1_Send_String(buf1); Usart1_Send_hex((char*)buff1, 512); Usart1_Send_String("read_File_complite!\r\n"); f_close(&MyFile); } } подправил diskio.c так:   DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); sprintf(buffer0, "sector=%lu\r\n", sector); Usart1_Send_String(buffer0); w25qReadPage(buff, sector*2); w25qReadPage(buff + 256, sector*2+256); res=RES_OK; return res; } #if _USE_WRITE == 1 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); w25qWritingByUSB(sector, (uint8_t*)buff); res=RES_OK; return res; } #endif /* _USE_WRITE == 1 */ функцию чтения на самом деле пробовал прописывать по разному, все равно не корректно работает... Выдает в отладке такое:   Program start!.... sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File1! sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File2! Что я забыл еще добавить?
    • В былые годы запрещалось размещать на форуме бессмысленные темы. Видать, с тех пор правила существенно изменились.
    • скачай новый архив. там есть важные изменения в комповой программе, по сравнению с той, что я отправлял в личке. исправлены недоделки и добавлены проверки на некорректные действия.
    • Здесь все индивидуально, точного ответа нет. Тип фоторезиста, качество фотошаблона, расстояние и время засветки, длина волны св.диодов, "полоскание" в химии ... Надо все пробовать самому, ручками, опыт придет со временем, ничего сложного там нет. На форуме есть ветка, почитайте.
×
×
  • Создать...